Update optimize_png_files.sh to work on msysgit bash.
[chromium-blink-merge.git] / ash / root_window_controller.h
blobb7a059f0b7903986f5649d6f8a48b3ba7cf12b03
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/window.h"
17 #include "ui/aura/window_tree_host.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 keyboard {
32 class KeyboardController;
35 namespace ui {
36 class EventHandler;
39 namespace views {
40 class Widget;
43 namespace wm {
44 class InputMethodEventFilter;
45 class RootWindowEventFilter;
46 class ScopedCaptureClient;
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;
69 #if defined(OS_CHROMEOS)
70 class BootSplashScreen;
71 class AccessibilityObserver;
72 #endif
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:
84 // Creates and Initialize the RootWindowController for primary display.
85 static void CreateForPrimaryDisplay(AshWindowTreeHost* host);
87 // Creates and Initialize the RootWindowController for secondary displays.
88 static void CreateForSecondaryDisplay(AshWindowTreeHost* host);
90 // Creates and Initialize the RootWindowController for virtual
91 // keyboard displays.
92 static void CreateForVirtualKeyboardDisplay(AshWindowTreeHost* host);
94 // Returns a RootWindowController that has a shelf for given
95 // |window|. This returns the RootWindowController for the |window|'s
96 // root window when multiple shelf mode is enabled, or the primary
97 // RootWindowController otherwise.
98 static RootWindowController* ForShelf(aura::Window* window);
100 // Returns a RootWindowController of the window's root window.
101 static RootWindowController* ForWindow(const aura::Window* window);
103 // Returns the RootWindowController of the target root window.
104 static RootWindowController* ForTargetRootWindow();
106 // Returns container which contains a given |window|.
107 static aura::Window* GetContainerForWindow(aura::Window* window);
109 virtual ~RootWindowController();
111 AshWindowTreeHost* ash_host() { return ash_host_.get(); }
112 const AshWindowTreeHost* ash_host() const { return ash_host_.get(); }
114 aura::WindowTreeHost* GetHost();
115 const aura::WindowTreeHost* GetHost() const;
116 aura::Window* GetRootWindow();
117 const aura::Window* GetRootWindow() const;
119 RootWindowLayoutManager* root_window_layout() { return root_window_layout_; }
121 WorkspaceController* workspace_controller() {
122 return workspace_controller_.get();
125 AlwaysOnTopController* always_on_top_controller() {
126 return always_on_top_controller_.get();
129 ScreenDimmer* screen_dimmer() { return screen_dimmer_.get(); }
131 // Access the shelf associated with this root window controller,
132 // NULL if no such shelf exists.
133 ShelfWidget* shelf() { return shelf_.get(); }
135 // Get touch HUDs associated with this root window controller.
136 TouchHudDebug* touch_hud_debug() const {
137 return touch_hud_debug_;
139 TouchHudProjection* touch_hud_projection() const {
140 return touch_hud_projection_;
143 // Set touch HUDs for this root window controller. The root window controller
144 // will not own the HUDs; their lifetimes are managed by themselves. Whenever
145 // the widget showing a HUD is being destroyed (e.g. because of detaching a
146 // display), the HUD deletes itself.
147 void set_touch_hud_debug(TouchHudDebug* hud) {
148 touch_hud_debug_ = hud;
150 void set_touch_hud_projection(TouchHudProjection* hud) {
151 touch_hud_projection_ = hud;
154 DesktopBackgroundWidgetController* wallpaper_controller() {
155 return wallpaper_controller_.get();
157 void SetWallpaperController(DesktopBackgroundWidgetController* controller);
158 AnimatingDesktopController* animating_wallpaper_controller() {
159 return animating_wallpaper_controller_.get();
161 void SetAnimatingWallpaperController(AnimatingDesktopController* controller);
163 // Access the shelf layout manager associated with this root
164 // window controller, NULL if no such shelf exists.
165 ShelfLayoutManager* GetShelfLayoutManager();
167 // Returns the system tray on this root window. Note that
168 // calling this on the root window that doesn't have a shelf will
169 // lead to a crash.
170 SystemTray* GetSystemTray();
172 // Shows context menu at the |location_in_screen|. This uses
173 // |ShellDelegate::CreateContextMenu| to define the content of the menu.
174 void ShowContextMenu(const gfx::Point& location_in_screen,
175 ui::MenuSourceType source_type);
177 // Returns the layout-manager for the appropriate modal-container. If the
178 // window is inside the lockscreen modal container, then the layout manager
179 // for that is returned. Otherwise the layout manager for the default modal
180 // container is returned.
181 // If no window is specified (i.e. |window| is NULL), then the lockscreen
182 // modal container is used if the screen is currently locked. Otherwise, the
183 // default modal container is used.
184 SystemModalContainerLayoutManager* GetSystemModalLayoutManager(
185 aura::Window* window);
187 aura::Window* GetContainer(int container_id);
188 const aura::Window* GetContainer(int container_id) const;
190 // Show shelf view if it was created hidden (before session has started).
191 void ShowShelf();
193 // Called when the shelf associated with this root window is created.
194 void OnShelfCreated();
196 // Called when the login status changes after login (such as lock/unlock).
197 // TODO(oshima): Investigate if we can merge this and |OnLoginStateChanged|.
198 void UpdateAfterLoginStatusChange(user::LoginStatus status);
200 // Called when the brightness/grayscale animation from white to the login
201 // desktop background image has started. Starts |boot_splash_screen_|'s
202 // hiding animation (if the screen is non-NULL).
203 void HandleInitialDesktopBackgroundAnimationStarted();
205 // Called when the wallpaper ainmation is finished. Updates |background_|
206 // to be black and drops |boot_splash_screen_| and moves the wallpaper
207 // controller into the root window controller. |widget| holds the wallpaper
208 // image, or NULL if the background is a solid color.
209 void OnWallpaperAnimationFinished(views::Widget* widget);
211 // Deletes associated objects and clears the state, but doesn't delete
212 // the root window yet. This is used to delete a secondary displays'
213 // root window safely when the display disconnect signal is received,
214 // which may come while we're in the nested message loop.
215 void Shutdown();
217 // Deletes all child windows and performs necessary cleanup.
218 void CloseChildWindows();
220 // Moves child windows to |dest|.
221 void MoveWindowsTo(aura::Window* dest);
223 // Force the shelf to query for it's current visibility state.
224 void UpdateShelfVisibility();
226 // Initialize touch HUDs if necessary.
227 void InitTouchHuds();
229 // Returns the topmost window or one of its transient parents, if any of them
230 // are in fullscreen mode.
231 const aura::Window* GetWindowForFullscreenMode() const;
233 // Activate virtual keyboard on current root window controller.
234 void ActivateKeyboard(keyboard::KeyboardController* keyboard_controller);
236 // Deactivate virtual keyboard on current root window controller.
237 void DeactivateKeyboard(keyboard::KeyboardController* keyboard_controller);
239 // Tests if a window is associated with the virtual keyboard.
240 bool IsVirtualKeyboardWindow(aura::Window* window);
242 private:
243 explicit RootWindowController(AshWindowTreeHost* host);
244 enum RootWindowType {
245 PRIMARY,
246 SECONDARY,
247 VIRTUAL_KEYBOARD
250 // Initializes the RootWindowController. |is_primary| is true if
251 // the controller is for primary display. |first_run_after_boot| is
252 // set to true only for primary root window after boot.
253 void Init(RootWindowType root_window_type, bool first_run_after_boot);
255 void InitLayoutManagers();
257 // Initializes |system_background_| and possibly also |boot_splash_screen_|.
258 // |is_first_run_after_boot| determines the background's initial color.
259 void CreateSystemBackground(bool is_first_run_after_boot);
261 // Creates each of the special window containers that holds windows of various
262 // types in the shell UI.
263 void CreateContainersInRootWindow(aura::Window* root_window);
265 // Enables projection touch HUD.
266 void EnableTouchHudProjection();
268 // Disables projection touch HUD.
269 void DisableTouchHudProjection();
271 // Overridden from ShellObserver.
272 virtual void OnLoginStateChanged(user::LoginStatus status) OVERRIDE;
273 virtual void OnTouchHudProjectionToggled(bool enabled) OVERRIDE;
275 scoped_ptr<AshWindowTreeHost> ash_host_;
276 RootWindowLayoutManager* root_window_layout_;
278 scoped_ptr<StackingController> stacking_controller_;
280 // The shelf for managing the shelf and the status widget.
281 scoped_ptr<ShelfWidget> shelf_;
283 // An invisible/empty window used as a event target for
284 // |MouseCursorEventFilter| before a user logs in.
285 // (crbug.com/266987)
286 // Its container is |LockScreenBackgroundContainer| and
287 // this must be deleted before the container is deleted.
288 scoped_ptr<aura::Window> mouse_event_target_;
290 // Manages layout of docked windows. Owned by DockedContainer.
291 DockedWindowLayoutManager* docked_layout_manager_;
293 // Manages layout of panels. Owned by PanelContainer.
294 PanelLayoutManager* panel_layout_manager_;
296 scoped_ptr<SystemBackgroundController> system_background_;
298 #if defined(OS_CHROMEOS)
299 scoped_ptr<BootSplashScreen> boot_splash_screen_;
300 // Responsible for initializing TouchExplorationController when spoken
301 // feedback is on.
302 scoped_ptr<AccessibilityObserver> cros_accessibility_observer_;
303 #endif
305 scoped_ptr<ScreenDimmer> screen_dimmer_;
306 scoped_ptr<WorkspaceController> workspace_controller_;
307 scoped_ptr<AlwaysOnTopController> always_on_top_controller_;
309 // 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_;
314 // Handles double clicks on the panel window header.
315 scoped_ptr<ui::EventHandler> panel_container_handler_;
317 scoped_ptr<DesktopBackgroundWidgetController> wallpaper_controller_;
318 scoped_ptr<AnimatingDesktopController> animating_wallpaper_controller_;
319 scoped_ptr< ::wm::ScopedCaptureClient> capture_client_;
321 DISALLOW_COPY_AND_ASSIGN(RootWindowController);
325 // Gets the RootWindowController for |root_window|.
326 ASH_EXPORT RootWindowController* GetRootWindowController(
327 const aura::Window* root_window);
329 } // ash
331 #endif // ASH_ROOT_WINDOW_CONTROLLER_H_