(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
--- 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)
--- 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);
--- 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
--- 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 */
--- 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();
}
--- 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;
--- 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();
}
--- 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 */