Home | History | Annotate | Download | only in wm
      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