Improved handling of multiple connected joysticks, prefer SDL_GameControllers.
This commit is contained in:
parent
e1ca17f1f0
commit
733a7fadda
|
@ -286,11 +286,14 @@ void EventThread::process(RGSSThreadData &rtData)
|
|||
break;
|
||||
|
||||
case SDL_JOYDEVICEADDED :
|
||||
if (event.jdevice.which > 0)
|
||||
if (SDL_JoystickGetAttached(js))
|
||||
break;
|
||||
|
||||
if (SDL_IsGameController(0))
|
||||
rtData.gamecontroller = SDL_GameControllerOpen(0);
|
||||
if (SDL_IsGameController(event.jdevice.which))
|
||||
{
|
||||
rtData.gamecontroller = SDL_GameControllerOpen(event.jdevice.which);
|
||||
rtData.gamecontrollerIndex = event.jdevice.which;
|
||||
}
|
||||
if (rtData.gamecontroller != NULL)
|
||||
{
|
||||
js = SDL_GameControllerGetJoystick(rtData.gamecontroller);
|
||||
|
@ -298,14 +301,44 @@ void EventThread::process(RGSSThreadData &rtData)
|
|||
* the user hasn't set a custom set of keybinds yet */
|
||||
rtData.bindingUpdateMsg.post(loadBindings(rtData.config, rtData.gamecontroller));
|
||||
}
|
||||
else
|
||||
else if (event.jdevice.which == 0)
|
||||
{
|
||||
js = SDL_JoystickOpen(0);
|
||||
rtData.gamecontrollerIndex = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case SDL_JOYDEVICEREMOVED :
|
||||
if (SDL_JoystickInstanceID(js) != event.jdevice.which)
|
||||
break;
|
||||
|
||||
/* clean up the connected controller and joy device if it was the one we were tracking */
|
||||
if (rtData.gamecontroller != NULL && SDL_GameControllerGetAttached(rtData.gamecontroller))
|
||||
SDL_GameControllerClose(rtData.gamecontroller);
|
||||
else if (SDL_JoystickGetAttached(js))
|
||||
SDL_JoystickClose(js);
|
||||
resetInputStates();
|
||||
|
||||
/* If there are still joysticks/gamepads around make sure to connect them */
|
||||
js = NULL;
|
||||
rtData.gamecontroller = NULL;
|
||||
rtData.gamecontrollerIndex = 0;
|
||||
for (int i = 0; i < SDL_NumJoysticks(); i++)
|
||||
{
|
||||
if (SDL_IsGameController(i))
|
||||
{
|
||||
rtData.gamecontroller = SDL_GameControllerOpen(i);
|
||||
rtData.gamecontrollerIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (rtData.gamecontroller != NULL)
|
||||
{
|
||||
js = SDL_GameControllerGetJoystick(rtData.gamecontroller);
|
||||
rtData.bindingUpdateMsg.post(loadBindings(rtData.config, rtData.gamecontroller));
|
||||
}
|
||||
else if (SDL_NumJoysticks() > 0)
|
||||
js = SDL_JoystickOpen(0);
|
||||
break;
|
||||
|
||||
case SDL_MOUSEBUTTONDOWN :
|
||||
|
|
|
@ -233,6 +233,7 @@ struct RGSSThreadData
|
|||
Config config;
|
||||
|
||||
SDL_GameController *gamecontroller;
|
||||
int gamecontrollerIndex;
|
||||
|
||||
std::string rgssErrorMsg;
|
||||
|
||||
|
|
13
src/main.cpp
13
src/main.cpp
|
@ -284,8 +284,17 @@ int main(int argc, char *argv[])
|
|||
SDL_GameControllerAddMappingsFromRW(controllerDB, 1);
|
||||
|
||||
rtData.gamecontroller = NULL;
|
||||
if (SDL_NumJoysticks() > 0 && SDL_IsGameController(0))
|
||||
rtData.gamecontroller = SDL_GameControllerOpen(0);
|
||||
rtData.gamecontrollerIndex = 0;
|
||||
/* Add the first index which is a valid GameController if there is one */
|
||||
for (int i = 0; i < SDL_NumJoysticks(); i++)
|
||||
{
|
||||
if (SDL_IsGameController(i))
|
||||
{
|
||||
rtData.gamecontroller = SDL_GameControllerOpen(i);
|
||||
rtData.gamecontrollerIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Load and post key bindings */
|
||||
rtData.bindingUpdateMsg.post(loadBindings(conf, rtData.gamecontroller));
|
||||
|
|
Loading…
Reference in New Issue