# HG changeset patch # User Ryan C. Gordon # Date 1127811642 0 # Node ID d31afac94eff6a203e8dc2f76a6144e5da12df95 # Parent 509295d5a0232fa9d1ab938c96e4dbcc26a5cd92 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 diff -r 509295d5a023 -r d31afac94eff include/SDL_main.h --- a/include/SDL_main.h Tue Sep 27 08:36:28 2005 +0000 +++ b/include/SDL_main.h Tue Sep 27 09:00:42 2005 +0000 @@ -69,7 +69,8 @@ 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 -r 509295d5a023 -r d31afac94eff src/video/wincommon/SDL_sysevents.c --- a/src/video/wincommon/SDL_sysevents.c Tue Sep 27 08:36:28 2005 +0000 +++ b/src/video/wincommon/SDL_sysevents.c Tue Sep 27 09:00:42 2005 +0000 @@ -562,11 +562,6 @@ 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 @@ /* 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 @@ /* 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 -r 509295d5a023 -r d31afac94eff src/video/windib/SDL_dibvideo.c --- a/src/video/windib/SDL_dibvideo.c Tue Sep 27 08:36:28 2005 +0000 +++ b/src/video/windib/SDL_dibvideo.c Tue Sep 27 09:00:42 2005 +0000 @@ -971,6 +971,7 @@ } DIB_QuitGamma(this); DIB_DestroyWindow(this); + SDL_UnregisterApp(); FlushMessageQueue(); SDL_Window = NULL; diff -r 509295d5a023 -r d31afac94eff src/video/windx5/SDL_dx5video.c --- a/src/video/windx5/SDL_dx5video.c Tue Sep 27 08:36:28 2005 +0000 +++ b/src/video/windx5/SDL_dx5video.c Tue Sep 27 09:00:42 2005 +0000 @@ -2387,6 +2387,7 @@ DIB_QuitGamma(this); if ( SDL_Window ) { DX5_DestroyWindow(this); + SDL_UnregisterApp(); FlushMessageQueue(); }