Reworked XInput and DirectInput joystick code.

Now multiple XInput controllers map correctly to device indexes instead of grabbing
the first available userid, and are completely separated out from DirectInput.

Also, the hardcoded limitation on number of DirectInput devices is gone. I don't
expect there to really ever be more than eight joysticks plugged into a machine, but
it was a leftover limitation for a static array we didn't actually use anymore.

Fixes Bugzilla #1984. (etc?)

--HG--
extra : rebase_source : 103ce667c1cdd87a3691c9dd9eea2318bad908c8
This commit is contained in:
Ryan C. Gordon 2013-08-28 16:43:47 -04:00
parent 17c90f1186
commit 6f21990987
2 changed files with 151 additions and 193 deletions

View file

@ -851,9 +851,6 @@ SDL_GameControllerOpen(int device_index)
SDL_GameController *gamecontroller;
SDL_GameController *gamecontrollerlist;
ControllerMapping_t *pSupportedController = NULL;
#ifdef SDL_JOYSTICK_DINPUT
SDL_bool bIsXinputDevice;
#endif
if ((device_index < 0) || (device_index >= SDL_NumJoysticks())) {
SDL_SetError("There are %d joysticks available", SDL_NumJoysticks());
@ -886,11 +883,6 @@ SDL_GameControllerOpen(int device_index)
return NULL;
}
#ifdef SDL_JOYSTICK_DINPUT
/* check if we think we should open this device in XInput mode */
bIsXinputDevice = SDL_SYS_IsXInputDeviceIndex(device_index);
#endif
SDL_memset(gamecontroller, 0, (sizeof *gamecontroller));
gamecontroller->joystick = SDL_JoystickOpen(device_index);
if ( !gamecontroller->joystick ) {
@ -898,19 +890,6 @@ SDL_GameControllerOpen(int device_index)
return NULL;
}
#ifdef SDL_JOYSTICK_DINPUT
if ( !SDL_SYS_IsXInputJoystick( gamecontroller->joystick ) && bIsXinputDevice )
{
/* we tried to open the controller in XInput mode and failed, so get the mapping again for the direct input variant if possible */
SDL_JoystickGUID jGUID = SDL_JoystickGetDeviceGUID( device_index );
pSupportedController = SDL_PrivateGetControllerMappingForGUID(&jGUID);
if ( !pSupportedController ) {
SDL_SetError("Failed to open device in XInput mode (%d)", device_index );
return (NULL);
}
}
#endif
SDL_PrivateLoadButtonMapping( &gamecontroller->mapping, pSupportedController->guid, pSupportedController->name, pSupportedController->mapping );
/* Add joystick to list */