1 // Copyright 2013 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_WM_WINDOW_STATE_H_ 6 #define ASH_WM_WINDOW_STATE_H_ 7 8 #include "ash/ash_export.h" 9 #include "ash/wm/wm_types.h" 10 #include "base/basictypes.h" 11 #include "base/memory/scoped_ptr.h" 12 #include "base/observer_list.h" 13 #include "ui/aura/window_observer.h" 14 #include "ui/base/ui_base_types.h" 15 16 namespace aura { 17 class Window; 18 } 19 20 namespace gfx { 21 class Rect; 22 } 23 24 namespace ash { 25 class WindowResizer; 26 27 namespace wm { 28 class WindowStateDelegate; 29 class WindowStateObserver; 30 31 // WindowState manages and defines ash specific window state and 32 // behavior. Ash specific per-window state (such as ones that controls 33 // window manager behavior) and ash specific window behavior (such as 34 // maximize, minimize, snap sizing etc) should be added here instead 35 // of defining separate functions (like |MaximizeWindow(aura::Window* 36 // window)|) or using aura Window property. 37 // The WindowState gets created when first accessed by 38 // |wm::GetWindowState|, and deleted when the window is deleted. 39 // Prefer using this class instead of passing aura::Window* around in 40 // ash code as this is often what you need to interact with, and 41 // accessing the window using |window()| is cheap. 42 class ASH_EXPORT WindowState : public aura::WindowObserver { 43 public: 44 static bool IsMaximizedOrFullscreenState(ui::WindowShowState state); 45 46 explicit WindowState(aura::Window* window); 47 virtual ~WindowState(); 48 49 aura::Window* window() { return window_; } 50 const aura::Window* window() const { return window_; } 51 52 bool HasDelegate() const; 53 void SetDelegate(scoped_ptr<WindowStateDelegate> delegate); 54 55 // Returns the window's current show state. 56 ui::WindowShowState GetShowState() const; 57 58 // Returns the window's current ash show type. 59 // Refer to WindowShowType definition in wm_types.h as for why Ash 60 // has its own show type. 61 WindowShowType window_show_type() const { return window_show_type_; } 62 63 // Predicates to check window state. 64 bool IsMinimized() const; 65 bool IsMaximized() const; 66 bool IsFullscreen() const; 67 bool IsMaximizedOrFullscreen() const; 68 // True if the window's show state is SHOW_STATE_NORMAL or 69 // SHOW_STATE_DEFAULT. 70 bool IsNormalShowState() const; 71 bool IsActive() const; 72 bool IsDocked() const; 73 bool IsSnapped() const; 74 75 // Checks if the window can change its state accordingly. 76 bool CanMaximize() const; 77 bool CanMinimize() const; 78 bool CanResize() const; 79 bool CanSnap() const; 80 bool CanActivate() const; 81 82 // Returns true if the window has restore bounds. 83 bool HasRestoreBounds() const; 84 85 void Maximize(); 86 void Minimize(); 87 void Unminimize(); 88 void Activate(); 89 void Deactivate(); 90 void Restore(); 91 void ToggleMaximized(); 92 void ToggleFullscreen(); 93 void SnapLeft(const gfx::Rect& bounds); 94 void SnapRight(const gfx::Rect& bounds); 95 96 // Sets the window's bounds in screen coordinates. 97 void SetBoundsInScreen(const gfx::Rect& bounds_in_screen); 98 99 // Saves the current bounds to be used as a restore bounds. 100 void SaveCurrentBoundsForRestore(); 101 102 // Same as |GetRestoreBoundsInScreen| except that it returns the 103 // bounds in the parent's coordinates. 104 gfx::Rect GetRestoreBoundsInParent() const; 105 106 // Returns the restore bounds property on the window in the virtual screen 107 // coordinates. The bounds can be NULL if the bounds property does not 108 // exist for the window. The window owns the bounds object. 109 gfx::Rect GetRestoreBoundsInScreen() const; 110 111 // Same as |SetRestoreBoundsInScreen| except that the bounds is in the 112 // parent's coordinates. 113 void SetRestoreBoundsInParent(const gfx::Rect& bounds_in_parent); 114 115 // Sets the restore bounds property on the window in the virtual screen 116 // coordinates. Deletes existing bounds value if exists. 117 void SetRestoreBoundsInScreen(const gfx::Rect& bounds_in_screen); 118 119 // Deletes and clears the restore bounds property on the window. 120 void ClearRestoreBounds(); 121 122 // Sets whether the window should always be restored to the restore bounds 123 // (sometimes the workspace layout manager restores the window to its original 124 // bounds instead of the restore bounds. Setting this key overrides that 125 // behaviour). The flag is reset to the default value after the window is 126 // restored. 127 bool always_restores_to_restore_bounds() const { 128 return always_restores_to_restore_bounds_; 129 } 130 void set_always_restores_to_restore_bounds(bool value) { 131 always_restores_to_restore_bounds_ = value; 132 } 133 134 // Gets/sets whether the shelf should be hidden when this window is 135 // fullscreen. 136 bool hide_shelf_when_fullscreen() const { 137 return hide_shelf_when_fullscreen_; 138 } 139 140 void set_hide_shelf_when_fullscreen(bool value) { 141 hide_shelf_when_fullscreen_ = value; 142 } 143 144 // Sets/gets the flag to suppress the cross-fade animation for 145 // the transition to the fullscreen state. 146 bool animate_to_fullscreen() const { 147 return animate_to_fullscreen_; 148 } 149 void set_animate_to_fullscreen(bool value) { 150 animate_to_fullscreen_ = value; 151 } 152 153 // If the minimum visibilty is true, ash will try to keep a 154 // minimum amount of the window is always visible on the work area 155 // when shown. 156 // TODO(oshima): Consolidate this and window_position_managed 157 // into single parameter to control the window placement. 158 bool minimum_visibility() const { 159 return minimum_visibility_; 160 } 161 void set_minimum_visibility(bool minimum_visibility) { 162 minimum_visibility_ = minimum_visibility; 163 } 164 165 // Gets/Sets the bounds of the window before it was moved by the auto window 166 // management. As long as it was not auto-managed, it will return NULL. 167 const gfx::Rect* pre_auto_manage_window_bounds() const { 168 return pre_auto_manage_window_bounds_.get(); 169 } 170 void SetPreAutoManageWindowBounds(const gfx::Rect& bounds); 171 172 // Layout related properties 173 174 void AddObserver(WindowStateObserver* observer); 175 void RemoveObserver(WindowStateObserver* observer); 176 177 // Whether the window is being dragged. 178 bool is_dragged() const { return !!window_resizer_; } 179 180 // Whether or not the window's position can be managed by the 181 // auto management logic. 182 bool window_position_managed() const { return window_position_managed_; } 183 void set_window_position_managed(bool window_position_managed) { 184 window_position_managed_ = window_position_managed; 185 } 186 187 // Whether or not the window's position or size was changed by a user. 188 bool bounds_changed_by_user() const { return bounds_changed_by_user_; } 189 void set_bounds_changed_by_user(bool bounds_changed_by_user) { 190 bounds_changed_by_user_ = bounds_changed_by_user; 191 } 192 193 // True if this window is an attached panel. 194 bool panel_attached() const { 195 return panel_attached_; 196 } 197 void set_panel_attached(bool panel_attached) { 198 panel_attached_ = panel_attached; 199 } 200 201 // Indicates that an in progress drag should be continued after the 202 // window is reparented to another container. 203 bool continue_drag_after_reparent() const { 204 return continue_drag_after_reparent_; 205 } 206 void set_continue_drag_after_reparent(bool value) { 207 continue_drag_after_reparent_ = value; 208 } 209 210 // True if the window is ignored by the shelf layout manager for 211 // purposes of darkening the shelf. 212 bool ignored_by_shelf() const { return ignored_by_shelf_; } 213 void set_ignored_by_shelf(bool ignored_by_shelf) { 214 ignored_by_shelf_ = ignored_by_shelf; 215 } 216 217 // True if the window should be offered a chance to consume special system 218 // keys such as brightness, volume, etc. that are usually handled by the 219 // shell. 220 bool can_consume_system_keys() const { return can_consume_system_keys_; } 221 void set_can_consume_system_keys(bool can_consume_system_keys) { 222 can_consume_system_keys_ = can_consume_system_keys; 223 } 224 225 // True if this window has requested that the top-row keys (back, forward, 226 // brightness, volume) should be treated as function keys. 227 bool top_row_keys_are_function_keys() const { 228 return top_row_keys_are_function_keys_; 229 } 230 void set_top_row_keys_are_function_keys(bool value) { 231 top_row_keys_are_function_keys_ = value; 232 } 233 234 // Returns or sets a pointer to WindowResizer when resizing is active. 235 // The pointer to a WindowResizer that is returned is set when a resizer gets 236 // created and cleared when it gets destroyed. WindowState does not own the 237 // |window_resizer_| instance and the resizer's lifetime is controlled 238 // externally. It can be used to avoid creating multiple instances of a 239 // WindowResizer for the same window. 240 WindowResizer* window_resizer() const { 241 return window_resizer_; 242 } 243 void set_window_resizer_(WindowResizer* window_resizer) { 244 window_resizer_ = window_resizer; 245 } 246 247 // aura::WindowObserver overrides: 248 virtual void OnWindowPropertyChanged(aura::Window* window, 249 const void* key, 250 intptr_t old) OVERRIDE; 251 252 private: 253 // Snaps the window to left or right of the desktop with given bounds. 254 void SnapWindow(WindowShowType left_or_right, 255 const gfx::Rect& bounds); 256 257 // Sets the window show type and updates the show state if necessary. 258 void SetWindowShowType(WindowShowType new_window_show_type); 259 260 // The owner of this window settings. 261 aura::Window* window_; 262 scoped_ptr<WindowStateDelegate> delegate_; 263 264 bool window_position_managed_; 265 bool bounds_changed_by_user_; 266 bool panel_attached_; 267 bool continue_drag_after_reparent_; 268 bool ignored_by_shelf_; 269 bool can_consume_system_keys_; 270 bool top_row_keys_are_function_keys_; 271 WindowResizer* window_resizer_; 272 273 bool always_restores_to_restore_bounds_; 274 bool hide_shelf_when_fullscreen_; 275 bool animate_to_fullscreen_; 276 bool minimum_visibility_; 277 278 // A property to remember the window position which was set before the 279 // auto window position manager changed the window bounds, so that it can get 280 // restored when only this one window gets shown. 281 scoped_ptr<gfx::Rect> pre_auto_manage_window_bounds_; 282 283 ObserverList<WindowStateObserver> observer_list_; 284 285 // True when in SetWindowShowType(). This is used to avoid reentrance. 286 bool in_set_window_show_type_; 287 288 WindowShowType window_show_type_; 289 290 DISALLOW_COPY_AND_ASSIGN(WindowState); 291 }; 292 293 // Returns the WindowState for active window. Returns |NULL| 294 // if there is no active window. 295 ASH_EXPORT WindowState* GetActiveWindowState(); 296 297 // Returns the WindowState for |window|. Creates WindowState 298 // if it didn't exist. The settings object is owned by |window|. 299 ASH_EXPORT WindowState* GetWindowState(aura::Window* window); 300 301 // const version of GetWindowState. 302 ASH_EXPORT const WindowState* 303 GetWindowState(const aura::Window* window); 304 305 } // namespace wm 306 } // namespace ash 307 308 #endif // ASH_WM_WINDOW_STATE_H_ 309