Repository navigation
feat(menu): the Game tab first, where the menu opens - #2179
Draft
pmwork-personal wants to merge 22 commits into
Draft
pmwork-personal wants to merge 22 commits into
pmwork-personal wants to merge 22 commits into
Conversation
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
# Conflicts: # gpu/vk/vk_menu.cpp # readme.md
# Conflicts: # gpu/vk/vk_menu.cpp
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>
# Conflicts: # gpu/vk/vk_menu.cpp # tests/test_upscaler_rows.py
# Conflicts: # tests/test_menu_sections.py
# Conflicts: # gpu/vk/vk_menu.cpp
# Conflicts: # gpu/vk/vk_menu.cpp # tests/test_menu_sections.py
# Conflicts: # gpu/vk/vk_menu.cpp
# Conflicts: # gpu/vk/vk_menu.cpp
# Conflicts: # gpu/vk/vk_menu.cpp
…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>
This was referenced Nov 12, 2026
Draft
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
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 (feat: the Insert menu in 13 languages, with Game language and Menu la… #1864's languages, feat(menu): skip the title screen and load the newest save #1560's Skiptitle screen, feat: virtual Amiibo scanning and the game's Amiibo rewards #1521's Amiibo) and still apply. Only the title changes; feat: the Insert menu in 13 languages, with Game language and Menu la… #1864's tables need "Game".
bridge_fill's tab names follow the new order, and the Game tab keeps its keygameplay, so aclient that asks for its rows by that name still finds them. Main's tuning bar (feat(menu): add compact TV-style tuning bar for live setting tweaks #2378) takes the strip's titles from the same global list, Game first.
kRestartRow/kQuitRowcount back fromits end), so
readme.md's option table, which follows the table's order, reads in the strip's order too. The readme'stab list names Game first and where the menu opens.
test_menu_sections.pychecks that the strip reads Game, Graphics, Display and that the menu opens on Game;test_tab_strip_fit.pylists Game (with Gameplay's width, the widest the first tab has been).Testing
tests/run_all.pyon Windows 11 (llvm-mingw clang, 8 at once) after merging main at bd69992 (with feat(dlss): DLSS Frame Generation through NGX, evenly paced at 3x and up #2118's Frame generation by row, feat(fsr4): FSR 4 for the game's native HDR, given linear light #2342's HDR contrast, and feat(menu): a VRAM budget row of its own (builds on #1358) #1859'sVRAM budget in GPU and memory): 383 passed, 31 skipped, 1 failed:
test_vram_budget_row.py, which fails the same onuntouched main on this PC. A build of the branch compiles.
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
Headless runs of a build of this branch (
HOS_HEADLESS=1,RX_VK_SHOT_MENU=1, the keys fromRX_VK_MENU_SCRIPT), builtwith
HOOKSHOT_VERSION=v2.2.0-rc.1for a release's build label.🤖 Generated with Claude Code