From f65cfbfe9b20e38537c7cb8608e7f411c9e8b725 Mon Sep 17 00:00:00 2001 From: Brendan Shanks Date: Fri, 17 Apr 2020 11:35:07 -0700 Subject: [PATCH] dinput: Fix DInput8 keyboard behavior for injected events with scancode=0. Grand Theft Auto IV injects VK_F8 and scancode=0, and expects DirectInput not to report that F8 is pressed. Signed-off-by: Brendan Shanks Signed-off-by: Alexandre Julliard --- dlls/dinput/keyboard.c | 8 ++++---- dlls/dinput8/tests/device.c | 2 -- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/dlls/dinput/keyboard.c b/dlls/dinput/keyboard.c index 47f28cac52a..f842f1ca42e 100644 --- a/dlls/dinput/keyboard.c +++ b/dlls/dinput/keyboard.c @@ -68,9 +68,9 @@ static inline IDirectInputDevice8W *IDirectInputDevice8W_from_impl(SysKeyboardIm return &This->base.IDirectInputDevice8W_iface; } -static BYTE map_dik_code(DWORD scanCode, DWORD vkCode, DWORD subType) +static BYTE map_dik_code(DWORD scanCode, DWORD vkCode, DWORD subType, DWORD version) { - if (!scanCode) + if (!scanCode && version < 0x0800) scanCode = MapVirtualKeyW(vkCode, MAPVK_VK_TO_VSC); if (subType == DIDEVTYPEKEYBOARD_JAPAN106) @@ -125,7 +125,7 @@ static int KeyboardCallback( LPDIRECTINPUTDEVICE8A iface, WPARAM wparam, LPARAM case VK_NUMLOCK : dik_code = DIK_NUMLOCK; break; case VK_SUBTRACT: dik_code = DIK_SUBTRACT; break; default: - dik_code = map_dik_code(hook->scanCode & 0xff, hook->vkCode, This->subtype); + dik_code = map_dik_code(hook->scanCode & 0xff, hook->vkCode, This->subtype, This->base.dinput->dwVersion); if (hook->flags & LLKHF_EXTENDED) dik_code |= 0x80; } new_diks = hook->flags & LLKHF_UP ? 0 : 0x80; @@ -282,7 +282,7 @@ static SysKeyboardImpl *alloc_device(REFGUID rguid, IDirectInputImpl *dinput) if (!GetKeyNameTextA(((i & 0x7f) << 16) | ((i & 0x80) << 17), buf, sizeof(buf))) continue; - dik_code = map_dik_code(i, 0, newDevice->subtype); + dik_code = map_dik_code(i, 0, newDevice->subtype, dinput->dwVersion); memcpy(&df->rgodf[idx], &c_dfDIKeyboard.rgodf[dik_code], df->dwObjSize); df->rgodf[idx++].dwType = DIDFT_MAKEINSTANCE(dik_code) | DIDFT_PSHBUTTON; } diff --git a/dlls/dinput8/tests/device.c b/dlls/dinput8/tests/device.c index bb82855d408..39c635f2fb9 100644 --- a/dlls/dinput8/tests/device.c +++ b/dlls/dinput8/tests/device.c @@ -820,7 +820,6 @@ static void test_keyboard_events(void) data_size = ARRAY_SIZE(obj_data); hr = IDirectInputDevice8_GetDeviceData(di_keyboard, sizeof(DIDEVICEOBJECTDATA), obj_data, &data_size, 0); ok(SUCCEEDED(hr), "Failed to get data hr=%08x\n", hr); - todo_wine ok(data_size == 0, "Expected 0 elements, received %d\n", data_size); hr = IDirectInputDevice8_GetDeviceState(di_keyboard, sizeof(kbdata), kbdata); @@ -834,7 +833,6 @@ static void test_keyboard_events(void) data_size = ARRAY_SIZE(obj_data); hr = IDirectInputDevice8_GetDeviceData(di_keyboard, sizeof(DIDEVICEOBJECTDATA), obj_data, &data_size, 0); ok(SUCCEEDED(hr), "Failed to get data hr=%08x\n", hr); - todo_wine ok(data_size == 0, "Expected 0 elements, received %d\n", data_size); hr = IDirectInputDevice8_Unacquire(di_keyboard);