From 9351bf6dd10734c7dc43442537341bdb19801999 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Sun, 18 Jun 2023 12:19:22 -0700
Subject: [PATCH] Add handling for SDL_HINT_WINDOW_ACTIVATE_WHEN_RAISED and
SDL_HINT_WINDOW_ACTIVATE_WHEN_SHOWN on macOS
- Cocoa_ShowWindow will order a window that is not being activated below the key window (if one exists) then set visible
- Cocoa_RaiseWindow calls -[NSWindow orderFront:] without changing the key window
---
src/video/cocoa/SDL_cocoawindow.m | 21 ++++++++++++++++++---
1 file changed, 18 insertions(+), 3 deletions(-)
diff --git a/src/video/cocoa/SDL_cocoawindow.m b/src/video/cocoa/SDL_cocoawindow.m
index 1813f3ddcc61..fa6db64d02f5 100644
--- a/src/video/cocoa/SDL_cocoawindow.m
+++ b/src/video/cocoa/SDL_cocoawindow.m
@@ -2139,6 +2139,7 @@ void Cocoa_ShowWindow(SDL_VideoDevice *_this, SDL_Window *window)
@autoreleasepool {
SDL_CocoaWindowData *windowData = ((__bridge SDL_CocoaWindowData *)window->driverdata);
NSWindow *nswindow = windowData.nswindow;
+ SDL_bool bActivate = SDL_GetHintBoolean(SDL_HINT_WINDOW_ACTIVATE_WHEN_SHOWN, SDL_TRUE);
if (![nswindow isMiniaturized]) {
[windowData.listener pauseVisibleObservation];
@@ -2146,7 +2147,15 @@ void Cocoa_ShowWindow(SDL_VideoDevice *_this, SDL_Window *window)
NSWindow *nsparent = ((__bridge SDL_CocoaWindowData *)window->parent->driverdata).nswindow;
[nsparent addChildWindow:nswindow ordered:NSWindowAbove];
}
- [nswindow makeKeyAndOrderFront:nil];
+ if (bActivate) {
+ [nswindow makeKeyAndOrderFront:nil];
+ } else {
+ /* Order this window below the key window if we're not activating it */
+ if ([NSApp keyWindow]) {
+ [nswindow orderWindow:NSWindowBelow relativeTo:[[NSApp keyWindow] windowNumber]];
+ }
+ [nswindow setIsVisible:YES];
+ }
[windowData.listener resumeVisibleObservation];
}
}
@@ -2180,9 +2189,10 @@ void Cocoa_RaiseWindow(SDL_VideoDevice *_this, SDL_Window *window)
@autoreleasepool {
SDL_CocoaWindowData *windowData = ((__bridge SDL_CocoaWindowData *)window->driverdata);
NSWindow *nswindow = windowData.nswindow;
+ SDL_bool bActivate = SDL_GetHintBoolean(SDL_HINT_WINDOW_ACTIVATE_WHEN_RAISED, SDL_TRUE);
/* makeKeyAndOrderFront: has the side-effect of deminiaturizing and showing
- a minimized or hidden window, so check for that before showing it.
+ a minimized or hidden window, so check for that before showing it.
*/
[windowData.listener pauseVisibleObservation];
if (![nswindow isMiniaturized] && [nswindow isVisible]) {
@@ -2191,7 +2201,12 @@ void Cocoa_RaiseWindow(SDL_VideoDevice *_this, SDL_Window *window)
NSWindow *nsparent = ((__bridge SDL_CocoaWindowData *)window->parent->driverdata).nswindow;
[nsparent addChildWindow:nswindow ordered:NSWindowAbove];
}
- [nswindow makeKeyAndOrderFront:nil];
+
+ if (bActivate) {
+ [nswindow makeKeyAndOrderFront:nil];
+ } else {
+ [nswindow orderFront:nil];
+ }
}
[windowData.listener resumeVisibleObservation];
}