diff --git a/atom/browser/native_window_views.cc b/atom/browser/native_window_views.cc index 0e04414b6a4..6d89ee1d06e 100644 --- a/atom/browser/native_window_views.cc +++ b/atom/browser/native_window_views.cc @@ -387,6 +387,15 @@ gfx::Size NativeWindowViews::GetContentSize() { return web_view_->size(); } +void NativeWindowViews::SetContentSizeConstraints( + const extensions::SizeConstraints& size_constraints) { + NativeWindow::SetContentSizeConstraints(size_constraints); +#if defined(USE_X11) + if (resizable_) + old_size_constraints_ = size_constraints; +#endif +} + void NativeWindowViews::SetResizable(bool resizable) { #if defined(OS_WIN) // WS_MAXIMIZEBOX => Maximize button @@ -403,11 +412,13 @@ void NativeWindowViews::SetResizable(bool resizable) { // On Linux there is no "resizable" property of a window, we have to set // both the minimum and maximum size to the window size to achieve it. if (resizable) { - SetMaximumSize(gfx::Size()); - SetMinimumSize(gfx::Size()); + SetContentSizeConstraints(old_size_constraints_); } else { - SetMaximumSize(GetSize()); - SetMinimumSize(GetSize()); + old_size_constraints_ = GetContentSizeConstraints(); + resizable_ = false; + gfx::Size content_size = GetContentSize(); + SetContentSizeConstraints( + extensions::SizeConstraints(content_size, content_size)); } } #endif diff --git a/atom/browser/native_window_views.h b/atom/browser/native_window_views.h index 35ca7b63e25..0014acd073c 100644 --- a/atom/browser/native_window_views.h +++ b/atom/browser/native_window_views.h @@ -64,6 +64,8 @@ class NativeWindowViews : public NativeWindow, void SetBounds(const gfx::Rect& bounds) override; gfx::Rect GetBounds() override; gfx::Size GetContentSize() override; + void SetContentSizeConstraints( + const extensions::SizeConstraints& size_constraints) override; void SetResizable(bool resizable) override; bool IsResizable() override; void SetAlwaysOnTop(bool top) override; @@ -165,6 +167,11 @@ class NativeWindowViews : public NativeWindow, // Handles window state events. scoped_ptr<WindowStateWatcher> window_state_watcher_; + + // The "resizable" flag on Linux is implemented by setting size constraints, + // we need to make sure size constraints are restored when window becomes + // resizable again. + extensions::SizeConstraints old_size_constraints_; #elif defined(OS_WIN) // Weak ref. AtomDesktopWindowTreeHostWin* atom_desktop_window_tree_host_win_;