Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
mac: Fix gamepad detection
- Loading branch information
Showing
with
15 additions
and
8 deletions.
-
+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); |
|
|