Patch from Martin Lange (mala-sdl at hotmail.com) to unregister SDL's win32
authorRyan C. Gordon <icculus@icculus.org>
Tue, 27 Sep 2005 09:00:42 +0000
changeset 1145 d31afac94eff
parent 1144 509295d5a023
child 1146 ab0154afe938
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
src/video/wincommon/SDL_sysevents.c
src/video/windib/SDL_dibvideo.c
src/video/windx5/SDL_dx5video.c
--- 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();
 	}