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_POSITIONER_H_
      6 #define ASH_WM_WINDOW_POSITIONER_H_
      7 
      8 #include "ash/ash_export.h"
      9 #include "base/basictypes.h"
     10 #include "ui/base/ui_base_types.h"
     11 #include "ui/gfx/rect.h"
     12 
     13 namespace aura {
     14 class Window;
     15 class RootWindow;
     16 }
     17 
     18 namespace gfx {
     19 class Display;
     20 class Rect;
     21 class Screen;
     22 }
     23 
     24 namespace ash {
     25 
     26 namespace test {
     27 class WindowPositionerTest;
     28 }
     29 
     30 // WindowPositioner is used by the browser to move new popups automatically to
     31 // a usable position on the closest work area (of the active window).
     32 class ASH_EXPORT WindowPositioner {
     33  public:
     34   // When the screen resolution width is smaller then this size, The algorithm
     35   // will default to maximized.
     36   static int GetForceMaximizedWidthLimit();
     37 
     38   // The number of pixels which are kept free top, left and right when a window
     39   // gets positioned to its default location.
     40   static const int kDesktopBorderSize;
     41 
     42   // Maximum width of a window even if there is more room on the desktop.
     43   static const int kMaximumWindowWidth;
     44 
     45   // Computes and returns the bounds and show state for new window
     46   // based on the parameter passed AND existing windows. |window| is
     47   // the one this function will generate a bounds for and used to
     48   // exclude the self window in making decision how to position the
     49   // window. |window| can be (and in most case) NULL.
     50   // |is_saved_bounds| indicates the |bounds_in_out| is the saved
     51   // bounds.
     52   static void GetBoundsAndShowStateForNewWindow(
     53       const gfx::Screen* screen,
     54       const aura::Window* new_window,
     55       bool is_saved_bounds,
     56       ui::WindowShowState show_state_in,
     57       gfx::Rect* bounds_in_out,
     58       ui::WindowShowState* show_state_out);
     59 
     60   // Returns the default bounds for a window to be created in the |display|.
     61   static gfx::Rect GetDefaultWindowBounds(const gfx::Display& display);
     62 
     63   // Check if after removal or hide of the given |removed_window| an
     64   // automated desktop location management can be performed and
     65   // rearrange accordingly.
     66   static void RearrangeVisibleWindowOnHideOrRemove(
     67       const aura::Window* removed_window);
     68 
     69   // Turn the automatic positioning logic temporarily off. Returns the previous
     70   // state.
     71   static bool DisableAutoPositioning(bool ignore);
     72 
     73   // Check if after insertion or showing of the given |added_window|
     74   // an automated desktop location management can be performed and
     75   // rearrange accordingly.
     76   static void RearrangeVisibleWindowOnShow(aura::Window* added_window);
     77 
     78   WindowPositioner();
     79   ~WindowPositioner();
     80 
     81   // Find a suitable screen position for a popup window and return it. The
     82   // passed input position is only used to retrieve the width and height.
     83   // The position is determined on the left / right / top / bottom first. If
     84   // no smart space is found, the position will follow the standard what other
     85   // operating systems do (default cascading style).
     86   gfx::Rect GetPopupPosition(const gfx::Rect& old_pos);
     87 
     88   // Accessor to set a flag indicating whether the first window in ASH should
     89   // be maximized.
     90   static void SetMaximizeFirstWindow(bool maximize);
     91 
     92  protected:
     93   friend class test::WindowPositionerTest;
     94 
     95   // Find a smart way to position the popup window. If there is no space this
     96   // function will return an empty rectangle.
     97   gfx::Rect SmartPopupPosition(const gfx::Rect& old_pos,
     98                                const gfx::Rect& work_area,
     99                                int grid);
    100 
    101   // Find the next available cascading popup position (on the given screen).
    102   gfx::Rect NormalPopupPosition(const gfx::Rect& old_pos,
    103                                 const gfx::Rect& work_area);
    104 
    105   // Align the location to the grid / snap to the right / bottom corner.
    106   gfx::Rect AlignPopupPosition(const gfx::Rect &pos,
    107                                const gfx::Rect &work_area,
    108                                int grid);
    109 
    110   // Constant exposed for unittest.
    111   static const int kMinimumWindowOffset;
    112 
    113   // The offset in X and Y for the next popup which opens.
    114   int pop_position_offset_increment_x;
    115   int pop_position_offset_increment_y;
    116 
    117   // The position on the screen for the first popup which gets shown if no
    118   // empty space can be found.
    119   int popup_position_offset_from_screen_corner_x;
    120   int popup_position_offset_from_screen_corner_y;
    121 
    122   // The last used position.
    123   int last_popup_position_x_;
    124   int last_popup_position_y_;
    125 
    126   DISALLOW_COPY_AND_ASSIGN(WindowPositioner);
    127 };
    128 
    129 }  // namespace ash
    130 
    131 #endif  // ASH_WM_WINDOW_POSITIONER_H_
    132