mac: Fix gamepad detection

This commit is contained in:
Romain Roff? 2020-03-01 13:01:53 -08:00
parent 51e9e98451
commit 5346216368

View File

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