Sebastian Lackner : dinput: Reset device state in SysKeyboard*Impl_Acquire.

Alexandre Julliard julliard at wine.codeweavers.com
Mon May 18 07:57:35 CDT 2015


Module: wine
Branch: master
Commit: 0d91274defcf65093957cf8e43985b9be55642d5
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0d91274defcf65093957cf8e43985b9be55642d5

Author: Sebastian Lackner <sebastian at fds-team.de>
Date:   Sat Apr 11 10:06:05 2015 +0200

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 a5967d7..f3ac30e 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 ef5f06a..a0e7d24 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);
 }
 




More information about the wine-cvs mailing list