From cfd7a7fac6367461f0757ffaaf01bc91e442daf5 Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Thu, 31 Aug 2017 21:13:32 -0300 Subject: [PATCH] macOS: Prevent unwanted native fullscreen (Spaces) toggles when the window is in fullscreen or isn't resizable. Fixes bug #3691. --- src/video/cocoa/SDL_cocoawindow.m | 52 ++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 12 deletions(-) diff --git a/src/video/cocoa/SDL_cocoawindow.m b/src/video/cocoa/SDL_cocoawindow.m index 317862d110f45..5572c6a8874a1 100644 --- a/src/video/cocoa/SDL_cocoawindow.m +++ b/src/video/cocoa/SDL_cocoawindow.m @@ -65,10 +65,31 @@ - (void)doCommandBySelector:(SEL)aSelector; - (NSDragOperation)draggingEntered:(id )sender; - (BOOL)performDragOperation:(id )sender; - (BOOL)wantsPeriodicDraggingUpdates; +- (BOOL)validateMenuItem:(NSMenuItem *)menuItem; + +- (SDL_Window*)findSDLWindow; @end @implementation SDLWindow +- (BOOL)validateMenuItem:(NSMenuItem *)menuItem +{ + /* Only allow using the macOS native fullscreen toggle menubar item if the + * window is resizable and not in a SDL fullscreen mode. + */ + if ([menuItem action] == @selector(toggleFullScreen:)) { + SDL_Window *window = [self findSDLWindow]; + if (window == NULL) { + return YES; + } else if ((window->flags & (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_FULLSCREEN_DESKTOP)) != 0) { + return NO; + } else if ((window->flags & SDL_WINDOW_RESIZABLE) == 0) { + return NO; + } + } + return YES; +} + - (BOOL)canBecomeKeyWindow { return YES; @@ -117,11 +138,10 @@ - (NSDragOperation)draggingEntered:(id )sender - (BOOL)performDragOperation:(id )sender { @autoreleasepool { - SDL_VideoDevice *_this = SDL_GetVideoDevice(); NSPasteboard *pasteboard = [sender draggingPasteboard]; NSArray *types = [NSArray arrayWithObject:NSFilenamesPboardType]; NSString *desiredType = [pasteboard availableTypeFromArray:types]; - SDL_Window *sdlwindow = nil; + SDL_Window *sdlwindow = [self findSDLWindow]; if (desiredType == nil) { return NO; /* can't accept anything that's being dropped here. */ @@ -158,16 +178,6 @@ - (BOOL)performDragOperation:(id )sender } } - /* !!! FIXME: is there a better way to do this? */ - if (_this) { - for (sdlwindow = _this->windows; sdlwindow; sdlwindow = sdlwindow->next) { - NSWindow *nswindow = ((SDL_WindowData *) sdlwindow->driverdata)->nswindow; - if (nswindow == self) { - break; - } - } - } - if (!SDL_SendDropFile(sdlwindow, [[fileURL path] UTF8String])) { return NO; } @@ -182,6 +192,24 @@ - (BOOL)wantsPeriodicDraggingUpdates return NO; } +- (SDL_Window*)findSDLWindow +{ + SDL_Window *sdlwindow = NULL; + SDL_VideoDevice *_this = SDL_GetVideoDevice(); + + /* !!! FIXME: is there a better way to do this? */ + if (_this) { + for (sdlwindow = _this->windows; sdlwindow; sdlwindow = sdlwindow->next) { + NSWindow *nswindow = ((SDL_WindowData *) sdlwindow->driverdata)->nswindow; + if (nswindow == self) { + break; + } + } + } + + return sdlwindow; +} + @end