From 59ad6793b9ec900352cc3d756d6f3062a3ccb525 Mon Sep 17 00:00:00 2001 From: Matt Durgavich Date: Thu, 5 Jan 2023 11:54:27 -0500 Subject: [PATCH] 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. --- src/video/cocoa/SDL_cocoamessagebox.m | 34 ++++----------------------- 1 file changed, 5 insertions(+), 29 deletions(-) diff --git a/src/video/cocoa/SDL_cocoamessagebox.m b/src/video/cocoa/SDL_cocoamessagebox.m index 2a8815564..0684cf249 100644 --- a/src/video/cocoa/SDL_cocoamessagebox.m +++ b/src/video/cocoa/SDL_cocoamessagebox.m @@ -31,7 +31,6 @@ NSWindow *nswindow; } - (id)initWithParentWindow:(SDL_Window *)window; -- (void)alertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; @end @implementation SDLMessageBoxPresenter @@ -55,39 +54,16 @@ - (void)showAlert:(NSAlert *)alert { 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; } else { clicked = [alert runModal]; } } - -- (void)alertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo -{ - clicked = returnCode; -} - @end static void Cocoa_ShowMessageBoxImpl(const SDL_MessageBoxData *messageboxdata, int *buttonid, int *returnValue)