Date: Tue, 19 Oct 2004 23:04:58 -0700
authorSam Lantinga <slouken@libsdl.org>
Fri, 12 Nov 2004 23:14:47 +0000
changeset 970 fb8b91365766
parent 969 cfb9518670f4
child 971 96671ebc50a4
Date: Tue, 19 Oct 2004 23:04:58 -0700 From: "Trevor Scroggins" Subject: [SDL] [PATCH] DirectX and SDL_WINDOWID Hack Hello, all. The IDirectInputDevice2_SetCooperativeLevel call in SDL_dx5events.c expects to be passed a root-level HWND. More often than not, a child window is used with the SDL_WINDOWID hack, causing the IDirectInputDevice2_SetCooperativeLevel call to fail. This is a small patch to SDL_dx5events.c v1.21 that fixes the problem by retrieving a handle to the root-level ancestor of the current SDL_Window and passing that handle to IDirectInputDevice2_SetCooperativeLevel.
src/video/windx5/SDL_dx5events.c
--- a/src/video/windx5/SDL_dx5events.c	Fri Nov 12 22:09:17 2004 +0000
+++ b/src/video/windx5/SDL_dx5events.c	Fri Nov 12 23:14:47 2004 +0000
@@ -141,6 +141,7 @@
 	LPDIRECTINPUTDEVICE device;
 	HRESULT     result;
 	DIPROPDWORD dipdw;
+	HWND        topwnd;
 
 	/* Create the DirectInput object */
 	result = DInputCreate(SDL_Instance, DIRECTINPUT_VERSION,
@@ -167,8 +168,9 @@
 			SetDIerror("DirectInputDevice::QueryInterface", result);
 			return(-1);
 		}
+		topwnd =  GetAncestor(SDL_Window, GA_ROOT);
 		result = IDirectInputDevice2_SetCooperativeLevel(SDL_DIdev[i],
-					SDL_Window, inputs[i].win_level);
+					topwnd, inputs[i].win_level);
 		if ( result != DI_OK ) {
 			SetDIerror("DirectInputDevice::SetCooperativeLevel",
 									result);
@@ -640,6 +642,7 @@
 	DWORD level;
 	int i;
 	HRESULT result;
+	HWND topwnd;
 
 	for ( i=0; i<MAX_INPUTS; ++i ) {
 		if ( SDL_DIdev[i] != NULL ) {
@@ -649,8 +652,9 @@
 				level = inputs[i].win_level;
 			}
 			IDirectInputDevice2_Unacquire(SDL_DIdev[i]);
+			topwnd = GetAncestor(SDL_Window, GA_ROOT);
 			result = IDirectInputDevice2_SetCooperativeLevel(
-					SDL_DIdev[i], SDL_Window, level);
+					SDL_DIdev[i], topwnd, level);
 			IDirectInputDevice2_Acquire(SDL_DIdev[i]);
 			if ( result != DI_OK ) {
 				SetDIerror(