From 18b7a2315c389107a433153f0a24d19d734996e8 Mon Sep 17 00:00:00 2001
From: Frank Praznik <[EMAIL REDACTED]>
Date: Tue, 19 Nov 2024 11:15:31 -0500
Subject: [PATCH] cocoa: Restore fullscreen state on the window regaining key
status
Ensure that fullscreen state is restored if a non-minimized fullscreen window regains key status. This can happen if a fullscreen window was requested to minimize on loss of key status, but the minimization didn't actually occur.
---
src/video/cocoa/SDL_cocoawindow.m | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/src/video/cocoa/SDL_cocoawindow.m b/src/video/cocoa/SDL_cocoawindow.m
index cf6290cd5055c..560f2ddd3931a 100644
--- a/src/video/cocoa/SDL_cocoawindow.m
+++ b/src/video/cocoa/SDL_cocoawindow.m
@@ -1203,6 +1203,14 @@ - (void)windowDidBecomeKey:(NSNotification *)aNotification
_data.videodata.modifierFlags = (_data.videodata.modifierFlags & ~NSEventModifierFlagCapsLock) | newflags;
SDL_ToggleModState(SDL_KMOD_CAPS, newflags ? true : false);
}
+
+ /* Restore fullscreen mode unless the window is deminiaturizing.
+ * If it is, fullscreen will be restored when deminiaturization is complete.
+ */
+ if (!(window->flags & SDL_WINDOW_MINIMIZED) &&
+ [self windowOperationIsPending:PENDING_OPERATION_ENTER_FULLSCREEN]) {
+ SDL_UpdateFullscreenMode(window, true, true);
+ }
}
- (void)windowDidResignKey:(NSNotification *)aNotification
@@ -2733,6 +2741,8 @@ SDL_FullscreenResult Cocoa_SetWindowFullscreen(SDL_VideoDevice *_this, SDL_Windo
NSWindow *nswindow = data.nswindow;
NSRect rect;
+ [data.listener clearPendingWindowOperation:PENDING_OPERATION_ENTER_FULLSCREEN];
+
// The view responder chain gets messed with during setStyleMask
if ([data.sdlContentView nextResponder] == data.listener) {
[data.sdlContentView setNextResponder:nil];
@@ -2841,6 +2851,7 @@ SDL_FullscreenResult Cocoa_SetWindowFullscreen(SDL_VideoDevice *_this, SDL_Windo
if (!fullscreen && [data.listener windowOperationIsPending:PENDING_OPERATION_MINIMIZE]) {
Cocoa_WaitForMiniaturizable(window);
[data.listener addPendingWindowOperation:PENDING_OPERATION_ENTER_FULLSCREEN];
+ [data.listener clearPendingWindowOperation:PENDING_OPERATION_MINIMIZE];
[nswindow miniaturize:nil];
}