SDL: gamepad: Add SDL_GAMEPAD_TYPE_STEAM for Steam Controllers

From 6d3404e4bbdfa02da56bca4ed21f0426da764bfc Mon Sep 17 00:00:00 2001
From: Cameron Gutman <[EMAIL REDACTED]>
Date: Sat, 16 May 2026 16:29:07 -0500
Subject: [PATCH] gamepad: Add SDL_GAMEPAD_TYPE_STEAM for Steam Controllers

---
 include/SDL3/SDL_gamepad.h  | 1 +
 src/SDL_utils.c             | 3 +++
 src/joystick/SDL_gamepad.c  | 3 ++-
 src/joystick/SDL_joystick.c | 8 ++++++++
 test/gamepadutils.c         | 2 ++
 5 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/include/SDL3/SDL_gamepad.h b/include/SDL3/SDL_gamepad.h
index 2d0e83440ad70..363ec7dbe6942 100644
--- a/include/SDL3/SDL_gamepad.h
+++ b/include/SDL3/SDL_gamepad.h
@@ -122,6 +122,7 @@ typedef enum SDL_GamepadType
     SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT,
     SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_PAIR,
     SDL_GAMEPAD_TYPE_GAMECUBE,
+    SDL_GAMEPAD_TYPE_STEAM,
     SDL_GAMEPAD_TYPE_COUNT
 } SDL_GamepadType;
 
diff --git a/src/SDL_utils.c b/src/SDL_utils.c
index a4a0d77614e80..153803adc1e04 100644
--- a/src/SDL_utils.c
+++ b/src/SDL_utils.c
@@ -548,6 +548,9 @@ char *SDL_CreateDeviceName(Uint16 vendor, Uint16 product, const char *vendor_nam
         case SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_PRO:
             name = SDL_strdup("Nintendo Switch Pro Controller");
             break;
+        case SDL_GAMEPAD_TYPE_STEAM:
+            name = SDL_strdup("Steam Controller");
+            break;
         default:
             len = (6 + 1 + 6 + 1);
             name = (char *)SDL_malloc(len);
diff --git a/src/joystick/SDL_gamepad.c b/src/joystick/SDL_gamepad.c
index b9c3ade4f0bdd..6dab310b80bbc 100644
--- a/src/joystick/SDL_gamepad.c
+++ b/src/joystick/SDL_gamepad.c
@@ -1494,7 +1494,8 @@ static const char *map_StringForGamepadType[] = {
     "joyconleft",
     "joyconright",
     "joyconpair",
-    "gamecube"
+    "gamecube",
+    "steam"
 };
 SDL_COMPILE_TIME_ASSERT(map_StringForGamepadType, SDL_arraysize(map_StringForGamepadType) == SDL_GAMEPAD_TYPE_COUNT);
 
diff --git a/src/joystick/SDL_joystick.c b/src/joystick/SDL_joystick.c
index 746cb04690a53..3e3fb95d5b69d 100644
--- a/src/joystick/SDL_joystick.c
+++ b/src/joystick/SDL_joystick.c
@@ -3173,6 +3173,14 @@ SDL_GamepadType SDL_GetGamepadTypeFromVIDPID(Uint16 vendor, Uint16 product, cons
                 type = SDL_GAMEPAD_TYPE_STANDARD;
             }
             break;
+        case k_eControllerType_SteamController:
+        case k_eControllerType_SteamControllerV2:
+        case k_eControllerType_SteamControllerNeptune:
+        case k_eControllerType_SteamControllerTriton:
+        case k_eControllerType_HoriSteamController:
+        case k_eControllerType_UnknownSteamController:
+            type = SDL_GAMEPAD_TYPE_STEAM;
+            break;
         default:
             break;
         }
diff --git a/test/gamepadutils.c b/test/gamepadutils.c
index d7fa1c5a45bd9..0d61596b0e0c6 100644
--- a/test/gamepadutils.c
+++ b/test/gamepadutils.c
@@ -3643,6 +3643,8 @@ const char *GetGamepadTypeString(SDL_GamepadType type)
         return "Joy-Con Pair";
     case SDL_GAMEPAD_TYPE_GAMECUBE:
         return "GameCube";
+    case SDL_GAMEPAD_TYPE_STEAM:
+        return "Steam";
     default:
         return "";
     }