Maelstrom: Handle Steam handle changing for a gamepad

From fe174821aa76332925d93ad5700e907a4803c54a Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Mon, 15 Dec 2025 16:58:35 -0800
Subject: [PATCH] Handle Steam handle changing for a gamepad

---
 game/controls.cpp | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/game/controls.cpp b/game/controls.cpp
index 1dd2a4d3..a84bd46c 100644
--- a/game/controls.cpp
+++ b/game/controls.cpp
@@ -262,6 +262,17 @@ static void OpenGamepad(SDL_JoystickID id)
 	gamepads.add(gamepad);
 }
 
+static void UpdateGamepadHandle(SDL_JoystickID id)
+{
+	for (unsigned int i = 0; i < gamepads.length(); ++i) {
+		Gamepad* gamepad = &gamepads[i];
+		if (gamepad->id == id) {
+			gamepad->sessionID = GetRemoteSessionForGamepad(gamepad->gamepad);
+			break;
+		}
+	}
+}
+
 static void CloseGamepad(SDL_JoystickID id)
 {
 	for (unsigned int i = 0; i < gamepads.length(); ++i) {
@@ -424,6 +435,21 @@ static void HandleEvent(SDL_Event *event)
 			}
 			break;
 
+		/* -- Handle Steam handle changing for a gamepad */
+		case SDL_EVENT_GAMEPAD_STEAM_HANDLE_UPDATED:
+			player = GetJoystickPlayer(event->gdevice.which);
+			UpdateGamepadHandle(event->gdevice.which);
+			if (player) {
+				// Update the previous player's controls
+				UpdateControl(player);
+			}
+			player = GetJoystickPlayer(event->gdevice.which);
+			if (player) {
+				// Update the new player's controls
+				UpdateControl(player);
+			}
+			break;
+
 		/* -- Handle key presses/releases */
 		case SDL_EVENT_KEY_DOWN:
 			key = event->key.key;