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