Browse Source

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
Sam Lantinga 1 year ago
parent
commit
9351bf6dd1
1 changed files with 18 additions and 3 deletions
  1. 18 3
      src/video/cocoa/SDL_cocoawindow.m

+ 18 - 3
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];
     }