Wait for the GCController framework to see IOKit devices It occasionally takes a few millseconds for the GCController framework to handle the device notification and set up the device Fixes the duplicate controller issue in https://github.com/libsdl-org/SDL/issues/6686 (cherry picked from commit 645823fc901c98b688512d3b3e70cc8922e8140c)
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 39 40 41 42
diff --git a/src/joystick/iphoneos/SDL_mfijoystick.m b/src/joystick/iphoneos/SDL_mfijoystick.m
index 17de018..cb524ae 100644
--- a/src/joystick/iphoneos/SDL_mfijoystick.m
+++ b/src/joystick/iphoneos/SDL_mfijoystick.m
@@ -1668,31 +1668,14 @@ static SDL_bool IOS_JoystickGetGamepadMapping(int device_index, SDL_GamepadMappi
SDL_bool IOS_SupportedHIDDevice(IOHIDDeviceRef device)
{
if (@available(macOS 10.16, *)) {
- 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)) {
+ const int MAX_ATTEMPTS = 3;
+ for (int attempt = 0; attempt < MAX_ATTEMPTS; ++attempt) {
+ if ([GCController supportsHIDDevice:device]) {
return SDL_TRUE;
}
+
+ /* The framework may not have seen the device yet */
+ SDL_Delay(10);
}
}
return SDL_FALSE;