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