Skip to content

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

Draft
pmwork-personal wants to merge 22 commits into
NotRexed:mainfrom
pmwork-personal:feat/menu-game-tab
Draft

pmwork-personal wants to merge 22 commits into
NotRexed:mainfrom
pmwork-personal:feat/menu-game-tab

Conversation

@pmwork-personal

@pmwork-personal pmwork-personal commented Nov 11, 2026 •

Copy link
Copy Markdown
Contributor

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

Testing

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

pmwork-personal and others added 11 commits November 10, 2026 23:46
The Graphics tab is one list of 24 settings, with the window, HDR, upscaling,
frame generation and GPU options mixed together, and more are on their way in
open PRs. Its rows now sit under section titles, heading rows like the Debug
tab's Developer: the Quality preset first, then Resolution and upscaling,
Frame generation and latency, Screen, HDR, Detail, and GPU and memory last.

Moves only: every row's definition is unchanged, so saved options and saved
keys carry over. The menu already draws heading rows on any tab and the keys,
the pad and the mouse step over them, so no drawing or input code changes.

- readme.md: a sentence on the sections; the option table in the new order.
- tests/test_upscaler_rows.py: the order list follows the picture's path
  (output, upscaler, render size, sharpening, then the frame rows, then the
  window).
- tests/test_menu_sections.py (new): the Graphics sections and the rows they
  hold, and on every tab no section that row_shown could leave empty.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Graphics tab held both how the picture is made and how it reaches the
screen. The rows about the screen now have a tab of their own, second in the
strip: Display, with the Screen and HDR sections from Graphics (Fullscreen,
V-Sync, Window scaling filter, Ultrawide, Ultrawide menus; HDR and its paper
white and peak brightness) and a new Overlays section with the FPS counter
and Menu size from Gameplay. Graphics keeps the Quality preset, Resolution
and upscaling, Frame generation and latency, Detail, and GPU and memory.

Moves only: every row's definition is unchanged apart from its tab, so saved
options keep working.

The tab strip fits the window: the menu is scaled by the window's height
alone, so six tabs at Large were wider than a 16:10 screen (the Steam Deck's
1280x800 put the Q and E keys past its edges) and a 4:3 one (already so with
five). tab_strip_fit narrows the gaps between the titles first, down to 16
points, then shrinks the titles; where they fit, nothing changes.

- enum MenuTab: TAB_DISPLAY = 1, the tabs after it one up; the Motion and
  Controls pages follow TAB_COUNT as before. scrolled_to starts every slot at
  -1 (the Controls page's slot was left at 0 since the Audio tab), with a
  static_assert to keep the list as long as the slots.
- The restart line shows on Display too (Ultrawide takes a restart).
- readme.md: the Display tab's rows under Display in the option table; the
  sections sentence and the restart note name the tab.
- tests: test_vsync_row.py finds V-Sync on Display; test_menu_sections.py
  checks Display's sections and that it is the strip's second tab (the shape
  row by its value); test_tab_strip_fit.py (new) runs the fit over 16:9,
  16:10, the Deck, 4:3 and a narrow window at each menu size.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Gameplay tab holds Restart and Quit, what a PC game's pause menu opens
on. It is now titled Game, first in the strip, and the menu opens on it:
Game, Graphics, Display, Audio, Controls, Debug. Its rows are unchanged;
they move to the top of the rows table (Restart and Quit stay its last two),
so the readme's option table reads in the strip's order too.

- enum MenuTab: TAB_GAMEPLAY = 0 (the name kept: open pull requests add rows
  to it), Graphics and Display after it; cur_tab starts on it.
- readme.md: the tab list names Game first and where the menu opens; the
  option table's Game lines first.
- 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.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	gpu/vk/vk_menu.cpp
#	readme.md
# Conflicts:
#	gpu/vk/vk_menu.cpp
#	readme.md
NotRexed#926's bridge_fill names each MenuTab by its place in a list, and the list
had no name for TAB_DISPLAY: the static_assert stopped the build. "display"
in its place, so option_get/option_set tell the FPS counter's and the
screen rows' tab as display.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
bridge_fill's list is in MenuTab's order, and TAB_GAMEPLAY is now 0: the
names follow it. The Game tab keeps its key, gameplay, so a client that
asks for it by that name still finds its rows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
pmwork-personal and others added 2 commits November 11, 2026 18:18
…2119, NotRexed#2197, NotRexed#2481, NotRexed#2496)

NotRexed#2177 landed (squashed), so this takes main's sections as they shipped and
keeps this PR's change on top: the Screen, HDR and Overlays rows on the
Display tab. Main's newer rows go with them, word for word: NotRexed#2119's Aspect
ratio and Ultrawide menus text and NotRexed#2481's HDR tone mapper (last in Display's
HDR). Every one of main's 88 rows keeps main's definition; the only changes
are the moved rows' tab and the Overlays heading. draw_options keeps main's
Save my pipeline list line (NotRexed#2447) with the restart line on Display too. The
readme takes main's Menu shortcut text (NotRexed#2197) with six tabs, NotRexed#2177's VRAM
budget line, and main's HDR tone mapper and Field of view lines.
test_menu_sections.py pins Aspect ratio by name and HDR tone mapper in
Display's HDR; test_scene_tonemap_pass.py (NotRexed#2481) finds the tone mapper row on Display.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
NotRexed#2197, NotRexed#2481, NotRexed#2496) into feat/menu-game-tab

Takes NotRexed#2178 as merged with main (cf90c14f) and keeps this PR's change on
top: the Game tab first, where the menu opens. Main's new Gameplay row,
Field of view, goes with the Game rows at the table's top, word for word,
after Game speed. Every one of main's 88 rows keeps main's definition; the
only changes are the moved rows' tab (Display) and the Overlays heading.
The readme takes main's Menu shortcut text (NotRexed#2197) with this PR's tab
sentence, and Field of view among Game's rows. The tab enum, the strip's
titles and the control bridge's names follow the same Game-first order.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.

1 participant