[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