mirror of https://github.com/encounter/SDL.git
Run the entire Cocoa messagebox function on the main thread.
This fixes bug https://github.com/libsdl-org/SDL/issues/4420
This commit is contained in:
parent
dfd3f30e88
commit
51c61d7cdf
|
@ -89,10 +89,8 @@
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
||||||
/* Display a Cocoa message box */
|
static void
|
||||||
int
|
Cocoa_ShowMessageBoxImpl(const SDL_MessageBoxData *messageboxdata, int *buttonid, int *returnValue)
|
||||||
Cocoa_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid)
|
|
||||||
{ @autoreleasepool
|
|
||||||
{
|
{
|
||||||
Cocoa_RegisterApp();
|
Cocoa_RegisterApp();
|
||||||
|
|
||||||
|
@ -133,11 +131,8 @@ Cocoa_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid)
|
||||||
|
|
||||||
SDLMessageBoxPresenter* presenter = [[[SDLMessageBoxPresenter alloc] initWithParentWindow:messageboxdata->window] autorelease];
|
SDLMessageBoxPresenter* presenter = [[[SDLMessageBoxPresenter alloc] initWithParentWindow:messageboxdata->window] autorelease];
|
||||||
|
|
||||||
[presenter performSelectorOnMainThread:@selector(showAlert:)
|
[presenter showAlert:alert];
|
||||||
withObject:alert
|
|
||||||
waitUntilDone:YES];
|
|
||||||
|
|
||||||
int returnValue = 0;
|
|
||||||
NSInteger clicked = presenter->clicked;
|
NSInteger clicked = presenter->clicked;
|
||||||
if (clicked >= NSAlertFirstButtonReturn) {
|
if (clicked >= NSAlertFirstButtonReturn) {
|
||||||
clicked -= NSAlertFirstButtonReturn;
|
clicked -= NSAlertFirstButtonReturn;
|
||||||
|
@ -145,10 +140,24 @@ Cocoa_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid)
|
||||||
clicked = messageboxdata->numbuttons - 1 - clicked;
|
clicked = messageboxdata->numbuttons - 1 - clicked;
|
||||||
}
|
}
|
||||||
*buttonid = buttons[clicked].buttonid;
|
*buttonid = buttons[clicked].buttonid;
|
||||||
|
*returnValue = 0;
|
||||||
} else {
|
} else {
|
||||||
returnValue = SDL_SetError("Did not get a valid `clicked button' id: %ld", (long)clicked);
|
*returnValue = SDL_SetError("Did not get a valid `clicked button' id: %ld", (long)clicked);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Display a Cocoa message box */
|
||||||
|
int
|
||||||
|
Cocoa_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid)
|
||||||
|
{ @autoreleasepool
|
||||||
|
{
|
||||||
|
__block int returnValue = 0;
|
||||||
|
|
||||||
|
if ([NSThread isMainThread]) {
|
||||||
|
Cocoa_ShowMessageBoxImpl(messageboxdata, buttonid, &returnValue);
|
||||||
|
} else {
|
||||||
|
dispatch_sync(dispatch_get_main_queue(), ^{ Cocoa_ShowMessageBoxImpl(messageboxdata, buttonid, &returnValue); });
|
||||||
|
}
|
||||||
return returnValue;
|
return returnValue;
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
|
|
@ -197,7 +197,7 @@ main(int argc, char *argv[])
|
||||||
|
|
||||||
success = SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,
|
success = SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,
|
||||||
"Simple MessageBox",
|
"Simple MessageBox",
|
||||||
"This is a simple error MessageBox with a parent window",
|
"This is a simple error MessageBox with a parent window. Press a key or close the window after dismissing this messagebox.",
|
||||||
window);
|
window);
|
||||||
if (success == -1) {
|
if (success == -1) {
|
||||||
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error Presenting MessageBox: %s\n", SDL_GetError());
|
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error Presenting MessageBox: %s\n", SDL_GetError());
|
||||||
|
|
Loading…
Reference in New Issue