src/joystick/windows/SDL_dxjoystick.c
changeset 7712 66b5b8446275
parent 7711 db9e27a52d77
child 7719 31b5f9ff36ca
--- a/src/joystick/windows/SDL_dxjoystick.c	Wed Aug 28 22:07:54 2013 -0400
+++ b/src/joystick/windows/SDL_dxjoystick.c	Wed Aug 28 22:09:17 2013 -0400
@@ -766,8 +766,10 @@
 EnumXInputDevices(JoyStick_DeviceData **pContext)
 {
     if (s_bXInputEnabled) {
-        Uint8 userid;
-        for (userid = 0; userid < SDL_XINPUT_MAX_DEVICES; userid++) {
+        int iuserid;
+        /* iterate in reverse, so these are in the final list in ascending numeric order. */
+        for (iuserid = SDL_XINPUT_MAX_DEVICES-1; iuserid >= 0; iuserid--) {
+            const Uint8 userid = (Uint8) iuserid;
             XINPUT_CAPABILITIES capabilities;
             if (XINPUTGETCAPABILITIES(userid, XINPUT_FLAG_GAMEPAD, &capabilities) == ERROR_SUCCESS) {
                 /* Current version of XInput mistakenly returns 0 as the Type. Ignore it and ensure the subtype is a gamepad. */
@@ -796,9 +798,6 @@
         pCurList = SYS_Joystick;
         SYS_Joystick = NULL;
 
-        /* Look for XInput devices... */
-        EnumXInputDevices(&pCurList);
-
         /* Look for DirectInput joysticks, wheels, head trackers, gamepads, etc.. */
         IDirectInput8_EnumDevices(dinput,
             DI8DEVCLASS_GAMECTRL,
@@ -809,6 +808,9 @@
         SDL_RawDevList = NULL;
         SDL_RawDevListCount = 0;
 
+        /* Look for XInput devices. Do this last, so they're first in the final list. */
+        EnumXInputDevices(&pCurList);
+
         SDL_UnlockMutex( s_mutexJoyStickEnum );
     }