protonscr

Games using Steam Input API Directly Conflict with "Use Nintendo Layout" setting on Steam Deck

steamopen General controller / Steam Input
ValveSoftware/steam-for-linux#11555 · opened 2024-12-09 by ItsRogueRen · updated 2026-07-21 · 4 comments · github
IItsRogueRen 2024-12-09 github

Apologies in advance, this might be confusing to explain.

I have a Steam Deck with the "Use Ninendo Layout" enabled. So now the left-most is "Y" and the top button is "X", the right-most is "A" and the bottom is "B".

From here on any reference to ABXY buttons will be in regard to the Nintendo layout.

If I have the Nintendo layout enabled to flip the buttons, the in-game button prompts now ALSO flip so that now my Y is registered as X. Because of this no matter what I do I cannot make the button prompts in-game match the actual button layout I'm using. This is because Steam Input doesn't remap the actual buttons, it maps the action itself.

Steam Input needs to have a way to instead override the actual button. I need to tell the game that X is Y, not that X opens the map when in a menu. The Steam Input API should not be able to change the actual in-game prompts or should have the user decide. As is, games that use the Steam Input API for controls are completely unplayable if you need to use the Nintendo Layout setting, rendering the setting confusing at best and a hindrance at worst.

Examples of games in question:
Marvel's Spider-Man Remastered
Tales of Arise

SSteveDaSteve 2025-07-23 github

I’ve faced this same annoyance for a long while. When I select “Use Nintendo button layout”, it’s because my brain is wired to press the rightmost button when the screen says “A”, not because I simply want the action mapped to be to be set to “A”. The labels the game shows are more so the problem than that actual button mapping.

In particular, I’ve faced this issue with Prey (2017), Horizon Zero Dawn, and No Man’s Sky. With the first two, I can just switch the Steam Input layout to a regular controller layout and it will work just fine, but No Man’s Sky is using a kinda convoluted setup with multiple layers, and the game doesnt work with a regular gamepad layout, so it’s unintuitive to play when the labels are showing the wrong buttons.

Perhaps, when Nintendo button layout is activated, Steam Input should automatically tell the game it’s pressing one button when the opposite one is being pressed, so that when the game tells me to press “A”, I press the rightmost button, which is “A” in the Nintendo button layout.

Vvegca 2025-12-24 github

Nintendo and PlayStation both use the right button to accept (A and O respectively), only Xbox/Steam Deck have it at the bottom. With "Use Nintendo Layout" enabled, games using the Steam Input API force me to accept with the bottom button I've always used to cancel, while the prompt shows "A". My muscle memory constantly leads me to press the opposite button...

Ssig-kill 2026-07-21 github

I've always found this implementation a bit bizarre. "Nintendo-style" means I want the east button to be A and the south B. It doesn't mean I want A to be mapped as "back" and B to be mapped as "confirm". Ideally choosing this would simply remap the BAYX buttons on the controller to be ABXY so that applications see A when I press the east button.

This current implementation is confusing... when I see the A button glyph in Steam Input I'm still not sure "which A" it is, and seeing something mapped to "X" confuses me because I still need to press "the wrong X".

Mmagiruuvelvet 2026-07-21 github

Using the "Nintendo Layout" together with a Sony DualShock controller has, at least within Steam itself, a better experience due to the ○✕△□ glyphs. ○ becomes the confirm button and ✕ the cancel button. This is correctly visualized in the UI button legend.

For games that don't natively use or support the Steam Input API, enabling Steam Input fakes an XBOX Controller to these games; for which I have remembered an easy mindmap ○=A, ✕=B, △=X, □=Y. This is so deeply embedded into my mind I never think about this while playing games. It just happens automatically after many years.

Problems start once games natively use the Steam Input API. You can no longer fake an XBOX Controller to these games via Steam Input itself. You need external programs like xboxdrv (Linux) to continue faking an XBOX Controller to these games. The mapping itself is correct in these games, but the visualized glyphs in the game UI are swapped (wrong). The game UI shows an ✕ for the confirm action, but I need to press ○ for trigger the confirm action. △/□ respectively are also swapped (wrong) in the game UI. This is just irritating. I don't know the internals of the Steam Input API, so I won't be making further judgments.

I wish Valve would come up with a solution to this. A totally acceptable workaround would be to force the faking of an XBOX Controller for games that natively use the Steam Input API via a new option. Right now, as it is, you need to resort to external programs and disable Steam Input for these games.

EDIT: (personal opinion) The lack of "east button as confirm" support is an accessibility problem, which should have been solved years ago. But here we are in 2026 still suffering from problems like this. I hate how Microsoft mainstreamed the "south button as confirm" pattern, which is basically hardcoded in too many places now; and barely any game developer takes this seriously. Games that allow to rebind the confirm/cancel actions on a controller are rare. Sony Japan also forced ✕ to be the confirm button starting from the PS5, which just amplifies the problem imo. In Japan the ○ button was the confirm button for decades.


Attachments:

ps4-to-xbox-controller.sh with "Nintendo Layout"
#!/bin/sh

find_ds4_event_device() {
    for ev in /sys/class/input/event*; do
        [ -r "$ev/device/name" ] || continue
        [ -r "$ev/device/id/bustype" ] || continue

        name=$(cat "$ev/device/name")
        bus=$(cat "$ev/device/id/bustype")

        if [ "$name" = "Wireless Controller" ] && [ "$bus" = "0005" ]; then
            basename "$ev"
            return 0
        fi
    done

    return 1
}

DS4_EV="$(find_ds4_event_device)"

if [[ $? != 0 ]]; then
    echo "no Bluetooth DS4 controller found!" >&2
    exit 1
fi

echo "Bluetooth DS4 controller: ${DS4_EV}"

exec xboxdrv --evdev "/dev/input/$DS4_EV" \
    --evdev-keymap "BTN_START=start,BTN_SELECT=back,BTN_MODE=guide,BTN_EAST=a,BTN_SOUTH=b,BTN_WEST=y,BTN_NORTH=x,BTN_TL=lb,BTN_TR=rb,BTN_THUMBL=tl,BTN_THUMBR=tr" \
    --evdev-absmap "ABS_X=x1,ABS_Y=y1,ABS_RX=x2,ABS_RY=y2,ABS_Z=lt,ABS_RZ=rt,ABS_HAT0X=dpad_x,ABS_HAT0Y=dpad_y" \
    --axismap "-y1=y1,-y2=y2" \
    --mimic-xpad --mimic-xpad-wireless --silent

Nothing extracted yet.