浏览代码

Fix For issue #6948 (#6991)

MessageBoxes attached to a window in macOS should use modal APIs and not
use a poll/sleep pattern on the main thread. Sleeping the main thread
makes the NSWindow message loop sluggish and interferes with external
applications that need to send messages to that window, such as
VoiceOver.
Matt Durgavich 2 年之前
父节点
当前提交
59ad6793b9
共有 1 个文件被更改,包括 5 次插入29 次删除
  1. 5 29
      src/video/cocoa/SDL_cocoamessagebox.m

+ 5 - 29
src/video/cocoa/SDL_cocoamessagebox.m

@@ -31,7 +31,6 @@
     NSWindow *nswindow;
     NSWindow *nswindow;
 }
 }
 - (id)initWithParentWindow:(SDL_Window *)window;
 - (id)initWithParentWindow:(SDL_Window *)window;
-- (void)alertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo;
 @end
 @end
 
 
 @implementation SDLMessageBoxPresenter
 @implementation SDLMessageBoxPresenter
@@ -55,39 +54,16 @@
 - (void)showAlert:(NSAlert *)alert
 - (void)showAlert:(NSAlert *)alert
 {
 {
     if (nswindow) {
     if (nswindow) {
-#ifdef MAC_OS_X_VERSION_10_9
-        if ([alert respondsToSelector:@selector(beginSheetModalForWindow:completionHandler:)]) {
-            [alert beginSheetModalForWindow:nswindow
-                          completionHandler:^(NSModalResponse returnCode) {
-                            self->clicked = returnCode;
-                          }];
-        } else
-#endif
-        {
-#if MAC_OS_X_VERSION_MIN_REQUIRED < 1090
-            [alert beginSheetModalForWindow:nswindow
-                              modalDelegate:self
-                             didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:)
-                                contextInfo:nil];
-#endif
-        }
-
-        while (clicked < 0) {
-            SDL_PumpEvents();
-            SDL_Delay(100);
-        }
-
+        [alert beginSheetModalForWindow:nswindow
+                      completionHandler:^(NSModalResponse returnCode) {
+                        [NSApp stopModalWithCode:returnCode];
+                      }];
+        clicked = [NSApp runModalForWindow:nswindow];
         nswindow = nil;
         nswindow = nil;
     } else {
     } else {
         clicked = [alert runModal];
         clicked = [alert runModal];
     }
     }
 }
 }
-
-- (void)alertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
-{
-    clicked = returnCode;
-}
-
 @end
 @end
 
 
 static void Cocoa_ShowMessageBoxImpl(const SDL_MessageBoxData *messageboxdata, int *buttonid, int *returnValue)
 static void Cocoa_ShowMessageBoxImpl(const SDL_MessageBoxData *messageboxdata, int *buttonid, int *returnValue)