Mac: Don't add the same joystick twice if IOKit reports a duplicate device. Fixes Bugzilla #2704.
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
diff --git a/src/joystick/darwin/SDL_sysjoystick.c b/src/joystick/darwin/SDL_sysjoystick.c
index f0bd5b8..0518cc7 100644
--- a/src/joystick/darwin/SDL_sysjoystick.c
+++ b/src/joystick/darwin/SDL_sysjoystick.c
@@ -364,15 +364,33 @@ GetDeviceInfo(IOHIDDeviceRef hidDevice, recDevice *pDevice)
return SDL_TRUE;
}
+static SDL_bool
+JoystickAlreadyKnown(IOHIDDeviceRef ioHIDDeviceObject)
+{
+ recDevice *i;
+ for (i = gpDeviceList; i != NULL; i = i->pNext) {
+ if (i->deviceRef == ioHIDDeviceObject) {
+ return SDL_TRUE;
+ }
+ }
+ return SDL_FALSE;
+}
+
static void
JoystickDeviceWasAddedCallback(void *ctx, IOReturn res, void *sender, IOHIDDeviceRef ioHIDDeviceObject)
{
+ recDevice *device;
+
if (res != kIOReturnSuccess) {
return;
}
- recDevice *device = (recDevice *) SDL_calloc(1, sizeof(recDevice));
+ if (JoystickAlreadyKnown(ioHIDDeviceObject)) {
+ return; /* IOKit sent us a duplicate. */
+ }
+
+ device = (recDevice *) SDL_calloc(1, sizeof(recDevice));
if (!device) {
SDL_OutOfMemory();