(patch tweaked a bit)
authorSam Lantinga <slouken@libsdl.org>
Tue, 14 Mar 2006 04:00:03 +0000
changeset 1523 21b1fbb53f4a
parent 1522 1078552c83a0
child 1524 38a12fd1a2c1
(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
src/video/gapi/SDL_gapivideo.c
src/video/wincommon/SDL_lowvideo.h
src/video/wincommon/SDL_sysevents.c
src/video/wincommon/SDL_wingl.c
src/video/windib/SDL_dibevents.c
src/video/windib/SDL_dibvideo.c
src/video/windx5/SDL_dx5events.c
src/video/windx5/SDL_dx5video.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 */