rAc: don't reset reference to invoking form on frame load.
[chromium-blink-merge.git] / ash / root_window_controller.h
blobd347d8126be340145df86a1e55de349a1ed9e289
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_ROOT_WINDOW_CONTROLLER_H_
6 #define ASH_ROOT_WINDOW_CONTROLLER_H_
8 #include <map>
10 #include "ash/ash_export.h"
11 #include "ash/shelf/shelf_types.h"
12 #include "ash/shell_observer.h"
13 #include "ash/system/user/login_status.h"
14 #include "base/basictypes.h"
15 #include "base/memory/scoped_ptr.h"
16 #include "ui/aura/window.h"
17 #include "ui/aura/window_tree_host.h"
18 #include "ui/base/ui_base_types.h"
20 class SkBitmap;
22 namespace aura {
23 class EventFilter;
24 class Window;
27 namespace gfx {
28 class Point;
31 namespace views {
32 class Widget;
34 namespace corewm {
35 class InputMethodEventFilter;
36 class RootWindowEventFilter;
37 class ScopedCaptureClient;
41 namespace keyboard {
42 class KeyboardController;
45 namespace ui {
46 class EventHandler;
49 namespace ash {
50 class ShelfWidget;
51 class StackingController;
52 class SystemTray;
54 namespace internal {
56 class AlwaysOnTopController;
57 class AnimatingDesktopController;
58 class DesktopBackgroundWidgetController;
59 class DockedWindowLayoutManager;
60 class PanelLayoutManager;
61 class RootWindowLayoutManager;
62 class ScreenDimmer;
63 class ShelfLayoutManager;
64 class StatusAreaWidget;
65 class SystemBackgroundController;
66 class SystemModalContainerLayoutManager;
67 class TouchHudDebug;
68 class TouchHudProjection;
69 class WorkspaceController;
71 #if defined(OS_CHROMEOS)
72 class BootSplashScreen;
73 #endif
75 // This class maintains the per root window state for ash. This class
76 // owns the root window and other dependent objects that should be
77 // deleted upon the deletion of the root window. This object is
78 // indirectly owned and deleted by |DisplayController|.
79 // The RootWindowController for particular root window is stored in
80 // its property (RootWindowSettings) and can be obtained using
81 // |GetRootWindowController(aura::WindowEventDispatcher*)| function.
82 class ASH_EXPORT RootWindowController : public ShellObserver {
83 public:
85 // Creates and Initialize the RootWindowController for primary display.
86 static void CreateForPrimaryDisplay(aura::WindowTreeHost* host);
88 // Creates and Initialize the RootWindowController for secondary displays.
89 static void CreateForSecondaryDisplay(aura::WindowTreeHost* host);
91 // Creates and Initialize the RootWindowController for virtual
92 // keyboard displays.
93 static void CreateForVirtualKeyboardDisplay(aura::WindowTreeHost* host);
95 // Returns a RootWindowController that has a shelf for given
96 // |window|. This returns the RootWindowController for the |window|'s
97 // root window when multiple shelf mode is enabled, or the primary
98 // RootWindowController otherwise.
99 static RootWindowController* ForShelf(aura::Window* window);
101 // Returns a RootWindowController of the window's root window.
102 static RootWindowController* ForWindow(const aura::Window* window);
104 // Returns the RootWindowController of the target root window.
105 static internal::RootWindowController* ForTargetRootWindow();
107 // Returns container which contains a given |window|.
108 static aura::Window* GetContainerForWindow(aura::Window* window);
110 virtual ~RootWindowController();
112 aura::Window* root_window() { return host_->window(); }
113 const aura::Window* root_window() const { return host_->window(); }
114 aura::WindowTreeHost* host() { return host_.get(); }
115 const aura::WindowTreeHost* host() const { return host_.get(); }
117 RootWindowLayoutManager* root_window_layout() { return root_window_layout_; }
119 WorkspaceController* workspace_controller() {
120 return workspace_controller_.get();
123 AlwaysOnTopController* always_on_top_controller() {
124 return always_on_top_controller_.get();
127 ScreenDimmer* screen_dimmer() { return screen_dimmer_.get(); }
129 // Access the shelf associated with this root window controller,
130 // NULL if no such shelf exists.
131 ShelfWidget* shelf() { return shelf_.get(); }
133 // Get touch HUDs associated with this root window controller.
134 TouchHudDebug* touch_hud_debug() const {
135 return touch_hud_debug_;
137 TouchHudProjection* touch_hud_projection() const {
138 return touch_hud_projection_;
141 // Set touch HUDs for this root window controller. The root window controller
142 // will not own the HUDs; their lifetimes are managed by themselves. Whenever
143 // the widget showing a HUD is being destroyed (e.g. because of detaching a
144 // display), the HUD deletes itself.
145 void set_touch_hud_debug(TouchHudDebug* hud) {
146 touch_hud_debug_ = hud;
148 void set_touch_hud_projection(TouchHudProjection* hud) {
149 touch_hud_projection_ = hud;
152 DesktopBackgroundWidgetController* wallpaper_controller() {
153 return wallpaper_controller_.get();
155 void SetWallpaperController(DesktopBackgroundWidgetController* controller);
156 AnimatingDesktopController* animating_wallpaper_controller() {
157 return animating_wallpaper_controller_.get();
159 void SetAnimatingWallpaperController(AnimatingDesktopController* controller);
161 // Access the shelf layout manager associated with this root
162 // window controller, NULL if no such shelf exists.
163 ShelfLayoutManager* GetShelfLayoutManager();
165 // Returns the system tray on this root window. Note that
166 // calling this on the root window that doesn't have a shelf will
167 // lead to a crash.
168 SystemTray* GetSystemTray();
170 // Shows context menu at the |location_in_screen|. This uses
171 // |ShellDelegate::CreateContextMenu| to define the content of the menu.
172 void ShowContextMenu(const gfx::Point& location_in_screen,
173 ui::MenuSourceType source_type);
175 // Returns the layout-manager for the appropriate modal-container. If the
176 // window is inside the lockscreen modal container, then the layout manager
177 // for that is returned. Otherwise the layout manager for the default modal
178 // container is returned.
179 // If no window is specified (i.e. |window| is NULL), then the lockscreen
180 // modal container is used if the screen is currently locked. Otherwise, the
181 // default modal container is used.
182 SystemModalContainerLayoutManager* GetSystemModalLayoutManager(
183 aura::Window* window);
185 aura::Window* GetContainer(int container_id);
186 const aura::Window* GetContainer(int container_id) const;
188 // Show shelf view if it was created hidden (before session has started).
189 void ShowShelf();
191 // Called when the shelf associated with this root window is created.
192 void OnShelfCreated();
194 // Called when the login status changes after login (such as lock/unlock).
195 // TODO(oshima): Investigate if we can merge this and |OnLoginStateChanged|.
196 void UpdateAfterLoginStatusChange(user::LoginStatus status);
198 // Called when the brightness/grayscale animation from white to the login
199 // desktop background image has started. Starts |boot_splash_screen_|'s
200 // hiding animation (if the screen is non-NULL).
201 void HandleInitialDesktopBackgroundAnimationStarted();
203 // Called when the wallpaper ainmation is finished. Updates |background_|
204 // to be black and drops |boot_splash_screen_| and moves the wallpaper
205 // controller into the root window controller. |widget| holds the wallpaper
206 // image, or NULL if the background is a solid color.
207 void OnWallpaperAnimationFinished(views::Widget* widget);
209 // Deletes associated objects and clears the state, but doesn't delete
210 // the root window yet. This is used to delete a secondary displays'
211 // root window safely when the display disconnect signal is received,
212 // which may come while we're in the nested message loop.
213 void Shutdown();
215 // Deletes all child windows and performs necessary cleanup.
216 void CloseChildWindows();
218 // Moves child windows to |dest|.
219 void MoveWindowsTo(aura::Window* dest);
221 // Force the shelf to query for it's current visibility state.
222 void UpdateShelfVisibility();
224 // Initialize touch HUDs if necessary.
225 void InitTouchHuds();
227 // Returns the topmost window or one of its transient parents, if any of them
228 // are in fullscreen mode.
229 const aura::Window* GetWindowForFullscreenMode() const;
231 // Activate virtual keyboard on current root window controller.
232 void ActivateKeyboard(keyboard::KeyboardController* keyboard_controller);
234 // Deactivate virtual keyboard on current root window controller.
235 void DeactivateKeyboard(keyboard::KeyboardController* keyboard_controller);
237 private:
238 explicit RootWindowController(aura::WindowTreeHost* host);
239 enum RootWindowType {
240 PRIMARY,
241 SECONDARY,
242 VIRTUAL_KEYBOARD
245 // Initializes the RootWindowController. |is_primary| is true if
246 // the controller is for primary display. |first_run_after_boot| is
247 // set to true only for primary root window after boot.
248 void Init(RootWindowType root_window_type, bool first_run_after_boot);
250 void InitLayoutManagers();
252 // Initializes |system_background_| and possibly also |boot_splash_screen_|.
253 // |is_first_run_after_boot| determines the background's initial color.
254 void CreateSystemBackground(bool is_first_run_after_boot);
256 // Creates each of the special window containers that holds windows of various
257 // types in the shell UI.
258 void CreateContainersInRootWindow(aura::Window* root_window);
260 // Enables projection touch HUD.
261 void EnableTouchHudProjection();
263 // Disables projection touch HUD.
264 void DisableTouchHudProjection();
266 // Overridden from ShellObserver.
267 virtual void OnLoginStateChanged(user::LoginStatus status) OVERRIDE;
268 virtual void OnTouchHudProjectionToggled(bool enabled) OVERRIDE;
270 scoped_ptr<aura::WindowTreeHost> host_;
271 RootWindowLayoutManager* root_window_layout_;
273 scoped_ptr<StackingController> stacking_controller_;
275 // The shelf for managing the shelf and the status widget.
276 scoped_ptr<ShelfWidget> shelf_;
278 // An invisible/empty window used as a event target for
279 // |MouseCursorEventFilter| before a user logs in.
280 // (crbug.com/266987)
281 // Its container is |LockScreenBackgroundContainer| and
282 // this must be deleted before the container is deleted.
283 scoped_ptr<aura::Window> mouse_event_target_;
285 // Manages layout of docked windows. Owned by DockedContainer.
286 DockedWindowLayoutManager* docked_layout_manager_;
288 // Manages layout of panels. Owned by PanelContainer.
289 PanelLayoutManager* panel_layout_manager_;
291 scoped_ptr<SystemBackgroundController> system_background_;
292 #if defined(OS_CHROMEOS)
293 scoped_ptr<BootSplashScreen> boot_splash_screen_;
294 #endif
296 scoped_ptr<ScreenDimmer> screen_dimmer_;
297 scoped_ptr<WorkspaceController> workspace_controller_;
298 scoped_ptr<AlwaysOnTopController> always_on_top_controller_;
300 // Heads-up displays for touch events. These HUDs are not owned by the root
301 // window controller and manage their own lifetimes.
302 TouchHudDebug* touch_hud_debug_;
303 TouchHudProjection* touch_hud_projection_;
305 // Handles double clicks on the panel window header.
306 scoped_ptr<ui::EventHandler> panel_container_handler_;
308 scoped_ptr<DesktopBackgroundWidgetController> wallpaper_controller_;
309 scoped_ptr<AnimatingDesktopController> animating_wallpaper_controller_;
310 scoped_ptr<views::corewm::ScopedCaptureClient> capture_client_;
312 DISALLOW_COPY_AND_ASSIGN(RootWindowController);
316 // Gets the RootWindowController for |root_window|.
317 ASH_EXPORT RootWindowController* GetRootWindowController(
318 const aura::Window* root_window);
320 } // namespace internal
321 } // ash
323 #endif // ASH_ROOT_WINDOW_CONTROLLER_H_