Rémi Bernon : win32u: Enumerate mouse and keyboard devices first and skip duplicates.

Alexandre Julliard julliard at winehq.org
Wed Jul 27 16:17:08 CDT 2022


Module: wine
Branch: master
Commit: 689826a02c7d1711858d5f15588e4f04f230d1ff
URL:    https://gitlab.winehq.org/wine/wine/-/commit/689826a02c7d1711858d5f15588e4f04f230d1ff

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Tue Jul 26 07:25:57 2022 +0200

win32u: Enumerate mouse and keyboard devices first and skip duplicates.

---

 dlls/win32u/rawinput.c | 28 ++++++++++++----------------
 1 file changed, 12 insertions(+), 16 deletions(-)

diff --git a/dlls/win32u/rawinput.c b/dlls/win32u/rawinput.c
index 81403771c4a..6a018e15bb7 100644
--- a/dlls/win32u/rawinput.c
+++ b/dlls/win32u/rawinput.c
@@ -244,9 +244,9 @@ static struct device *add_device( HKEY key, DWORD type )
     static const RID_DEVICE_INFO_MOUSE mouse_info = {1, 5, 0, FALSE};
     struct hid_preparsed_data *preparsed = NULL;
     HID_COLLECTION_INFORMATION hid_info;
-    struct device *device = NULL;
     OBJECT_ATTRIBUTES attr;
     UNICODE_STRING string;
+    struct device *device;
     RID_DEVICE_INFO info;
     IO_STATUS_BLOCK io;
     WCHAR *path, *pos;
@@ -292,6 +292,15 @@ static struct device *add_device( HKEY key, DWORD type )
         goto fail;
     }
 
+    for (i = 0; i < rawinput_devices_count; ++i)
+    {
+        if (rawinput_devices[i].handle == UlongToHandle(handle))
+        {
+            TRACE( "Ignoring already added device %#x / %s.\n", handle, debugstr_w(path) );
+            goto fail;
+        }
+    }
+
     memset( &info, 0, sizeof(info) );
     info.cbSize = sizeof(info);
     info.dwType = type;
@@ -340,20 +349,7 @@ static struct device *add_device( HKEY key, DWORD type )
         break;
     }
 
-    for (i = 0; i < rawinput_devices_count && !device; ++i)
-    {
-        if (rawinput_devices[i].handle == UlongToHandle(handle))
-            device = rawinput_devices + i;
-    }
-
-    if (device)
-    {
-        TRACE( "Updating device %#x / %s.\n", handle, debugstr_w(path) );
-        free( device->data );
-        NtClose( device->file );
-        free( device->path );
-    }
-    else if (array_reserve( (void **)&rawinput_devices, &rawinput_devices_max,
+    if (array_reserve( (void **)&rawinput_devices, &rawinput_devices_max,
                             rawinput_devices_count + 1, sizeof(*rawinput_devices) ))
     {
         device = &rawinput_devices[rawinput_devices_count++];
@@ -461,9 +457,9 @@ static void rawinput_update_device_list(void)
     }
     rawinput_devices_count = 0;
 
-    enumerate_devices( RIM_TYPEHID, guid_devinterface_hidW );
     enumerate_devices( RIM_TYPEMOUSE, guid_devinterface_mouseW );
     enumerate_devices( RIM_TYPEKEYBOARD, guid_devinterface_keyboardW );
+    enumerate_devices( RIM_TYPEHID, guid_devinterface_hidW );
 
     pthread_mutex_unlock( &rawinput_devices_mutex );
 }




More information about the wine-cvs mailing list