From 9351bf6dd10734c7dc43442537341bdb19801999 Mon Sep 17 00:00:00 2001 From: Sam Lantinga 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 1813f3ddc..fa6db64d0 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]; }