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.
--- 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(