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
--- 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
--- 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;
+}
+
--- 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;
--- 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();
}