From aa2f7aaf3a19a61f141d9788dfcde9e0b3164897 Mon Sep 17 00:00:00 2001 From: jaanus Date: Mon, 21 Dec 2015 20:55:23 +0200 Subject: [PATCH] Fixes #2810: correct look of hidden-inset windows in full screen. `hidden` and `hidden-inset` windows differ only by the hidden-inset window having a toolbar. Yet, the toolbar yields an incorrect look in fullscreen mode. So, we hide and recreate the toolbar for such windows when going to/from fullscreen. There are some visible artifacts during the fullscreen animations, as the toolbar gets created and destroyed. When entering fullscreen, you see a toolbar that then disappears. When going back to normal window, you see the traffic light buttons jump around a little bit. Yet, this is definitely better than the current broken fullscreen look. --- atom/browser/native_window_mac.h | 6 ++++++ atom/browser/native_window_mac.mm | 24 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/atom/browser/native_window_mac.h b/atom/browser/native_window_mac.h index 38845140e694..3b81786e7930 100644 --- a/atom/browser/native_window_mac.h +++ b/atom/browser/native_window_mac.h @@ -78,6 +78,10 @@ class NativeWindowMac : public NativeWindow { UpdateDraggableRegionViews(draggable_regions_); } + bool ShouldHideNativeToolbarInFullscreen() const { + return should_hide_native_toolbar_in_fullscreen_; + } + protected: // NativeWindow: void HandleKeyboardEvent( @@ -118,6 +122,8 @@ class NativeWindowMac : public NativeWindow { // The presentation options before entering kiosk mode. NSApplicationPresentationOptions kiosk_options_; + bool should_hide_native_toolbar_in_fullscreen_; + DISALLOW_COPY_AND_ASSIGN(NativeWindowMac); }; diff --git a/atom/browser/native_window_mac.mm b/atom/browser/native_window_mac.mm index 1ee69fc1fc7a..d8d1f66197ae 100644 --- a/atom/browser/native_window_mac.mm +++ b/atom/browser/native_window_mac.mm @@ -177,10 +177,25 @@ bool ScopedDisableResize::disable_resize_ = false; } - (void)windowDidEnterFullScreen:(NSNotification*)notification { + if (shell_->ShouldHideNativeToolbarInFullscreen()) { + NSWindow* window = shell_->GetNativeWindow(); + [window setToolbar:nil]; + } + shell_->NotifyWindowEnterFullScreen(); } - (void)windowDidExitFullScreen:(NSNotification*)notification { + + // Restore the native toolbar for styling if needed + if (shell_->ShouldHideNativeToolbarInFullscreen()) { + NSWindow* window = shell_->GetNativeWindow(); + base::scoped_nsobject toolbar( + [[NSToolbar alloc] initWithIdentifier:@"titlebarStylingToolbar"]); + [toolbar setShowsBaselineSeparator:NO]; + [window setToolbar:toolbar]; + } + if (!shell_->has_frame()) { NSWindow* window = shell_->GetNativeWindow(); [[window standardWindowButton:NSWindowFullScreenButton] setHidden:YES]; @@ -378,6 +393,15 @@ NativeWindowMac::NativeWindowMac( styleMask |= NSUnifiedTitleAndToolbarWindowMask; } + // We capture this because we need to access the option later when entering/exiting fullscreen + // and since the options dict is only passed to the constructor but not stored, + // let’s store this option this way. + if (titleBarStyle == "hidden-inset") { + should_hide_native_toolbar_in_fullscreen_ = true; + } else { + should_hide_native_toolbar_in_fullscreen_ = false; + } + window_.reset([[AtomNSWindow alloc] initWithContentRect:cocoa_bounds styleMask:styleMask