protonscr

ISteamInput: how to distinguish the built-in Steam Deck controller from the new external Steam Controller (both report type 14)?

steamopen General controller / Steam Input
ValveSoftware/steam-for-linux#13285 · opened 2026-06-02 by sreuter · updated 2026-06-02 · 0 comments · github
Ssreuter 2026-06-02 github

Summary

On a Steam Deck with the new Steam Controller also connected, ISteamInput::GetInputTypeForHandle() returns k_ESteamInputType_SteamDeckController (14) for both the built-in Deck controls and the external Steam Controller. There appears to be no way, given an InputHandle_t, to tell the two apart.

What I'm trying to do

Fold the Deck's touchscreen input into the right player — e.g. the one holding the Deck itself vs. the one holding the (external) Steam Controller. To do that I need to identify specifically the built-in Deck pad among the connected handles.

The problem

  • GetInputTypeForHandle()14 (SteamDeckController) for both controllers.
  • I don't see VID/PID, serial, or any "is internal/built-in" indicator exposed on any ISteamInput method or callback struct (SteamInputDeviceConnected_t, SteamInputConfigurationLoaded_t, SteamInputGamepadSlotChange_t).
  • At the evdev level they are clearly distinct: built-in Deck = 28DE:1205, new Steam Controller = 28DE:1303.

Question

Is there a supported way, via Steam Input (or a correlatable SDL path such as SDL_GetGamepadSteamHandle() + SDL_GetGamepadVendor/SDL_GetGamepadProduct), to distinguish the internal Deck controller from an external Steam Controller? What's the recommended approach?

Environment

  • Steam Deck (SteamOS), built-in controller + new external Steam Controller (BT)
  • Steamworks SDK ESteamInputType includes k_ESteamInputType_SteamDeckController (added SDK 153)

Launch options