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 "";
}