Ignore non-active fullscreen windows for shelf state.
[chromium-blink-merge.git] / ash / root_window_controller.h
blob6e2d5454427aa4ab65c8df0ffd8209c3a2d0547a
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.
5 #ifndef ASH_ROOT_WINDOW_CONTROLLER_H_
6 #define ASH_ROOT_WINDOW_CONTROLLER_H_
8 #include <map>
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"
20 class SkBitmap;
22 namespace aura {
23 class EventFilter;
24 class Window;
27 namespace gfx {
28 class Point;
31 namespace views {
32 class Widget;
34 namespace corewm {
35 class InputMethodEventFilter;
36 class RootWindowEventFilter;
37 class ScopedCaptureClient;
41 namespace keyboard {
42 class KeyboardController;
45 namespace ash {
46 class ShelfWidget;
47 class SoloWindowTracker;
48 class StackingController;
49 class SystemTray;
50 class ToplevelWindowEventHandler;
52 namespace internal {
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;
69 #if defined(OS_CHROMEOS)
70 class BootSplashScreen;
71 #endif
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:
83 // Creates and Initialize the RootWindowController for primary display.
84 static void CreateForPrimaryDisplay(aura::RootWindow* root_window);
86 // Creates and Initialize the RootWindowController for secondary displays.
87 static void CreateForSecondaryDisplay(aura::RootWindow* root_window);
89 // Creates and Initialize the RootWindowController for virtual
90 // keyboard displays.
91 static void CreateForVirtualKeyboardDisplay(aura::RootWindow* root_window);
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);
99 // Returns a RootWindowController of the window's root window.
100 static RootWindowController* ForWindow(const aura::Window* window);
102 // Returns the RootWindowController of the target root window.
103 static internal::RootWindowController* ForTargetRootWindow();
105 virtual ~RootWindowController();
107 aura::Window* root_window() { return dispatcher()->window(); }
108 aura::WindowEventDispatcher* dispatcher() { return root_window_.get(); }
110 RootWindowLayoutManager* root_window_layout() { return root_window_layout_; }
112 WorkspaceController* workspace_controller() {
113 return workspace_controller_.get();
116 AlwaysOnTopController* always_on_top_controller() {
117 return always_on_top_controller_.get();
120 ScreenDimmer* screen_dimmer() { return screen_dimmer_.get(); }
122 // Access the shelf associated with this root window controller,
123 // NULL if no such shelf exists.
124 ShelfWidget* shelf() { return shelf_.get(); }
126 // Get touch HUDs associated with this root window controller.
127 TouchHudDebug* touch_hud_debug() const {
128 return touch_hud_debug_;
130 TouchHudProjection* touch_hud_projection() const {
131 return touch_hud_projection_;
134 // Set touch HUDs for this root window controller. The root window controller
135 // will not own the HUDs; their lifetimes are managed by themselves. Whenever
136 // the widget showing a HUD is being destroyed (e.g. because of detaching a
137 // display), the HUD deletes itself.
138 void set_touch_hud_debug(TouchHudDebug* hud) {
139 touch_hud_debug_ = hud;
141 void set_touch_hud_projection(TouchHudProjection* hud) {
142 touch_hud_projection_ = hud;
145 DesktopBackgroundWidgetController* wallpaper_controller() {
146 return wallpaper_controller_.get();
148 void SetWallpaperController(DesktopBackgroundWidgetController* controller);
149 AnimatingDesktopController* animating_wallpaper_controller() {
150 return animating_wallpaper_controller_.get();
152 void SetAnimatingWallpaperController(AnimatingDesktopController* controller);
154 SoloWindowTracker* solo_window_tracker() {
155 return solo_window_tracker_.get();
158 // Access the shelf layout manager associated with this root
159 // window controller, NULL if no such shelf exists.
160 ShelfLayoutManager* GetShelfLayoutManager();
162 // Returns the system tray on this root window. Note that
163 // calling this on the root window that doesn't have a launcher will
164 // lead to a crash.
165 SystemTray* GetSystemTray();
167 // Shows context menu at the |location_in_screen|. This uses
168 // |ShellDelegate::CreateContextMenu| to define the content of the menu.
169 void ShowContextMenu(const gfx::Point& location_in_screen,
170 ui::MenuSourceType source_type);
172 // Returns the layout-manager for the appropriate modal-container. If the
173 // window is inside the lockscreen modal container, then the layout manager
174 // for that is returned. Otherwise the layout manager for the default modal
175 // container is returned.
176 // If no window is specified (i.e. |window| is NULL), then the lockscreen
177 // modal container is used if the screen is currently locked. Otherwise, the
178 // default modal container is used.
179 SystemModalContainerLayoutManager* GetSystemModalLayoutManager(
180 aura::Window* window);
182 aura::Window* GetContainer(int container_id);
183 const aura::Window* GetContainer(int container_id) const;
185 // Show launcher view if it was created hidden (before session has started).
186 void ShowLauncher();
188 // Called when the launcher associated with this root window is created.
189 void OnLauncherCreated();
191 // Called when the login status changes after login (such as lock/unlock).
192 // TODO(oshima): Investigate if we can merge this and |OnLoginStateChanged|.
193 void UpdateAfterLoginStatusChange(user::LoginStatus status);
195 // Called when the brightness/grayscale animation from white to the login
196 // desktop background image has started. Starts |boot_splash_screen_|'s
197 // hiding animation (if the screen is non-NULL).
198 void HandleInitialDesktopBackgroundAnimationStarted();
200 // Called when the wallpaper ainmation is finished. Updates |background_|
201 // to be black and drops |boot_splash_screen_| and moves the wallpaper
202 // controller into the root window controller. |widget| holds the wallpaper
203 // image, or NULL if the background is a solid color.
204 void OnWallpaperAnimationFinished(views::Widget* widget);
206 // Deletes associated objects and clears the state, but doesn't delete
207 // the root window yet. This is used to delete a secondary displays'
208 // root window safely when the display disconnect signal is received,
209 // which may come while we're in the nested message loop.
210 void Shutdown();
212 // Deletes all child windows and performs necessary cleanup.
213 void CloseChildWindows();
215 // Moves child windows to |dest|.
216 void MoveWindowsTo(aura::Window* dest);
218 // Force the shelf to query for it's current visibility state.
219 void UpdateShelfVisibility();
221 // Initialize touch HUDs if necessary.
222 void InitTouchHuds();
224 // Returns the topmost window or one of its transient parents, if any of them
225 // are in fullscreen mode.
226 const aura::Window* GetWindowForFullscreenMode() const;
228 // Activate virtual keyboard on current root window controller.
229 void ActivateKeyboard(keyboard::KeyboardController* keyboard_controller);
231 // Deactivate virtual keyboard on current root window controller.
232 void DeactivateKeyboard(keyboard::KeyboardController* keyboard_controller);
234 private:
235 explicit RootWindowController(aura::RootWindow* root_window);
236 enum RootWindowType {
237 PRIMARY,
238 SECONDARY,
239 VIRTUAL_KEYBOARD
242 // Initializes the RootWindowController. |is_primary| is true if
243 // the controller is for primary display. |first_run_after_boot| is
244 // set to true only for primary root window after boot.
245 void Init(RootWindowType root_window_type, bool first_run_after_boot);
247 void InitLayoutManagers();
249 // Initializes |system_background_| and possibly also |boot_splash_screen_|.
250 // |is_first_run_after_boot| determines the background's initial color.
251 void CreateSystemBackground(bool is_first_run_after_boot);
253 // Creates each of the special window containers that holds windows of various
254 // types in the shell UI.
255 void CreateContainersInRootWindow(aura::Window* root_window);
257 // Enables projection touch HUD.
258 void EnableTouchHudProjection();
260 // Disables projection touch HUD.
261 void DisableTouchHudProjection();
263 // Overridden from ShellObserver.
264 virtual void OnLoginStateChanged(user::LoginStatus status) OVERRIDE;
265 virtual void OnTouchHudProjectionToggled(bool enabled) OVERRIDE;
267 scoped_ptr<aura::RootWindow> root_window_;
268 RootWindowLayoutManager* root_window_layout_;
270 scoped_ptr<StackingController> stacking_controller_;
272 // The shelf for managing the launcher and the status widget.
273 scoped_ptr<ShelfWidget> shelf_;
275 // An invisible/empty window used as a event target for
276 // |MouseCursorEventFilter| before a user logs in.
277 // (crbug.com/266987)
278 // Its container is |LockScreenBackgroundContainer| and
279 // this must be deleted before the container is deleted.
280 scoped_ptr<aura::Window> mouse_event_target_;
282 // Manages layout of docked windows. Owned by DockedContainer.
283 DockedWindowLayoutManager* docked_layout_manager_;
285 // Manages layout of panels. Owned by PanelContainer.
286 PanelLayoutManager* panel_layout_manager_;
288 scoped_ptr<SystemBackgroundController> system_background_;
289 #if defined(OS_CHROMEOS)
290 scoped_ptr<BootSplashScreen> boot_splash_screen_;
291 #endif
293 scoped_ptr<ScreenDimmer> screen_dimmer_;
294 scoped_ptr<WorkspaceController> workspace_controller_;
295 scoped_ptr<AlwaysOnTopController> always_on_top_controller_;
297 // Heads-up displays for touch events. These HUDs are not owned by the root
298 // window controller and manage their own lifetimes.
299 TouchHudDebug* touch_hud_debug_;
300 TouchHudProjection* touch_hud_projection_;
302 // We need to own event handlers for various containers.
303 scoped_ptr<ToplevelWindowEventHandler> default_container_handler_;
304 scoped_ptr<ToplevelWindowEventHandler> always_on_top_container_handler_;
305 scoped_ptr<ToplevelWindowEventHandler> modal_container_handler_;
306 scoped_ptr<ToplevelWindowEventHandler> lock_modal_container_handler_;
307 scoped_ptr<ToplevelWindowEventHandler> panel_container_handler_;
308 scoped_ptr<ToplevelWindowEventHandler> docked_container_handler_;
310 scoped_ptr<DesktopBackgroundWidgetController> wallpaper_controller_;
311 scoped_ptr<AnimatingDesktopController> animating_wallpaper_controller_;
312 scoped_ptr<views::corewm::ScopedCaptureClient> capture_client_;
313 scoped_ptr<SoloWindowTracker> solo_window_tracker_;
315 DISALLOW_COPY_AND_ASSIGN(RootWindowController);
319 // Gets the RootWindowController for |root_window|.
320 ASH_EXPORT RootWindowController* GetRootWindowController(
321 const aura::Window* root_window);
323 } // namespace internal
324 } // ash
326 #endif // ASH_ROOT_WINDOW_CONTROLLER_H_