iOS: Set the 'player index' of MFi game controllers when they're opened for use.
authorAlex Szpakowski <slime73@gmail.com>
Mon, 09 Nov 2015 18:13:47 -0400
changeset 9909 b2c000b256ea
parent 9908 b63158b01a7d
child 9910 3ef321f52ca5
iOS: Set the 'player index' of MFi game controllers when they're opened for use. MFi controllers display their player index via LEDs on the controller.
src/joystick/iphoneos/SDL_sysjoystick.m
--- a/src/joystick/iphoneos/SDL_sysjoystick.m	Mon Nov 09 17:41:54 2015 -0400
+++ b/src/joystick/iphoneos/SDL_sysjoystick.m	Mon Nov 09 18:13:47 2015 -0400
@@ -361,6 +361,25 @@
         } else {
 #ifdef SDL_JOYSTICK_MFI
             GCController *controller = device->controller;
+            BOOL usedPlayerIndexSlots[4] = {NO, NO, NO, NO};
+
+            /* Find the player index of all other connected controllers. */
+            for (GCController *c in [GCController controllers]) {
+                if (c != controller && c.playerIndex >= 0) {
+                    usedPlayerIndexSlots[c.playerIndex] = YES;
+                }
+            }
+
+            /* Set this controller's player index to the first unused index.
+             * FIXME: This logic isn't great... but SDL doesn't expose this
+             * concept in its external API, so we don't have much to go on. */
+            for (int i = 0; i < 4; i++) {
+                if (!usedPlayerIndexSlots[i]) {
+                    controller.playerIndex = i;
+                    break;
+                }
+            }
+
             controller.controllerPausedHandler = ^(GCController *controller) {
                 if (joystick->hwdata) {
                     ++joystick->hwdata->num_pause_presses;