(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
This commit is contained in:
parent
e1c330b81f
commit
482c7c9258
8 changed files with 69 additions and 34 deletions
|
@ -731,6 +731,12 @@ SDL_Surface *GAPI_SetVideoMode(_THIS, SDL_Surface *current,
|
||||||
ShowWindow(SDL_Window, SW_SHOW);
|
ShowWindow(SDL_Window, SW_SHOW);
|
||||||
SetForegroundWindow(SDL_Window);
|
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 */
|
/* Open GAPI display */
|
||||||
if( !gapi->useVga && this->hidden->useGXOpenDisplay )
|
if( !gapi->useVga && this->hidden->useGXOpenDisplay )
|
||||||
if( !gapi->gxFunc.GXOpenDisplay(SDL_Window, GX_FULLSCREEN) )
|
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();
|
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
|
/* Note: If we are terminated, this could be called in the middle of
|
||||||
another SDL video routine -- notably UpdateRects.
|
another SDL video routine -- notably UpdateRects.
|
||||||
*/
|
*/
|
||||||
|
@ -1138,7 +1133,6 @@ void GAPI_VideoQuit(_THIS)
|
||||||
|
|
||||||
DIB_DestroyWindow(this);
|
DIB_DestroyWindow(this);
|
||||||
SDL_UnregisterApp();
|
SDL_UnregisterApp();
|
||||||
FlushMessageQueue();
|
|
||||||
|
|
||||||
SDL_Window = NULL;
|
SDL_Window = NULL;
|
||||||
#if defined(_WIN32_WCE)
|
#if defined(_WIN32_WCE)
|
||||||
|
|
|
@ -79,6 +79,8 @@ extern BOOL SDL_windowid;
|
||||||
/* Variables and functions exported to other parts of the native video
|
/* Variables and functions exported to other parts of the native video
|
||||||
subsystem (SDL_sysevents.c)
|
subsystem (SDL_sysevents.c)
|
||||||
*/
|
*/
|
||||||
|
extern void WIN_FlushMessageQueue();
|
||||||
|
|
||||||
/* Called by windows message loop when system palette is available */
|
/* Called by windows message loop when system palette is available */
|
||||||
extern void (*WIN_RealizePalette)(_THIS);
|
extern void (*WIN_RealizePalette)(_THIS);
|
||||||
|
|
||||||
|
|
|
@ -169,6 +169,21 @@ static void GapiTransform(SDL_ScreenOrientation rotate, char hires, Sint16 *x, S
|
||||||
|
|
||||||
#endif
|
#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)
|
static void SDL_RestoreGameMode(void)
|
||||||
{
|
{
|
||||||
#ifdef _WIN32_WCE
|
#ifdef _WIN32_WCE
|
||||||
|
|
|
@ -48,12 +48,16 @@ static int WIN_GL_ResetWindow(_THIS)
|
||||||
style = GetWindowLong(SDL_Window, GWL_STYLE);
|
style = GetWindowLong(SDL_Window, GWL_STYLE);
|
||||||
GetWindowRect(SDL_Window, &rect);
|
GetWindowRect(SDL_Window, &rect);
|
||||||
DestroyWindow(SDL_Window);
|
DestroyWindow(SDL_Window);
|
||||||
|
WIN_FlushMessageQueue();
|
||||||
|
|
||||||
SDL_Window = CreateWindow(SDL_Appname, SDL_Appname,
|
SDL_Window = CreateWindow(SDL_Appname, SDL_Appname,
|
||||||
style,
|
style,
|
||||||
rect.left, rect.top,
|
rect.left, rect.top,
|
||||||
(rect.right-rect.left)+1,
|
(rect.right-rect.left)+1,
|
||||||
(rect.top-rect.bottom)+1,
|
(rect.top-rect.bottom)+1,
|
||||||
NULL, NULL, SDL_Instance, NULL);
|
NULL, NULL, SDL_Instance, NULL);
|
||||||
|
WIN_FlushMessageQueue();
|
||||||
|
|
||||||
if ( SDL_Window ) {
|
if ( SDL_Window ) {
|
||||||
this->SetCaption(this, this->wm_title, this->wm_icon);
|
this->SetCaption(this, this->wm_title, this->wm_icon);
|
||||||
} else {
|
} else {
|
||||||
|
@ -118,6 +122,8 @@ static void Init_WGL_ARB_extensions(_THIS)
|
||||||
hwnd = CreateWindow(SDL_Appname, SDL_Appname, WS_POPUP | WS_DISABLED,
|
hwnd = CreateWindow(SDL_Appname, SDL_Appname, WS_POPUP | WS_DISABLED,
|
||||||
0, 0, 10, 10,
|
0, 0, 10, 10,
|
||||||
NULL, NULL, SDL_Instance, NULL);
|
NULL, NULL, SDL_Instance, NULL);
|
||||||
|
WIN_FlushMessageQueue();
|
||||||
|
|
||||||
hdc = GetDC(hwnd);
|
hdc = GetDC(hwnd);
|
||||||
|
|
||||||
pformat = ChoosePixelFormat(hdc, &GL_pfd);
|
pformat = ChoosePixelFormat(hdc, &GL_pfd);
|
||||||
|
@ -158,6 +164,7 @@ static void Init_WGL_ARB_extensions(_THIS)
|
||||||
}
|
}
|
||||||
ReleaseDC(hwnd, hdc);
|
ReleaseDC(hwnd, hdc);
|
||||||
DestroyWindow(hwnd);
|
DestroyWindow(hwnd);
|
||||||
|
WIN_FlushMessageQueue();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* SDL_VIDEO_OPENGL */
|
#endif /* SDL_VIDEO_OPENGL */
|
||||||
|
|
|
@ -438,6 +438,13 @@ int DIB_CreateWindow(_THIS)
|
||||||
}
|
}
|
||||||
ShowWindow(SDL_Window, SW_HIDE);
|
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);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -449,4 +456,10 @@ void DIB_DestroyWindow(_THIS)
|
||||||
DestroyWindow(SDL_Window);
|
DestroyWindow(SDL_Window);
|
||||||
}
|
}
|
||||||
SDL_UnregisterApp();
|
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 ) {
|
if ( DIB_CreateWindow(this) < 0 ) {
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !SDL_AUDIO_DISABLED
|
#if !SDL_AUDIO_DISABLED
|
||||||
DX5_SoundFocus(SDL_Window);
|
DX5_SoundFocus(SDL_Window);
|
||||||
#endif
|
#endif
|
||||||
|
@ -818,6 +819,12 @@ SDL_Surface *DIB_SetVideoMode(_THIS, SDL_Surface *current,
|
||||||
video->flags |= SDL_OPENGL;
|
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! */
|
/* We're live! */
|
||||||
return(video);
|
return(video);
|
||||||
}
|
}
|
||||||
|
@ -1014,16 +1021,6 @@ int DIB_GetGammaRamp(_THIS, Uint16 *ramp)
|
||||||
#endif /* !NO_GAMMA_SUPPORT */
|
#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)
|
void DIB_VideoQuit(_THIS)
|
||||||
{
|
{
|
||||||
/* Destroy the window and everything associated with it */
|
/* Destroy the window and everything associated with it */
|
||||||
|
@ -1051,7 +1048,6 @@ void DIB_VideoQuit(_THIS)
|
||||||
}
|
}
|
||||||
DIB_QuitGamma(this);
|
DIB_QuitGamma(this);
|
||||||
DIB_DestroyWindow(this);
|
DIB_DestroyWindow(this);
|
||||||
FlushMessageQueue();
|
|
||||||
|
|
||||||
SDL_Window = NULL;
|
SDL_Window = NULL;
|
||||||
|
|
||||||
|
|
|
@ -892,6 +892,12 @@ int DX5_CreateWindow(_THIS)
|
||||||
return(-1);
|
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 */
|
/* Ready to roll */
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
@ -908,4 +914,10 @@ void DX5_DestroyWindow(_THIS)
|
||||||
DestroyWindow(SDL_Window);
|
DestroyWindow(SDL_Window);
|
||||||
}
|
}
|
||||||
SDL_UnregisterApp();
|
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 ) {
|
if ( DX5_CreateWindow(this) < 0 ) {
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !SDL_AUDIO_DISABLED
|
#if !SDL_AUDIO_DISABLED
|
||||||
DX5_SoundFocus(SDL_Window);
|
DX5_SoundFocus(SDL_Window);
|
||||||
#endif
|
#endif
|
||||||
|
@ -1604,6 +1605,12 @@ SDL_Surface *DX5_SetVideoMode(_THIS, SDL_Surface *current,
|
||||||
SetForegroundWindow(SDL_Window);
|
SetForegroundWindow(SDL_Window);
|
||||||
SDL_resizing = 0;
|
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! */
|
/* We're live! */
|
||||||
return(video);
|
return(video);
|
||||||
}
|
}
|
||||||
|
@ -2345,16 +2352,6 @@ static int DX5_GetGammaRamp(_THIS, Uint16 *ramp)
|
||||||
#endif /* !IDirectDrawGammaControl_SetGammaRamp */
|
#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)
|
void DX5_VideoQuit(_THIS)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
|
@ -2398,7 +2395,6 @@ void DX5_VideoQuit(_THIS)
|
||||||
DIB_QuitGamma(this);
|
DIB_QuitGamma(this);
|
||||||
if ( SDL_Window ) {
|
if ( SDL_Window ) {
|
||||||
DX5_DestroyWindow(this);
|
DX5_DestroyWindow(this);
|
||||||
FlushMessageQueue();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Free our window icon */
|
/* Free our window icon */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue