Sfoglia il codice sorgente

Fix Joystick:getGamepadType when the gamepad is disconnected.

Sasha Szpakowski 3 mesi fa
parent
commit
6a972eec8e
2 ha cambiato i file con 45 aggiunte e 19 eliminazioni
  1. 44 19
      src/modules/joystick/sdl/Joystick.cpp
  2. 1 0
      src/modules/joystick/sdl/Joystick.h

+ 44 - 19
src/modules/joystick/sdl/Joystick.cpp

@@ -42,6 +42,7 @@ Joystick::Joystick(int id)
 	: joyhandle(nullptr)
 	, controller(nullptr)
 	, joystickType(JOYSTICK_TYPE_UNKNOWN)
+	, gamepadType(GAMEPAD_TYPE_UNKNOWN)
 	, instanceid(-1)
 	, id(id)
 {
@@ -114,6 +115,48 @@ bool Joystick::open(int64 deviceid)
 			joystickType = JOYSTICK_TYPE_UNKNOWN;
 			break;
 		}
+
+		if (controller != nullptr)
+		{
+			switch (SDL_GetGamepadType(controller))
+			{
+			case SDL_GAMEPAD_TYPE_UNKNOWN:
+				gamepadType = GAMEPAD_TYPE_UNKNOWN;
+				break;
+			case SDL_GAMEPAD_TYPE_XBOX360:
+				gamepadType = GAMEPAD_TYPE_XBOX360;
+				break;
+			case SDL_GAMEPAD_TYPE_XBOXONE:
+				gamepadType = GAMEPAD_TYPE_XBOXONE;
+				break;
+			case SDL_GAMEPAD_TYPE_PS3:
+				gamepadType = GAMEPAD_TYPE_PS3;
+				break;
+			case SDL_GAMEPAD_TYPE_PS4:
+				gamepadType = GAMEPAD_TYPE_PS4;
+				break;
+			case SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_PRO:
+				gamepadType = GAMEPAD_TYPE_NINTENDO_SWITCH_PRO;
+				break;
+			case SDL_GAMEPAD_TYPE_PS5:
+				gamepadType = GAMEPAD_TYPE_PS5;
+				break;
+			case SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_LEFT:
+				gamepadType = GAMEPAD_TYPE_JOYCON_LEFT;
+				break;
+			case SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT:
+				gamepadType = GAMEPAD_TYPE_JOYCON_RIGHT;
+				break;
+			case SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_PAIR:
+				gamepadType = GAMEPAD_TYPE_JOYCON_PAIR;
+				break;
+			default:
+				gamepadType = GAMEPAD_TYPE_UNKNOWN;
+				break;
+			}
+		}
+		else
+			gamepadType = GAMEPAD_TYPE_UNKNOWN;
 	}
 
 	return isConnected();
@@ -255,25 +298,7 @@ bool Joystick::isGamepad() const
 
 Joystick::GamepadType Joystick::getGamepadType() const
 {
-	if (controller == nullptr)
-		return GAMEPAD_TYPE_UNKNOWN;
-
-	switch (SDL_GetGamepadType(controller))
-	{
-		case SDL_GAMEPAD_TYPE_UNKNOWN: return GAMEPAD_TYPE_UNKNOWN;
-		case SDL_GAMEPAD_TYPE_XBOX360: return GAMEPAD_TYPE_XBOX360;
-		case SDL_GAMEPAD_TYPE_XBOXONE: return GAMEPAD_TYPE_XBOXONE;
-		case SDL_GAMEPAD_TYPE_PS3: return GAMEPAD_TYPE_PS3;
-		case SDL_GAMEPAD_TYPE_PS4: return GAMEPAD_TYPE_PS4;
-		case SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_PRO: return GAMEPAD_TYPE_NINTENDO_SWITCH_PRO;
-		case SDL_GAMEPAD_TYPE_PS5: return GAMEPAD_TYPE_PS5;
-		case SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_LEFT: return GAMEPAD_TYPE_JOYCON_LEFT;
-		case SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT: return GAMEPAD_TYPE_JOYCON_RIGHT;
-		case SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_PAIR: return GAMEPAD_TYPE_JOYCON_PAIR;
-		default: return GAMEPAD_TYPE_UNKNOWN;
-	}
-
-	return GAMEPAD_TYPE_UNKNOWN;
+	return gamepadType;
 }
 
 float Joystick::getGamepadAxis(love::joystick::Joystick::GamepadAxis axis) const

+ 1 - 0
src/modules/joystick/sdl/Joystick.h

@@ -112,6 +112,7 @@ private:
 	SDL_Gamepad *controller;
 
 	JoystickType joystickType;
+	GamepadType gamepadType;
 
 	SDL_JoystickID instanceid;
 	std::string pguid;