From 0d91274defcf65093957cf8e43985b9be55642d5 Mon Sep 17 00:00:00 2001 From: Sebastian Lackner Date: Sat, 11 Apr 2015 10:06:05 +0200 Subject: [PATCH] dinput: Reset device state in SysKeyboard*Impl_Acquire. --- dlls/dinput/keyboard.c | 27 +++++++++++++++++++++++++-- dlls/dinput/tests/keyboard.c | 20 ++++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/dlls/dinput/keyboard.c b/dlls/dinput/keyboard.c index a5967d78c47..f3ac30e3325 100644 --- a/dlls/dinput/keyboard.c +++ b/dlls/dinput/keyboard.c @@ -527,6 +527,29 @@ static HRESULT WINAPI SysKeyboardAImpl_GetProperty(LPDIRECTINPUTDEVICE8A iface, return SysKeyboardWImpl_GetProperty(IDirectInputDevice8W_from_impl(This), rguid, pdiph); } +static HRESULT WINAPI SysKeyboardWImpl_Acquire(LPDIRECTINPUTDEVICE8W iface) +{ + SysKeyboardImpl *This = impl_from_IDirectInputDevice8W(iface); + HRESULT res; + + TRACE("(%p)\n", This); + + res = IDirectInputDevice2WImpl_Acquire(iface); + if (res == DI_OK) + { + TRACE("clearing keystate\n"); + memset(This->DInputKeyState, 0, sizeof(This->DInputKeyState)); + } + + return res; +} + +static HRESULT WINAPI SysKeyboardAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface) +{ + SysKeyboardImpl *This = impl_from_IDirectInputDevice8A(iface); + return SysKeyboardWImpl_Acquire(IDirectInputDevice8W_from_impl(This)); +} + static HRESULT WINAPI SysKeyboardWImpl_BuildActionMap(LPDIRECTINPUTDEVICE8W iface, LPDIACTIONFORMATW lpdiaf, LPCWSTR lpszUserName, @@ -615,7 +638,7 @@ static const IDirectInputDevice8AVtbl SysKeyboardAvt = IDirectInputDevice2AImpl_EnumObjects, SysKeyboardAImpl_GetProperty, IDirectInputDevice2AImpl_SetProperty, - IDirectInputDevice2AImpl_Acquire, + SysKeyboardAImpl_Acquire, IDirectInputDevice2AImpl_Unacquire, SysKeyboardAImpl_GetDeviceState, IDirectInputDevice2AImpl_GetDeviceData, @@ -651,7 +674,7 @@ static const IDirectInputDevice8WVtbl SysKeyboardWvt = IDirectInputDevice2WImpl_EnumObjects, SysKeyboardWImpl_GetProperty, IDirectInputDevice2WImpl_SetProperty, - IDirectInputDevice2WImpl_Acquire, + SysKeyboardWImpl_Acquire, IDirectInputDevice2WImpl_Unacquire, SysKeyboardWImpl_GetDeviceState, IDirectInputDevice2WImpl_GetDeviceData, diff --git a/dlls/dinput/tests/keyboard.c b/dlls/dinput/tests/keyboard.c index ef5f06a6c90..a0e7d2457ae 100644 --- a/dlls/dinput/tests/keyboard.c +++ b/dlls/dinput/tests/keyboard.c @@ -91,6 +91,26 @@ static void acquire_tests(IDirectInputA *pDI, HWND hwnd) for (i = 0; i < sizeof(custom_state) / sizeof(custom_state[0]); i++) ok(custom_state[i] == 0, "Should be zeroed, got 0x%08x\n", custom_state[i]); + /* simulate some keyboard input */ + SetFocus(hwnd); + keybd_event('Q', 0, 0, 0); + hr = IDirectInputDevice_GetDeviceState(pKeyboard, sizeof(custom_state), custom_state); + ok(SUCCEEDED(hr), "IDirectInputDevice_GetDeviceState() failed: %08x\n", hr); + if (!custom_state[0]) + win_skip("Keyboard event not processed, skipping test\n"); + else + { + /* unacquiring should reset the device state */ + hr = IDirectInputDevice_Unacquire(pKeyboard); + ok(SUCCEEDED(hr), "IDirectInputDevice_Unacquire() failed: %08x\n", hr); + hr = IDirectInputDevice_Acquire(pKeyboard); + ok(SUCCEEDED(hr), "IDirectInputDevice_Acquire() failed: %08x\n", hr); + hr = IDirectInputDevice_GetDeviceState(pKeyboard, sizeof(custom_state), custom_state); + ok(SUCCEEDED(hr), "IDirectInputDevice_GetDeviceState failed: %08x\n", hr); + for (i = 0; i < sizeof(custom_state) / sizeof(custom_state[0]); i++) + ok(custom_state[i] == 0, "Should be zeroed, got 0x%08x\n", custom_state[i]); + } + if (pKeyboard) IUnknown_Release(pKeyboard); }