From e8332dece8209d331285622f4e960f27e328bd3e Mon Sep 17 00:00:00 2001 From: Brendan Shanks Date: Thu, 11 Feb 2021 11:21:20 -0800 Subject: [PATCH] dinput: On Mac, always use both HID usage page and usage for comparisons. Signed-off-by: Brendan Shanks Signed-off-by: Alexandre Julliard --- 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++;