diff --git a/src/video/uikit/SDL_uikitmessagebox.m b/src/video/uikit/SDL_uikitmessagebox.m index a57b3f76cd..b96f5fde70 100644 --- a/src/video/uikit/SDL_uikitmessagebox.m +++ b/src/video/uikit/SDL_uikitmessagebox.m @@ -124,31 +124,30 @@ static BOOL UIKit_ShowMessageBoxAlertController(const SDL_MessageBoxData *messag return YES; } -static void UIKit_ShowMessageBoxImpl(const SDL_MessageBoxData *messageboxdata, int *buttonID, int *result) +typedef struct UIKit_ShowMessageBoxData +{ + const SDL_MessageBoxData *messageboxdata; + int *buttonID; + bool result; +} UIKit_ShowMessageBoxData; + +static void SDLCALL UIKit_ShowMessageBoxMainThreadCallback(void *userdata) { @autoreleasepool { - if (UIKit_ShowMessageBoxAlertController(messageboxdata, buttonID)) { - *result = true; - } else { - *result = SDL_SetError("Could not show message box."); - } + UIKit_ShowMessageBoxData *data = (UIKit_ShowMessageBoxData *) userdata; + data->result = UIKit_ShowMessageBoxAlertController(data->messageboxdata, data->buttonID); } } bool UIKit_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonID) { - @autoreleasepool { - __block int result = true; - - if ([NSThread isMainThread]) { - UIKit_ShowMessageBoxImpl(messageboxdata, buttonID, &result); - } else { - dispatch_sync(dispatch_get_main_queue(), ^{ - UIKit_ShowMessageBoxImpl(messageboxdata, buttonID, &result); - }); - } - return result; + UIKit_ShowMessageBoxData data = { messageboxdata, buttonID, false }; + if (!SDL_RunOnMainThread(UIKit_ShowMessageBoxMainThreadCallback, &data, true)) { + return false; + } else if (!data.result) { + return SDL_SetError("Could not show message box."); } + return true; } #endif // SDL_VIDEO_DRIVER_UIKIT