From c8b8665f437a0774bc414707d5d6269cef45cc77 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sun, 14 Jul 2013 11:11:42 -0700 Subject: [PATCH] If the video system has been initialized, only use that message box system. Don't pass a window from one video driver to the messagebox function of another video driver. This makes bad things happen. :) --- src/video/SDL_video.c | 70 +++++++++++++++++++++++-------------------- 1 file changed, 38 insertions(+), 32 deletions(-) diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index afa00db95..c0a24e09e 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -3057,48 +3057,54 @@ SDL_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid) { int dummybutton; int retval = -1; - SDL_bool relative_mode = SDL_GetRelativeMouseMode(); - int show_cursor_prev = SDL_ShowCursor( 1 ); + SDL_bool relative_mode; + int show_cursor_prev; - SDL_SetRelativeMouseMode( SDL_FALSE ); + if (!messageboxdata) { + return SDL_InvalidParamError("messageboxdata"); + } + + relative_mode = SDL_GetRelativeMouseMode(); + SDL_SetRelativeMouseMode(SDL_FALSE); + show_cursor_prev = SDL_ShowCursor(1); if (!buttonid) { buttonid = &dummybutton; } if (_this && _this->ShowMessageBox) { - if (_this->ShowMessageBox(_this, messageboxdata, buttonid) == 0) { - retval = 0; + retval = _this->ShowMessageBox(_this, messageboxdata, buttonid); + } else { + /* It's completely fine to call this function before video is initialized */ + if (messageboxdata->window == NULL) { +#if SDL_VIDEO_DRIVER_WINDOWS + if ((retval == -1) && (WIN_ShowMessageBox(messageboxdata, buttonid) == 0)) { + retval = 0; + } +#endif +#if SDL_VIDEO_DRIVER_COCOA + if ((retval == -1) && (Cocoa_ShowMessageBox(messageboxdata, buttonid) == 0)) { + retval = 0; + } +#endif +#if SDL_VIDEO_DRIVER_UIKIT + if ((retval == -1) && (UIKit_ShowMessageBox(messageboxdata, buttonid) == 0)) { + retval = 0; + } +#endif +#if SDL_VIDEO_DRIVER_X11 + if ((retval == -1) && (X11_ShowMessageBox(messageboxdata, buttonid) == 0)) { + retval = 0; + } +#endif + } + if (retval == -1) { + SDL_SetError("No message system available"); } } - /* It's completely fine to call this function before video is initialized */ -#if SDL_VIDEO_DRIVER_WINDOWS - if ((retval == -1) && (WIN_ShowMessageBox(messageboxdata, buttonid) == 0)) { - retval = 0; - } -#endif -#if SDL_VIDEO_DRIVER_COCOA - if ((retval == -1) && (Cocoa_ShowMessageBox(messageboxdata, buttonid) == 0)) { - retval = 0; - } -#endif -#if SDL_VIDEO_DRIVER_UIKIT - if ((retval == -1) && (UIKit_ShowMessageBox(messageboxdata, buttonid) == 0)) { - retval = 0; - } -#endif -#if SDL_VIDEO_DRIVER_X11 - if ((retval == -1) && (X11_ShowMessageBox(messageboxdata, buttonid) == 0)) { - retval = 0; - } -#endif + SDL_ShowCursor(show_cursor_prev); + SDL_SetRelativeMouseMode(relative_mode); - SDL_ShowCursor( show_cursor_prev ); - SDL_SetRelativeMouseMode( relative_mode ); - - if(retval == -1) { - SDL_SetError("No message system available"); - } return retval; }