From 4d9e6e5f7098a47181e4a367c293715f12960c32 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Fri, 21 Feb 2020 14:50:09 -0500 Subject: [PATCH] cocoa: When exiting a fullscreen space, wait for window state to normalize. A good metric of this is when the titlebar's "minimize" button is reenabled, which doesn't happen by the time windowDidExitFullscreen triggers. This fixes minimizing a fullscreen window on macOS. Fixes Bugzilla #4177. --- src/video/cocoa/SDL_cocoawindow.m | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/video/cocoa/SDL_cocoawindow.m b/src/video/cocoa/SDL_cocoawindow.m index 959d54550..bf28682f4 100644 --- a/src/video/cocoa/SDL_cocoawindow.m +++ b/src/video/cocoa/SDL_cocoawindow.m @@ -794,6 +794,7 @@ SetWindowStyle(SDL_Window * window, NSUInteger style) { SDL_Window *window = _data->window; NSWindow *nswindow = _data->nswindow; + NSButton *button = nil; inFullscreenTransition = NO; @@ -865,6 +866,22 @@ SetWindowStyle(SDL_Window * window, NSUInteger style) Cocoa_ShowWindow(SDL_GetVideoDevice(), window); } } + + /* There's some state that isn't quite back to normal when + windowDidExitFullScreen triggers. For example, the minimize button on + the titlebar doesn't actually enable for another 200 milliseconds or + so on this MacBook. Camp here and wait for that to happen before + going on, in case we're exiting fullscreen to minimize, which need + that window state to be normal before it will work. */ + button = [nswindow standardWindowButton:NSWindowMiniaturizeButton]; + if (button) { + int iterations = 0; + while (![button isEnabled]) { + SDL_Delay(10); + SDL_PumpEvents(); + iterations++; + } + } } -(NSApplicationPresentationOptions)window:(NSWindow *)window willUseFullScreenPresentationOptions:(NSApplicationPresentationOptions)proposedOptions @@ -1724,6 +1741,7 @@ Cocoa_MinimizeWindow(_THIS, SDL_Window * window) SDL_WindowData *data = (SDL_WindowData *) window->driverdata; NSWindow *nswindow = data->nswindow; +printf("Cocoa_MinimizeWindow begin %u\n", (unsigned int) SDL_GetTicks()); if ([data->listener isInFullscreenSpaceTransition]) { [data->listener addPendingWindowOperation:PENDING_OPERATION_MINIMIZE]; } else {