Skip to content

PCSX2: standard Hotkey+Start exit gesture fails - hotkeygen exit sends Alt+F4, but PCSX2 binds F4 to ToggleFrameLimit (with verified user-level fix) #16072

Description

@Blue4Life90

Batocera build version

43.1

Your architecture

x86_64 (arcade cabinet PC)

Your Graphic Processor Unit(s) (GPU)

AMD Radeon 780M, integrated Ryzen 9 PRO 8945HS

Issue description

On an arcade cabinet, the standard Hotkey+Start exit gesture does nothing in standalone PCSX2. The chord is detected correctly at every layer (verified live): evmapy generates hotkey+start → KEY_EXIT, but the pcsx2 hotkeygen context translates exit to Alt+F4 while the PCSX2 configgen simultaneously binds ToggleFrameLimit = Keyboard/F4. PCSX2 consumes the F4 and toggles fast-forward instead of exiting. Same collision affects a physical keyboard (Alt+F4 fast-forwards the game). With no keyboard attached there is no way to exit a PS2 game short of SSH + emukill.

Not a duplicate of #4408 / #9091 (reconnect-triggered) or #15797 (controller profiles): this reproduces with a stable, correctly-assigned P1 and no disconnect.

hotkeygen --list during a live session shows:
Context [pcsx2]:
exit → ['KEY_LEFTALT', 'KEY_F4']
menu → KEY_ESC

hotkeygen --send menu opens the pause menu correctly, proving the menu route works. A user-level evmapy override (ps2.keys mapping hotkey+start → KEY_MENU) fully fixes it — details in the fix-attempts section.

Detailed reproduction steps

  1. x86_64 arcade cabinet, USB arcade encoder enumerating as "Generic X-Box pad" (GUID 030000006b1400000306000000010000), mapped in EmulationStation with Hotkey on Select (shared physical button, standard for arcade panels).
  2. Launch any PS2 game via standalone PCSX2 from EmulationStation.
  3. Press Hotkey+Start → nothing happens (no pause menu, no exit).
  4. But only when checked live: /var/run/evmapy/event8.json contains {"trigger": ["hotkey","start"], "type": "key", "target": ["KEY_EXIT"]} — the chord IS detected and dispatched; the failure is downstream.
  5. From an attached keyboard, press Alt+F4 → game fast-forwards instead of exiting (F4 consumed by ToggleFrameLimit).
  6. Generated /userdata/system/configs/PCSX2/inis/PCSX2.ini contains: OpenPauseMenu = Keyboard/Escape and ToggleFrameLimit = Keyboard/F4.
  7. Player assignment confirmed correct in launch log ([P1] Stored GUID matches encoder) and [Pad1] binds the encoder — reproduces without any second-controller interference or reconnect event.

Details of any attempts to fix this yourself

Tried and not durable / not viable:

  • Hand-editing OpenPauseMenu in PCSX2.ini → rewritten by the configgen on every game launch.
  • Remapping via PCSX2's in-emulator binding UI → captures all simultaneous inputs into one AND-chord and destroyed the default Escape binding, removing every exit path (recovered via SSH: batocera-es-swissknife --emukill).
  • Explicit P1 assignment / removing the second controller → no change; assignment was already correct.

Working fix (verified on physical hardware): create /userdata/system/configs/evmapy/ps2.keys:

{
"actions_player1": [
{
"trigger": ["hotkey", "start"],
"type": "key",
"target": ["KEY_MENU"],
"description": "PCSX2: open pause menu via Hotkey+Start"
}
]
}

The evmapy generator merges user files before /usr/share/evmapy/hotkeys.keys and keeps the first matching trigger, so this reroutes Select+Start → KEY_MENU → Escape → PCSX2 pause menu → Close Game (graceful exit, memory-card writes complete). Verified in /var/run/evmapy/event8.json after relaunch. Rollback: delete the file.

Suggested default fix: the pcsx2 hotkeygen context should not map exit to Alt+F4 while the configgen binds F4 to ToggleFrameLimit — map exit to KEY_ESC, or map hotkey+start to menu for pcsx2, or move the frame-limit binding off F4.

Details of any modifications you have made to Batocera.

None at time of reproduction — stock 43.1 install. After diagnosing, I added a user-level workaround file /userdata/system/configs/evmapy/ps2.keys (described below); removing it restores the stock broken behavior, confirming the issue is in the default configuration.

Logs and data

Attached below: Batocera support file, plus a full diagnostic writeup (markdown) covering every verified layer — launch log P1 GUID assignment, es_input.cfg mapping, live /var/run/evmapy/event8.json contents, hotkeygen --list output for the [pcsx2] context, generated PCSX2.ini [Hotkeys] section, and the verified transient test (hotkeygen --send menu opens the pause menu during gameplay).

Create /userdata/system/configs/evmapy/ps2.keys:

{
  "actions_player1": [
    {
      "trigger": ["hotkey", "start"],
      "type": "key",
      "target": ["KEY_MENU"],
      "description": "PCSX2: open pause menu via Hotkey+Start"
    }
  ]
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions