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@transgaming.com> Only install the keyboard hook on device creation -- Lionel Ulmer - http://www.bbrox.org/
--- ../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,