Commit 482c7c92 authored by Sam Lantinga's avatar Sam Lantinga

(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

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%401527
parent e1c330b8
......@@ -731,6 +731,12 @@ SDL_Surface *GAPI_SetVideoMode(_THIS, SDL_Surface *current,
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 @@ static void GAPI_UpdateRects(_THIS, int numrects, SDL_Rect *rects)
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 @@ void GAPI_VideoQuit(_THIS)
DIB_DestroyWindow(this);
SDL_UnregisterApp();
FlushMessageQueue();
SDL_Window = NULL;
#if defined(_WIN32_WCE)
......
......@@ -79,6 +79,8 @@ extern BOOL SDL_windowid;
/* 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);
......
......@@ -169,6 +169,21 @@ static void GapiTransform(SDL_ScreenOrientation rotate, char hires, Sint16 *x, S
#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
......
......@@ -48,12 +48,16 @@ static int WIN_GL_ResetWindow(_THIS)
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 @@ static void Init_WGL_ARB_extensions(_THIS)
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 @@ static void Init_WGL_ARB_extensions(_THIS)
}
ReleaseDC(hwnd, hdc);
DestroyWindow(hwnd);
WIN_FlushMessageQueue();
}
#endif /* SDL_VIDEO_OPENGL */
......
......@@ -438,6 +438,13 @@ int DIB_CreateWindow(_THIS)
}
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 @@ void DIB_DestroyWindow(_THIS)
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();
}
......@@ -291,6 +291,7 @@ int DIB_VideoInit(_THIS, SDL_PixelFormat *vformat)
if ( DIB_CreateWindow(this) < 0 ) {
return(-1);
}
#if !SDL_AUDIO_DISABLED
DX5_SoundFocus(SDL_Window);
#endif
......@@ -818,6 +819,12 @@ SDL_Surface *DIB_SetVideoMode(_THIS, SDL_Surface *current,
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 @@ int DIB_GetGammaRamp(_THIS, Uint16 *ramp)
#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 @@ void DIB_VideoQuit(_THIS)
}
DIB_QuitGamma(this);
DIB_DestroyWindow(this);
FlushMessageQueue();
SDL_Window = NULL;
......
......@@ -892,6 +892,12 @@ int DX5_CreateWindow(_THIS)
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 @@ void DX5_DestroyWindow(_THIS)
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();
}
......@@ -902,6 +902,7 @@ int DX5_VideoInit(_THIS, SDL_PixelFormat *vformat)
if ( DX5_CreateWindow(this) < 0 ) {
return(-1);
}
#if !SDL_AUDIO_DISABLED
DX5_SoundFocus(SDL_Window);
#endif
......@@ -1604,6 +1605,12 @@ SDL_Surface *DX5_SetVideoMode(_THIS, SDL_Surface *current,
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 @@ static int DX5_GetGammaRamp(_THIS, Uint16 *ramp)
#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 @@ void DX5_VideoQuit(_THIS)
DIB_QuitGamma(this);
if ( SDL_Window ) {
DX5_DestroyWindow(this);
FlushMessageQueue();
}
/* Free our window icon */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment