[PATCH 1/5] server: Add process argument to find_rawinput_device.

Rémi Bernon rbernon at codeweavers.com
Wed Feb 10 06:23:31 CST 2021


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 <rbernon at codeweavers.com>
---

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, &current->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( &current->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




More information about the wine-devel mailing list