Module: wine Branch: master Commit: e745a482d187920b4f87ee2ab7ed7f4eb37c268f URL: https://source.winehq.org/git/wine.git/?a=commit;h=e745a482d187920b4f87ee2ab...
Author: Zebediah Figura zfigura@codeweavers.com Date: Mon Aug 20 15:24:42 2018 -0500
user32: Return RIDI_DEVICEINFO for HID devices from GetRawInputDeviceInfo().
Signed-off-by: Zebediah Figura zfigura@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
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; }