diff --git a/src/joystick/windows/SDL_dxjoystick.c b/src/joystick/windows/SDL_dxjoystick.c index 2648ef3ad..4165c7011 100644 --- a/src/joystick/windows/SDL_dxjoystick.c +++ b/src/joystick/windows/SDL_dxjoystick.c @@ -766,8 +766,10 @@ static void 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 @@ void SDL_SYS_JoystickDetect() 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 @@ void SDL_SYS_JoystickDetect() 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 ); }