| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/window_sizer.h" | 5 #include "chrome/browser/ui/window_sizer.h" |
| 6 | 6 |
| 7 #include "chrome/browser/browser_process.h" | 7 #include "chrome/browser/browser_process.h" |
| 8 #include "chrome/browser/prefs/pref_service.h" | 8 #include "chrome/browser/prefs/pref_service.h" |
| 9 #include "chrome/browser/profiles/profile.h" | 9 #include "chrome/browser/profiles/profile.h" |
| 10 #include "chrome/browser/ui/browser.h" | 10 #include "chrome/browser/ui/browser.h" |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 std::string app_name_; | 95 std::string app_name_; |
| 96 | 96 |
| 97 // If set, is used as the reference browser for GetLastActiveWindowState. | 97 // If set, is used as the reference browser for GetLastActiveWindowState. |
| 98 const Browser* browser_; | 98 const Browser* browser_; |
| 99 DISALLOW_COPY_AND_ASSIGN(DefaultStateProvider); | 99 DISALLOW_COPY_AND_ASSIGN(DefaultStateProvider); |
| 100 }; | 100 }; |
| 101 | 101 |
| 102 /////////////////////////////////////////////////////////////////////////////// | 102 /////////////////////////////////////////////////////////////////////////////// |
| 103 // WindowSizer, public: | 103 // WindowSizer, public: |
| 104 | 104 |
| 105 WindowSizer::WindowSizer( | 105 WindowSizer::WindowSizer(StateProvider* state_provider, |
| 106 StateProvider* state_provider, | 106 MonitorInfoProvider* monitor_info_provider) |
| 107 MonitorInfoProvider* monitor_info_provider) | |
| 108 : state_provider_(state_provider), | 107 : state_provider_(state_provider), |
| 109 monitor_info_provider_(monitor_info_provider) { | 108 monitor_info_provider_(monitor_info_provider) { |
| 110 } | 109 } |
| 111 | 110 |
| 112 WindowSizer::~WindowSizer() { | 111 WindowSizer::~WindowSizer() { |
| 113 if (state_provider_) | |
| 114 delete state_provider_; | |
| 115 if (monitor_info_provider_) | |
| 116 delete monitor_info_provider_; | |
| 117 } | 112 } |
| 118 | 113 |
| 119 // static | 114 // static |
| 120 void WindowSizer::GetBrowserWindowBounds(const std::string& app_name, | 115 void WindowSizer::GetBrowserWindowBounds(const std::string& app_name, |
| 121 const gfx::Rect& specified_bounds, | 116 const gfx::Rect& specified_bounds, |
| 122 const Browser* browser, | 117 const Browser* browser, |
| 123 gfx::Rect* window_bounds) { | 118 gfx::Rect* window_bounds) { |
| 124 const WindowSizer sizer(new DefaultStateProvider(app_name, browser), | 119 const WindowSizer sizer(new DefaultStateProvider(app_name, browser), |
| 125 CreateDefaultMonitorInfoProvider()); | 120 CreateDefaultMonitorInfoProvider()); |
| 126 sizer.DetermineWindowBounds(specified_bounds, window_bounds); | 121 sizer.DetermineWindowBounds(specified_bounds, window_bounds); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 139 // No saved placement, figure out some sensible default size based on | 134 // No saved placement, figure out some sensible default size based on |
| 140 // the user's screen size. | 135 // the user's screen size. |
| 141 GetDefaultWindowBounds(bounds); | 136 GetDefaultWindowBounds(bounds); |
| 142 } | 137 } |
| 143 } | 138 } |
| 144 } | 139 } |
| 145 } | 140 } |
| 146 | 141 |
| 147 bool WindowSizer::GetLastWindowBounds(gfx::Rect* bounds) const { | 142 bool WindowSizer::GetLastWindowBounds(gfx::Rect* bounds) const { |
| 148 DCHECK(bounds); | 143 DCHECK(bounds); |
| 149 if (!state_provider_ || !state_provider_->GetLastActiveWindowState(bounds)) | 144 if (!state_provider_.get() || |
| 145 !state_provider_->GetLastActiveWindowState(bounds)) |
| 150 return false; | 146 return false; |
| 151 gfx::Rect last_window_bounds = *bounds; | 147 gfx::Rect last_window_bounds = *bounds; |
| 152 bounds->Offset(kWindowTilePixels, kWindowTilePixels); | 148 bounds->Offset(kWindowTilePixels, kWindowTilePixels); |
| 153 AdjustBoundsToBeVisibleOnMonitorContaining(last_window_bounds, | 149 AdjustBoundsToBeVisibleOnMonitorContaining(last_window_bounds, |
| 154 gfx::Rect(), | 150 gfx::Rect(), |
| 155 bounds); | 151 bounds); |
| 156 return true; | 152 return true; |
| 157 } | 153 } |
| 158 | 154 |
| 159 bool WindowSizer::GetSavedWindowBounds(gfx::Rect* bounds) const { | 155 bool WindowSizer::GetSavedWindowBounds(gfx::Rect* bounds) const { |
| 160 DCHECK(bounds); | 156 DCHECK(bounds); |
| 161 gfx::Rect saved_work_area; | 157 gfx::Rect saved_work_area; |
| 162 if (!state_provider_ || | 158 if (!state_provider_.get() || |
| 163 !state_provider_->GetPersistentState(bounds, &saved_work_area)) | 159 !state_provider_->GetPersistentState(bounds, &saved_work_area)) |
| 164 return false; | 160 return false; |
| 165 AdjustBoundsToBeVisibleOnMonitorContaining(*bounds, saved_work_area, bounds); | 161 AdjustBoundsToBeVisibleOnMonitorContaining(*bounds, saved_work_area, bounds); |
| 166 return true; | 162 return true; |
| 167 } | 163 } |
| 168 | 164 |
| 169 void WindowSizer::GetDefaultWindowBounds(gfx::Rect* default_bounds) const { | 165 void WindowSizer::GetDefaultWindowBounds(gfx::Rect* default_bounds) const { |
| 170 DCHECK(default_bounds); | 166 DCHECK(default_bounds); |
| 171 DCHECK(monitor_info_provider_); | 167 DCHECK(monitor_info_provider_.get()); |
| 172 | 168 |
| 173 gfx::Rect work_area = monitor_info_provider_->GetPrimaryMonitorWorkArea(); | 169 gfx::Rect work_area = monitor_info_provider_->GetPrimaryMonitorWorkArea(); |
| 174 | 170 |
| 175 // The default size is either some reasonably wide width, or if the work | 171 // The default size is either some reasonably wide width, or if the work |
| 176 // area is narrower, then the work area width less some aesthetic padding. | 172 // area is narrower, then the work area width less some aesthetic padding. |
| 177 int default_width = std::min(work_area.width() - 2 * kWindowTilePixels, 1050); | 173 int default_width = std::min(work_area.width() - 2 * kWindowTilePixels, 1050); |
| 178 int default_height = work_area.height() - 2 * kWindowTilePixels; | 174 int default_height = work_area.height() - 2 * kWindowTilePixels; |
| 179 | 175 |
| 180 // For wider aspect ratio displays at higher resolutions, we might size the | 176 // For wider aspect ratio displays at higher resolutions, we might size the |
| 181 // window narrower to allow two windows to easily be placed side-by-side. | 177 // window narrower to allow two windows to easily be placed side-by-side. |
| (...skipping 12 matching lines...) Expand all Loading... |
| 194 // kWindowTilePixels between screen edge and each other. | 190 // kWindowTilePixels between screen edge and each other. |
| 195 default_width = static_cast<int>(work_area.width() / 2. - | 191 default_width = static_cast<int>(work_area.width() / 2. - |
| 196 1.5 * kWindowTilePixels); | 192 1.5 * kWindowTilePixels); |
| 197 } | 193 } |
| 198 default_bounds->SetRect(kWindowTilePixels + work_area.x(), | 194 default_bounds->SetRect(kWindowTilePixels + work_area.x(), |
| 199 kWindowTilePixels + work_area.y(), | 195 kWindowTilePixels + work_area.y(), |
| 200 default_width, default_height); | 196 default_width, default_height); |
| 201 } | 197 } |
| 202 | 198 |
| 203 bool WindowSizer::PositionIsOffscreen(int position, Edge edge) const { | 199 bool WindowSizer::PositionIsOffscreen(int position, Edge edge) const { |
| 204 DCHECK(monitor_info_provider_); | 200 DCHECK(monitor_info_provider_.get()); |
| 205 size_t monitor_count = monitor_info_provider_->GetMonitorCount(); | 201 size_t monitor_count = monitor_info_provider_->GetMonitorCount(); |
| 206 for (size_t i = 0; i < monitor_count; ++i) { | 202 for (size_t i = 0; i < monitor_count; ++i) { |
| 207 gfx::Rect work_area = monitor_info_provider_->GetWorkAreaAt(i); | 203 gfx::Rect work_area = monitor_info_provider_->GetWorkAreaAt(i); |
| 208 switch (edge) { | 204 switch (edge) { |
| 209 case TOP: | 205 case TOP: |
| 210 if (position >= work_area.y()) | 206 if (position >= work_area.y()) |
| 211 return false; | 207 return false; |
| 212 break; | 208 break; |
| 213 case LEFT: | 209 case LEFT: |
| 214 if (position >= work_area.x()) | 210 if (position >= work_area.x()) |
| (...skipping 17 matching lines...) Expand all Loading... |
| 232 static const int kMinVisibleHeight = 30; | 228 static const int kMinVisibleHeight = 30; |
| 233 // Minimum width of the visible part of a window. | 229 // Minimum width of the visible part of a window. |
| 234 static const int kMinVisibleWidth = 30; | 230 static const int kMinVisibleWidth = 30; |
| 235 } | 231 } |
| 236 | 232 |
| 237 void WindowSizer::AdjustBoundsToBeVisibleOnMonitorContaining( | 233 void WindowSizer::AdjustBoundsToBeVisibleOnMonitorContaining( |
| 238 const gfx::Rect& other_bounds, | 234 const gfx::Rect& other_bounds, |
| 239 const gfx::Rect& saved_work_area, | 235 const gfx::Rect& saved_work_area, |
| 240 gfx::Rect* bounds) const { | 236 gfx::Rect* bounds) const { |
| 241 DCHECK(bounds); | 237 DCHECK(bounds); |
| 242 DCHECK(monitor_info_provider_); | 238 DCHECK(monitor_info_provider_.get()); |
| 243 | 239 |
| 244 // Find the size of the work area of the monitor that intersects the bounds | 240 // Find the size of the work area of the monitor that intersects the bounds |
| 245 // of the anchor window. | 241 // of the anchor window. |
| 246 gfx::Rect work_area = | 242 gfx::Rect work_area = |
| 247 monitor_info_provider_->GetMonitorWorkAreaMatching(other_bounds); | 243 monitor_info_provider_->GetMonitorWorkAreaMatching(other_bounds); |
| 248 | 244 |
| 249 // If height or width are 0, reset to the default size. | 245 // If height or width are 0, reset to the default size. |
| 250 gfx::Rect default_bounds; | 246 gfx::Rect default_bounds; |
| 251 GetDefaultWindowBounds(&default_bounds); | 247 GetDefaultWindowBounds(&default_bounds); |
| 252 if (bounds->height() <= 0) | 248 if (bounds->height() <= 0) |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 300 // On non-Mac platforms, we are less aggressive about repositioning. Simply | 296 // On non-Mac platforms, we are less aggressive about repositioning. Simply |
| 301 // ensure that at least kMinVisibleWidth * kMinVisibleHeight is visible. | 297 // ensure that at least kMinVisibleWidth * kMinVisibleHeight is visible. |
| 302 const int min_y = work_area.y() + kMinVisibleHeight - bounds->height(); | 298 const int min_y = work_area.y() + kMinVisibleHeight - bounds->height(); |
| 303 const int min_x = work_area.x() + kMinVisibleWidth - bounds->width(); | 299 const int min_x = work_area.x() + kMinVisibleWidth - bounds->width(); |
| 304 const int max_y = work_area.bottom() - kMinVisibleHeight; | 300 const int max_y = work_area.bottom() - kMinVisibleHeight; |
| 305 const int max_x = work_area.right() - kMinVisibleWidth; | 301 const int max_x = work_area.right() - kMinVisibleWidth; |
| 306 bounds->set_y(std::max(min_y, std::min(max_y, bounds->y()))); | 302 bounds->set_y(std::max(min_y, std::min(max_y, bounds->y()))); |
| 307 bounds->set_x(std::max(min_x, std::min(max_x, bounds->x()))); | 303 bounds->set_x(std::max(min_x, std::min(max_x, bounds->x()))); |
| 308 #endif // defined(OS_MACOSX) | 304 #endif // defined(OS_MACOSX) |
| 309 } | 305 } |
| OLD | NEW |