Skip to content

input: add accessibility co-pilot joypad feature#18850

Open
Iansboro wants to merge 1 commit intolibretro:masterfrom
Iansboro:accessibility/copilot-input
Open

input: add accessibility co-pilot joypad feature#18850
Iansboro wants to merge 1 commit intolibretro:masterfrom
Iansboro:accessibility/copilot-input

Conversation

@Iansboro
Copy link
Copy Markdown

@Iansboro Iansboro commented Mar 21, 2026

Closes #7830 (N-to-1 direction)

Inspiration

This feature is inspired by the Xbox Copilot accessibility feature,
which allows a second controller to assist a player with disabilities.
Unlike the existing "Mapped Port" workaround (which is not easily discoverable), this implementation provides
a dedicated, persistent, globally-applicable setting directly in the
Port N Controls menu where users already configure their controllers.

What this does

Allows a second physical controller ("co-pilot") to share input with
an existing player port. Intended for users with disabilities who need
assistance from a caregiver or companion controller.
Persistent: configured once in retroarch.cfg, applies to all cores and games automatically.

How it works

  • Settings → Input → Port N Controls → Co-pilot Joypad
  • Digital buttons: OR'd together (either pad can press any button)
  • Analog axes: max-magnitude merge (whichever pad is pushed further wins)
  • Hotkeys: the co-pilot's own autoconf profile is used, so a different
    controller model can trigger basic hotkeys (e.g. Start+Select for menu)

Tested on

  • Raspberry Pi 5 (aarch64, Linux)
  • Main pad: Xbox 360 USB
  • Co-pilot pad: Mad Catz Street Fighter IV FightPad
  • Core: Genesis Plus GX (Sonic the Hedgehog)
  • Both pads successfully controlled Player 1 simultaneously

Known Limitations

  • Complex hotkey combinations (e.g. Select+R1 for save state) require
    the co-pilot pad to have the same physical button layout as the main
    controller. Basic hotkeys (Start+Select for menu toggle) work correctly
    with any controller model. Will be addressed in a follow-up PR.

Files changed

  • configuration.hCOPILOT_PORT_DISABLED constant + input_copilot_port[]
  • configuration.c — default init + .cfg persistence (p1–p8)
  • input/input_driver.c — game input merge + hotkey merge
  • menu/menu_setting.c — UI entry per player port with navigation callbacks

Accessibility

This feature has no impact on users who do not configure it
(default = COPILOT_PORT_DISABLED for all ports).

@gouchi
Copy link
Copy Markdown
Member

gouchi commented Apr 12, 2026

Hi,

I tested quickly and it is working.

You got a new parameter

image

@Iansboro
Copy link
Copy Markdown
Author

Hi,

I tested quickly and it is working.

You got a new parameter

image

Thank you for testing! Great to see it working with two different controller models (Xbox 360 + PS4).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bounty: $300] Multiple gamepads mapped to one RetroPad, and one gamepad to multiple RetroPads

2 participants