From ddddcb78cb670c11f8c1fbf120f4db055c8d995a Mon Sep 17 00:00:00 2001
From: Frank Praznik <[EMAIL REDACTED]>
Date: Sat, 12 Aug 2023 10:38:33 -0400
Subject: [PATCH] cocoa: Use the close method to hide a miniaturized window
The 'orderOut' method has no effect on miniaturized windows, so 'close' must be used to remove the window from the desktop, dock, and window list in this case.
SDL holds a strong reference to the window (oneShot/releasedWhenClosed are 'NO'), and calling 'close' doesn't send a 'windowShouldClose' message, so it's safe to use for this purpose as nothing is implicitly released.
---
src/video/cocoa/SDL_cocoawindow.m | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/src/video/cocoa/SDL_cocoawindow.m b/src/video/cocoa/SDL_cocoawindow.m
index a1119282748d..608d28a62af9 100644
--- a/src/video/cocoa/SDL_cocoawindow.m
+++ b/src/video/cocoa/SDL_cocoawindow.m
@@ -2185,7 +2185,18 @@ void Cocoa_HideWindow(SDL_VideoDevice *_this, SDL_Window *window)
@autoreleasepool {
NSWindow *nswindow = ((__bridge SDL_CocoaWindowData *)window->driverdata).nswindow;
- [nswindow orderOut:nil];
+ /* orderOut has no effect on miniaturized windows, so close must be used to remove
+ * the window from the desktop and window list in this case.
+ *
+ * SDL holds a strong reference to the window (oneShot/releasedWhenClosed are 'NO'),
+ * and calling 'close' doesn't send a 'windowShouldClose' message, so it's safe to
+ * use for this purpose as nothing is implicitly released.
+ */
+ if (![nswindow isMiniaturized]) {
+ [nswindow orderOut:nil];
+ } else {
+ [nswindow close];
+ }
/* Transfer keyboard focus back to the parent */
if (window->flags & SDL_WINDOW_POPUP_MENU) {