Module: wine Branch: master Commit: 966b3b20de0c060a32c88ba1fce193725310afd7 URL: https://source.winehq.org/git/wine.git/?a=commit;h=966b3b20de0c060a32c88ba1f...
Author: Akihiro Sagawa sagawa.aki@gmail.com Date: Fri Aug 17 17:15:03 2018 +0900
dinput: Correct key name mappings on Japanese 106 keyboard.
Signed-off-by: Akihiro Sagawa sagawa.aki@gmail.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/dinput/keyboard.c | 42 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 4 deletions(-)
diff --git a/dlls/dinput/keyboard.c b/dlls/dinput/keyboard.c index c810515..6c7b535 100644 --- a/dlls/dinput/keyboard.c +++ b/dlls/dinput/keyboard.c @@ -433,6 +433,40 @@ static HRESULT WINAPI SysKeyboardAImpl_GetCapabilities(LPDIRECTINPUTDEVICE8A ifa return SysKeyboardWImpl_GetCapabilities(IDirectInputDevice8W_from_impl(This), lpDIDevCaps); }
+static DWORD map_dik_to_scan(DWORD dik_code, DWORD subtype) +{ + if (dik_code == DIK_PAUSE || dik_code == DIK_NUMLOCK) dik_code ^= 0x80; + if (subtype == DIDEVTYPEKEYBOARD_JAPAN106) + { + switch (dik_code) + { + case DIK_CIRCUMFLEX: + dik_code = 0x0d; + break; + case DIK_AT: + dik_code = 0x1a; + break; + case DIK_LBRACKET: + dik_code = 0x1b; + break; + case DIK_COLON: + dik_code = 0x28; + break; + case DIK_KANJI: + dik_code = 0x29; + break; + case DIK_RBRACKET: + dik_code = 0x2b; + break; + case DIK_BACKSLASH: + dik_code = 0x73; + break; + } + } + + return dik_code; +} + /****************************************************************************** * GetObjectInfo : get information about a device object such as a button * or axis @@ -444,14 +478,14 @@ SysKeyboardAImpl_GetObjectInfo( DWORD dwObj, DWORD dwHow) { + SysKeyboardImpl *This = impl_from_IDirectInputDevice8A(iface); HRESULT res; LONG scan;
res = IDirectInputDevice2AImpl_GetObjectInfo(iface, pdidoi, dwObj, dwHow); if (res != DI_OK) return res;
- scan = DIDFT_GETINSTANCE(pdidoi->dwType); - if (scan == DIK_PAUSE || scan == DIK_NUMLOCK) scan ^= 0x80; + scan = map_dik_to_scan(DIDFT_GETINSTANCE(pdidoi->dwType), This->subtype); if (!GetKeyNameTextA((scan & 0x80) << 17 | (scan & 0x7f) << 16, pdidoi->tszName, sizeof(pdidoi->tszName))) return DIERR_OBJECTNOTFOUND; @@ -465,14 +499,14 @@ static HRESULT WINAPI SysKeyboardWImpl_GetObjectInfo(LPDIRECTINPUTDEVICE8W iface DWORD dwObj, DWORD dwHow) { + SysKeyboardImpl *This = impl_from_IDirectInputDevice8W(iface); HRESULT res; LONG scan;
res = IDirectInputDevice2WImpl_GetObjectInfo(iface, pdidoi, dwObj, dwHow); if (res != DI_OK) return res;
- scan = DIDFT_GETINSTANCE(pdidoi->dwType); - if (scan == DIK_PAUSE || scan == DIK_NUMLOCK) scan ^= 0x80; + scan = map_dik_to_scan(DIDFT_GETINSTANCE(pdidoi->dwType), This->subtype); if (!GetKeyNameTextW((scan & 0x80) << 17 | (scan & 0x7f) << 16, pdidoi->tszName, sizeof(pdidoi->tszName)/sizeof(pdidoi->tszName[0]))) return DIERR_OBJECTNOTFOUND;