blob: 28954663177b38598fa601e8a0ea4f960bfff453 [file] [log] [blame]
[email protected]d90b8392012-06-13 09:34:561// 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.
4
5#ifndef ASH_ROOT_WINDOW_CONTROLLER_H_
6#define ASH_ROOT_WINDOW_CONTROLLER_H_
[email protected]d90b8392012-06-13 09:34:567
[email protected]2b8a9bb2013-07-01 22:43:408#include <map>
9
[email protected]c0ce80e2012-10-05 23:28:2710#include "ash/ash_export.h"
[email protected]478c6c32013-03-09 02:50:5811#include "ash/shelf/shelf_types.h"
[email protected]16059276d2012-10-22 18:59:5012#include "ash/system/user/login_status.h"
[email protected]d90b8392012-06-13 09:34:5613#include "base/basictypes.h"
14#include "base/memory/scoped_ptr.h"
[email protected]940fb1c2013-06-18 16:54:2815#include "ui/base/ui_base_types.h"
[email protected]d90b8392012-06-13 09:34:5616
17class SkBitmap;
18
19namespace aura {
20class EventFilter;
21class RootWindow;
22class Window;
[email protected]4a59e4e2012-11-12 21:15:4023}
24
25namespace gfx {
26class Point;
27}
28
29namespace views {
[email protected]0bf61732013-07-02 04:35:1030class Widget;
31
[email protected]4a59e4e2012-11-12 21:15:4032namespace corewm {
[email protected]d90b8392012-06-13 09:34:5633class InputMethodEventFilter;
34class RootWindowEventFilter;
[email protected]4a59e4e2012-11-12 21:15:4035}
36}
[email protected]d90b8392012-06-13 09:34:5637
[email protected]86459e2c2013-04-10 13:39:2438namespace keyboard {
39class KeyboardController;
40}
41
[email protected]d90b8392012-06-13 09:34:5642namespace ash {
[email protected]2a2caa02013-01-22 20:50:3643class StackingController;
[email protected]478c6c32013-03-09 02:50:5844class ShelfWidget;
[email protected]a0afeb12012-12-10 22:57:0945class SystemTray;
[email protected]a4cd6d32012-09-12 03:42:1346class ToplevelWindowEventHandler;
[email protected]e74aaf0a2012-10-12 18:42:2847
[email protected]d90b8392012-06-13 09:34:5648namespace internal {
49
[email protected]80549c152013-07-02 01:42:4750class AlwaysOnTopController;
[email protected]0bf61732013-07-02 04:35:1051class AnimatingDesktopController;
[email protected]bca9a7e2012-11-10 06:25:4952class BootSplashScreen;
[email protected]0bf61732013-07-02 04:35:1053class DesktopBackgroundWidgetController;
[email protected]beb4e5c2013-06-18 15:37:0754class DockedWindowLayoutManager;
[email protected]e74aaf0a2012-10-12 18:42:2855class PanelLayoutManager;
[email protected]d90b8392012-06-13 09:34:5656class RootWindowLayoutManager;
57class ScreenDimmer;
[email protected]e74aaf0a2012-10-12 18:42:2858class ShelfLayoutManager;
59class StatusAreaWidget;
60class SystemBackgroundController;
[email protected]c0ce80e2012-10-05 23:28:2761class SystemModalContainerLayoutManager;
[email protected]2b8a9bb2013-07-01 22:43:4062class TouchHudDebug;
63class TouchHudProjection;
[email protected]d90b8392012-06-13 09:34:5664class WorkspaceController;
65
66// This class maintains the per root window state for ash. This class
67// owns the root window and other dependent objects that should be
68// deleted upon the deletion of the root window. The RootWindowController
69// for particular root window is stored as a property and can be obtained
70// using |GetRootWindowController(aura::RootWindow*)| function.
[email protected]c0ce80e2012-10-05 23:28:2771class ASH_EXPORT RootWindowController {
[email protected]d90b8392012-06-13 09:34:5672 public:
73 explicit RootWindowController(aura::RootWindow* root_window);
74 ~RootWindowController();
75
[email protected]88d71122012-10-18 07:11:0176 // Returns a RootWindowController that has a launcher for given
77 // |window|. This returns the RootWindowController for the |window|'s
78 // root window when multiple launcher mode is enabled, or the primary
79 // RootWindowController otherwise.
80 static RootWindowController* ForLauncher(aura::Window* window);
81
[email protected]a0afeb12012-12-10 22:57:0982 // Returns a RootWindowController of the window's root window.
[email protected]ccff3d72013-02-06 04:26:2883 static RootWindowController* ForWindow(const aura::Window* window);
[email protected]a0afeb12012-12-10 22:57:0984
85 // Returns the RootWindowController of the active root window.
86 static internal::RootWindowController* ForActiveRootWindow();
87
[email protected]e74aaf0a2012-10-12 18:42:2888 aura::RootWindow* root_window() { return root_window_.get(); }
[email protected]d90b8392012-06-13 09:34:5689
[email protected]e74aaf0a2012-10-12 18:42:2890 RootWindowLayoutManager* root_window_layout() { return root_window_layout_; }
[email protected]d90b8392012-06-13 09:34:5691
[email protected]c0ce80e2012-10-05 23:28:2792 WorkspaceController* workspace_controller() {
[email protected]d90b8392012-06-13 09:34:5693 return workspace_controller_.get();
94 }
95
[email protected]80549c152013-07-02 01:42:4796 AlwaysOnTopController* always_on_top_controller() {
97 return always_on_top_controller_.get();
98 }
99
[email protected]e74aaf0a2012-10-12 18:42:28100 ScreenDimmer* screen_dimmer() { return screen_dimmer_.get(); }
101
[email protected]478c6c32013-03-09 02:50:58102 // Access the shelf associated with this root window controller,
103 // NULL if no such shelf exists.
104 ShelfWidget* shelf() { return shelf_.get(); }
[email protected]e74aaf0a2012-10-12 18:42:28105
[email protected]2b8a9bb2013-07-01 22:43:40106 // Get touch HUDs associated with this root window controller.
107 TouchHudDebug* touch_hud_debug() const {
108 return touch_hud_debug_;
[email protected]bff17552013-04-25 04:44:55109 }
[email protected]2b8a9bb2013-07-01 22:43:40110 TouchHudProjection* touch_hud_projection() const {
111 return touch_hud_projection_;
112 }
113
114 // Set touch HUDs for this root window controller. The root window controller
115 // will not own the HUDs; their lifetimes are managed by themselves. Whenever
116 // the widget showing a HUD is being destroyed (e.g. because of detaching a
117 // display), the HUD deletes itself.
118 void set_touch_hud_debug(TouchHudDebug* hud) {
119 touch_hud_debug_ = hud;
120 }
121 void set_touch_hud_projection(TouchHudProjection* hud) {
122 touch_hud_projection_ = hud;
123 }
124
125 // Enables projection touch HUD.
126 void EnableTouchHudProjection();
127
128 // Disables projection touch HUD.
129 void DisableTouchHudProjection();
130
[email protected]0bf61732013-07-02 04:35:10131 DesktopBackgroundWidgetController* wallpaper_controller() {
132 return wallpaper_controller_.get();
133 }
134 void SetWallpaperController(DesktopBackgroundWidgetController* controller);
135 AnimatingDesktopController* animating_wallpaper_controller() {
136 return animating_wallpaper_controller_.get();
137 }
138 void SetAnimatingWallpaperController(AnimatingDesktopController* controller);
139
[email protected]478c6c32013-03-09 02:50:58140 // Access the shelf layout manager associated with this root
141 // window controller, NULL if no such shelf exists.
142 ShelfLayoutManager* GetShelfLayoutManager();
[email protected]d90b8392012-06-13 09:34:56143
[email protected]a0afeb12012-12-10 22:57:09144 // Returns the system tray on this root window. Note that
145 // calling this on the root window that doesn't have a launcher will
146 // lead to a crash.
147 SystemTray* GetSystemTray();
148
[email protected]431552c2012-10-23 00:38:33149 // Shows context menu at the |location_in_screen|. This uses
150 // |ShellDelegate::CreateContextMenu| to define the content of the menu.
[email protected]940fb1c2013-06-18 16:54:28151 void ShowContextMenu(const gfx::Point& location_in_screen,
152 ui::MenuSourceType source_type);
[email protected]431552c2012-10-23 00:38:33153
[email protected]8674b312012-10-12 19:02:44154 // Returns the layout-manager for the appropriate modal-container. If the
155 // window is inside the lockscreen modal container, then the layout manager
156 // for that is returned. Otherwise the layout manager for the default modal
157 // container is returned.
158 // If no window is specified (i.e. |window| is NULL), then the lockscreen
159 // modal container is used if the screen is currently locked. Otherwise, the
160 // default modal container is used.
161 SystemModalContainerLayoutManager* GetSystemModalLayoutManager(
162 aura::Window* window);
[email protected]c0ce80e2012-10-05 23:28:27163
[email protected]d90b8392012-06-13 09:34:56164 aura::Window* GetContainer(int container_id);
165
[email protected]d90b8392012-06-13 09:34:56166 void InitLayoutManagers();
[email protected]697f04c2012-10-03 01:15:10167 void CreateContainers();
168
[email protected]e74aaf0a2012-10-12 18:42:28169 // Initializs the RootWindowController for primary display. This
170 // creates
171 void InitForPrimaryDisplay();
172
[email protected]bca9a7e2012-11-10 06:25:49173 // Initializes |system_background_| and possibly also |boot_splash_screen_|.
174 // |is_first_run_after_boot| determines the background's initial color.
[email protected]697f04c2012-10-03 01:15:10175 void CreateSystemBackground(bool is_first_run_after_boot);
176
[email protected]e74aaf0a2012-10-12 18:42:28177 // Show launcher view if it was created hidden (before session has started).
178 void ShowLauncher();
179
[email protected]478c6c32013-03-09 02:50:58180 // Called when the launcher associated with this root window is created.
181 void OnLauncherCreated();
182
[email protected]16059276d2012-10-22 18:59:50183 // Called when the user logs in.
184 void OnLoginStateChanged(user::LoginStatus status);
185
186 // Called when the login status changes after login (such as lock/unlock).
187 // TODO(oshima): Investigate if we can merge this and |OnLoginStateChanged|.
188 void UpdateAfterLoginStatusChange(user::LoginStatus status);
189
[email protected]bca9a7e2012-11-10 06:25:49190 // Called when the brightness/grayscale animation from white to the login
191 // desktop background image has started. Starts |boot_splash_screen_|'s
192 // hiding animation (if the screen is non-NULL).
193 void HandleInitialDesktopBackgroundAnimationStarted();
194
[email protected]0bf61732013-07-02 04:35:10195 // Called when the wallpaper ainmation is finished. Updates |background_|
196 // to be black and drops |boot_splash_screen_| and moves the wallpaper
197 // controller into the root window controller. |widget| holds the wallpaper
198 // image, or NULL if the background is a solid color.
199 void OnWallpaperAnimationFinished(views::Widget* widget);
[email protected]d90b8392012-06-13 09:34:56200
[email protected]6675e1c2012-09-11 09:15:45201 // Deletes associated objects and clears the state, but doesn't delete
202 // the root window yet. This is used to delete a secondary displays'
203 // root window safely when the display disconnect signal is received,
204 // which may come while we're in the nested message loop.
205 void Shutdown();
206
[email protected]d90b8392012-06-13 09:34:56207 // Deletes all child windows and performs necessary cleanup.
208 void CloseChildWindows();
209
[email protected]f1853122012-06-27 16:21:26210 // Moves child windows to |dest|.
211 void MoveWindowsTo(aura::RootWindow* dest);
212
[email protected]e74aaf0a2012-10-12 18:42:28213 // Force the shelf to query for it's current visibility state.
214 void UpdateShelfVisibility();
215
[email protected]2b8a9bb2013-07-01 22:43:40216 // Initialize touch HUDs if necessary.
217 void InitTouchHuds();
218
[email protected]700849f2013-04-30 17:49:20219 // Returns the window, if any, which is in fullscreen mode in the active
220 // workspace. Exposed here so clients of Ash don't need to know the details
221 // of workspace management.
222 aura::Window* GetFullscreenWindow() const;
[email protected]2ee2f5d2013-01-10 23:37:16223
[email protected]431552c2012-10-23 00:38:33224 private:
[email protected]a4cd6d32012-09-12 03:42:13225 // Creates each of the special window containers that holds windows of various
226 // types in the shell UI.
227 void CreateContainersInRootWindow(aura::RootWindow* root_window);
228
[email protected]86459e2c2013-04-10 13:39:24229 // Initializes the virtual keyboard.
230 void InitKeyboard();
231
[email protected]d90b8392012-06-13 09:34:56232 scoped_ptr<aura::RootWindow> root_window_;
[email protected]c0ce80e2012-10-05 23:28:27233 RootWindowLayoutManager* root_window_layout_;
[email protected]d90b8392012-06-13 09:34:56234
[email protected]2a2caa02013-01-22 20:50:36235 scoped_ptr<StackingController> stacking_controller_;
236
[email protected]86459e2c2013-04-10 13:39:24237 scoped_ptr<keyboard::KeyboardController> keyboard_controller_;
238
[email protected]e74aaf0a2012-10-12 18:42:28239 // The shelf for managing the launcher and the status widget.
[email protected]478c6c32013-03-09 02:50:58240 scoped_ptr<ShelfWidget> shelf_;
[email protected]e74aaf0a2012-10-12 18:42:28241
[email protected]beb4e5c2013-06-18 15:37:07242 // Manages layout of docked windows. Owned by DockedContainer.
243 DockedWindowLayoutManager* docked_layout_manager_;
244
[email protected]e74aaf0a2012-10-12 18:42:28245 // Manages layout of panels. Owned by PanelContainer.
[email protected]88d71122012-10-18 07:11:01246 PanelLayoutManager* panel_layout_manager_;
[email protected]e74aaf0a2012-10-12 18:42:28247
[email protected]e6e41d2f2012-10-29 19:22:19248 scoped_ptr<SystemBackgroundController> system_background_;
[email protected]bca9a7e2012-11-10 06:25:49249 scoped_ptr<BootSplashScreen> boot_splash_screen_;
[email protected]697f04c2012-10-03 01:15:10250
[email protected]c0ce80e2012-10-05 23:28:27251 scoped_ptr<ScreenDimmer> screen_dimmer_;
252 scoped_ptr<WorkspaceController> workspace_controller_;
[email protected]80549c152013-07-02 01:42:47253 scoped_ptr<AlwaysOnTopController> always_on_top_controller_;
[email protected]d90b8392012-06-13 09:34:56254
[email protected]2b8a9bb2013-07-01 22:43:40255 // Heads-up displays for touch events. These HUDs are not owned by the root
256 // window controller and manage their own lifetimes.
257 TouchHudDebug* touch_hud_debug_;
258 TouchHudProjection* touch_hud_projection_;
[email protected]58175042013-04-01 19:27:13259
[email protected]a4cd6d32012-09-12 03:42:13260 // We need to own event handlers for various containers.
261 scoped_ptr<ToplevelWindowEventHandler> default_container_handler_;
262 scoped_ptr<ToplevelWindowEventHandler> always_on_top_container_handler_;
263 scoped_ptr<ToplevelWindowEventHandler> modal_container_handler_;
264 scoped_ptr<ToplevelWindowEventHandler> lock_modal_container_handler_;
[email protected]582022052013-02-20 15:19:04265 scoped_ptr<ToplevelWindowEventHandler> panel_container_handler_;
[email protected]beb4e5c2013-06-18 15:37:07266 scoped_ptr<ToplevelWindowEventHandler> docked_container_handler_;
[email protected]a4cd6d32012-09-12 03:42:13267
[email protected]0bf61732013-07-02 04:35:10268 scoped_ptr<DesktopBackgroundWidgetController> wallpaper_controller_;
269 scoped_ptr<AnimatingDesktopController> animating_wallpaper_controller_;
270
[email protected]d90b8392012-06-13 09:34:56271 DISALLOW_COPY_AND_ASSIGN(RootWindowController);
272};
273
274} // namespace internal
275} // ash
276
277#endif // ASH_ROOT_WINDOW_CONTROLLER_H_