Skip to content

Switch 2 face-button layout

Status: implemented for Switch 2 Pro Controller and every standalone/joined Joy-Con 2 presentation mode. The profile schema, editor, canonical runtime publication, and deterministic software tests are complete.

Source and policy

Switch2Connect commit 61ac6642ce12fe7217e38a860b14863b18ca7e28 exposes an abxy_mode setting with Xbox and Switch values (src/config.py, src/gui.py, src/controller.py, and src/virtual_controller.py). Its Xbox/PlayStation outputs treat Xbox as the physical-position layout and Switch as the printed-label layout. DS4Windows names the second option Nintendo to avoid confusing a face-button policy with its separate Switch virtual-pad type.

The persisted profile field is Switch2FaceButtonLayout. Existing and legacy profiles default to Xbox, preserving the previously shipped behavior. Unknown serialized values normalize to Xbox.

Canonical projection

The switch is applied once when a validated Switch 2 profile frame writes into the existing DS4State mapping boundary:

physical position / printed label Xbox layout Nintendo layout
west / Y X (Square) Y (Triangle)
north / X Y (Triangle) X (Square)
south / B A (Cross) B (Circle)
east / A B (Circle) A (Cross)

This projection is shared by USB/Bluetooth Pro Controller 2, joined Joy-Con 2, and vertical or horizontal standalone Joy-Con 2 frames. It is independent of the selected virtual output type, so Xbox One, Xbox 360, DualShock 4, DualSense, DualSense Edge, and Switch 2 output all consume the same authored profile semantics.

The operation is four boolean assignments on the report hot path. It creates no object, worker, queue, timer, or transport transition. Raw button bits and the Pro/Joy-Con sidecars retain the exact physical observation, so C, rail, paddle, IR, gyro, custom mapping, lifecycle, and freshness behavior are unchanged. A live selection takes effect on the next report and never recreates the controller or its feedback owner.

Verification

Switch2ProProfileInputTests and Switch2JoyConProfileInputTests verify each physical face position under both layouts, invalid-value rejection, and raw sidecar preservation. Switch2RuntimeInputDeviceTests changes the active profile value on one live runtime and verifies that the next publication uses the new layout. Switch2ProfileMappingSchemaTests verifies the legacy Xbox default, profile-store/XML round trip, and invalid-value normalization.

These are deterministic software checks. They do not claim physical hardware validation or game-specific prompt behavior.