Andrew Eikum : xinput: Consolidate new device setup.

Alexandre Julliard julliard at winehq.org
Tue Oct 22 16:57:02 CDT 2019


Module: wine
Branch: master
Commit: 5417c3bfa4e667902835117dc78b9ea629e7bc3e
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=5417c3bfa4e667902835117dc78b9ea629e7bc3e

Author: Andrew Eikum <aeikum at codeweavers.com>
Date:   Tue Oct 22 15:00:34 2019 -0500

xinput: Consolidate new device setup.

Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/xinput1_3/hid.c | 32 +++++++++++++++++++-------------
 1 file changed, 19 insertions(+), 13 deletions(-)

diff --git a/dlls/xinput1_3/hid.c b/dlls/xinput1_3/hid.c
index 477d5304ca..5baf3b2b53 100644
--- a/dlls/xinput1_3/hid.c
+++ b/dlls/xinput1_3/hid.c
@@ -171,19 +171,34 @@ static BOOL VerifyGamepad(PHIDP_PREPARSED_DATA ppd, XINPUT_CAPABILITIES *xinput_
     return TRUE;
 }
 
-static void build_private(struct hid_platform_private *private, PHIDP_PREPARSED_DATA ppd, HIDP_CAPS *caps, HANDLE device, WCHAR *path)
+static BOOL init_controller(xinput_controller *controller, PHIDP_PREPARSED_DATA ppd, HIDP_CAPS *caps, HANDLE device, WCHAR *device_path)
 {
     size_t size;
+    struct hid_platform_private *private = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct hid_platform_private));
+
+    if (!VerifyGamepad(ppd, &controller->caps, private, caps))
+    {
+        HeapFree(GetProcessHeap(), 0, private);
+        return FALSE;
+    }
+
+    TRACE("Found gamepad %s\n", debugstr_w(device_path));
+
     private->ppd = ppd;
     private->device = device;
     private->report_length = caps->InputReportByteLength + 1;
     private->current_report = 0;
     private->reports[0] = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, private->report_length);
     private->reports[1] = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, private->report_length);
-    size = (lstrlenW(path) + 1) * sizeof(WCHAR);
+    size = (lstrlenW(device_path) + 1) * sizeof(WCHAR);
     private->device_path = HeapAlloc(GetProcessHeap(), 0, size);
-    memcpy(private->device_path, path, size);
+    memcpy(private->device_path, device_path, size);
     private->enabled = TRUE;
+
+    controller->platform_private = private;
+    controller->connected = TRUE;
+
+    return TRUE;
 }
 
 void HID_find_gamepads(xinput_controller *devices)
@@ -263,19 +278,10 @@ void HID_find_gamepads(xinput_controller *devices)
              Caps.Usage == HID_USAGE_GENERIC_JOYSTICK ||
              Caps.Usage == 0x8 /* Multi-axis Controller */))
         {
-            struct hid_platform_private *private = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct hid_platform_private));
-            if (VerifyGamepad(ppd, &devices[open_device_idx].caps, private, &Caps))
-            {
-                TRACE("Found gamepad %i %s\n", open_device_idx, debugstr_w(data->DevicePath));
-                build_private(private, ppd, &Caps, device, data->DevicePath);
-                devices[open_device_idx].platform_private = private;
-                devices[open_device_idx].connected = TRUE;
-            }
-            else
+            if(!init_controller(&devices[open_device_idx], ppd, &Caps, device, data->DevicePath))
             {
                 CloseHandle(device);
                 HidD_FreePreparsedData(ppd);
-                HeapFree(GetProcessHeap(), 0, private);
             }
         }
         else




More information about the wine-cvs mailing list