[PATCH 5/6] user32: Return RIDI_DEVICEINFO for HID devices from GetRawInputDeviceInfo().
Zebediah Figura
zfigura at codeweavers.com
Mon Aug 20 15:24:42 CDT 2018
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
dlls/user32/rawinput.c | 31 +++++++++++++++++++++++++++++--
1 file changed, 29 insertions(+), 2 deletions(-)
diff --git a/dlls/user32/rawinput.c b/dlls/user32/rawinput.c
index 91dcff4..12a0e15 100644
--- a/dlls/user32/rawinput.c
+++ b/dlls/user32/rawinput.c
@@ -42,6 +42,8 @@ struct hid_device
{
WCHAR *path;
HANDLE file;
+ RID_DEVICE_INFO_HID info;
+ PHIDP_PREPARSED_DATA data;
};
static struct hid_device *hid_devices;
@@ -63,7 +65,9 @@ static void find_hid_devices(void)
SP_DEVICE_INTERFACE_DATA iface = { sizeof(iface) };
SP_DEVICE_INTERFACE_DETAIL_DATA_W *detail;
DWORD detail_size, needed;
+ HIDD_ATTRIBUTES attr;
DWORD idx, didx;
+ HIDP_CAPS caps;
GUID hid_guid;
HDEVINFO set;
HANDLE file;
@@ -146,6 +150,22 @@ static void find_hid_devices(void)
hid_devices[didx].path = path;
hid_devices[didx].file = file;
+ attr.Size = sizeof(HIDD_ATTRIBUTES);
+ if (!HidD_GetAttributes(file, &attr))
+ WARN_(rawinput)("Failed to get attributes.\n");
+ hid_devices[didx].info.dwVendorId = attr.VendorID;
+ hid_devices[didx].info.dwProductId = attr.ProductID;
+ hid_devices[didx].info.dwVersionNumber = attr.VersionNumber;
+
+ if (!HidD_GetPreparsedData(file, &hid_devices[didx].data))
+ WARN_(rawinput)("Failed to get preparsed data.\n");
+
+ if (!HidP_GetCaps(hid_devices[didx].data, &caps))
+ WARN_(rawinput)("Failed to get caps.\n");
+
+ hid_devices[didx].info.usUsagePage = caps.UsagePage;
+ hid_devices[didx].info.usUsage = caps.Usage;
+
didx++;
}
hid_devices_count = didx;
@@ -327,6 +347,7 @@ UINT WINAPI GetRawInputDeviceInfoW(HANDLE device, UINT command, void *data, UINT
static const WCHAR mouse_name[] = {'\\','\\','?','\\','W','I','N','E','_','M','O','U','S','E',0};
static const RID_DEVICE_INFO_KEYBOARD keyboard_info = {0, 0, 1, 12, 3, 101};
static const RID_DEVICE_INFO_MOUSE mouse_info = {1, 5, 0, FALSE};
+ struct hid_device *hid_device;
const WCHAR *name = NULL;
RID_DEVICE_INFO *info;
UINT s;
@@ -334,7 +355,7 @@ UINT WINAPI GetRawInputDeviceInfoW(HANDLE device, UINT command, void *data, UINT
TRACE("device %p, command %#x, data %p, data_size %p.\n",
device, command, data, data_size);
- if (!data_size || (device != WINE_MOUSE_HANDLE && device != WINE_KEYBOARD_HANDLE)) return ~0U;
+ if (!data_size) return ~0U;
switch (command)
{
@@ -382,11 +403,17 @@ UINT WINAPI GetRawInputDeviceInfoW(HANDLE device, UINT command, void *data, UINT
info->dwType = RIM_TYPEMOUSE;
info->u.mouse = mouse_info;
}
- else
+ else if (device == WINE_KEYBOARD_HANDLE)
{
info->dwType = RIM_TYPEKEYBOARD;
info->u.keyboard = keyboard_info;
}
+ else
+ {
+ hid_device = device;
+ info->dwType = RIM_TYPEHID;
+ info->u.hid = hid_device->info;
+ }
return s;
}
--
2.7.4
More information about the wine-devel
mailing list