[PATCH 1/2] dinput: On Mac, always use both HID usage page and usage for comparisons.

Brendan Shanks bshanks at codeweavers.com
Thu Feb 11 13:21:20 CST 2021


Signed-off-by: Brendan Shanks <bshanks at codeweavers.com>
---
 dlls/dinput/joystick_osx.c | 77 ++++++++++++++++++++------------------
 1 file changed, 40 insertions(+), 37 deletions(-)

diff --git a/dlls/dinput/joystick_osx.c b/dlls/dinput/joystick_osx.c
index 58f6b86fc16..bd39ca41b51 100644
--- a/dlls/dinput/joystick_osx.c
+++ b/dlls/dinput/joystick_osx.c
@@ -96,6 +96,8 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(dinput);
 
+#define MAKEUINT64(high, low) (((uint64_t)high << 32) | (uint32_t)low)
+
 static CFMutableArrayRef device_main_elements = NULL;
 
 typedef struct JoystickImpl JoystickImpl;
@@ -614,7 +616,7 @@ static CFComparisonResult button_usage_comparator(const void *val1, const void *
     return kCFCompareEqualTo;
 }
 
-static void get_osx_device_elements(JoystickImpl *device, int axis_map[8])
+static void get_osx_device_elements(JoystickImpl *device, uint64_t axis_map[8])
 {
     IOHIDElementRef device_main_element;
     CFMutableArrayRef elements;
@@ -680,33 +682,33 @@ static void get_osx_device_elements(JoystickImpl *device, int axis_map[8])
                 case kIOHIDElementTypeInput_Misc:
                 {
                     uint32_t usage = IOHIDElementGetUsage( element );
-                    switch(usage)
+                    switch(MAKEUINT64(usage_page, usage))
                     {
-                        case kHIDUsage_GD_Hatswitch:
+                        case MAKEUINT64(kHIDPage_GenericDesktop, kHIDUsage_GD_Hatswitch):
                         {
                             TRACE("kIOHIDElementTypeInput_Misc / kHIDUsage_GD_Hatswitch\n");
                             CFArrayAppendValue(povs, element);
                             break;
                         }
-                        case kHIDUsage_GD_Slider:
+                        case MAKEUINT64(kHIDPage_GenericDesktop, kHIDUsage_GD_Slider):
                             sliders ++;
                             if (sliders > 2)
                                 break;
                             /* fallthrough, sliders are axis */
-                        case kHIDUsage_GD_X:
-                        case kHIDUsage_GD_Y:
-                        case kHIDUsage_GD_Z:
-                        case kHIDUsage_GD_Rx:
-                        case kHIDUsage_GD_Ry:
-                        case kHIDUsage_GD_Rz:
+                        case MAKEUINT64(kHIDPage_GenericDesktop, kHIDUsage_GD_X):
+                        case MAKEUINT64(kHIDPage_GenericDesktop, kHIDUsage_GD_Y):
+                        case MAKEUINT64(kHIDPage_GenericDesktop, kHIDUsage_GD_Z):
+                        case MAKEUINT64(kHIDPage_GenericDesktop, kHIDUsage_GD_Rx):
+                        case MAKEUINT64(kHIDPage_GenericDesktop, kHIDUsage_GD_Ry):
+                        case MAKEUINT64(kHIDPage_GenericDesktop, kHIDUsage_GD_Rz):
                         {
                             TRACE("kIOHIDElementTypeInput_Misc / kHIDUsage_GD_* (%d)\n", usage);
-                            axis_map[CFArrayGetCount(axes)]=usage;
+                            axis_map[CFArrayGetCount(axes)]=MAKEUINT64(usage_page, usage);
                             CFArrayAppendValue(axes, element);
                             break;
                         }
                         default:
-                            FIXME("kIOHIDElementTypeInput_Misc / Unhandled usage %i\n", usage);
+                            FIXME("kIOHIDElementTypeInput_Misc / Unhandled usage %i/%i\n", usage_page, usage);
                     }
                     break;
                 }
@@ -827,10 +829,11 @@ static void poll_osx_device_state(LPDIRECTINPUTDEVICE8A iface)
                     break;
                 case kIOHIDElementTypeInput_Misc:
                 {
+                    uint32_t usage_page = IOHIDElementGetUsagePage( element );
                     uint32_t usage = IOHIDElementGetUsage( element );
-                    switch(usage)
+                    switch(MAKEUINT64(usage_page, usage))
                     {
-                        case kHIDUsage_GD_Hatswitch:
+                        case MAKEUINT64(kHIDPage_GenericDesktop, kHIDUsage_GD_Hatswitch):
                         {
                             TRACE("kIOHIDElementTypeInput_Misc / kHIDUsage_GD_Hatswitch\n");
                             valueRef = NULL;
@@ -854,13 +857,13 @@ static void poll_osx_device_state(LPDIRECTINPUTDEVICE8A iface)
                             pov_idx ++;
                             break;
                         }
-                        case kHIDUsage_GD_X:
-                        case kHIDUsage_GD_Y:
-                        case kHIDUsage_GD_Z:
-                        case kHIDUsage_GD_Rx:
-                        case kHIDUsage_GD_Ry:
-                        case kHIDUsage_GD_Rz:
-                        case kHIDUsage_GD_Slider:
+                        case MAKEUINT64(kHIDPage_GenericDesktop, kHIDUsage_GD_X):
+                        case MAKEUINT64(kHIDPage_GenericDesktop, kHIDUsage_GD_Y):
+                        case MAKEUINT64(kHIDPage_GenericDesktop, kHIDUsage_GD_Z):
+                        case MAKEUINT64(kHIDPage_GenericDesktop, kHIDUsage_GD_Rx):
+                        case MAKEUINT64(kHIDPage_GenericDesktop, kHIDUsage_GD_Ry):
+                        case MAKEUINT64(kHIDPage_GenericDesktop, kHIDUsage_GD_Rz):
+                        case MAKEUINT64(kHIDPage_GenericDesktop, kHIDUsage_GD_Slider):
                         {
                             int wine_obj = -1;
 
@@ -871,45 +874,45 @@ static void poll_osx_device_state(LPDIRECTINPUTDEVICE8A iface)
                                 return;
                             val = IOHIDValueGetIntegerValue(valueRef);
                             newVal = joystick_map_axis(&device->generic.props[idx], val);
-                            switch (usage)
+                            switch (MAKEUINT64(usage_page, usage))
                             {
-                            case kHIDUsage_GD_X:
+                            case MAKEUINT64(kHIDPage_GenericDesktop, kHIDUsage_GD_X):
                                 TRACE("kIOHIDElementTypeInput_Misc / kHIDUsage_GD_X\n");
                                 wine_obj = 0;
                                 oldVal = device->generic.js.lX;
                                 device->generic.js.lX = newVal;
                                 break;
-                            case kHIDUsage_GD_Y:
+                            case MAKEUINT64(kHIDPage_GenericDesktop, kHIDUsage_GD_Y):
                                 TRACE("kIOHIDElementTypeInput_Misc / kHIDUsage_GD_Y\n");
                                 wine_obj = 1;
                                 oldVal = device->generic.js.lY;
                                 device->generic.js.lY = newVal;
                                 break;
-                            case kHIDUsage_GD_Z:
+                            case MAKEUINT64(kHIDPage_GenericDesktop, kHIDUsage_GD_Z):
                                 TRACE("kIOHIDElementTypeInput_Misc / kHIDUsage_GD_Z\n");
                                 wine_obj = 2;
                                 oldVal = device->generic.js.lZ;
                                 device->generic.js.lZ = newVal;
                                 break;
-                            case kHIDUsage_GD_Rx:
+                            case MAKEUINT64(kHIDPage_GenericDesktop, kHIDUsage_GD_Rx):
                                 TRACE("kIOHIDElementTypeInput_Misc / kHIDUsage_GD_Rx\n");
                                 wine_obj = 3;
                                 oldVal = device->generic.js.lRx;
                                 device->generic.js.lRx = newVal;
                                 break;
-                            case kHIDUsage_GD_Ry:
+                            case MAKEUINT64(kHIDPage_GenericDesktop, kHIDUsage_GD_Ry):
                                 TRACE("kIOHIDElementTypeInput_Misc / kHIDUsage_GD_Ry\n");
                                 wine_obj = 4;
                                 oldVal = device->generic.js.lRy;
                                 device->generic.js.lRy = newVal;
                                 break;
-                            case kHIDUsage_GD_Rz:
+                            case MAKEUINT64(kHIDPage_GenericDesktop, kHIDUsage_GD_Rz):
                                 TRACE("kIOHIDElementTypeInput_Misc / kHIDUsage_GD_Rz\n");
                                 wine_obj = 5;
                                 oldVal = device->generic.js.lRz;
                                 device->generic.js.lRz = newVal;
                                 break;
-                            case kHIDUsage_GD_Slider:
+                            case MAKEUINT64(kHIDPage_GenericDesktop, kHIDUsage_GD_Slider):
                                 TRACE("kIOHIDElementTypeInput_Misc / kHIDUsage_GD_Slider\n");
                                 wine_obj = 6 + slider_idx;
                                 oldVal = device->generic.js.rglSlider[slider_idx];
@@ -1090,7 +1093,7 @@ static HRESULT alloc_device(REFGUID rguid, IDirectInputImpl *dinput,
     HRESULT hr;
     LPDIDATAFORMAT df = NULL;
     int idx = 0;
-    int axis_map[8]; /* max axes */
+    uint64_t axis_map[8]; /* max axes */
     int slider_count = 0;
     FFCAPABILITIES ffcaps;
 
@@ -1184,31 +1187,31 @@ static HRESULT alloc_device(REFGUID rguid, IDirectInputImpl *dinput,
         BOOL has_ff  = FALSE;
         switch (axis_map[i])
         {
-            case kHIDUsage_GD_X:
+            case MAKEUINT64(kHIDPage_GenericDesktop, kHIDUsage_GD_X):
                 wine_obj = 0;
                 has_ff = (newDevice->ff != 0) && osx_axis_has_ff(&ffcaps, FFJOFS_X);
                 break;
-            case kHIDUsage_GD_Y:
+            case MAKEUINT64(kHIDPage_GenericDesktop, kHIDUsage_GD_Y):
                 wine_obj = 1;
                 has_ff = (newDevice->ff != 0) && osx_axis_has_ff(&ffcaps, FFJOFS_Y);
                 break;
-            case kHIDUsage_GD_Z:
+            case MAKEUINT64(kHIDPage_GenericDesktop, kHIDUsage_GD_Z):
                 wine_obj = 2;
                 has_ff = (newDevice->ff != 0) && osx_axis_has_ff(&ffcaps, FFJOFS_Z);
                 break;
-            case kHIDUsage_GD_Rx:
+            case MAKEUINT64(kHIDPage_GenericDesktop, kHIDUsage_GD_Rx):
                 wine_obj = 3;
                 has_ff = (newDevice->ff != 0) && osx_axis_has_ff(&ffcaps, FFJOFS_RX);
                 break;
-            case kHIDUsage_GD_Ry:
+            case MAKEUINT64(kHIDPage_GenericDesktop, kHIDUsage_GD_Ry):
                 wine_obj = 4;
                 has_ff = (newDevice->ff != 0) && osx_axis_has_ff(&ffcaps, FFJOFS_RY);
                 break;
-            case kHIDUsage_GD_Rz:
+            case MAKEUINT64(kHIDPage_GenericDesktop, kHIDUsage_GD_Rz):
                 wine_obj = 5;
                 has_ff = (newDevice->ff != 0) && osx_axis_has_ff(&ffcaps, FFJOFS_RZ);
                 break;
-            case kHIDUsage_GD_Slider:
+            case MAKEUINT64(kHIDPage_GenericDesktop, kHIDUsage_GD_Slider):
                 wine_obj = 6 + slider_count;
                 has_ff = (newDevice->ff != 0) && osx_axis_has_ff(&ffcaps, FFJOFS_SLIDER(slider_count));
                 slider_count++;
-- 
2.26.2




More information about the wine-devel mailing list