Browse Source

mac: Fix gamepad detection

Romain Roff? 5 years ago
parent
commit
5346216368
1 changed files with 15 additions and 8 deletions
  1. 15 8
      src/joystick/hidapi/SDL_hidapijoystick.c

+ 15 - 8
src/joystick/hidapi/SDL_hidapijoystick.c

@@ -43,6 +43,7 @@
 #include <CoreFoundation/CoreFoundation.h>
 #include <mach/mach.h>
 #include <IOKit/IOKitLib.h>
+#include <IOKit/hid/IOHIDDevice.h>
 #include <IOKit/usb/USBSpec.h>
 #endif
 
@@ -218,12 +219,15 @@ HIDAPI_InitializeDiscovery()
     SDL_HIDAPI_discovery.m_notificationPort = IONotificationPortCreate(kIOMasterPortDefault);
     if (SDL_HIDAPI_discovery.m_notificationPort) {
         {
-            CFMutableDictionaryRef matchingDict = IOServiceMatching("IOUSBDevice");
-
-            /* Note: IOServiceAddMatchingNotification consumes the reference to matchingDict */
             io_iterator_t portIterator = 0;
             io_object_t entry;
-            if (IOServiceAddMatchingNotification(SDL_HIDAPI_discovery.m_notificationPort, kIOMatchedNotification, matchingDict, CallbackIOServiceFunc, &SDL_HIDAPI_discovery.m_bHaveDevicesChanged, &portIterator) == 0) {
+            IOReturn result = IOServiceAddMatchingNotification(
+                SDL_HIDAPI_discovery.m_notificationPort,
+                kIOFirstMatchNotification,
+                IOServiceMatching(kIOHIDDeviceKey),
+                CallbackIOServiceFunc, &SDL_HIDAPI_discovery.m_bHaveDevicesChanged, &portIterator);
+
+            if (result == 0) {
                 /* Must drain the existing iterator, or we won't receive new notifications */
                 while ((entry = IOIteratorNext(portIterator)) != 0) {
                     IOObjectRelease(entry);
@@ -234,12 +238,15 @@ HIDAPI_InitializeDiscovery()
             }
         }
         {
-            CFMutableDictionaryRef matchingDict = IOServiceMatching("IOBluetoothDevice");
-
-            /* Note: IOServiceAddMatchingNotification consumes the reference to matchingDict */
             io_iterator_t portIterator = 0;
             io_object_t entry;
-            if (IOServiceAddMatchingNotification(SDL_HIDAPI_discovery.m_notificationPort, kIOMatchedNotification, matchingDict, CallbackIOServiceFunc, &SDL_HIDAPI_discovery.m_bHaveDevicesChanged, &portIterator) == 0) {
+            IOReturn result = IOServiceAddMatchingNotification(
+                SDL_HIDAPI_discovery.m_notificationPort,
+                kIOTerminatedNotification,
+                IOServiceMatching(kIOHIDDeviceKey),
+                CallbackIOServiceFunc, &SDL_HIDAPI_discovery.m_bHaveDevicesChanged, &portIterator);
+
+            if (result == 0) {
                 /* Must drain the existing iterator, or we won't receive new notifications */
                 while ((entry = IOIteratorNext(portIterator)) != 0) {
                     IOObjectRelease(entry);