Reland of Disable smoothness.top_25_smooth on win/mac/linux. (patchset #1 id:1 of...
[chromium-blink-merge.git] / ash / desktop_background / desktop_background_widget_controller.h
blobbad030c6fe0b32dfcfeceb6327853be474f8a32f
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef ASH_DESKTOP_BACKGROUND_DESKTOP_BACKGROUND_WIDGET_CONTROLLER_H_
6 #define ASH_DESKTOP_BACKGROUND_DESKTOP_BACKGROUND_WIDGET_CONTROLLER_H_
8 #include "ash/ash_export.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "ui/aura/window.h"
11 #include "ui/compositor/layer.h"
12 #include "ui/views/widget/widget.h"
13 #include "ui/views/widget/widget_observer.h"
15 namespace ash {
16 class RootWindowController;
18 // This class implements a widget-based wallpaper.
19 // DesktopBackgroundWidgetController is owned by RootWindowController.
20 // When the animation completes the old DesktopBackgroundWidgetController is
21 // destroyed. Exported for tests.
22 class ASH_EXPORT DesktopBackgroundWidgetController
23 : public views::WidgetObserver {
24 public:
25 // Create
26 explicit DesktopBackgroundWidgetController(views::Widget* widget);
28 ~DesktopBackgroundWidgetController() override;
30 // Overridden from views::WidgetObserver.
31 void OnWidgetDestroying(views::Widget* widget) override;
33 // Set bounds of component that draws background.
34 void SetBounds(gfx::Rect bounds);
36 // Move component from |src_container| in |root_window| to |dest_container|.
37 // It is required for lock screen, when we need to move background so that
38 // it hides user's windows. Returns true if there was something to reparent.
39 bool Reparent(aura::Window* root_window,
40 int src_container,
41 int dest_container);
43 // Starts wallpaper fade in animation. |root_window_controller| is
44 // the root window where the animation will happen. (This is
45 // necessary this as |layer_| doesn't have access to the root window).
46 void StartAnimating(RootWindowController* root_window_controller);
48 views::Widget* widget() { return widget_; }
50 private:
51 views::Widget* widget_;
53 DISALLOW_COPY_AND_ASSIGN(DesktopBackgroundWidgetController);
56 // This class wraps a DesktopBackgroundWidgetController pointer. It is owned
57 // by RootWindowController. The instance of DesktopBackgroundWidgetController is
58 // moved to this RootWindowController when the animation completes.
59 // Exported for tests.
60 class ASH_EXPORT AnimatingDesktopController {
61 public:
62 explicit AnimatingDesktopController(
63 DesktopBackgroundWidgetController* component);
64 ~AnimatingDesktopController();
66 // Stops animation and makes sure OnImplicitAnimationsCompleted() is called if
67 // current animation is not finished yet.
68 // Note we have to make sure this function is called before we set
69 // kAnimatingDesktopController to a new controller. If it is not called, the
70 // animating widget/layer is closed immediately and the new one is animating
71 // from the widget/layer before animation. For instance, if a user quickly
72 // switches between red, green and blue wallpapers. The green wallpaper will
73 // first fade in from red wallpaper. And in the middle of the animation, blue
74 // wallpaper also wants to fade in. If the green wallpaper animation does not
75 // finish immediately, the green wallpaper widget will be removed and the red
76 // widget will show again. As a result, the blue wallpaper fades in from red
77 // wallpaper. This is a bad user experience. See bug http://crbug.com/156542
78 // for more details.
79 void StopAnimating();
81 // Gets the wrapped DesktopBackgroundWidgetController pointer. Caller should
82 // take ownership of the pointer if |pass_ownership| is true.
83 DesktopBackgroundWidgetController* GetController(bool pass_ownership);
85 private:
86 scoped_ptr<DesktopBackgroundWidgetController> controller_;
88 DISALLOW_COPY_AND_ASSIGN(AnimatingDesktopController);
91 } // namespace ash
93 #endif // ASH_DESKTOP_BACKGROUND_DESKTOP_BACKGROUND_WIDGET_CONTROLLER_H_