mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-12-03 17:52:04 +00:00
Attempt to handle unstable device IDs
This commit is contained in:
parent
216e710b87
commit
44d6a1d236
2 changed files with 40 additions and 11 deletions
|
@ -1019,10 +1019,9 @@ void I_GetJoystickEvents(void)
|
||||||
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
static int joy_open(const char *fname)
|
static int joy_open(int joyindex)
|
||||||
{
|
{
|
||||||
SDL_Joystick *newdev = NULL;
|
SDL_Joystick *newdev = NULL;
|
||||||
int joyindex = atoi(fname);
|
|
||||||
int num_joy = 0;
|
int num_joy = 0;
|
||||||
|
|
||||||
if (SDL_WasInit(SDL_INIT_JOYSTICK) == 0)
|
if (SDL_WasInit(SDL_INIT_JOYSTICK) == 0)
|
||||||
|
@ -1292,10 +1291,9 @@ void I_GetJoystick2Events(void)
|
||||||
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
static int joy_open2(const char *fname)
|
static int joy_open2(int joyindex)
|
||||||
{
|
{
|
||||||
SDL_Joystick *newdev = NULL;
|
SDL_Joystick *newdev = NULL;
|
||||||
int joyindex = atoi(fname);
|
|
||||||
int num_joy = 0;
|
int num_joy = 0;
|
||||||
|
|
||||||
if (SDL_WasInit(SDL_INIT_JOYSTICK) == 0)
|
if (SDL_WasInit(SDL_INIT_JOYSTICK) == 0)
|
||||||
|
@ -1392,16 +1390,18 @@ void I_InitJoystick(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(cv_usejoystick.string, "0") && joy_open(cv_usejoystick.string) != -1)
|
if (cv_usejoystick.value && joy_open(cv_usejoystick.value) != -1)
|
||||||
{
|
{
|
||||||
JoyInfo.oldjoy = atoi(cv_usejoystick.string);
|
// SDL's device indexes are unstable, so cv_usejoystick may not match
|
||||||
|
// the actual device index. So let's cheat a bit and use the instance ID.
|
||||||
|
// oldjoy's exact value doesn't matter, because we use it like a boolean
|
||||||
|
JoyInfo.oldjoy = SDL_JoystickInstanceID(JoyInfo.dev) + 1;
|
||||||
joystick_started = 1;
|
joystick_started = 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (JoyInfo.oldjoy)
|
if (JoyInfo.oldjoy)
|
||||||
I_ShutdownJoystick();
|
I_ShutdownJoystick();
|
||||||
cv_usejoystick.value = 0;
|
|
||||||
joystick_started = 0;
|
joystick_started = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1423,16 +1423,18 @@ void I_InitJoystick2(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(cv_usejoystick2.string, "0") && joy_open2(cv_usejoystick2.string) != -1)
|
if (cv_usejoystick2.value && joy_open2(cv_usejoystick2.value) != -1)
|
||||||
{
|
{
|
||||||
JoyInfo2.oldjoy = atoi(cv_usejoystick2.string);
|
// SDL's device indexes are unstable, so cv_usejoystick2 may not match
|
||||||
|
// the actual device index. So let's cheat a bit and use the instance ID.
|
||||||
|
// oldjoy's exact value doesn't matter, because we use it like a boolean
|
||||||
|
JoyInfo2.oldjoy = SDL_JoystickInstanceID(JoyInfo2.dev) + 1;
|
||||||
joystick2_started = 1;
|
joystick2_started = 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (JoyInfo2.oldjoy)
|
if (JoyInfo2.oldjoy)
|
||||||
I_ShutdownJoystick2();
|
I_ShutdownJoystick2();
|
||||||
cv_usejoystick2.value = 0;
|
|
||||||
joystick2_started = 0;
|
joystick2_started = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -885,7 +885,27 @@ void I_GetEvent(void)
|
||||||
case SDL_JOYDEVICEADDED:
|
case SDL_JOYDEVICEADDED:
|
||||||
CONS_Debug(DBG_GAMELOGIC, "Joystick device index %d added\n", evt.jdevice.which + 1);
|
CONS_Debug(DBG_GAMELOGIC, "Joystick device index %d added\n", evt.jdevice.which + 1);
|
||||||
|
|
||||||
// recount hotplugged joysticks
|
// Because SDL's device index is unstable, we're going to cheat here a bit:
|
||||||
|
// For the first joystick setting that is NOT active:
|
||||||
|
// Set cv_usejoystickX.value to the new device index (this does not change what is written to config.cfg)
|
||||||
|
// Set OTHERS' cv_usejoystickX.value to THEIR new device index, because it likely changed
|
||||||
|
if (!JoyInfo.dev || !SDL_JoystickGetAttached(JoyInfo.dev))
|
||||||
|
{
|
||||||
|
cv_usejoystick.value = evt.jdevice.which + 1;
|
||||||
|
|
||||||
|
if (JoyInfo2.dev)
|
||||||
|
cv_usejoystick2.value = SDL_JoystickInstanceID(JoyInfo2.dev) + 1;
|
||||||
|
}
|
||||||
|
else if (!JoyInfo2.dev || !SDL_JoystickGetAttached(JoyInfo2.dev))
|
||||||
|
{
|
||||||
|
cv_usejoystick2.value = evt.jdevice.which + 1;
|
||||||
|
|
||||||
|
if (JoyInfo.dev)
|
||||||
|
cv_usejoystick.value = SDL_JoystickInstanceID(JoyInfo.dev) + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If an active joystick's index has changed, these will just
|
||||||
|
// change the corresponding JoyInfo.oldjoy
|
||||||
I_InitJoystick();
|
I_InitJoystick();
|
||||||
I_InitJoystick2();
|
I_InitJoystick2();
|
||||||
|
|
||||||
|
@ -909,6 +929,13 @@ void I_GetEvent(void)
|
||||||
I_ShutdownJoystick2();
|
I_ShutdownJoystick2();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Update the device indexes, because they likely changed
|
||||||
|
if (JoyInfo.dev)
|
||||||
|
JoyInfo.oldjoy = SDL_JoystickInstanceID(JoyInfo.dev) + 1;
|
||||||
|
|
||||||
|
if (JoyInfo2.dev)
|
||||||
|
JoyInfo2.oldjoy = SDL_JoystickInstanceID(JoyInfo2.dev) + 1;
|
||||||
|
|
||||||
CONS_Debug(DBG_GAMELOGIC, "Joystick1 device index: %d\n", JoyInfo.oldjoy);
|
CONS_Debug(DBG_GAMELOGIC, "Joystick1 device index: %d\n", JoyInfo.oldjoy);
|
||||||
CONS_Debug(DBG_GAMELOGIC, "Joystick2 device index: %d\n", JoyInfo2.oldjoy);
|
CONS_Debug(DBG_GAMELOGIC, "Joystick2 device index: %d\n", JoyInfo2.oldjoy);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue