blob: 672bd0ff42acfc093a41972144120a8ce5b6aa3f [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>
dchenga94547472016-04-08 08:41:119#include <memory>
[email protected]2b8a9bb2013-07-01 22:43:4010
[email protected]c0ce80e2012-10-05 23:28:2711#include "ash/ash_export.h"
[email protected]478c6c32013-03-09 02:50:5812#include "ash/shelf/shelf_types.h"
[email protected]d141b922013-07-09 08:13:1713#include "ash/shell_observer.h"
[email protected]16059276d2012-10-22 18:59:5014#include "ash/system/user/login_status.h"
avidb567a8a2015-12-20 17:07:2415#include "base/macros.h"
[email protected]f7c05b22013-11-12 21:07:2416#include "ui/aura/window.h"
[email protected]2f2620332014-02-28 10:07:3817#include "ui/aura/window_tree_host.h"
[email protected]940fb1c2013-06-18 16:54:2818#include "ui/base/ui_base_types.h"
[email protected]d90b8392012-06-13 09:34:5619
20class SkBitmap;
21
22namespace aura {
23class EventFilter;
[email protected]d90b8392012-06-13 09:34:5624class Window;
[email protected]4a59e4e2012-11-12 21:15:4025}
26
27namespace gfx {
28class Point;
29}
30
[email protected]86459e2c2013-04-10 13:39:2431namespace keyboard {
32class KeyboardController;
33}
34
[email protected]3537d472014-01-15 05:45:3135namespace ui {
36class EventHandler;
jonrossa90d8982016-05-16 18:14:2537class MenuModel;
[email protected]3537d472014-01-15 05:45:3138}
39
[email protected]e319c7e2014-03-14 19:56:1440namespace views {
jonrossa90d8982016-05-16 18:14:2541class MenuModelAdapter;
42class MenuRunner;
[email protected]e319c7e2014-03-14 19:56:1443class Widget;
44}
45
46namespace wm {
47class InputMethodEventFilter;
48class RootWindowEventFilter;
49class ScopedCaptureClient;
50}
51
[email protected]d90b8392012-06-13 09:34:5652namespace ash {
[email protected]f5c9dbc2014-04-11 08:13:4553class AshWindowTreeHost;
[email protected]80549c152013-07-02 01:42:4754class AlwaysOnTopController;
[email protected]0bf61732013-07-02 04:35:1055class AnimatingDesktopController;
[email protected]0bf61732013-07-02 04:35:1056class DesktopBackgroundWidgetController;
[email protected]beb4e5c2013-06-18 15:37:0757class DockedWindowLayoutManager;
[email protected]e74aaf0a2012-10-12 18:42:2858class PanelLayoutManager;
skyee78dde2016-06-01 01:21:4359class RootWindowControllerCommon;
jamescook6afad6d2016-06-01 00:35:0160class Shelf;
[email protected]e74aaf0a2012-10-12 18:42:2861class ShelfLayoutManager;
[email protected]093b8d642014-04-03 20:59:2862class ShelfWidget;
63class StackingController;
[email protected]e74aaf0a2012-10-12 18:42:2864class StatusAreaWidget;
65class SystemBackgroundController;
[email protected]c0ce80e2012-10-05 23:28:2766class SystemModalContainerLayoutManager;
[email protected]093b8d642014-04-03 20:59:2867class SystemTray;
[email protected]2b8a9bb2013-07-01 22:43:4068class TouchHudDebug;
69class TouchHudProjection;
[email protected]d90b8392012-06-13 09:34:5670class WorkspaceController;
71
[email protected]438cbdf02013-10-07 23:41:0972#if defined(OS_CHROMEOS)
[email protected]252eb232013-08-14 22:09:2773class BootSplashScreen;
[email protected]7d487592014-07-24 03:54:5074class AshTouchExplorationManager;
[email protected]252eb232013-08-14 22:09:2775#endif
76
skye782a262016-05-31 20:28:5777namespace wm {
78class WmWindow;
79}
80
[email protected]d90b8392012-06-13 09:34:5681// This class maintains the per root window state for ash. This class
82// owns the root window and other dependent objects that should be
[email protected]a273d33a2013-10-17 12:41:2183// deleted upon the deletion of the root window. This object is
oshimae2818922015-07-28 01:18:5284// indirectly owned and deleted by |WindowTreeHostManager|.
[email protected]a273d33a2013-10-17 12:41:2185// The RootWindowController for particular root window is stored in
86// its property (RootWindowSettings) and can be obtained using
[email protected]056ce052014-02-21 05:19:3287// |GetRootWindowController(aura::WindowEventDispatcher*)| function.
jamescook2a5ffa212016-04-29 17:44:0288//
89// NOTE: In classic ash there is one RootWindow per display, so every RootWindow
90// has a RootWindowController. In mus/mash there is one RootWindow per top-level
91// Widget, so not all RootWindows have a RootWindowController.
[email protected]d141b922013-07-09 08:13:1792class ASH_EXPORT RootWindowController : public ShellObserver {
[email protected]d90b8392012-06-13 09:34:5693 public:
[email protected]a273d33a2013-10-17 12:41:2194 // Creates and Initialize the RootWindowController for primary display.
[email protected]f5c9dbc2014-04-11 08:13:4595 static void CreateForPrimaryDisplay(AshWindowTreeHost* host);
[email protected]a273d33a2013-10-17 12:41:2196
97 // Creates and Initialize the RootWindowController for secondary displays.
[email protected]f5c9dbc2014-04-11 08:13:4598 static void CreateForSecondaryDisplay(AshWindowTreeHost* host);
[email protected]d90b8392012-06-13 09:34:5699
[email protected]a0afeb12012-12-10 22:57:09100 // Returns a RootWindowController of the window's root window.
[email protected]ccff3d72013-02-06 04:26:28101 static RootWindowController* ForWindow(const aura::Window* window);
[email protected]a0afeb12012-12-10 22:57:09102
[email protected]d17642d2013-09-12 23:44:38103 // Returns the RootWindowController of the target root window.
[email protected]093b8d642014-04-03 20:59:28104 static RootWindowController* ForTargetRootWindow();
[email protected]a0afeb12012-12-10 22:57:09105
dcheng1f4538e2014-10-27 23:57:05106 ~RootWindowController() override;
[email protected]a273d33a2013-10-17 12:41:21107
[email protected]f5c9dbc2014-04-11 08:13:45108 AshWindowTreeHost* ash_host() { return ash_host_.get(); }
109 const AshWindowTreeHost* ash_host() const { return ash_host_.get(); }
110
111 aura::WindowTreeHost* GetHost();
112 const aura::WindowTreeHost* GetHost() const;
113 aura::Window* GetRootWindow();
114 const aura::Window* GetRootWindow() const;
[email protected]d90b8392012-06-13 09:34:56115
[email protected]c0ce80e2012-10-05 23:28:27116 WorkspaceController* workspace_controller() {
[email protected]d90b8392012-06-13 09:34:56117 return workspace_controller_.get();
118 }
119
[email protected]80549c152013-07-02 01:42:47120 AlwaysOnTopController* always_on_top_controller() {
121 return always_on_top_controller_.get();
122 }
123
jamescook612205f2016-05-26 06:02:11124 // Access the shelf widget associated with this root window controller,
[email protected]478c6c32013-03-09 02:50:58125 // NULL if no such shelf exists.
jamescook6afad6d2016-06-01 00:35:01126 // DEPRECATED: Prefer GetShelf()->shelf_widget().
jamescook612205f2016-05-26 06:02:11127 ShelfWidget* shelf_widget() { return shelf_widget_.get(); }
[email protected]e74aaf0a2012-10-12 18:42:28128
[email protected]2b8a9bb2013-07-01 22:43:40129 // Get touch HUDs associated with this root window controller.
130 TouchHudDebug* touch_hud_debug() const {
131 return touch_hud_debug_;
[email protected]bff17552013-04-25 04:44:55132 }
[email protected]2b8a9bb2013-07-01 22:43:40133 TouchHudProjection* touch_hud_projection() const {
134 return touch_hud_projection_;
135 }
136
137 // Set touch HUDs for this root window controller. The root window controller
138 // will not own the HUDs; their lifetimes are managed by themselves. Whenever
139 // the widget showing a HUD is being destroyed (e.g. because of detaching a
140 // display), the HUD deletes itself.
141 void set_touch_hud_debug(TouchHudDebug* hud) {
142 touch_hud_debug_ = hud;
143 }
144 void set_touch_hud_projection(TouchHudProjection* hud) {
145 touch_hud_projection_ = hud;
146 }
147
[email protected]0bf61732013-07-02 04:35:10148 DesktopBackgroundWidgetController* wallpaper_controller() {
149 return wallpaper_controller_.get();
150 }
151 void SetWallpaperController(DesktopBackgroundWidgetController* controller);
152 AnimatingDesktopController* animating_wallpaper_controller() {
153 return animating_wallpaper_controller_.get();
154 }
155 void SetAnimatingWallpaperController(AnimatingDesktopController* controller);
156
[email protected]478c6c32013-03-09 02:50:58157 // Access the shelf layout manager associated with this root
158 // window controller, NULL if no such shelf exists.
159 ShelfLayoutManager* GetShelfLayoutManager();
[email protected]d90b8392012-06-13 09:34:56160
[email protected]a0afeb12012-12-10 22:57:09161 // Returns the system tray on this root window. Note that
[email protected]864b58552013-12-19 04:19:38162 // calling this on the root window that doesn't have a shelf will
[email protected]a0afeb12012-12-10 22:57:09163 // lead to a crash.
164 SystemTray* GetSystemTray();
165
[email protected]431552c2012-10-23 00:38:33166 // Shows context menu at the |location_in_screen|. This uses
167 // |ShellDelegate::CreateContextMenu| to define the content of the menu.
[email protected]940fb1c2013-06-18 16:54:28168 void ShowContextMenu(const gfx::Point& location_in_screen,
169 ui::MenuSourceType source_type);
[email protected]431552c2012-10-23 00:38:33170
[email protected]8674b312012-10-12 19:02:44171 // Returns the layout-manager for the appropriate modal-container. If the
172 // window is inside the lockscreen modal container, then the layout manager
173 // for that is returned. Otherwise the layout manager for the default modal
174 // container is returned.
175 // If no window is specified (i.e. |window| is NULL), then the lockscreen
176 // modal container is used if the screen is currently locked. Otherwise, the
177 // default modal container is used.
178 SystemModalContainerLayoutManager* GetSystemModalLayoutManager(
179 aura::Window* window);
[email protected]c0ce80e2012-10-05 23:28:27180
[email protected]d90b8392012-06-13 09:34:56181 aura::Window* GetContainer(int container_id);
[email protected]d8a24952013-08-05 20:05:05182 const aura::Window* GetContainer(int container_id) const;
[email protected]d90b8392012-06-13 09:34:56183
[email protected]864b58552013-12-19 04:19:38184 // Show shelf view if it was created hidden (before session has started).
jamescook6afad6d2016-06-01 00:35:01185 // TODO(jamescook): Eliminate this and handle show via Shelf.
[email protected]864b58552013-12-19 04:19:38186 void ShowShelf();
[email protected]e74aaf0a2012-10-12 18:42:28187
jamescook6500ad132016-05-27 06:15:54188 // Creates the shelf for this root window and notifies observers.
189 void CreateShelf();
[email protected]478c6c32013-03-09 02:50:58190
jamescook6afad6d2016-06-01 00:35:01191 // Returns the shelf controller for this root window.
192 Shelf* GetShelf() const;
193
[email protected]16059276d2012-10-22 18:59:50194 // 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);
197
[email protected]bca9a7e2012-11-10 06:25:49198 // 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();
202
[email protected]0bf61732013-07-02 04:35:10203 // 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);
[email protected]d90b8392012-06-13 09:34:56208
[email protected]6675e1c2012-09-11 09:15:45209 // 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();
214
[email protected]d90b8392012-06-13 09:34:56215 // Deletes all child windows and performs necessary cleanup.
216 void CloseChildWindows();
217
[email protected]f1853122012-06-27 16:21:26218 // Moves child windows to |dest|.
[email protected]bf9cdb362013-10-25 19:22:45219 void MoveWindowsTo(aura::Window* dest);
[email protected]f1853122012-06-27 16:21:26220
[email protected]e74aaf0a2012-10-12 18:42:28221 // Force the shelf to query for it's current visibility state.
222 void UpdateShelfVisibility();
223
[email protected]2b8a9bb2013-07-01 22:43:40224 // Initialize touch HUDs if necessary.
225 void InitTouchHuds();
226
[email protected]2c9171d22013-12-10 21:55:10227 // Returns the topmost window or one of its transient parents, if any of them
228 // are in fullscreen mode.
varkhad99fa94f2015-06-29 22:35:46229 aura::Window* GetWindowForFullscreenMode();
[email protected]2ee2f5d2013-01-10 23:37:16230
[email protected]b6ba05d902013-10-04 21:38:45231 // Activate virtual keyboard on current root window controller.
232 void ActivateKeyboard(keyboard::KeyboardController* keyboard_controller);
233
234 // Deactivate virtual keyboard on current root window controller.
235 void DeactivateKeyboard(keyboard::KeyboardController* keyboard_controller);
236
[email protected]602022b2014-03-31 17:07:31237 // Tests if a window is associated with the virtual keyboard.
238 bool IsVirtualKeyboardWindow(aura::Window* window);
239
dmazzoniff86e3472016-06-03 19:52:32240 // If touch exploration is enabled, update the touch exploration
241 // controller so that synthesized touch events are anchored at this point.
242 void SetTouchAccessibilityAnchorPoint(const gfx::Point& anchor_point);
243
[email protected]431552c2012-10-23 00:38:33244 private:
[email protected]f5c9dbc2014-04-11 08:13:45245 explicit RootWindowController(AshWindowTreeHost* host);
[email protected]608de6c2013-10-29 00:14:28246 enum RootWindowType {
247 PRIMARY,
bshee1eb0a22014-09-23 21:18:38248 SECONDARY
[email protected]608de6c2013-10-29 00:14:28249 };
[email protected]a273d33a2013-10-17 12:41:21250
251 // Initializes the RootWindowController. |is_primary| is true if
252 // the controller is for primary display. |first_run_after_boot| is
253 // set to true only for primary root window after boot.
[email protected]608de6c2013-10-29 00:14:28254 void Init(RootWindowType root_window_type, bool first_run_after_boot);
[email protected]a273d33a2013-10-17 12:41:21255
[email protected]756bda12013-07-03 08:17:06256 void InitLayoutManagers();
257
258 // Initializes |system_background_| and possibly also |boot_splash_screen_|.
259 // |is_first_run_after_boot| determines the background's initial color.
260 void CreateSystemBackground(bool is_first_run_after_boot);
261
[email protected]d141b922013-07-09 08:13:17262 // Enables projection touch HUD.
263 void EnableTouchHudProjection();
264
265 // Disables projection touch HUD.
266 void DisableTouchHudProjection();
267
jonrossa90d8982016-05-16 18:14:25268 // Callback for MenuModelAdapter.
269 void OnMenuClosed();
270
[email protected]d141b922013-07-09 08:13:17271 // Overridden from ShellObserver.
dcheng1f4538e2014-10-27 23:57:05272 void OnLoginStateChanged(user::LoginStatus status) override;
273 void OnTouchHudProjectionToggled(bool enabled) override;
[email protected]d141b922013-07-09 08:13:17274
dchenga94547472016-04-08 08:41:11275 std::unique_ptr<AshWindowTreeHost> ash_host_;
skyee78dde2016-06-01 01:21:43276
277 std::unique_ptr<RootWindowControllerCommon> root_window_controller_common_;
278
dchenga94547472016-04-08 08:41:11279 std::unique_ptr<StackingController> stacking_controller_;
[email protected]2a2caa02013-01-22 20:50:36280
jamescook612205f2016-05-26 06:02:11281 // The shelf widget for this root window.
282 std::unique_ptr<ShelfWidget> shelf_widget_;
[email protected]e74aaf0a2012-10-12 18:42:28283
[email protected]cf6fea22013-08-07 14:24:01284 // An invisible/empty window used as a event target for
285 // |MouseCursorEventFilter| before a user logs in.
286 // (crbug.com/266987)
287 // Its container is |LockScreenBackgroundContainer| and
288 // this must be deleted before the container is deleted.
dchenga94547472016-04-08 08:41:11289 std::unique_ptr<aura::Window> mouse_event_target_;
[email protected]cf6fea22013-08-07 14:24:01290
[email protected]beb4e5c2013-06-18 15:37:07291 // Manages layout of docked windows. Owned by DockedContainer.
292 DockedWindowLayoutManager* docked_layout_manager_;
293
[email protected]e74aaf0a2012-10-12 18:42:28294 // Manages layout of panels. Owned by PanelContainer.
[email protected]88d71122012-10-18 07:11:01295 PanelLayoutManager* panel_layout_manager_;
[email protected]e74aaf0a2012-10-12 18:42:28296
dchenga94547472016-04-08 08:41:11297 std::unique_ptr<SystemBackgroundController> system_background_;
[email protected]a825e8312014-05-05 22:05:01298
[email protected]438cbdf02013-10-07 23:41:09299#if defined(OS_CHROMEOS)
dchenga94547472016-04-08 08:41:11300 std::unique_ptr<BootSplashScreen> boot_splash_screen_;
[email protected]a825e8312014-05-05 22:05:01301 // Responsible for initializing TouchExplorationController when spoken
302 // feedback is on.
dchenga94547472016-04-08 08:41:11303 std::unique_ptr<AshTouchExplorationManager> touch_exploration_manager_;
[email protected]252eb232013-08-14 22:09:27304#endif
[email protected]697f04c2012-10-03 01:15:10305
dchenga94547472016-04-08 08:41:11306 std::unique_ptr<WorkspaceController> workspace_controller_;
307 std::unique_ptr<AlwaysOnTopController> always_on_top_controller_;
[email protected]d90b8392012-06-13 09:34:56308
[email protected]2b8a9bb2013-07-01 22:43:40309 // Heads-up displays for touch events. These HUDs are not owned by the root
310 // window controller and manage their own lifetimes.
311 TouchHudDebug* touch_hud_debug_;
312 TouchHudProjection* touch_hud_projection_;
[email protected]58175042013-04-01 19:27:13313
[email protected]3537d472014-01-15 05:45:31314 // Handles double clicks on the panel window header.
dchenga94547472016-04-08 08:41:11315 std::unique_ptr<ui::EventHandler> panel_container_handler_;
[email protected]a4cd6d32012-09-12 03:42:13316
dchenga94547472016-04-08 08:41:11317 std::unique_ptr<DesktopBackgroundWidgetController> wallpaper_controller_;
318 std::unique_ptr<AnimatingDesktopController> animating_wallpaper_controller_;
319 std::unique_ptr<::wm::ScopedCaptureClient> capture_client_;
[email protected]0bf61732013-07-02 04:35:10320
jonrossa90d8982016-05-16 18:14:25321 // Manages the context menu.
322 std::unique_ptr<ui::MenuModel> menu_model_;
323 std::unique_ptr<views::MenuModelAdapter> menu_model_adapter_;
324 std::unique_ptr<views::MenuRunner> menu_runner_;
325
[email protected]d90b8392012-06-13 09:34:56326 DISALLOW_COPY_AND_ASSIGN(RootWindowController);
327};
328
jamescook5d74ac02016-05-12 19:57:12329// On classic ash, returns the RootWindowController for the given |root_window|.
330// On mus ash, returns the RootWindowController for the primary display.
331// See RootWindowController class comment above.
[email protected]6b2d4a0b2013-09-06 06:29:54332ASH_EXPORT RootWindowController* GetRootWindowController(
[email protected]bf9cdb362013-10-25 19:22:45333 const aura::Window* root_window);
[email protected]6b2d4a0b2013-09-06 06:29:54334
[email protected]76bc4632014-06-16 19:07:46335} // namespace ash
[email protected]d90b8392012-06-13 09:34:56336
[email protected]76bc4632014-06-16 19:07:46337#endif // ASH_ROOT_WINDOW_CONTROLLER_H_