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/root_window.h" 17 #include "ui/aura/window.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 views { 32 class Widget; 33 34 namespace corewm { 35 class InputMethodEventFilter; 36 class RootWindowEventFilter; 37 class ScopedCaptureClient; 38 } 39 } 40 41 namespace keyboard { 42 class KeyboardController; 43 } 44 45 namespace ash { 46 class ShelfWidget; 47 class SoloWindowTracker; 48 class StackingController; 49 class SystemTray; 50 class ToplevelWindowEventHandler; 51 52 namespace internal { 53 54 class AlwaysOnTopController; 55 class AnimatingDesktopController; 56 class DesktopBackgroundWidgetController; 57 class DockedWindowLayoutManager; 58 class PanelLayoutManager; 59 class RootWindowLayoutManager; 60 class ScreenDimmer; 61 class ShelfLayoutManager; 62 class StatusAreaWidget; 63 class SystemBackgroundController; 64 class SystemModalContainerLayoutManager; 65 class TouchHudDebug; 66 class TouchHudProjection; 67 class WorkspaceController; 68 69 #if defined(OS_CHROMEOS) 70 class BootSplashScreen; 71 #endif 72 73 // This class maintains the per root window state for ash. This class 74 // owns the root window and other dependent objects that should be 75 // deleted upon the deletion of the root window. This object is 76 // indirectly owned and deleted by |DisplayController|. 77 // The RootWindowController for particular root window is stored in 78 // its property (RootWindowSettings) and can be obtained using 79 // |GetRootWindowController(aura::RootWindow*)| function. 80 class ASH_EXPORT RootWindowController : public ShellObserver { 81 public: 82 83 // Creates and Initialize the RootWindowController for primary display. 84 static void CreateForPrimaryDisplay(aura::RootWindow* root_window); 85 86 // Creates and Initialize the RootWindowController for secondary displays. 87 static void CreateForSecondaryDisplay(aura::RootWindow* root_window); 88 89 // Creates and Initialize the RootWindowController for virtual 90 // keyboard displays. 91 static void CreateForVirtualKeyboardDisplay(aura::RootWindow* root_window); 92 93 // Returns a RootWindowController that has a launcher for given 94 // |window|. This returns the RootWindowController for the |window|'s 95 // root window when multiple launcher mode is enabled, or the primary 96 // RootWindowController otherwise. 97 static RootWindowController* ForLauncher(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 internal::RootWindowController* ForTargetRootWindow(); 104 105 // Returns container which contains a given |window|. 106 static aura::Window* GetContainerForWindow(aura::Window* window); 107 108 virtual ~RootWindowController(); 109 110 aura::Window* root_window() { return dispatcher()->window(); } 111 aura::WindowEventDispatcher* dispatcher() { return root_window_.get(); } 112 113 RootWindowLayoutManager* root_window_layout() { return root_window_layout_; } 114 115 WorkspaceController* workspace_controller() { 116 return workspace_controller_.get(); 117 } 118 119 AlwaysOnTopController* always_on_top_controller() { 120 return always_on_top_controller_.get(); 121 } 122 123 ScreenDimmer* screen_dimmer() { return screen_dimmer_.get(); } 124 125 // Access the shelf associated with this root window controller, 126 // NULL if no such shelf exists. 127 ShelfWidget* shelf() { return shelf_.get(); } 128 129 // Get touch HUDs associated with this root window controller. 130 TouchHudDebug* touch_hud_debug() const { 131 return touch_hud_debug_; 132 } 133 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 148 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 157 SoloWindowTracker* solo_window_tracker() { 158 return solo_window_tracker_.get(); 159 } 160 161 // Access the shelf layout manager associated with this root 162 // window controller, NULL if no such shelf exists. 163 ShelfLayoutManager* GetShelfLayoutManager(); 164 165 // Returns the system tray on this root window. Note that 166 // calling this on the root window that doesn't have a launcher will 167 // lead to a crash. 168 SystemTray* GetSystemTray(); 169 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); 174 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); 184 185 aura::Window* GetContainer(int container_id); 186 const aura::Window* GetContainer(int container_id) const; 187 188 // Show launcher view if it was created hidden (before session has started). 189 void ShowLauncher(); 190 191 // Called when the launcher associated with this root window is created. 192 void OnLauncherCreated(); 193 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); 197 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(); 202 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); 208 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(); 214 215 // Deletes all child windows and performs necessary cleanup. 216 void CloseChildWindows(); 217 218 // Moves child windows to |dest|. 219 void MoveWindowsTo(aura::Window* dest); 220 221 // Force the shelf to query for it's current visibility state. 222 void UpdateShelfVisibility(); 223 224 // Initialize touch HUDs if necessary. 225 void InitTouchHuds(); 226 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; 230 231 // 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 237 private: 238 explicit RootWindowController(aura::RootWindow* root_window); 239 enum RootWindowType { 240 PRIMARY, 241 SECONDARY, 242 VIRTUAL_KEYBOARD 243 }; 244 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); 249 250 void InitLayoutManagers(); 251 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); 255 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); 259 260 // Enables projection touch HUD. 261 void EnableTouchHudProjection(); 262 263 // Disables projection touch HUD. 264 void DisableTouchHudProjection(); 265 266 // Overridden from ShellObserver. 267 virtual void OnLoginStateChanged(user::LoginStatus status) OVERRIDE; 268 virtual void OnTouchHudProjectionToggled(bool enabled) OVERRIDE; 269 270 scoped_ptr<aura::RootWindow> root_window_; 271 RootWindowLayoutManager* root_window_layout_; 272 273 scoped_ptr<StackingController> stacking_controller_; 274 275 // The shelf for managing the launcher and the status widget. 276 scoped_ptr<ShelfWidget> shelf_; 277 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_; 284 285 // Manages layout of docked windows. Owned by DockedContainer. 286 DockedWindowLayoutManager* docked_layout_manager_; 287 288 // Manages layout of panels. Owned by PanelContainer. 289 PanelLayoutManager* panel_layout_manager_; 290 291 scoped_ptr<SystemBackgroundController> system_background_; 292 #if defined(OS_CHROMEOS) 293 scoped_ptr<BootSplashScreen> boot_splash_screen_; 294 #endif 295 296 scoped_ptr<ScreenDimmer> screen_dimmer_; 297 scoped_ptr<WorkspaceController> workspace_controller_; 298 scoped_ptr<AlwaysOnTopController> always_on_top_controller_; 299 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_; 304 305 // We need to own event handlers for various containers. 306 scoped_ptr<ToplevelWindowEventHandler> default_container_handler_; 307 scoped_ptr<ToplevelWindowEventHandler> always_on_top_container_handler_; 308 scoped_ptr<ToplevelWindowEventHandler> modal_container_handler_; 309 scoped_ptr<ToplevelWindowEventHandler> lock_modal_container_handler_; 310 scoped_ptr<ToplevelWindowEventHandler> panel_container_handler_; 311 scoped_ptr<ToplevelWindowEventHandler> docked_container_handler_; 312 313 scoped_ptr<DesktopBackgroundWidgetController> wallpaper_controller_; 314 scoped_ptr<AnimatingDesktopController> animating_wallpaper_controller_; 315 scoped_ptr<views::corewm::ScopedCaptureClient> capture_client_; 316 scoped_ptr<SoloWindowTracker> solo_window_tracker_; 317 318 DISALLOW_COPY_AND_ASSIGN(RootWindowController); 319 }; 320 321 322 // Gets the RootWindowController for |root_window|. 323 ASH_EXPORT RootWindowController* GetRootWindowController( 324 const aura::Window* root_window); 325 326 } // namespace internal 327 } // ash 328 329 #endif // ASH_ROOT_WINDOW_CONTROLLER_H_ 330