From bfb885a0d94eacfedc044a1bd4a47446d9f41a72 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Tue, 27 Sep 2005 09:00:42 +0000 Subject: [PATCH] Patch from Martin Lange (mala-sdl at hotmail.com) to unregister SDL's win32 windowclass when shutting down the video subsystem...this allows you to safely unload/reload the SDL shared library on Windows between initializations. Discussion is here: http://www.devolution.com/pipermail/sdl/2005-February/067424.html --- include/SDL_main.h | 3 ++- src/video/wincommon/SDL_sysevents.c | 31 +++++++++++++++++++++-------- src/video/windib/SDL_dibvideo.c | 1 + src/video/windx5/SDL_dx5video.c | 1 + 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/include/SDL_main.h b/include/SDL_main.h index 084534a28..9d5924dbc 100644 --- a/include/SDL_main.h +++ b/include/SDL_main.h @@ -69,7 +69,8 @@ extern "C" { extern DECLSPEC void SDLCALL SDL_SetModuleHandle(void *hInst); /* This can also be called, but is no longer necessary */ extern DECLSPEC int SDLCALL SDL_RegisterApp(char *name, Uint32 style, void *hInst); - +/* This can also be called, but is no longer necessary (SDL_Quit calls it) */ +extern DECLSPEC void SDLCALL SDL_UnregisterApp(); #ifdef __cplusplus } #endif diff --git a/src/video/wincommon/SDL_sysevents.c b/src/video/wincommon/SDL_sysevents.c index 7c1f828c1..38ba1053c 100644 --- a/src/video/wincommon/SDL_sysevents.c +++ b/src/video/wincommon/SDL_sysevents.c @@ -562,11 +562,6 @@ void *SDL_GetModuleHandle(void) if ( SDL_handle ) { handle = SDL_handle; } else { - /* Warning: - If SDL is built as a DLL, this will return a handle to - the DLL, not the application, and DirectInput may fail - to initialize. - */ handle = GetModuleHandle(NULL); } return(handle); @@ -575,17 +570,18 @@ void *SDL_GetModuleHandle(void) /* This allows the SDL_WINDOWID hack */ const char *SDL_windowid = NULL; +static int app_registered = 0; + /* Register the class for this application -- exported for winmain.c */ int SDL_RegisterApp(char *name, Uint32 style, void *hInst) { - static int initialized = 0; WNDCLASS class; #ifdef WM_MOUSELEAVE HMODULE handle; #endif /* Only do this once... */ - if ( initialized ) { + if ( app_registered ) { return(0); } @@ -646,7 +642,26 @@ int SDL_RegisterApp(char *name, Uint32 style, void *hInst) /* Check for SDL_WINDOWID hack */ SDL_windowid = getenv("SDL_WINDOWID"); - initialized = 1; + app_registered = 1; return(0); } +/* + * Unregisters the windowclass registered in SDL_RegisterApp above. + * Called from DIB_VideoQuit and DX5_VideoQuit when + * SDL_QuitSubSystem(INIT_VIDEO) is called. + */ +void SDL_UnRegisterApp() +{ + WNDCLASS class; + + /* SDL_RegisterApp might not have been called before */ + if (app_registered) { + /* Check for any registered windowclasses. */ + if (GetClassInfo(SDL_Instance, SDL_Appname, &class)) { + UnregisterClass(SDL_Appname, SDL_Instance); + } + } + app_registered = 0; +} + diff --git a/src/video/windib/SDL_dibvideo.c b/src/video/windib/SDL_dibvideo.c index a30696e04..aa74bf726 100644 --- a/src/video/windib/SDL_dibvideo.c +++ b/src/video/windib/SDL_dibvideo.c @@ -971,6 +971,7 @@ void DIB_VideoQuit(_THIS) } DIB_QuitGamma(this); DIB_DestroyWindow(this); + SDL_UnregisterApp(); FlushMessageQueue(); SDL_Window = NULL; diff --git a/src/video/windx5/SDL_dx5video.c b/src/video/windx5/SDL_dx5video.c index 0664295be..8abc6f1db 100644 --- a/src/video/windx5/SDL_dx5video.c +++ b/src/video/windx5/SDL_dx5video.c @@ -2387,6 +2387,7 @@ void DX5_VideoQuit(_THIS) DIB_QuitGamma(this); if ( SDL_Window ) { DX5_DestroyWindow(this); + SDL_UnregisterApp(); FlushMessageQueue(); }