Commit f0cee3edec830544892cbe6dd348b8e9d2cbc3ed

Zack Middleton 2019-12-22T13:15:11

Fix shutting down HIDAPI device with multiple joysticks Using Wii U GameCube USB adapter with multiple controllers attached and restarting SDL input in a game results in extra joysticks with NULL name. HIDAPI_CleanupDeviceDriver() shut down joysticks by iterating through device->num_joysticks but each HIDAPI_JoystickDisconnected() decreases device->num_joysticks and shifts joysticks array down. Resulting in only half of controllers being shutdown. It worked with only 1 controller attached though. Disconnect HIDAPI device joystick 0 until there are none left.

diff --git a/src/joystick/hidapi/SDL_hidapijoystick.c b/src/joystick/hidapi/SDL_hidapijoystick.c
index ef9ee08..3248769 100644
--- a/src/joystick/hidapi/SDL_hidapijoystick.c
+++ b/src/joystick/hidapi/SDL_hidapijoystick.c
@@ -484,20 +484,18 @@ HIDAPI_SetupDeviceDriver(SDL_HIDAPI_Device *device)
 static void
 HIDAPI_CleanupDeviceDriver(SDL_HIDAPI_Device *device)
 {
-    int i;
-
     if (!device->driver) {
         /* Already cleaned up */
         return;
     }
 
     /* Disconnect any joysticks */
-    for (i = 0; i < device->num_joysticks; ++i) {
-        SDL_Joystick *joystick = SDL_JoystickFromInstanceID(device->joysticks[i]);
+    while (device->num_joysticks) {
+        SDL_Joystick *joystick = SDL_JoystickFromInstanceID(device->joysticks[0]);
         if (joystick) {
             HIDAPI_JoystickClose(joystick);
         }
-        HIDAPI_JoystickDisconnected(device, device->joysticks[i]);
+        HIDAPI_JoystickDisconnected(device, device->joysticks[0]);
     }
 
     device->driver->FreeDevice(device);