From f550fdaa91293fa1dd125b5743728c1d387d21c4 Mon Sep 17 00:00:00 2001 From: Akemi Date: Thu, 27 Jul 2017 21:28:33 +0200 Subject: cocoa: add an option to disable the native macOS fullscreen Fixes #4014 --- video/out/cocoa/mpvadapter.h | 3 +++ video/out/cocoa/window.m | 37 +++++++++++++++++++++++++++++-------- video/out/cocoa_common.m | 9 +++++++-- 3 files changed, 39 insertions(+), 10 deletions(-) (limited to 'video/out') diff --git a/video/out/cocoa/mpvadapter.h b/video/out/cocoa/mpvadapter.h index f6d9ae2eaf..7a858f56ab 100644 --- a/video/out/cocoa/mpvadapter.h +++ b/video/out/cocoa/mpvadapter.h @@ -28,8 +28,11 @@ - (void)didChangeWindowedScreenProfile:(NSNotification *)notification; - (void)performAsyncResize:(NSSize)size; - (void)windowDidChangePhysicalScreen; +- (void)windowDidEnterFullScreen; +- (void)windowDidExitFullScreen; - (BOOL)isInFullScreenMode; +- (BOOL)wantsNativeFullscreen; - (BOOL)keyboardEnabled; - (BOOL)mouseEnabled; diff --git a/video/out/cocoa/window.m b/video/out/cocoa/window.m index 9b602436dd..e08f4745bc 100644 --- a/video/out/cocoa/window.m +++ b/video/out/cocoa/window.m @@ -106,7 +106,8 @@ [self setFrame:frame display:YES]; } - [super toggleFullScreen:sender]; + if ([self.adapter wantsNativeFullscreen]) + [super toggleFullScreen:sender]; if (![self.adapter isInFullScreenMode]) { [self setToFullScreen]; @@ -119,7 +120,16 @@ { [self setStyleMask:([self styleMask] | NSWindowStyleMaskFullScreen)]; NSRect frame = [[self targetScreen] frame]; - [self setFrame:frame display:YES]; + + if ([self.adapter wantsNativeFullscreen]) { + [self setFrame:frame display:YES]; + } else { + [NSApp setPresentationOptions:NSApplicationPresentationAutoHideMenuBar| + NSApplicationPresentationAutoHideDock]; + [self setFrame:frame display:YES]; + _is_animating = 0; + [self.adapter windowDidEnterFullScreen]; + } } - (void)setToWindow @@ -127,9 +137,19 @@ [self setStyleMask:([self styleMask] & ~NSWindowStyleMaskFullScreen)]; NSRect frame = [self calculateWindowPositionForScreen:[self targetScreen] withoutBounds:[[self targetScreen] isEqual:[self screen]]]; - [self setFrame:frame display:YES]; - [self setContentAspectRatio:_unfs_content_frame.size]; - [self setCenteredContentSize:_unfs_content_frame.size]; + + if ([self.adapter wantsNativeFullscreen]) { + [self setFrame:frame display:YES]; + [self setContentAspectRatio:_unfs_content_frame.size]; + [self setCenteredContentSize:_unfs_content_frame.size]; + } else { + [NSApp setPresentationOptions:NSApplicationPresentationDefault]; + [self setFrame:frame display:YES]; + [self setContentAspectRatio:_unfs_content_frame.size]; + [self setCenteredContentSize:_unfs_content_frame.size]; + _is_animating = 0; + [self.adapter windowDidExitFullScreen]; + } } - (NSArray *)customWindowsToEnterFullScreenForWindow:(NSWindow *)window @@ -150,13 +170,13 @@ - (void)windowDidEnterFullScreen:(NSNotification *)notification { _is_animating = 0; - [self.adapter windowDidEnterFullScreen:notification]; + [self.adapter windowDidEnterFullScreen]; } - (void)windowDidExitFullScreen:(NSNotification *)notification { _is_animating = 0; - [self.adapter windowDidExitFullScreen:notification]; + [self.adapter windowDidExitFullScreen]; } - (void)windowWillEnterFullScreen:(NSNotification *)notification @@ -390,7 +410,8 @@ if (NSMaxX(nf) < NSMinX(vf)) nf.origin.x = NSMinX(vf); - if (NSHeight(nf) < NSHeight(vf) && NSHeight(of) > NSHeight(vf)) + if (NSHeight(nf) < NSHeight(vf) && NSHeight(of) > NSHeight(vf) && + ![self.adapter isInFullScreenMode]) // If the window height is smaller than the visible frame, but it was // bigger previously recenter the smaller window vertically. This is // needed to counter the 'snap to top' behaviour. diff --git a/video/out/cocoa_common.m b/video/out/cocoa_common.m index 56cfd221d8..b535de279d 100644 --- a/video/out/cocoa_common.m +++ b/video/out/cocoa_common.m @@ -1014,6 +1014,11 @@ int vo_cocoa_control(struct vo *vo, int *events, int request, void *arg) return self.vout->cocoa->fullscreen; } +- (BOOL)wantsNativeFullscreen +{ + return self.vout->opts->native_fs; +} + - (NSScreen *)getTargetScreen { struct vo_cocoa_state *s = self.vout->cocoa; @@ -1039,7 +1044,7 @@ int vo_cocoa_control(struct vo *vo, int *events, int request, void *arg) flag_events(self.vout, VO_EVENT_WIN_STATE); } -- (void)windowDidEnterFullScreen:(NSNotification *)notification +- (void)windowDidEnterFullScreen { struct vo_cocoa_state *s = self.vout->cocoa; s->fullscreen = 1; @@ -1047,7 +1052,7 @@ int vo_cocoa_control(struct vo *vo, int *events, int request, void *arg) vo_cocoa_anim_unlock(self.vout); } -- (void)windowDidExitFullScreen:(NSNotification *)notification +- (void)windowDidExitFullScreen { struct vo_cocoa_state *s = self.vout->cocoa; s->fullscreen = 0; -- cgit v1.2.3