mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2024-11-22 22:05:38 +00:00
SDLControllerInterface: Fix broken input when player IDs clash
This commit is contained in:
parent
4fd5d6ca4f
commit
e843fcd9f0
|
@ -109,6 +109,23 @@ SDLControllerInterface::ControllerDataVector::iterator SDLControllerInterface::G
|
||||||
[id](const ControllerData& cd) { return cd.player_id == id; });
|
[id](const ControllerData& cd) { return cd.player_id == id; });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int SDLControllerInterface::GetFreePlayerId() const
|
||||||
|
{
|
||||||
|
for (int player_id = 0;; player_id++)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
for (i = 0; i < m_controllers.size(); i++)
|
||||||
|
{
|
||||||
|
if (m_controllers[i].player_id == player_id)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i == m_controllers.size())
|
||||||
|
return player_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
bool SDLControllerInterface::OpenGameController(int index)
|
bool SDLControllerInterface::OpenGameController(int index)
|
||||||
{
|
{
|
||||||
SDL_GameController* gcontroller = SDL_GameControllerOpen(index);
|
SDL_GameController* gcontroller = SDL_GameControllerOpen(index);
|
||||||
|
@ -128,12 +145,13 @@ bool SDLControllerInterface::OpenGameController(int index)
|
||||||
#else
|
#else
|
||||||
int player_id = -1;
|
int player_id = -1;
|
||||||
#endif
|
#endif
|
||||||
if (player_id < 0)
|
if (player_id < 0 || GetControllerDataForPlayerId(player_id) != m_controllers.end())
|
||||||
{
|
{
|
||||||
Log_WarningPrintf("Controller %d (joystick %d) returned player ID %d. Setting to zero, but this may cause issues "
|
const int free_player_id = GetFreePlayerId();
|
||||||
"if you try to use multiple controllers.",
|
Log_WarningPrintf(
|
||||||
index, joystick_id, player_id);
|
"Controller %d (joystick %d) returned player ID %d, which is invalid or in use. Using ID %d instead.", index,
|
||||||
player_id = 0;
|
joystick_id, player_id, free_player_id);
|
||||||
|
player_id = free_player_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log_InfoPrintf("Opened controller %d (instance id %d, player id %d): %s", index, joystick_id, player_id,
|
Log_InfoPrintf("Opened controller %d (instance id %d, player id %d): %s", index, joystick_id, player_id,
|
||||||
|
|
|
@ -50,6 +50,7 @@ private:
|
||||||
ControllerDataVector::iterator GetControllerDataForController(void* controller);
|
ControllerDataVector::iterator GetControllerDataForController(void* controller);
|
||||||
ControllerDataVector::iterator GetControllerDataForJoystickId(int id);
|
ControllerDataVector::iterator GetControllerDataForJoystickId(int id);
|
||||||
ControllerDataVector::iterator GetControllerDataForPlayerId(int id);
|
ControllerDataVector::iterator GetControllerDataForPlayerId(int id);
|
||||||
|
int GetFreePlayerId() const;
|
||||||
|
|
||||||
bool OpenGameController(int index);
|
bool OpenGameController(int index);
|
||||||
bool CloseGameController(int joystick_index, bool notify);
|
bool CloseGameController(int joystick_index, bool notify);
|
||||||
|
|
Loading…
Reference in a new issue