From: "Rémi Bernon" Subject: [PATCH 1/5] server: Add process argument to find_rawinput_device. Message-Id: <20210210122335.516779-1-rbernon@codeweavers.com> Date: Wed, 10 Feb 2021 13:23:31 +0100 We need to be able to iterate all registered rawinput devices for foreign processes, not only the current one. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50506 Signed-off-by: Rémi Bernon --- This series implements rawinput message support for HID gamepads, needed by several games when not using XInput compatible gamepads (such as DualShock or Wiimotes controllers). It will allow us to read HID reports in a more efficient way than reading the device files, as the rawinput messages are pushed by winedevice.exe to the listening applications instead of requiring ioctl roundtrips between the application, wineserver, and winedevice.exe. It could help for instance, for DInput over HID, or to optimize XInput, which I believe is currently also reading HID reports. The series has been tested in Wine Staging and Proton for a while now. server/queue.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/server/queue.c b/server/queue.c index e47980a4aa8..1735d0d6d26 100644 --- a/server/queue.c +++ b/server/queue.c @@ -1489,11 +1489,11 @@ static user_handle_t find_hardware_message_window( struct desktop *desktop, stru return win; } -static struct rawinput_device_entry *find_rawinput_device( unsigned short usage_page, unsigned short usage ) +static struct rawinput_device_entry *find_rawinput_device( struct process *process, unsigned short usage_page, unsigned short usage ) { struct rawinput_device_entry *e; - LIST_FOR_EACH_ENTRY( e, ¤t->process->rawinput_devices, struct rawinput_device_entry, entry ) + LIST_FOR_EACH_ENTRY( e, &process->rawinput_devices, struct rawinput_device_entry, entry ) { if (e->device.usage_page != usage_page || e->device.usage != usage) continue; return e; @@ -1506,7 +1506,7 @@ static void update_rawinput_device(const struct rawinput_device *device) { struct rawinput_device_entry *e; - if (!(e = find_rawinput_device( device->usage_page, device->usage ))) + if (!(e = find_rawinput_device( current->process, device->usage_page, device->usage ))) { if (!(e = mem_alloc( sizeof(*e) ))) return; list_add_tail( ¤t->process->rawinput_devices, &e->entry ); @@ -3313,9 +3313,9 @@ DECL_HANDLER(update_rawinput_devices) update_rawinput_device(&devices[i]); } - e = find_rawinput_device( 1, 2 ); + e = find_rawinput_device( current->process, 1, 2 ); current->process->rawinput_mouse = e ? &e->device : NULL; - e = find_rawinput_device( 1, 6 ); + e = find_rawinput_device( current->process, 1, 6 ); current->process->rawinput_kbd = e ? &e->device : NULL; } -- 2.30.0