From 7c67ebfd568eaf56f5289596fc03caecba98f6fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Bernon?= Date: Thu, 21 Oct 2021 18:07:46 +0200 Subject: [PATCH] dinput: Set high DIK bit for extended scancodes. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51910 Signed-off-by: RĂ©mi Bernon Signed-off-by: Alexandre Julliard --- dlls/dinput/keyboard.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/dlls/dinput/keyboard.c b/dlls/dinput/keyboard.c index fb6cf33b911..fd8e9e8fd12 100644 --- a/dlls/dinput/keyboard.c +++ b/dlls/dinput/keyboard.c @@ -80,7 +80,8 @@ static BYTE map_dik_code(DWORD scanCode, DWORD vkCode, DWORD subType, DWORD vers break; } } - return scanCode; + if (scanCode & 0x100) scanCode |= 0x80; + return (BYTE)scanCode; } int dinput_keyboard_hook( IDirectInputDevice8W *iface, WPARAM wparam, LPARAM lparam ) @@ -89,6 +90,7 @@ int dinput_keyboard_hook( IDirectInputDevice8W *iface, WPARAM wparam, LPARAM lpa BYTE new_diks, subtype = GET_DIDEVICE_SUBTYPE( This->base.instance.dwDevType ); int dik_code, ret = This->base.dwCoopLevel & DISCL_EXCLUSIVE; KBDLLHOOKSTRUCT *hook = (KBDLLHOOKSTRUCT *)lparam; + DWORD scan_code; if (wparam != WM_KEYDOWN && wparam != WM_KEYUP && wparam != WM_SYSKEYDOWN && wparam != WM_SYSKEYUP) @@ -105,9 +107,9 @@ int dinput_keyboard_hook( IDirectInputDevice8W *iface, WPARAM wparam, LPARAM lpa 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, subtype, - This->base.dinput->dwVersion ); - if (hook->flags & LLKHF_EXTENDED) dik_code |= 0x80; + scan_code = hook->scanCode & 0xff; + if (hook->flags & LLKHF_EXTENDED) scan_code |= 0x100; + dik_code = map_dik_code( scan_code, hook->vkCode, subtype, This->base.dinput->dwVersion ); } new_diks = hook->flags & LLKHF_UP ? 0 : 0x80;