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.
5 #ifndef ASH_WM_WINDOW_POSITIONER_H_
6 #define ASH_WM_WINDOW_POSITIONER_H_
8 #include "ash/ash_export.h"
9 #include "base/basictypes.h"
10 #include "ui/base/ui_base_types.h"
11 #include "ui/gfx/geometry/rect.h"
27 class WindowPositionerTest
;
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
{
34 // When the screen resolution width is smaller then this size, The algorithm
35 // will default to maximized.
36 static int GetForceMaximizedWidthLimit();
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
;
42 // Maximum width of a window even if there is more room on the desktop.
43 static const int kMaximumWindowWidth
;
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
52 static void GetBoundsAndShowStateForNewWindow(
53 const gfx::Screen
* screen
,
54 const aura::Window
* new_window
,
56 ui::WindowShowState show_state_in
,
57 gfx::Rect
* bounds_in_out
,
58 ui::WindowShowState
* show_state_out
);
60 // Returns the default bounds for a window to be created in the |display|.
61 static gfx::Rect
GetDefaultWindowBounds(const gfx::Display
& display
);
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
);
69 // Turn the automatic positioning logic temporarily off. Returns the previous
71 static bool DisableAutoPositioning(bool ignore
);
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
);
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
);
88 // Accessor to set a flag indicating whether the first window in ASH should
90 static void SetMaximizeFirstWindow(bool maximize
);
93 friend class test::WindowPositionerTest
;
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
,
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
);
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
,
110 // Constant exposed for unittest.
111 static const int kMinimumWindowOffset
;
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
;
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
;
122 // The last used position.
123 int last_popup_position_x_
;
124 int last_popup_position_y_
;
126 DISALLOW_COPY_AND_ASSIGN(WindowPositioner
);
131 #endif // ASH_WM_WINDOW_POSITIONER_H_