diff options
author | pkasting@chromium.org <pkasting@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-05-29 20:47:50 +0000 |
---|---|---|
committer | pkasting@chromium.org <pkasting@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-05-29 20:47:50 +0000 |
commit | 2cc782d14e688f2d06f6d469ec11f9fc295b9546 (patch) | |
tree | 25f412731b68cf3c1aea1b82ed1820cdf3b2992c /chrome/browser/window_sizer.cc | |
parent | b2d8eb460632ddb2636bd636c54ea57635b85072 (diff) | |
download | chromium_src-2cc782d14e688f2d06f6d469ec11f9fc295b9546.zip chromium_src-2cc782d14e688f2d06f6d469ec11f9fc295b9546.tar.gz chromium_src-2cc782d14e688f2d06f6d469ec11f9fc295b9546.tar.bz2 |
Be less aggressive about resizing Chrome windows when restoring them. Original patch by Yuzo Fujishima (see http://codereview.chromium.org/115180 ), r=me.
BUG=9587
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@17233 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/window_sizer.cc')
-rw-r--r-- | chrome/browser/window_sizer.cc | 50 |
1 files changed, 18 insertions, 32 deletions
diff --git a/chrome/browser/window_sizer.cc b/chrome/browser/window_sizer.cc index 300e5c5..e005676 100644 --- a/chrome/browser/window_sizer.cc +++ b/chrome/browser/window_sizer.cc @@ -233,6 +233,13 @@ bool WindowSizer::PositionIsOffscreen(int position, Edge edge) const { return true; } +namespace { + // Minimum height of the visible part of a window. + static const int kMinVisibleHeight = 30; + // Minimum width of the visible part of a window. + static const int kMinVisibleWidth = 30; +} + void WindowSizer::AdjustBoundsToBeVisibleOnMonitorContaining( const gfx::Rect& other_bounds, gfx::Rect* bounds) const { DCHECK(bounds); @@ -251,36 +258,15 @@ void WindowSizer::AdjustBoundsToBeVisibleOnMonitorContaining( if (bounds->width() <= 0) bounds->set_width(default_bounds.width()); - // First determine which screen edge(s) the window is offscreen on. - monitor_info_provider_->UpdateWorkAreas(); - bool top_offscreen = PositionIsOffscreen(bounds->y(), TOP); - bool left_offscreen = PositionIsOffscreen(bounds->x(), LEFT); - bool bottom_offscreen = PositionIsOffscreen(bounds->bottom(), BOTTOM); - bool right_offscreen = PositionIsOffscreen(bounds->right(), RIGHT); - - // Bump the window back onto the screen in the direction that it's offscreen. - int min_x = work_area.x() + kWindowTilePixels; - int min_y = work_area.y() + kWindowTilePixels; - if (bottom_offscreen) { - bounds->set_y(std::max( - work_area.bottom() - kWindowTilePixels - bounds->height(), min_y)); - } - if (right_offscreen) { - bounds->set_x(std::max( - work_area.right() - kWindowTilePixels - bounds->width(), min_x)); - } - if (top_offscreen) - bounds->set_y(min_y); - if (left_offscreen) - bounds->set_x(min_x); - - // Now that we've tried to correct the x/y position to something reasonable, - // see if the window is still too tall or wide to fit, and resize it if need - // be. - if ((bottom_offscreen || top_offscreen) && - bounds->bottom() > work_area.bottom()) - bounds->set_height(work_area.height() - 2 * kWindowTilePixels); - if ((left_offscreen || right_offscreen) && - bounds->right() > work_area.right()) - bounds->set_width(work_area.width() - 2 * kWindowTilePixels); + // Ensure the minimum height and width. + bounds->set_height(std::max(kMinVisibleHeight, bounds->height())); + bounds->set_width(std::max(kMinVisibleWidth, bounds->width())); + + // Ensure at least kMinVisibleWidth * kMinVisibleHeight is visible. + const int min_y = work_area.y() + kMinVisibleHeight - bounds->height(); + const int min_x = work_area.x() + kMinVisibleWidth - bounds->width(); + const int max_y = work_area.bottom() - kMinVisibleHeight; + const int max_x = work_area.right() - kMinVisibleWidth; + bounds->set_y(std::max(min_y, std::min(max_y, bounds->y()))); + bounds->set_x(std::max(min_x, std::min(max_x, bounds->x()))); } |