Fixed Mac OS X build

This commit is contained in:
Sam Lantinga 2018-08-15 19:53:24 -07:00
parent ec74c318b9
commit dfbd7f65a9
1 changed files with 24 additions and 19 deletions

View File

@ -103,7 +103,7 @@ static struct
Uint32 m_unLastDetect; Uint32 m_unLastDetect;
#if defined(__WIN32__) #if defined(__WIN32__)
SDL_threadID m_nThreadID; SDL_threadID m_nThreadID;
WNDCLASSEXA m_wndClass; WNDCLASSEXA m_wndClass;
HWND m_hwndMsg; HWND m_hwndMsg;
HDEVNOTIFY m_hNotify; HDEVNOTIFY m_hNotify;
@ -158,7 +158,7 @@ static LRESULT CALLBACK ControllerWndProc(HWND hwnd, UINT message, WPARAM wParam
switch (wParam) { switch (wParam) {
case DBT_DEVICEARRIVAL: case DBT_DEVICEARRIVAL:
if (((DEV_BROADCAST_HDR*)lParam)->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) { if (((DEV_BROADCAST_HDR*)lParam)->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) {
SDL_HIDAPI_discovery.m_bHaveDevicesChanged = SDL_TRUE; SDL_HIDAPI_discovery.m_bHaveDevicesChanged = SDL_TRUE;
} }
break; break;
} }
@ -171,10 +171,11 @@ static LRESULT CALLBACK ControllerWndProc(HWND hwnd, UINT message, WPARAM wParam
#if defined(__MACOSX__) #if defined(__MACOSX__)
static void CallbackIOServiceFUNC(void *context, io_iterator_t portIterator) static void CallbackIOServiceFunc(void *context, io_iterator_t portIterator)
{ {
/* Must drain the iterator, or we won't receive new notifications */ /* Must drain the iterator, or we won't receive new notifications */
while ((io_object_t entry = IOIteratorNext(portIterator)) != NULL) { io_object_t entry;
while ((entry = IOIteratorNext(portIterator)) != 0) {
IOObjectRelease(entry); IOObjectRelease(entry);
*(SDL_bool*)context = SDL_TRUE; *(SDL_bool*)context = SDL_TRUE;
} }
@ -200,21 +201,21 @@ HIDAPI_InitializeDiscovery()
RegisterClassExA(&SDL_HIDAPI_discovery.m_wndClass); RegisterClassExA(&SDL_HIDAPI_discovery.m_wndClass);
SDL_HIDAPI_discovery.m_hwndMsg = CreateWindowExA(0, "ControllerDetect", NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL); SDL_HIDAPI_discovery.m_hwndMsg = CreateWindowExA(0, "ControllerDetect", NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL);
{ {
DEV_BROADCAST_DEVICEINTERFACE_A devBroadcast; DEV_BROADCAST_DEVICEINTERFACE_A devBroadcast;
SDL_memset( &devBroadcast, 0x0, sizeof( devBroadcast ) ); SDL_memset( &devBroadcast, 0x0, sizeof( devBroadcast ) );
devBroadcast.dbcc_size = sizeof( devBroadcast ); devBroadcast.dbcc_size = sizeof( devBroadcast );
devBroadcast.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; devBroadcast.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
devBroadcast.dbcc_classguid = GUID_DEVINTERFACE_USB_DEVICE; devBroadcast.dbcc_classguid = GUID_DEVINTERFACE_USB_DEVICE;
/* DEVICE_NOTIFY_ALL_INTERFACE_CLASSES is important, makes GUID_DEVINTERFACE_USB_DEVICE ignored, /* DEVICE_NOTIFY_ALL_INTERFACE_CLASSES is important, makes GUID_DEVINTERFACE_USB_DEVICE ignored,
* but that seems to be necessary to get a notice after each individual usb input device actually * but that seems to be necessary to get a notice after each individual usb input device actually
* installs, rather than just as the composite device is seen. * installs, rather than just as the composite device is seen.
*/ */
SDL_HIDAPI_discovery.m_hNotify = RegisterDeviceNotification( SDL_HIDAPI_discovery.m_hwndMsg, &devBroadcast, DEVICE_NOTIFY_WINDOW_HANDLE | DEVICE_NOTIFY_ALL_INTERFACE_CLASSES ); SDL_HIDAPI_discovery.m_hNotify = RegisterDeviceNotification( SDL_HIDAPI_discovery.m_hwndMsg, &devBroadcast, DEVICE_NOTIFY_WINDOW_HANDLE | DEVICE_NOTIFY_ALL_INTERFACE_CLASSES );
SDL_HIDAPI_discovery.m_bCanGetNotifications = ( SDL_HIDAPI_discovery.m_hNotify != 0 ); SDL_HIDAPI_discovery.m_bCanGetNotifications = ( SDL_HIDAPI_discovery.m_hNotify != 0 );
} }
#endif /* __WIN32__ */ #endif /* __WIN32__ */
#if defined(__MACOSX__) #if defined(__MACOSX__)
@ -225,9 +226,10 @@ HIDAPI_InitializeDiscovery()
/* Note: IOServiceAddMatchingNotification consumes the reference to matchingDict */ /* Note: IOServiceAddMatchingNotification consumes the reference to matchingDict */
io_iterator_t portIterator = 0; 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) { if (IOServiceAddMatchingNotification(SDL_HIDAPI_discovery.m_notificationPort, kIOMatchedNotification, matchingDict, CallbackIOServiceFunc, &SDL_HIDAPI_discovery.m_bHaveDevicesChanged, &portIterator) == 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 (io_object_t entry = IOIteratorNext(portIterator)) { while ((entry = IOIteratorNext(portIterator)) != 0) {
IOObjectRelease(entry); IOObjectRelease(entry);
} }
} else { } else {
@ -240,9 +242,10 @@ HIDAPI_InitializeDiscovery()
/* Note: IOServiceAddMatchingNotification consumes the reference to matchingDict */ /* Note: IOServiceAddMatchingNotification consumes the reference to matchingDict */
io_iterator_t portIterator = 0; 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) { if (IOServiceAddMatchingNotification(SDL_HIDAPI_discovery.m_notificationPort, kIOMatchedNotification, matchingDict, CallbackIOServiceFunc, &SDL_HIDAPI_discovery.m_bHaveDevicesChanged, &portIterator) == 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 (io_object_t entry = IOIteratorNext(portIterator)) { while ((entry = IOIteratorNext(portIterator)) != 0) {
IOObjectRelease(entry); IOObjectRelease(entry);
} }
} else { } else {
@ -803,6 +806,8 @@ HIDAPI_JoystickQuit(void)
{ {
int i; int i;
HIDAPI_ShutdownDiscovery();
while (SDL_HIDAPI_devices) { while (SDL_HIDAPI_devices) {
HIDAPI_DelDevice(SDL_HIDAPI_devices, SDL_FALSE); HIDAPI_DelDevice(SDL_HIDAPI_devices, SDL_FALSE);
} }