From 216e710b8705dc3b26d5d09aa026064c68e7c8e2 Mon Sep 17 00:00:00 2001
From: mazmazz <mar.marcoz@outlook.com>
Date: Thu, 13 Dec 2018 23:50:36 -0500
Subject: [PATCH] Improve hotplug edge case with changing device indexes;
 return proper joy_open output on error

---
 src/sdl/i_system.c | 90 +++++++---------------------------------------
 1 file changed, 12 insertions(+), 78 deletions(-)

diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c
index 7a9439791..d1ce041a5 100644
--- a/src/sdl/i_system.c
+++ b/src/sdl/i_system.c
@@ -1024,7 +1024,6 @@ static int joy_open(const char *fname)
 	SDL_Joystick *newdev = NULL;
 	int joyindex = atoi(fname);
 	int num_joy = 0;
-	int i;
 
 	if (SDL_WasInit(SDL_INIT_JOYSTICK) == 0)
 	{
@@ -1032,35 +1031,15 @@ static int joy_open(const char *fname)
 		return -1;
 	}
 
-	JoyReset(&JoyInfo);
-
 	if (joyindex <= 0)
-		return 0;
+		return -1;
 
 	num_joy = SDL_NumJoysticks();
 
-	if (num_joy == 0 || JoyInfo.oldjoy == joyindex)
+	if (num_joy == 0)
 	{
-//		I_OutputMsg("Unable to use that joystick #(%s), non-number\n",fname);
-		if (num_joy != 0)
-		{
-			CONS_Printf(M_GetText("Found %d joysticks on this system\n"), num_joy);
-			for (i = 0; i < num_joy; i++)
-				CONS_Printf("#%d/(%s)\n", i+1, SDL_JoystickNameForIndex(i));
-
-			if (num_joy < joyindex)
-			{
-				CONS_Printf(M_GetText("Cannot use joystick #%d/(%s), it doesn't exist\n"),joyindex,fname);
-				for (i = 0; i < num_joy; i++)
-					CONS_Printf("#%d/(%s)\n", i+1, SDL_JoystickNameForIndex(i));
-				return 0;
-			}
-		}
-		else
-		{
-			CONS_Printf("%s", M_GetText("Found no joysticks on this system\n"));
-			return 0;
-		}
+		CONS_Printf("%s", M_GetText("Found no joysticks on this system\n"));
+		return -1;
 	}
 
 	newdev = SDL_JoystickOpen(joyindex-1);
@@ -1081,6 +1060,7 @@ static int joy_open(const char *fname)
 			|| (newdev == NULL && SDL_JoystickGetAttached(JoyInfo.dev))) // we failed, but already have a working device
 			return JoyInfo.axises;
 		// Else, we're changing devices, so send neutral joy events
+		CONS_Debug(DBG_GAMELOGIC, "Joystick1 device is changing; resetting events...\n");
 		I_ShutdownJoystick();
 	}
 
@@ -1317,7 +1297,6 @@ static int joy_open2(const char *fname)
 	SDL_Joystick *newdev = NULL;
 	int joyindex = atoi(fname);
 	int num_joy = 0;
-	int i;
 
 	if (SDL_WasInit(SDL_INIT_JOYSTICK) == 0)
 	{
@@ -1325,35 +1304,15 @@ static int joy_open2(const char *fname)
 		return -1;
 	}
 
-	JoyReset(&JoyInfo2);
-
 	if (joyindex <= 0)
-		return 0;
+		return -1;
 
 	num_joy = SDL_NumJoysticks();
 
-	if (num_joy == 0 || JoyInfo2.oldjoy == joyindex)
+	if (num_joy == 0)
 	{
-//		I_OutputMsg("Unable to use that joystick #(%s), non-number\n",fname);
-		if (num_joy != 0)
-		{
-			CONS_Printf(M_GetText("Found %d joysticks on this system\n"), num_joy);
-			for (i = 0; i < num_joy; i++)
-				CONS_Printf("#%d/(%s)\n", i+1, SDL_JoystickNameForIndex(i));
-
-			if (num_joy < joyindex)
-			{
-				CONS_Printf(M_GetText("Cannot use joystick #%d/(%s), it doesn't exist\n"),joyindex,fname);
-				for (i = 0; i < num_joy; i++)
-					CONS_Printf("#%d/(%s)\n", i+1, SDL_JoystickNameForIndex(i));
-				return 0;
-			}
-		}
-		else
-		{
-			CONS_Printf("%s", M_GetText("Found no joysticks on this system\n"));
-			return 0;
-		}
+		CONS_Printf("%s", M_GetText("Found no joysticks on this system\n"));
+		return -1;
 	}
 
 	newdev = SDL_JoystickOpen(joyindex-1);
@@ -1374,6 +1333,7 @@ static int joy_open2(const char *fname)
 			|| (newdev == NULL && SDL_JoystickGetAttached(JoyInfo2.dev))) // we failed, but already have a working device
 			return JoyInfo.axises;
 		// Else, we're changing devices, so send neutral joy events
+		CONS_Debug(DBG_GAMELOGIC, "Joystick2 device is changing; resetting events...\n");
 		I_ShutdownJoystick2();
 	}
 
@@ -1434,20 +1394,7 @@ void I_InitJoystick(void)
 
 	if (strcmp(cv_usejoystick.string, "0") && joy_open(cv_usejoystick.string) != -1)
 	{
-		// JoyInfo.oldjoy may already be filled because we attempted to hotplug
-		// a device and the device index has changed
-		// So in this case, get the new device index
-		//
-		// For now, it does not actually matter if the JoyInfo.oldjoy value is inaccurate. We don't use its
-		// exact value; we just use it like a boolean.
-		if (JoyInfo.oldjoy <= 0)
-			JoyInfo.oldjoy = atoi(cv_usejoystick.string);
-		else
-		{
-			CONS_Debug(DBG_GAMELOGIC, "Joystick1 device index has changed: was %d, now %d\n",
-				JoyInfo.oldjoy, SDL_JoystickInstanceID(JoyInfo.dev) + 1);
-			JoyInfo.oldjoy = SDL_JoystickInstanceID(JoyInfo.dev) + 1;
-		}
+		JoyInfo.oldjoy = atoi(cv_usejoystick.string);
 		joystick_started = 1;
 	}
 	else
@@ -1478,20 +1425,7 @@ void I_InitJoystick2(void)
 
 	if (strcmp(cv_usejoystick2.string, "0") && joy_open2(cv_usejoystick2.string) != -1)
 	{
-		// JoyInfo.oldjoy may already be filled because we attempted to hotplug
-		// a device and the device index has changed
-		// So in this case, get the new device index
-		//
-		// For now, it does not actually matter if the JoyInfo2.oldjoy value is inaccurate. We don't use its
-		// exact value; we just use it like a boolean.
-		if (JoyInfo2.oldjoy <= 0)
-			JoyInfo2.oldjoy = atoi(cv_usejoystick2.string);
-		else
-		{
-			CONS_Debug(DBG_GAMELOGIC, "Joystick2 device index has changed: was %d, now %d\n",
-				JoyInfo2.oldjoy, SDL_JoystickInstanceID(JoyInfo2.dev) + 1);
-			JoyInfo2.oldjoy = SDL_JoystickInstanceID(JoyInfo2.dev) + 1;
-		}
+		JoyInfo2.oldjoy = atoi(cv_usejoystick2.string);
 		joystick2_started = 1;
 	}
 	else
-- 
GitLab