blob: ca51a83a247e7353b5dbf6e3f8aa68d6e4443583 [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>
skyabcae812017-01-18 17:01:3410#include <vector>
[email protected]2b8a9bb2013-07-01 22:43:4011
[email protected]c0ce80e2012-10-05 23:28:2712#include "ash/ash_export.h"
jamescookd4649fa2016-09-30 17:50:0913#include "ash/public/cpp/shelf_types.h"
yoshiki iguchi4a10c5f2017-11-29 20:16:5414#include "ash/sidebar/sidebar.h"
James Cookb0bf8e82017-04-09 17:01:4415#include "ash/wm/workspace/workspace_types.h"
avidb567a8a2015-12-20 17:07:2416#include "base/macros.h"
[email protected]f7c05b22013-11-12 21:07:2417#include "ui/aura/window.h"
[email protected]2f2620332014-02-28 10:07:3818#include "ui/aura/window_tree_host.h"
[email protected]d90b8392012-06-13 09:34:5619
[email protected]d90b8392012-06-13 09:34:5620namespace aura {
[email protected]d90b8392012-06-13 09:34:5621class Window;
[email protected]4a59e4e2012-11-12 21:15:4022}
23
24namespace gfx {
25class Point;
26}
27
[email protected]86459e2c2013-04-10 13:39:2428namespace keyboard {
29class KeyboardController;
30}
31
[email protected]3537d472014-01-15 05:45:3132namespace ui {
33class EventHandler;
Alex Newcomer76f7dab62018-02-02 17:23:3734class SimpleMenuModel;
sky00f98a372017-01-11 06:03:4935class WindowTreeHost;
[email protected]3537d472014-01-15 05:45:3136}
37
[email protected]e319c7e2014-03-14 19:56:1438namespace views {
skyb6643832017-01-11 22:08:4539class MenuRunner;
[email protected]e319c7e2014-03-14 19:56:1440}
41
42namespace wm {
[email protected]e319c7e2014-03-14 19:56:1443class ScopedCaptureClient;
44}
45
[email protected]d90b8392012-06-13 09:34:5646namespace ash {
skyb6643832017-01-11 22:08:4547class AlwaysOnTopController;
jamescook01bf23e72017-01-09 19:58:1548class AshTouchExplorationManager;
[email protected]f5c9dbc2014-04-11 08:13:4549class AshWindowTreeHost;
Toni Barzic98c44eb2017-10-13 20:57:5050class LockScreenActionBackgroundController;
mswb2416052016-06-24 21:23:4551enum class LoginStatus;
[email protected]e74aaf0a2012-10-12 18:42:2852class PanelLayoutManager;
James Cook840177e2017-05-25 02:20:0153class Shelf;
[email protected]e74aaf0a2012-10-12 18:42:2854class ShelfLayoutManager;
yoshiki iguchi4a10c5f2017-11-29 20:16:5455class Sidebar;
[email protected]093b8d642014-04-03 20:59:2856class StackingController;
[email protected]e74aaf0a2012-10-12 18:42:2857class StatusAreaWidget;
skyb6643832017-01-11 22:08:4558class SystemModalContainerLayoutManager;
[email protected]093b8d642014-04-03 20:59:2859class SystemTray;
msw607227f82016-08-30 17:22:3960class SystemWallpaperController;
[email protected]2b8a9bb2013-07-01 22:43:4061class TouchHudDebug;
62class TouchHudProjection;
skyb6643832017-01-11 22:08:4563class WallpaperWidgetController;
sky8a8ffd22017-01-19 15:55:2964class WindowManager;
Scott Violet58ae95b2017-11-15 06:25:5365class WorkspaceController;
sky00f98a372017-01-11 06:03:4966
skyb6643832017-01-11 22:08:4567namespace wm {
68class RootWindowLayoutManager;
69}
70
[email protected]d90b8392012-06-13 09:34:5671// This class maintains the per root window state for ash. This class
72// owns the root window and other dependent objects that should be
[email protected]a273d33a2013-10-17 12:41:2173// deleted upon the deletion of the root window. This object is
oshimae2818922015-07-28 01:18:5274// indirectly owned and deleted by |WindowTreeHostManager|.
[email protected]a273d33a2013-10-17 12:41:2175// The RootWindowController for particular root window is stored in
76// its property (RootWindowSettings) and can be obtained using
msw257a6a232017-06-01 01:46:3077// |RootWindowController::ForWindow(aura::Window*)| function.
James Cookbd0b7792017-11-17 03:24:2678class ASH_EXPORT RootWindowController {
[email protected]d90b8392012-06-13 09:34:5679 public:
sky00f98a372017-01-11 06:03:4980 // Enumerates the type of display. If there is only a single display then
81 // it is primary. In a multi-display environment one monitor is deemed the
82 // PRIMARY and all others SECONDARY.
83 enum class RootWindowType { PRIMARY, SECONDARY };
84
James Cookbd0b7792017-11-17 03:24:2685 ~RootWindowController();
sky00f98a372017-01-11 06:03:4986
[email protected]a273d33a2013-10-17 12:41:2187 // Creates and Initialize the RootWindowController for primary display.
[email protected]f5c9dbc2014-04-11 08:13:4588 static void CreateForPrimaryDisplay(AshWindowTreeHost* host);
[email protected]a273d33a2013-10-17 12:41:2189
90 // Creates and Initialize the RootWindowController for secondary displays.
[email protected]f5c9dbc2014-04-11 08:13:4591 static void CreateForSecondaryDisplay(AshWindowTreeHost* host);
[email protected]d90b8392012-06-13 09:34:5692
[email protected]a0afeb12012-12-10 22:57:0993 // Returns a RootWindowController of the window's root window.
[email protected]ccff3d72013-02-06 04:26:2894 static RootWindowController* ForWindow(const aura::Window* window);
[email protected]a0afeb12012-12-10 22:57:0995
[email protected]d17642d2013-09-12 23:44:3896 // Returns the RootWindowController of the target root window.
[email protected]093b8d642014-04-03 20:59:2897 static RootWindowController* ForTargetRootWindow();
[email protected]a0afeb12012-12-10 22:57:0998
skyabcae812017-01-18 17:01:3499 static std::vector<RootWindowController*> root_window_controllers() {
100 return root_window_controllers_ ? *root_window_controllers_
101 : std::vector<RootWindowController*>();
102 }
103
sky00f98a372017-01-11 06:03:49104 // TODO(sky): move these to a separate class or use AshWindowTreeHost in
105 // mash. http://crbug.com/671246.
[email protected]f5c9dbc2014-04-11 08:13:45106 AshWindowTreeHost* ash_host() { return ash_host_.get(); }
107 const AshWindowTreeHost* ash_host() const { return ash_host_.get(); }
108
109 aura::WindowTreeHost* GetHost();
110 const aura::WindowTreeHost* GetHost() const;
111 aura::Window* GetRootWindow();
112 const aura::Window* GetRootWindow() const;
[email protected]d90b8392012-06-13 09:34:56113
skyb6643832017-01-11 22:08:45114 WorkspaceController* workspace_controller() {
115 return workspace_controller_.get();
116 }
117
118 wm::WorkspaceWindowState GetWorkspaceWindowState();
[email protected]d90b8392012-06-13 09:34:56119
James Cook840177e2017-05-25 02:20:01120 Shelf* shelf() const { return shelf_.get(); }
jamescookbe6ed822016-06-06 20:08:55121
yoshiki iguchi4a10c5f2017-11-29 20:16:54122 // Returns the instance of the sidebar.
123 Sidebar* sidebar() { return sidebar_.get(); }
124
[email protected]2b8a9bb2013-07-01 22:43:40125 // Get touch HUDs associated with this root window controller.
jamescookb8dcef522016-06-25 14:42:55126 TouchHudDebug* touch_hud_debug() const { return touch_hud_debug_; }
[email protected]2b8a9bb2013-07-01 22:43:40127 TouchHudProjection* touch_hud_projection() const {
128 return touch_hud_projection_;
129 }
130
131 // Set touch HUDs for this root window controller. The root window controller
132 // will not own the HUDs; their lifetimes are managed by themselves. Whenever
133 // the widget showing a HUD is being destroyed (e.g. because of detaching a
134 // display), the HUD deletes itself.
jamescookb8dcef522016-06-25 14:42:55135 void set_touch_hud_debug(TouchHudDebug* hud) { touch_hud_debug_ = hud; }
[email protected]2b8a9bb2013-07-01 22:43:40136 void set_touch_hud_projection(TouchHudProjection* hud) {
137 touch_hud_projection_ = hud;
138 }
139
skyb6643832017-01-11 22:08:45140 PanelLayoutManager* panel_layout_manager() { return panel_layout_manager_; }
141
142 wm::RootWindowLayoutManager* root_window_layout_manager() {
143 return root_window_layout_manager_;
144 }
145
[email protected]478c6c32013-03-09 02:50:58146 // Access the shelf layout manager associated with this root
147 // window controller, NULL if no such shelf exists.
148 ShelfLayoutManager* GetShelfLayoutManager();
[email protected]d90b8392012-06-13 09:34:56149
skyb6643832017-01-11 22:08:45150 // Returns the layout manager for the appropriate modal-container. If the
151 // window is inside the lockscreen modal container, then the layout manager
152 // for that is returned. Otherwise the layout manager for the default modal
153 // container is returned.
154 // If no window is specified (i.e. |window| is null), then the lockscreen
155 // modal container is used if the screen is currently locked. Otherwise, the
156 // default modal container is used.
157 SystemModalContainerLayoutManager* GetSystemModalLayoutManager(
sky97f9a7432017-05-09 05:14:31158 aura::Window* window);
skyb6643832017-01-11 22:08:45159
160 AlwaysOnTopController* always_on_top_controller() {
161 return always_on_top_controller_.get();
162 }
163
jamescookb551aba2016-09-01 01:00:16164 // May return null, for example for a secondary monitor at the login screen.
165 StatusAreaWidget* GetStatusAreaWidget();
166
[email protected]a0afeb12012-12-10 22:57:09167 // Returns the system tray on this root window. Note that
[email protected]864b58552013-12-19 04:19:38168 // calling this on the root window that doesn't have a shelf will
[email protected]a0afeb12012-12-10 22:57:09169 // lead to a crash.
170 SystemTray* GetSystemTray();
171
oshima9a61ecf2016-06-18 10:43:05172 // True if the window can receive events on this root window.
173 bool CanWindowReceiveEvents(aura::Window* window);
174
skyb6643832017-01-11 22:08:45175 // Returns the window events will be targeted at for the specified location
176 // (in screen coordinates).
177 //
178 // NOTE: the returned window may not contain the location as resize handles
179 // may extend outside the bounds of the window.
sky4befdb0d2017-05-18 23:50:26180 aura::Window* FindEventTarget(const gfx::Point& location_in_screen);
skyb6643832017-01-11 22:08:45181
182 // Gets the last location seen in a mouse event in this root window's
183 // coordinates. This may return a point outside the root window's bounds.
184 gfx::Point GetLastMouseLocationInRoot();
185
[email protected]d90b8392012-06-13 09:34:56186 aura::Window* GetContainer(int container_id);
[email protected]d8a24952013-08-05 20:05:05187 const aura::Window* GetContainer(int container_id) const;
[email protected]d90b8392012-06-13 09:34:56188
skyb6643832017-01-11 22:08:45189 WallpaperWidgetController* wallpaper_widget_controller() {
190 return wallpaper_widget_controller_.get();
191 }
skyb6643832017-01-11 22:08:45192
Toni Barzic98c44eb2017-10-13 20:57:50193 LockScreenActionBackgroundController*
194 lock_screen_action_background_controller() {
195 return lock_screen_action_background_controller_.get();
196 }
197
[email protected]6675e1c2012-09-11 09:15:45198 // Deletes associated objects and clears the state, but doesn't delete
199 // the root window yet. This is used to delete a secondary displays'
200 // root window safely when the display disconnect signal is received,
gab2998ee72017-05-05 16:23:50201 // which may come while we're in the nested run loop.
[email protected]6675e1c2012-09-11 09:15:45202 void Shutdown();
203
[email protected]d90b8392012-06-13 09:34:56204 // Deletes all child windows and performs necessary cleanup.
205 void CloseChildWindows();
206
[email protected]f1853122012-06-27 16:21:26207 // Moves child windows to |dest|.
[email protected]bf9cdb362013-10-25 19:22:45208 void MoveWindowsTo(aura::Window* dest);
[email protected]f1853122012-06-27 16:21:26209
[email protected]e74aaf0a2012-10-12 18:42:28210 // Force the shelf to query for it's current visibility state.
211 void UpdateShelfVisibility();
212
[email protected]2b8a9bb2013-07-01 22:43:40213 // Initialize touch HUDs if necessary.
214 void InitTouchHuds();
215
[email protected]2c9171d22013-12-10 21:55:10216 // Returns the topmost window or one of its transient parents, if any of them
217 // are in fullscreen mode.
varkhad99fa94f2015-06-29 22:35:46218 aura::Window* GetWindowForFullscreenMode();
[email protected]2ee2f5d2013-01-10 23:37:16219
[email protected]b6ba05d902013-10-04 21:38:45220 // Activate virtual keyboard on current root window controller.
221 void ActivateKeyboard(keyboard::KeyboardController* keyboard_controller);
222
223 // Deactivate virtual keyboard on current root window controller.
224 void DeactivateKeyboard(keyboard::KeyboardController* keyboard_controller);
225
dmazzoniff86e3472016-06-03 19:52:32226 // If touch exploration is enabled, update the touch exploration
227 // controller so that synthesized touch events are anchored at this point.
228 void SetTouchAccessibilityAnchorPoint(const gfx::Point& anchor_point);
229
skyb6643832017-01-11 22:08:45230 // Shows a context menu at the |location_in_screen|.
231 void ShowContextMenu(const gfx::Point& location_in_screen,
232 ui::MenuSourceType source_type);
Sammie Quon646e2632018-02-27 19:55:40233 void HideContextMenu();
skyb6643832017-01-11 22:08:45234
235 // Called when the login status changes after login (such as lock/unlock).
skyb6643832017-01-11 22:08:45236 void UpdateAfterLoginStatusChange(LoginStatus status);
237
[email protected]431552c2012-10-23 00:38:33238 private:
Sammie Quon646e2632018-02-27 19:55:40239 FRIEND_TEST_ALL_PREFIXES(RootWindowControllerTest,
240 ContextMenuDisappearsInTabletMode);
241
sky00f98a372017-01-11 06:03:49242 // TODO(sky): remove this. Temporary during ash-mus unification.
243 // http://crbug.com/671246.
Scott Violet58ae95b2017-11-15 06:25:53244 friend class WindowManager;
sky00f98a372017-01-11 06:03:49245
246 // Creates a new RootWindowController with the specified host. Only one of
247 // |ash_host| or |window_tree_host| should be specified. This takes ownership
248 // of the supplied arguments.
249 // TODO(sky): mash should create AshWindowTreeHost, http://crbug.com/671246.
250 RootWindowController(AshWindowTreeHost* ash_host,
251 aura::WindowTreeHost* window_tree_host);
[email protected]a273d33a2013-10-17 12:41:21252
jamescookfda159002016-10-21 18:48:57253 // Initializes the RootWindowController based on |root_window_type|.
254 void Init(RootWindowType root_window_type);
[email protected]a273d33a2013-10-17 12:41:21255
[email protected]756bda12013-07-03 08:17:06256 void InitLayoutManagers();
257
Aga Wronskae195ad22017-12-20 01:38:11258 // Initializes the shelf for this root window and notifies observers.
259 void InitializeShelf();
260
varkha515b43462017-05-26 23:21:27261 // Creates the containers (aura::Windows) used by the shell.
skyb6643832017-01-11 22:08:45262 void CreateContainers();
263
msw607227f82016-08-30 17:22:39264 // Initializes |system_wallpaper_| and possibly also |boot_splash_screen_|.
jamescookfda159002016-10-21 18:48:57265 // The initial color is determined by the |root_window_type| and whether or
266 // not this is the first boot.
267 void CreateSystemWallpaper(RootWindowType root_window_type);
[email protected]756bda12013-07-03 08:17:06268
sky27344382017-03-08 21:30:32269 // Resets Shell::GetRootWindowForNewWindows() if appropriate. This is called
skyb6643832017-01-11 22:08:45270 // during shutdown to make sure GetRootWindowForNewWindows() isn't referencing
271 // this.
272 void ResetRootForNewWindowsIfNecessary();
273
Alexander Shabalin5c910fc2017-12-08 23:29:47274 // Callback for MenuRunner.
Alex Newcomer76f7dab62018-02-02 17:23:37275 void OnMenuClosed(const base::TimeTicks desktop_context_menu_show_time);
sky8d971a0a2016-09-21 23:37:57276
Toni Barzic712399152018-02-15 17:38:40277 // Passed as callback to |wallpaper_widget_controller_| - run when the
278 // wallpaper widget is first set.
279 void OnFirstWallpaperWidgetSet();
280
dchenga94547472016-04-08 08:41:11281 std::unique_ptr<AshWindowTreeHost> ash_host_;
sky00f98a372017-01-11 06:03:49282 std::unique_ptr<aura::WindowTreeHost> mus_window_tree_host_;
283 // This comes from |ash_host_| or |mus_window_tree_host_|.
284 aura::WindowTreeHost* window_tree_host_;
skyee78dde2016-06-01 01:21:43285
skyb6643832017-01-11 22:08:45286 // LayoutManagers are owned by the window they are installed on.
skyb6643832017-01-11 22:08:45287 PanelLayoutManager* panel_layout_manager_ = nullptr;
288 wm::RootWindowLayoutManager* root_window_layout_manager_ = nullptr;
289
290 std::unique_ptr<WallpaperWidgetController> wallpaper_widget_controller_;
skyb6643832017-01-11 22:08:45291 std::unique_ptr<WorkspaceController> workspace_controller_;
292
293 std::unique_ptr<AlwaysOnTopController> always_on_top_controller_;
294
295 // Manages the context menu.
Alex Newcomer76f7dab62018-02-02 17:23:37296 std::unique_ptr<ui::SimpleMenuModel> menu_model_;
skyb6643832017-01-11 22:08:45297 std::unique_ptr<views::MenuRunner> menu_runner_;
skyee78dde2016-06-01 01:21:43298
dchenga94547472016-04-08 08:41:11299 std::unique_ptr<StackingController> stacking_controller_;
[email protected]2a2caa02013-01-22 20:50:36300
jamescookbe6ed822016-06-06 20:08:55301 // The shelf controller for this root window. Exists for the entire lifetime
302 // of the RootWindowController so that it is safe for observers to be added
303 // to it during construction of the shelf widget and status tray.
James Cook840177e2017-05-25 02:20:01304 std::unique_ptr<Shelf> shelf_;
yoshiki iguchi4a10c5f2017-11-29 20:16:54305 std::unique_ptr<Sidebar> sidebar_;
jamescookbe6ed822016-06-06 20:08:55306
jamescook788b4fc2017-05-18 16:16:06307 // TODO(jamescook): Eliminate this. It is left over from legacy shelf code and
308 // doesn't mean anything in particular.
309 bool shelf_initialized_ = false;
310
msw607227f82016-08-30 17:22:39311 std::unique_ptr<SystemWallpaperController> system_wallpaper_;
[email protected]a825e8312014-05-05 22:05:01312
[email protected]a825e8312014-05-05 22:05:01313 // Responsible for initializing TouchExplorationController when spoken
314 // feedback is on.
dchenga94547472016-04-08 08:41:11315 std::unique_ptr<AshTouchExplorationManager> touch_exploration_manager_;
[email protected]697f04c2012-10-03 01:15:10316
[email protected]2b8a9bb2013-07-01 22:43:40317 // Heads-up displays for touch events. These HUDs are not owned by the root
318 // window controller and manage their own lifetimes.
skyb6643832017-01-11 22:08:45319 TouchHudDebug* touch_hud_debug_ = nullptr;
320 TouchHudProjection* touch_hud_projection_ = nullptr;
[email protected]58175042013-04-01 19:27:13321
[email protected]3537d472014-01-15 05:45:31322 // Handles double clicks on the panel window header.
dchenga94547472016-04-08 08:41:11323 std::unique_ptr<ui::EventHandler> panel_container_handler_;
[email protected]a4cd6d32012-09-12 03:42:13324
dchenga94547472016-04-08 08:41:11325 std::unique_ptr<::wm::ScopedCaptureClient> capture_client_;
[email protected]0bf61732013-07-02 04:35:10326
Toni Barzic98c44eb2017-10-13 20:57:50327 std::unique_ptr<LockScreenActionBackgroundController>
328 lock_screen_action_background_controller_;
329
skyabcae812017-01-18 17:01:34330 static std::vector<RootWindowController*>* root_window_controllers_;
331
[email protected]d90b8392012-06-13 09:34:56332 DISALLOW_COPY_AND_ASSIGN(RootWindowController);
333};
334
[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_