# HG changeset patch # User Sam Lantinga # Date 1142308803 0 # Node ID 21b1fbb53f4a272cda6656ff61c265a41943bada # Parent 1078552c83a0d2ad44756f5447a79bc7c98011db (patch tweaked a bit) Date: Tue, 14 Mar 2006 03:30:11 +0000 From: Peter Mulholland Subject: [SDL] Windows MessageBox() strangeness fixes Hello all, I *think* this should fix the issues that people were seeing with MessageBox() not working and therefore assert() on mingw/msvc. Forgive me if i've screwed up making the diff file - I'm a total newb when it comes to things like CVS and diff. It modifies a few files as I saw that FlushMessageQueue() was in both the windx5 and windib driver, so I moved this into wincommon. It was also in the gapi driver, so I changed that too. The function is now WIN_FlushMessageQueue() in src/video/wincommon/SDL_syswm.c diff -r 1078552c83a0 -r 21b1fbb53f4a src/video/gapi/SDL_gapivideo.c --- a/src/video/gapi/SDL_gapivideo.c Tue Mar 14 03:04:50 2006 +0000 +++ b/src/video/gapi/SDL_gapivideo.c Tue Mar 14 04:00:03 2006 +0000 @@ -731,6 +731,12 @@ ShowWindow(SDL_Window, SW_SHOW); SetForegroundWindow(SDL_Window); + /* JC 14 Mar 2006 + Flush the message loop or this can cause big problems later + Especially if the user decides to use dialog boxes or assert()! + */ + WIN_FlushMessageQueue(); + /* Open GAPI display */ if( !gapi->useVga && this->hidden->useGXOpenDisplay ) if( !gapi->gxFunc.GXOpenDisplay(SDL_Window, GX_FULLSCREEN) ) @@ -1103,17 +1109,6 @@ gapi->gxFunc.GXEndDraw(); } -static void FlushMessageQueue() -{ - MSG msg; - while ( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) ) { - if ( msg.message == WM_QUIT ) break; - TranslateMessage( &msg ); - DispatchMessage( &msg ); - } -} - - /* Note: If we are terminated, this could be called in the middle of another SDL video routine -- notably UpdateRects. */ @@ -1138,7 +1133,6 @@ DIB_DestroyWindow(this); SDL_UnregisterApp(); - FlushMessageQueue(); SDL_Window = NULL; #if defined(_WIN32_WCE) diff -r 1078552c83a0 -r 21b1fbb53f4a src/video/wincommon/SDL_lowvideo.h --- a/src/video/wincommon/SDL_lowvideo.h Tue Mar 14 03:04:50 2006 +0000 +++ b/src/video/wincommon/SDL_lowvideo.h Tue Mar 14 04:00:03 2006 +0000 @@ -79,6 +79,8 @@ /* Variables and functions exported to other parts of the native video subsystem (SDL_sysevents.c) */ +extern void WIN_FlushMessageQueue(); + /* Called by windows message loop when system palette is available */ extern void (*WIN_RealizePalette)(_THIS); diff -r 1078552c83a0 -r 21b1fbb53f4a src/video/wincommon/SDL_sysevents.c --- a/src/video/wincommon/SDL_sysevents.c Tue Mar 14 03:04:50 2006 +0000 +++ b/src/video/wincommon/SDL_sysevents.c Tue Mar 14 04:00:03 2006 +0000 @@ -169,6 +169,21 @@ #endif +/* JC 14 Mar 2006 + This is used all over the place, in the windib driver and in the dx5 driver + So we may as well stick it here instead of having multiple copies scattered + about +*/ +void WIN_FlushMessageQueue() +{ + MSG msg; + while ( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) ) { + if ( msg.message == WM_QUIT ) break; + TranslateMessage( &msg ); + DispatchMessage( &msg ); + } +} + static void SDL_RestoreGameMode(void) { #ifdef _WIN32_WCE diff -r 1078552c83a0 -r 21b1fbb53f4a src/video/wincommon/SDL_wingl.c --- a/src/video/wincommon/SDL_wingl.c Tue Mar 14 03:04:50 2006 +0000 +++ b/src/video/wincommon/SDL_wingl.c Tue Mar 14 04:00:03 2006 +0000 @@ -48,12 +48,16 @@ style = GetWindowLong(SDL_Window, GWL_STYLE); GetWindowRect(SDL_Window, &rect); DestroyWindow(SDL_Window); + WIN_FlushMessageQueue(); + SDL_Window = CreateWindow(SDL_Appname, SDL_Appname, style, rect.left, rect.top, (rect.right-rect.left)+1, (rect.top-rect.bottom)+1, NULL, NULL, SDL_Instance, NULL); + WIN_FlushMessageQueue(); + if ( SDL_Window ) { this->SetCaption(this, this->wm_title, this->wm_icon); } else { @@ -118,6 +122,8 @@ hwnd = CreateWindow(SDL_Appname, SDL_Appname, WS_POPUP | WS_DISABLED, 0, 0, 10, 10, NULL, NULL, SDL_Instance, NULL); + WIN_FlushMessageQueue(); + hdc = GetDC(hwnd); pformat = ChoosePixelFormat(hdc, &GL_pfd); @@ -158,6 +164,7 @@ } ReleaseDC(hwnd, hdc); DestroyWindow(hwnd); + WIN_FlushMessageQueue(); } #endif /* SDL_VIDEO_OPENGL */ diff -r 1078552c83a0 -r 21b1fbb53f4a src/video/windib/SDL_dibevents.c --- a/src/video/windib/SDL_dibevents.c Tue Mar 14 03:04:50 2006 +0000 +++ b/src/video/windib/SDL_dibevents.c Tue Mar 14 04:00:03 2006 +0000 @@ -438,6 +438,13 @@ } ShowWindow(SDL_Window, SW_HIDE); } + + /* JC 14 Mar 2006 + Flush the message loop or this can cause big problems later + Especially if the user decides to use dialog boxes or assert()! + */ + WIN_FlushMessageQueue(); + return(0); } @@ -449,4 +456,10 @@ DestroyWindow(SDL_Window); } SDL_UnregisterApp(); + + /* JC 14 Mar 2006 + Flush the message loop or this can cause big problems later + Especially if the user decides to use dialog boxes or assert()! + */ + WIN_FlushMessageQueue(); } diff -r 1078552c83a0 -r 21b1fbb53f4a src/video/windib/SDL_dibvideo.c --- a/src/video/windib/SDL_dibvideo.c Tue Mar 14 03:04:50 2006 +0000 +++ b/src/video/windib/SDL_dibvideo.c Tue Mar 14 04:00:03 2006 +0000 @@ -291,6 +291,7 @@ if ( DIB_CreateWindow(this) < 0 ) { return(-1); } + #if !SDL_AUDIO_DISABLED DX5_SoundFocus(SDL_Window); #endif @@ -818,6 +819,12 @@ video->flags |= SDL_OPENGL; } + /* JC 14 Mar 2006 + Flush the message loop or this can cause big problems later + Especially if the user decides to use dialog boxes or assert()! + */ + WIN_FlushMessageQueue(); + /* We're live! */ return(video); } @@ -1014,16 +1021,6 @@ #endif /* !NO_GAMMA_SUPPORT */ } -static void FlushMessageQueue() -{ - MSG msg; - while ( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) ) { - if ( msg.message == WM_QUIT ) break; - TranslateMessage( &msg ); - DispatchMessage( &msg ); - } -} - void DIB_VideoQuit(_THIS) { /* Destroy the window and everything associated with it */ @@ -1051,7 +1048,6 @@ } DIB_QuitGamma(this); DIB_DestroyWindow(this); - FlushMessageQueue(); SDL_Window = NULL; diff -r 1078552c83a0 -r 21b1fbb53f4a src/video/windx5/SDL_dx5events.c --- a/src/video/windx5/SDL_dx5events.c Tue Mar 14 03:04:50 2006 +0000 +++ b/src/video/windx5/SDL_dx5events.c Tue Mar 14 04:00:03 2006 +0000 @@ -892,6 +892,12 @@ return(-1); } + /* JC 14 Mar 2006 + Flush the message loop or this can cause big problems later + Especially if the user decides to use dialog boxes or assert()! + */ + WIN_FlushMessageQueue(); + /* Ready to roll */ return(0); } @@ -908,4 +914,10 @@ DestroyWindow(SDL_Window); } SDL_UnregisterApp(); + + /* JC 14 Mar 2006 + Flush the message loop or this can cause big problems later + Especially if the user decides to use dialog boxes or assert()! + */ + WIN_FlushMessageQueue(); } diff -r 1078552c83a0 -r 21b1fbb53f4a src/video/windx5/SDL_dx5video.c --- a/src/video/windx5/SDL_dx5video.c Tue Mar 14 03:04:50 2006 +0000 +++ b/src/video/windx5/SDL_dx5video.c Tue Mar 14 04:00:03 2006 +0000 @@ -902,6 +902,7 @@ if ( DX5_CreateWindow(this) < 0 ) { return(-1); } + #if !SDL_AUDIO_DISABLED DX5_SoundFocus(SDL_Window); #endif @@ -1604,6 +1605,12 @@ SetForegroundWindow(SDL_Window); SDL_resizing = 0; + /* JC 14 Mar 2006 + Flush the message loop or this can cause big problems later + Especially if the user decides to use dialog boxes or assert()! + */ + WIN_FlushMessageQueue(); + /* We're live! */ return(video); } @@ -2345,16 +2352,6 @@ #endif /* !IDirectDrawGammaControl_SetGammaRamp */ } -static void FlushMessageQueue() -{ - MSG msg; - while ( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) ) { - if ( msg.message == WM_QUIT ) break; - TranslateMessage( &msg ); - DispatchMessage( &msg ); - } -} - void DX5_VideoQuit(_THIS) { int i, j; @@ -2398,7 +2395,6 @@ DIB_QuitGamma(this); if ( SDL_Window ) { DX5_DestroyWindow(this); - FlushMessageQueue(); } /* Free our window icon */