Index: chrome/browser/ui/panels/panel_browser_window_gtk.cc |
diff --git a/chrome/browser/ui/panels/panel_browser_window_gtk.cc b/chrome/browser/ui/panels/panel_browser_window_gtk.cc |
index e2e25d100f789afe0610c01a6c542860994c1be0..9b586ceb031e7262d60deb6017e5a7dd6a4a0a51 100644 |
--- a/chrome/browser/ui/panels/panel_browser_window_gtk.cc |
+++ b/chrome/browser/ui/panels/panel_browser_window_gtk.cc |
@@ -28,7 +28,8 @@ PanelBrowserWindowGtk::PanelBrowserWindowGtk(Browser* browser, |
drag_end_factory_(this), |
panel_(panel), |
bounds_(bounds), |
- restored_height_(bounds.height()) { |
+ restored_height_(bounds.height()), |
+ non_client_area_size_known_(false) { |
} |
PanelBrowserWindowGtk::~PanelBrowserWindowGtk() { |
@@ -99,7 +100,7 @@ void PanelBrowserWindowGtk::SetGeometryHints() { |
gtk_window_set_geometry_hints( |
window(), GTK_WIDGET(window()), &hints, GDK_HINT_MIN_SIZE); |
- SetBoundsImpl(bounds_, true); |
+ SetBoundsImpl(bounds_, true); // Force a move to set the initial position. |
} |
void PanelBrowserWindowGtk::SetBounds(const gfx::Rect& bounds) { |
@@ -107,6 +108,15 @@ void PanelBrowserWindowGtk::SetBounds(const gfx::Rect& bounds) { |
DLOG(WARNING) << "Unexpected call to PanelBrowserWindowGtk::SetBounds()"; |
} |
+void PanelBrowserWindowGtk::OnSizeChanged(int width, int height) { |
+ BrowserWindowGtk::OnSizeChanged(width, height); |
+ |
+ if (!non_client_area_size_known_) { |
+ non_client_area_size_known_ = true; |
+ panel_->OnNonClientExtentAvailable(); |
+ } |
+} |
+ |
bool PanelBrowserWindowGtk::UseCustomFrame() { |
// We always use custom frame for panels. |
return TRUE; |
@@ -135,7 +145,7 @@ gfx::Rect PanelBrowserWindowGtk::GetPanelBounds() const { |
void PanelBrowserWindowGtk::SetPanelBounds(const gfx::Rect& bounds) { |
if (bounds != bounds_) |
- SetBoundsImpl(bounds, true); |
+ SetBoundsImpl(bounds, false); // Only move if necessary. |
} |
void PanelBrowserWindowGtk::OnPanelExpansionStateChanged( |
@@ -166,11 +176,7 @@ void PanelBrowserWindowGtk::OnPanelExpansionStateChanged( |
expansion_state); |
bounds.set_y(bottom - height); |
bounds.set_height(height); |
- |
- // Do not move the window when expansion state changes. Just change the size. |
- // Because of GDK_GRAVITY_SOUTH_EAST gravity, the window will stay docked to |
- // the bottom. |
- SetBoundsImpl(bounds, false); |
+ SetBoundsImpl(bounds, false); // Only move if necessary. |
} |
bool PanelBrowserWindowGtk::ShouldBringUpPanelTitlebar(int mouse_x, |
@@ -251,20 +257,26 @@ void PanelBrowserWindowGtk::DestroyPanelBrowser() { |
} |
gfx::Size PanelBrowserWindowGtk::GetNonClientAreaExtent() const { |
- NOTIMPLEMENTED(); |
- return gfx::Size(); |
+ return GetNonClientFrameSize(); |
} |
int PanelBrowserWindowGtk::GetRestoredHeight() const { |
- NOTIMPLEMENTED(); |
- return 0; |
+ return restored_height_; |
} |
void PanelBrowserWindowGtk::SetRestoredHeight(int height) { |
- NOTIMPLEMENTED(); |
+ restored_height_ = height; |
} |
-void PanelBrowserWindowGtk::SetBoundsImpl(const gfx::Rect& bounds, bool move) { |
+void PanelBrowserWindowGtk::SetBoundsImpl(const gfx::Rect& bounds, |
+ bool force_move) { |
+ // Only move if required by caller, or if bottom right corner will change. |
+ // Panels use window gravity of GDK_GRAVITY_SOUTH_EAST which means the |
+ // window is anchored to the bottom right corner on resize, making it |
+ // unnecessary to move the window if the bottom right corner is unchanged. |
+ bool move = force_move || bounds.right() != bounds_.right() || |
+ bounds.bottom() != bounds_.bottom(); |
+ |
bounds_ = bounds; |
if (move) |
gtk_window_move(window_, bounds.x(), bounds.y()); |