From 1e74d39a70506cfcad8b224230d9f302c2f96ae7 Mon Sep 17 00:00:00 2001 From: "tc@google.com" Date: Mon, 20 Jul 2009 21:12:28 +0000 Subject: Change fullscreen mode to be determined by the window manager. We used to have a bool that determined whether we were in full screen mode or not, but that's not always in sync with the WM so wait for the WM to tell us that we're in full screen mode. Also, change it so when we're in full screen mode, we don't save our window bounds because that causes us to restart in full screen mode which is all sorts of broken. BUG=16602 Review URL: http://codereview.chromium.org/159087 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@21103 0039d316-1c4b-4281-b951-d872f2087c98 --- chrome/browser/gtk/browser_window_gtk.cc | 47 ++++++++++++++++++++------------ chrome/browser/gtk/browser_window_gtk.h | 4 --- 2 files changed, 30 insertions(+), 21 deletions(-) (limited to 'chrome/browser') diff --git a/chrome/browser/gtk/browser_window_gtk.cc b/chrome/browser/gtk/browser_window_gtk.cc index 06063ac..4bc4123d 100644 --- a/chrome/browser/gtk/browser_window_gtk.cc +++ b/chrome/browser/gtk/browser_window_gtk.cc @@ -378,7 +378,6 @@ std::map BrowserWindowGtk::xid_map_; BrowserWindowGtk::BrowserWindowGtk(Browser* browser) : browser_(browser), - full_screen_(false), #if defined(OS_CHROMEOS) drag_active_(false), panel_controller_(NULL), @@ -647,26 +646,17 @@ bool BrowserWindowGtk::IsMaximized() const { } void BrowserWindowGtk::SetFullscreen(bool fullscreen) { - full_screen_ = fullscreen; - UpdateCustomFrame(); - + // gtk_window_(un)fullscreen asks the window manager to toggle the EWMH + // for fullscreen windows. Not all window managers support this. if (fullscreen) { - // These four balanced by ShowSupportedWindowFeatures(). - toolbar_->Hide(); - tabstrip_->Hide(); - bookmark_bar_->Hide(false); - extension_shelf_->Hide(); - gtk_window_fullscreen(window_); } else { - ShowSupportedWindowFeatures(); - gtk_window_unfullscreen(window_); } } bool BrowserWindowGtk::IsFullscreen() const { - return full_screen_; + return (state_ & GDK_WINDOW_STATE_FULLSCREEN); } LocationBar* BrowserWindowGtk::GetLocationBar() const { @@ -896,7 +886,7 @@ void BrowserWindowGtk::MaybeShowBookmarkBar(TabContents* contents, bool animate) { // Don't change the visibility state when the browser is full screen or if // the bookmark bar isn't supported. - if (full_screen_ || !IsBookmarkBarSupported()) + if (IsFullscreen() || !IsBookmarkBarSupported()) return; bool show_bar = false; @@ -970,8 +960,26 @@ void BrowserWindowGtk::OnBoundsChanged(const gfx::Rect& bounds) { } void BrowserWindowGtk::OnStateChanged(GdkWindowState state) { + // If we care about more than full screen changes, we should pass through + // |changed_mask| from GdkEventWindowState. + bool fullscreen_state_changed = (state_ & GDK_WINDOW_STATE_FULLSCREEN) != + (state & GDK_WINDOW_STATE_FULLSCREEN); + state_ = state; + if (fullscreen_state_changed) { + if (state & GDK_WINDOW_STATE_FULLSCREEN) { + UpdateCustomFrame(); + toolbar_->Hide(); + tabstrip_->Hide(); + bookmark_bar_->Hide(false); + extension_shelf_->Hide(); + } else { + UpdateCustomFrame(); + ShowSupportedWindowFeatures(); + } + } + UpdateWindowShape(bounds_.width(), bounds_.height()); SaveWindowPosition(); } @@ -1217,7 +1225,7 @@ void BrowserWindowGtk::OnSizeChanged(int width, int height) { } void BrowserWindowGtk::UpdateWindowShape(int width, int height) { - if (use_custom_frame_.GetValue() && !full_screen_ && !IsMaximized()) { + if (use_custom_frame_.GetValue() && !IsFullscreen() && !IsMaximized()) { // Make the top corners rounded. We set a mask that includes most of the // window except for a few pixels in the top two corners. GdkRectangle top_rect = { 3, 0, width - 6, 1 }; @@ -1263,13 +1271,18 @@ void BrowserWindowGtk::ConnectAccelerators() { } void BrowserWindowGtk::UpdateCustomFrame() { - bool enable = use_custom_frame_.GetValue() && !full_screen_; - gtk_window_set_decorated(window_, !enable); + bool enable = use_custom_frame_.GetValue() && !IsFullscreen(); + gtk_window_set_decorated(window_, !use_custom_frame_.GetValue()); titlebar_->UpdateCustomFrame(enable); UpdateWindowShape(bounds_.width(), bounds_.height()); } void BrowserWindowGtk::SaveWindowPosition() { + // Don't save the window position if it's in full screen mode because we + // don't want to restart the browser in full screen mode. + if (IsFullscreen()) + return; + // Browser::SaveWindowPlacement is used for session restore. if (browser_->ShouldSaveWindowPlacement()) browser_->SaveWindowPlacement(bounds_, IsMaximized()); diff --git a/chrome/browser/gtk/browser_window_gtk.h b/chrome/browser/gtk/browser_window_gtk.h index 0267e41..110f1e5 100644 --- a/chrome/browser/gtk/browser_window_gtk.h +++ b/chrome/browser/gtk/browser_window_gtk.h @@ -272,10 +272,6 @@ class BrowserWindowGtk : public BrowserWindow, gfx::Rect bounds_; GdkWindowState state_; - // Whether we are full screen. Since IsFullscreen() gets called before - // OnStateChanged(), we can't rely on |state_| & GDK_WINDOW_STATE_FULLSCREEN. - bool full_screen_; - // The container for the titlebar + tab strip. scoped_ptr titlebar_; -- cgit v1.1