• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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