[DINPUT] Ove's keyboard hook fix
Lionel Ulmer
lionel.ulmer at free.fr
Sat Feb 1 11:04:33 CST 2003
Hi all,
This is just Ove's patch that applies cleanly to latest CVS which removes
the adding of the keyboard hook on DINPUT DLL loading.
Changelog:
Ove Kaaven <ovek at transgaming.com>
Only install the keyboard hook on device creation
--
Lionel Ulmer - http://www.bbrox.org/
-------------- next part --------------
--- ../wine_base/dlls/dinput/dinput_main.c Sun Jan 5 23:59:00 2003
+++ dlls/dinput/dinput_main.c Sat Feb 1 17:58:54 2003
@@ -58,10 +58,8 @@
{
case DLL_PROCESS_ATTACH:
DINPUT_instance = inst;
- keyboard_hook = SetWindowsHookExW( WH_KEYBOARD_LL, KeyboardCallback, inst, 0 );
break;
case DLL_PROCESS_DETACH:
- UnhookWindowsHookEx(keyboard_hook);
break;
}
return TRUE;
--- ../wine_base/dlls/dinput/dinput_private.h Sun Jan 5 23:59:00 2003
+++ dlls/dinput/dinput_private.h Sat Feb 1 17:59:08 2003
@@ -42,10 +42,6 @@
extern void dinput_register_device(dinput_device *device) ;
-HHOOK keyboard_hook;
-
-LRESULT CALLBACK KeyboardCallback( int code, WPARAM wparam, LPARAM lparam );
-
extern HINSTANCE DINPUT_instance;
#endif /* __WINE_DLLS_DINPUT_DINPUT_PRIVATE_H */
--- ../wine_base/dlls/dinput/keyboard/main.c Thu Jan 30 22:07:23 2003
+++ dlls/dinput/keyboard/main.c Sat Feb 1 17:59:57 2003
@@ -70,6 +70,8 @@
static BYTE DInputKeyState[256]; /* array for 'GetDeviceState' */
+CRITICAL_SECTION keyboard_crit = CRITICAL_SECTION_INIT("dinput_keyboard");
+DWORD keyboard_users;
HHOOK keyboard_hook;
LRESULT CALLBACK KeyboardCallback( int code, WPARAM wparam, LPARAM lparam )
@@ -162,6 +164,11 @@
memcpy(&(newDevice->guid),rguid,sizeof(*rguid));
newDevice->dinput = dinput;
+ EnterCriticalSection(&keyboard_crit);
+ if (!keyboard_users++)
+ keyboard_hook = SetWindowsHookExW( WH_KEYBOARD_LL, KeyboardCallback, DINPUT_instance, 0 );
+ LeaveCriticalSection(&keyboard_crit);
+
return newDevice;
}
@@ -193,6 +200,31 @@
DECL_GLOBAL_CONSTRUCTOR(keyboarddev_register) { dinput_register_device(&keyboarddev); }
+static ULONG WINAPI SysKeyboardAImpl_Release(LPDIRECTINPUTDEVICE8A iface)
+{
+ ICOM_THIS(SysKeyboardAImpl,iface);
+
+ This->ref--;
+ if (This->ref)
+ return This->ref;
+
+ EnterCriticalSection(&keyboard_crit);
+ if (!--keyboard_users) {
+ UnhookWindowsHookEx( keyboard_hook );
+ keyboard_hook = 0;
+ }
+ LeaveCriticalSection(&keyboard_crit);
+
+ /* Free the data queue */
+ if (This->buffer != NULL)
+ HeapFree(GetProcessHeap(),0,This->buffer);
+
+ DeleteCriticalSection(&(This->crit));
+
+ HeapFree(GetProcessHeap(),0,This);
+ return 0;
+}
+
static HRESULT WINAPI SysKeyboardAImpl_SetProperty(
LPDIRECTINPUTDEVICE8A iface,REFGUID rguid,LPCDIPROPHEADER ph
)
@@ -400,7 +432,7 @@
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
IDirectInputDevice2AImpl_QueryInterface,
IDirectInputDevice2AImpl_AddRef,
- IDirectInputDevice2AImpl_Release,
+ SysKeyboardAImpl_Release,
SysKeyboardAImpl_GetCapabilities,
IDirectInputDevice2AImpl_EnumObjects,
IDirectInputDevice2AImpl_GetProperty,
More information about the wine-patches
mailing list