Fixed Xbox Series X controller being detected by both IOKit and GCController on macOS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
diff --git a/src/joystick/iphoneos/SDL_mfijoystick.m b/src/joystick/iphoneos/SDL_mfijoystick.m
index 5283199..6563c91 100644
--- a/src/joystick/iphoneos/SDL_mfijoystick.m
+++ b/src/joystick/iphoneos/SDL_mfijoystick.m
@@ -1491,7 +1491,32 @@ IOS_JoystickGetGamepadMapping(int device_index, SDL_GamepadMapping *out)
SDL_bool IOS_SupportedHIDDevice(IOHIDDeviceRef device)
{
if (is_macos11()) {
- return [GCController supportsHIDDevice:device] ? SDL_TRUE : SDL_FALSE;
+ if ([GCController supportsHIDDevice:device]) {
+ return SDL_TRUE;
+ }
+
+ /* GCController supportsHIDDevice may return false if the device hasn't been
+ * seen by the framework yet, so check a few controllers we know are supported.
+ */
+ {
+ Sint32 vendor = 0;
+ Sint32 product = 0;
+ CFTypeRef refCF = NULL;
+
+ refCF = IOHIDDeviceGetProperty(device, CFSTR(kIOHIDVendorIDKey));
+ if (refCF) {
+ CFNumberGetValue(refCF, kCFNumberSInt32Type, &vendor);
+ }
+
+ refCF = IOHIDDeviceGetProperty(device, CFSTR(kIOHIDProductIDKey));
+ if (refCF) {
+ CFNumberGetValue(refCF, kCFNumberSInt32Type, &product);
+ }
+
+ if (vendor == USB_VENDOR_MICROSOFT && SDL_IsJoystickXboxSeriesX(vendor, product)) {
+ return SDL_TRUE;
+ }
+ }
}
return SDL_FALSE;
}