WIP: feat(menu): the Game tab first, where the menu opens #2179

Draft
pmwork-personal wants to merge 22 commits from pmwork-personal/feat/menu-game-tab into main
pmwork-personal commented 2026-11-11 06:09:27 +00:00 (Migrated from github.com)

The Gameplay tab is where Restart and Quit are, what a PC game's pause menu opens on, yet it sat fourth and the menu
opened on Graphics. This titles it Game, puts it first in the strip and opens the menu there: Esc (or Insert, or F1) then
lands on the tab with Restart and Quit, and Graphics is one E away. Step 3 of the menu organization in #2177, on #2178.

What changed

  • The strip reads Game, Graphics, Display, Audio, Controls, Debug, and the menu opens on Game (as it opened on the
    first tab before). Game's rows are unchanged: Game speed, Text speed, Text size, Microphone, Discord status, Restart,
    Quit.
  • enum MenuTab: TAB_GAMEPLAY = 0, the name kept on purpose: open PRs add rows to it (#1864's languages, #1560's Skip
    title screen, #1521's Amiibo) and still apply. Only the title changes; #1864's tables need "Game".
  • The control socket (#926): bridge_fill's tab names follow the new order, and the Game tab keeps its key gameplay, so a
    client that asks for its rows by that name still finds them. Main's tuning bar (#2378) takes the strip's titles from the same global list, Game first.
  • The rows table lists Game's rows first (Restart and Quit stay its last two: kRestartRow / kQuitRow count back from
    its end), so readme.md's option table, which follows the table's order, reads in the strip's order too. The readme's
    tab list names Game first and where the menu opens.
  • Tests: test_menu_sections.py checks that the strip reads Game, Graphics, Display and that the menu opens on Game;
    test_tab_strip_fit.py lists Game (with Gameplay's width, the widest the first tab has been).

Testing

  • tests/run_all.py on Windows 11 (llvm-mingw clang, 8 at once) after merging main at bd699925 (with #2118's Frame generation by row, #2342's HDR contrast, and #1859's
    VRAM budget in GPU and memory): 383 passed, 31 skipped, 1 failed: test_vram_budget_row.py, which fails the same on
    untouched main on this PC. A build of the branch compiles.
  • A build of this branch (RTX 5090), headless with scripted menu keys: the menu opens on Game with Game speed selected;
    Up wraps to Quit (the prompt bar then reads "Quit Enter"); E goes on to Graphics. At Large on 1280x800 the strip, Q and
    E included, stays inside the screen.

Not tested: a pad and the mouse in a window (the tab keys and clicks are unchanged code), AMD and Intel, Linux.

Screenshots

The menu as it opens: the Game tab, Game speed selected

Up from the first row: Quit

The Game tab at Large on 1280x800

Headless runs of a build of this branch (HOS_HEADLESS=1, RX_VK_SHOT_MENU=1, the keys from RX_VK_MENU_SCRIPT), built
with HOOKSHOT_VERSION=v2.2.0-rc.1 for a release's build label.

🤖 Generated with Claude Code

The Gameplay tab is where Restart and Quit are, what a PC game's pause menu opens on, yet it sat fourth and the menu opened on Graphics. This titles it Game, puts it first in the strip and opens the menu there: Esc (or Insert, or F1) then lands on the tab with Restart and Quit, and Graphics is one E away. Step 3 of the menu organization in #2177, on #2178. **What changed** - The strip reads **Game**, Graphics, Display, Audio, Controls, Debug, and the menu opens on Game (as it opened on the first tab before). Game's rows are unchanged: Game speed, Text speed, Text size, Microphone, Discord status, Restart, Quit. - `enum MenuTab`: `TAB_GAMEPLAY = 0`, the name kept on purpose: open PRs add rows to it (#1864's languages, #1560's Skip title screen, #1521's Amiibo) and still apply. Only the title changes; #1864's tables need "Game". - The control socket (#926): `bridge_fill`'s tab names follow the new order, and the Game tab keeps its key `gameplay`, so a client that asks for its rows by that name still finds them. Main's tuning bar (#2378) takes the strip's titles from the same global list, Game first. - The rows table lists Game's rows first (Restart and Quit stay its last two: `kRestartRow` / `kQuitRow` count back from its end), so `readme.md`'s option table, which follows the table's order, reads in the strip's order too. The readme's tab list names Game first and where the menu opens. - Tests: `test_menu_sections.py` checks that the strip reads Game, Graphics, Display and that the menu opens on Game; `test_tab_strip_fit.py` lists Game (with Gameplay's width, the widest the first tab has been). **Testing** - `tests/run_all.py` on Windows 11 (llvm-mingw clang, 8 at once) after merging main at bd699925 (with #2118's Frame generation by row, #2342's HDR contrast, and #1859's VRAM budget in GPU and memory): 383 passed, 31 skipped, 1 failed: `test_vram_budget_row.py`, which fails the same on untouched main on this PC. A build of the branch compiles. - A build of this branch (RTX 5090), headless with scripted menu keys: the menu opens on Game with Game speed selected; Up wraps to Quit (the prompt bar then reads "Quit Enter"); E goes on to Graphics. At Large on 1280x800 the strip, Q and E included, stays inside the screen. **Not tested**: a pad and the mouse in a window (the tab keys and clicks are unchanged code), AMD and Intel, Linux. **Screenshots** ![The menu as it opens: the Game tab, Game speed selected](https://raw.githubusercontent.com/pmwork-personal/Hookshot-pr/pr-screenshots/menu-game/game-tab-medium.webp) ![Up from the first row: Quit](https://raw.githubusercontent.com/pmwork-personal/Hookshot-pr/pr-screenshots/menu-game/game-tab-quit-medium.webp) ![The Game tab at Large on 1280x800](https://raw.githubusercontent.com/pmwork-personal/Hookshot-pr/pr-screenshots/menu-game/game-tab-1280x800-large.webp) _Headless runs of a build of this branch (`HOS_HEADLESS=1`, `RX_VK_SHOT_MENU=1`, the keys from `RX_VK_MENU_SCRIPT`), built with `HOOKSHOT_VERSION=v2.2.0-rc.1` for a release's build label._ 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Commenting is not possible because the repository is archived.
No description provided.