Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(40)

Side by Side Diff: chrome/browser/window_sizer.cc

Issue 115180: Change the window bounds adjusting algorithm to restore... (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: '' Created 11 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | chrome/browser/window_sizer_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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/window_sizer.h" 5 #include "chrome/browser/window_sizer.h"
6 6
7 #include "chrome/browser/browser.h" 7 #include "chrome/browser/browser.h"
8 #include "chrome/browser/browser_list.h" 8 #include "chrome/browser/browser_list.h"
9 #include "chrome/browser/browser_process.h" 9 #include "chrome/browser/browser_process.h"
10 #include "chrome/browser/browser_window.h" 10 #include "chrome/browser/browser_window.h"
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
226 break; 226 break;
227 case RIGHT: 227 case RIGHT:
228 if (position <= work_area.right()) 228 if (position <= work_area.right())
229 return false; 229 return false;
230 break; 230 break;
231 } 231 }
232 } 232 }
233 return true; 233 return true;
234 } 234 }
235 235
236 namespace {
237 // Minimum height of the visible part of a window.
238 static const int kMinVisibleHeight = 30;
239 // Minimum width of the visible part of a window.
240 static const int kMinVisibleWidth = 30;
241 }
242
236 void WindowSizer::AdjustBoundsToBeVisibleOnMonitorContaining( 243 void WindowSizer::AdjustBoundsToBeVisibleOnMonitorContaining(
237 const gfx::Rect& other_bounds, gfx::Rect* bounds) const { 244 const gfx::Rect& other_bounds, gfx::Rect* bounds) const {
238 DCHECK(bounds); 245 DCHECK(bounds);
239 DCHECK(monitor_info_provider_); 246 DCHECK(monitor_info_provider_);
240 247
241 // Find the size of the work area of the monitor that intersects the bounds 248 // Find the size of the work area of the monitor that intersects the bounds
242 // of the anchor window. 249 // of the anchor window.
243 gfx::Rect work_area = 250 gfx::Rect work_area =
244 monitor_info_provider_->GetMonitorWorkAreaMatching(other_bounds); 251 monitor_info_provider_->GetMonitorWorkAreaMatching(other_bounds);
245 252
246 // If height or width are 0, reset to the default size. 253 // If height or width are 0, reset to the default size.
247 gfx::Rect default_bounds; 254 gfx::Rect default_bounds;
248 GetDefaultWindowBounds(&default_bounds); 255 GetDefaultWindowBounds(&default_bounds);
249 if (bounds->height() <= 0) 256 if (bounds->height() <= 0)
250 bounds->set_height(default_bounds.height()); 257 bounds->set_height(default_bounds.height());
251 if (bounds->width() <= 0) 258 if (bounds->width() <= 0)
252 bounds->set_width(default_bounds.width()); 259 bounds->set_width(default_bounds.width());
253 260
254 // First determine which screen edge(s) the window is offscreen on. 261 // Ensure the minimum height and width.
255 monitor_info_provider_->UpdateWorkAreas(); 262 bounds->set_height(std::max(kMinVisibleHeight, bounds->height()));
256 bool top_offscreen = PositionIsOffscreen(bounds->y(), TOP); 263 bounds->set_width(std::max(kMinVisibleWidth, bounds->width()));
257 bool left_offscreen = PositionIsOffscreen(bounds->x(), LEFT);
258 bool bottom_offscreen = PositionIsOffscreen(bounds->bottom(), BOTTOM);
259 bool right_offscreen = PositionIsOffscreen(bounds->right(), RIGHT);
260 264
261 // Bump the window back onto the screen in the direction that it's offscreen. 265 // Ensure at least kMinVisibleWidth * kMinVisibleHeight is visible.
262 int min_x = work_area.x() + kWindowTilePixels; 266 const int min_y = work_area.y() + kMinVisibleHeight - bounds->height();
263 int min_y = work_area.y() + kWindowTilePixels; 267 const int min_x = work_area.x() + kMinVisibleWidth - bounds->width();
264 if (bottom_offscreen) { 268 const int max_y = work_area.bottom() - kMinVisibleHeight;
265 bounds->set_y(std::max( 269 const int max_x = work_area.right() - kMinVisibleWidth;
266 work_area.bottom() - kWindowTilePixels - bounds->height(), min_y)); 270 bounds->set_y(std::max(min_y, std::min(max_y, bounds->y())));
267 } 271 bounds->set_x(std::max(min_x, std::min(max_x, bounds->x())));
268 if (right_offscreen) {
269 bounds->set_x(std::max(
270 work_area.right() - kWindowTilePixels - bounds->width(), min_x));
271 }
272 if (top_offscreen)
273 bounds->set_y(min_y);
274 if (left_offscreen)
275 bounds->set_x(min_x);
276
277 // Now that we've tried to correct the x/y position to something reasonable,
278 // see if the window is still too tall or wide to fit, and resize it if need
279 // be.
280 if ((bottom_offscreen || top_offscreen) &&
281 bounds->bottom() > work_area.bottom())
282 bounds->set_height(work_area.height() - 2 * kWindowTilePixels);
283 if ((left_offscreen || right_offscreen) &&
284 bounds->right() > work_area.right())
285 bounds->set_width(work_area.width() - 2 * kWindowTilePixels);
286 } 272 }
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/window_sizer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698