Akihiro Sagawa : dinput: Return DIDEVTYPEKEYBOARD_JAPAN106 subtype when it is used.
Alexandre Julliard
julliard at winehq.org
Sun Mar 3 13:21:29 CST 2019
Module: wine
Branch: oldstable
Commit: 868efb90225cc51e13e7278d58335d057146559f
URL: https://source.winehq.org/git/wine.git/?a=commit;h=868efb90225cc51e13e7278d58335d057146559f
Author: Akihiro Sagawa <sagawa.aki at gmail.com>
Date: Fri Aug 17 17:14:54 2018 +0900
dinput: Return DIDEVTYPEKEYBOARD_JAPAN106 subtype when it is used.
For the further improvments, subtype is a member of SysKeyboardImpl structure.
Signed-off-by: Akihiro Sagawa <sagawa.aki at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit 8001dda1172dc0cff3da600d3f327f59f647f722)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>
---
dlls/dinput/keyboard.c | 43 +++++++++++++++++++++++++++++++------------
dlls/dinput/tests/keyboard.c | 2 +-
2 files changed, 32 insertions(+), 13 deletions(-)
diff --git a/dlls/dinput/keyboard.c b/dlls/dinput/keyboard.c
index e1ba15e..d213368 100644
--- a/dlls/dinput/keyboard.c
+++ b/dlls/dinput/keyboard.c
@@ -48,6 +48,7 @@ struct SysKeyboardImpl
{
struct IDirectInputDeviceImpl base;
BYTE DInputKeyState[WINE_DINPUT_KEYBOARD_MAX_KEYS];
+ DWORD subtype;
};
static inline SysKeyboardImpl *impl_from_IDirectInputDevice8A(IDirectInputDevice8A *iface)
@@ -120,7 +121,24 @@ const GUID DInput_Wine_Keyboard_GUID = { /* 0ab8648a-7735-11d2-8c73-71df54a96441
0x0ab8648a, 0x7735, 0x11d2, {0x8c, 0x73, 0x71, 0xdf, 0x54, 0xa9, 0x64, 0x41}
};
-static void fill_keyboard_dideviceinstanceA(LPDIDEVICEINSTANCEA lpddi, DWORD version) {
+static DWORD get_keyboard_subtype(void)
+{
+ DWORD kbd_type, kbd_subtype, dev_subtype;
+ kbd_type = GetKeyboardType(0);
+ kbd_subtype = GetKeyboardType(1);
+
+ if (kbd_type == 4 || (kbd_type == 7 && kbd_subtype == 0))
+ dev_subtype = DIDEVTYPEKEYBOARD_PCENH;
+ else if (kbd_type == 7 && kbd_subtype == 2)
+ dev_subtype = DIDEVTYPEKEYBOARD_JAPAN106;
+ else {
+ FIXME("Unknown keyboard type=%u, subtype=%u\n", kbd_type, kbd_subtype);
+ dev_subtype = DIDEVTYPEKEYBOARD_PCENH;
+ }
+ return dev_subtype;
+}
+
+static void fill_keyboard_dideviceinstanceA(LPDIDEVICEINSTANCEA lpddi, DWORD version, DWORD subtype) {
DWORD dwSize;
DIDEVICEINSTANCEA ddi;
@@ -135,16 +153,16 @@ static void fill_keyboard_dideviceinstanceA(LPDIDEVICEINSTANCEA lpddi, DWORD ver
ddi.guidInstance = GUID_SysKeyboard;/* DInput's GUID */
ddi.guidProduct = DInput_Wine_Keyboard_GUID; /* Vendor's GUID */
if (version >= 0x0800)
- ddi.dwDevType = DI8DEVTYPE_KEYBOARD | (DI8DEVTYPEKEYBOARD_UNKNOWN << 8);
+ ddi.dwDevType = DI8DEVTYPE_KEYBOARD | (subtype << 8);
else
- ddi.dwDevType = DIDEVTYPE_KEYBOARD | (DIDEVTYPEKEYBOARD_UNKNOWN << 8);
+ ddi.dwDevType = DIDEVTYPE_KEYBOARD | (subtype << 8);
strcpy(ddi.tszInstanceName, "Keyboard");
strcpy(ddi.tszProductName, "Wine Keyboard");
memcpy(lpddi, &ddi, (dwSize < sizeof(ddi) ? dwSize : sizeof(ddi)));
}
-static void fill_keyboard_dideviceinstanceW(LPDIDEVICEINSTANCEW lpddi, DWORD version) {
+static void fill_keyboard_dideviceinstanceW(LPDIDEVICEINSTANCEW lpddi, DWORD version, DWORD subtype) {
DWORD dwSize;
DIDEVICEINSTANCEW ddi;
@@ -159,9 +177,9 @@ static void fill_keyboard_dideviceinstanceW(LPDIDEVICEINSTANCEW lpddi, DWORD ver
ddi.guidInstance = GUID_SysKeyboard;/* DInput's GUID */
ddi.guidProduct = DInput_Wine_Keyboard_GUID; /* Vendor's GUID */
if (version >= 0x0800)
- ddi.dwDevType = DI8DEVTYPE_KEYBOARD | (DI8DEVTYPEKEYBOARD_UNKNOWN << 8);
+ ddi.dwDevType = DI8DEVTYPE_KEYBOARD | (subtype << 8);
else
- ddi.dwDevType = DIDEVTYPE_KEYBOARD | (DIDEVTYPEKEYBOARD_UNKNOWN << 8);
+ ddi.dwDevType = DIDEVTYPE_KEYBOARD | (subtype << 8);
MultiByteToWideChar(CP_ACP, 0, "Keyboard", -1, ddi.tszInstanceName, MAX_PATH);
MultiByteToWideChar(CP_ACP, 0, "Wine Keyboard", -1, ddi.tszProductName, MAX_PATH);
@@ -178,7 +196,7 @@ static HRESULT keyboarddev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVI
(((dwDevType == DI8DEVCLASS_KEYBOARD) || (dwDevType == DI8DEVTYPE_KEYBOARD)) && (version >= 0x0800))) {
TRACE("Enumerating the Keyboard device\n");
- fill_keyboard_dideviceinstanceA(lpddi, version);
+ fill_keyboard_dideviceinstanceA(lpddi, version, get_keyboard_subtype());
return S_OK;
}
@@ -196,7 +214,7 @@ static HRESULT keyboarddev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVI
(((dwDevType == DI8DEVCLASS_KEYBOARD) || (dwDevType == DI8DEVTYPE_KEYBOARD)) && (version >= 0x0800))) {
TRACE("Enumerating the Keyboard device\n");
- fill_keyboard_dideviceinstanceW(lpddi, version);
+ fill_keyboard_dideviceinstanceW(lpddi, version, get_keyboard_subtype());
return S_OK;
}
@@ -219,6 +237,7 @@ static SysKeyboardImpl *alloc_device(REFGUID rguid, IDirectInputImpl *dinput)
newDevice->base.event_proc = KeyboardCallback;
InitializeCriticalSection(&newDevice->base.crit);
newDevice->base.crit.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": SysKeyboardImpl*->base.crit");
+ newDevice->subtype = get_keyboard_subtype();
/* Create copy of default data format */
if (!(df = HeapAlloc(GetProcessHeap(), 0, c_dfDIKeyboard.dwSize))) goto failed;
@@ -361,9 +380,9 @@ static HRESULT WINAPI SysKeyboardWImpl_GetCapabilities(LPDIRECTINPUTDEVICE8W ifa
devcaps.dwSize = lpDIDevCaps->dwSize;
devcaps.dwFlags = DIDC_ATTACHED | DIDC_EMULATED;
if (This->base.dinput->dwVersion >= 0x0800)
- devcaps.dwDevType = DI8DEVTYPE_KEYBOARD | (DI8DEVTYPEKEYBOARD_PCENH << 8);
+ devcaps.dwDevType = DI8DEVTYPE_KEYBOARD | (This->subtype << 8);
else
- devcaps.dwDevType = DIDEVTYPE_KEYBOARD | (DIDEVTYPEKEYBOARD_PCENH << 8);
+ devcaps.dwDevType = DIDEVTYPE_KEYBOARD | (This->subtype << 8);
devcaps.dwAxes = 0;
devcaps.dwButtons = This->base.data_format.wine_df->dwNumObjs;
devcaps.dwPOVs = 0;
@@ -447,7 +466,7 @@ static HRESULT WINAPI SysKeyboardAImpl_GetDeviceInfo(
return DI_OK;
}
- fill_keyboard_dideviceinstanceA(pdidi, This->base.dinput->dwVersion);
+ fill_keyboard_dideviceinstanceA(pdidi, This->base.dinput->dwVersion, This->subtype);
return DI_OK;
}
@@ -462,7 +481,7 @@ static HRESULT WINAPI SysKeyboardWImpl_GetDeviceInfo(LPDIRECTINPUTDEVICE8W iface
return DI_OK;
}
- fill_keyboard_dideviceinstanceW(pdidi, This->base.dinput->dwVersion);
+ fill_keyboard_dideviceinstanceW(pdidi, This->base.dinput->dwVersion, This->subtype);
return DI_OK;
}
diff --git a/dlls/dinput/tests/keyboard.c b/dlls/dinput/tests/keyboard.c
index a60342d..9405596 100644
--- a/dlls/dinput/tests/keyboard.c
+++ b/dlls/dinput/tests/keyboard.c
@@ -228,7 +228,7 @@ static void test_capabilities(IDirectInputA *pDI, HWND hwnd)
"GetCapabilities invalid device subtype for dwDevType: 0x%08x (%04x:%04x)\n",
caps.dwDevType, kbd_type, kbd_subtype);
else if (kbd_type == 7 && kbd_subtype == 2)
- todo_wine ok (dev_subtype == DIDEVTYPEKEYBOARD_JAPAN106,
+ ok (dev_subtype == DIDEVTYPEKEYBOARD_JAPAN106,
"GetCapabilities invalid device subtype for dwDevType: 0x%08x (%04x:%04x)\n",
caps.dwDevType, kbd_type, kbd_subtype);
else
More information about the wine-cvs
mailing list