feat(ui): Extended ultrawide menus that move side panes to the screen edges #2843

Open
github-sync wants to merge 3 commits from github/pr/2843 into main
Owner

@ozwaldorf opened this pull request on GitHub · 2026-11-12 16:15 UTC · original

On an ultrawide screen the HUD and menus are either stretched or boxed into the middle 16:9, with the space beside them blurred or black. This adds a fourth choice, Extended. The HUD and menus keep their own size and shape, and what sits at their sides moves out to the screen's edges, like the ultrawide UI romfs mods but done at runtime, with no game files changed.

Preview

Extended at 3440x1440:

https://github.com/user-attachments/assets/0d0765ca-95fd-434c-b3f2-b86f2b4eaa45

What changed

  • Ultrawide menus: Extended (Graphics tab, next to Full width and the two centred choices). It changes at once, like the other choices. The default stays Centred, blurred sides.
  • host/hos_wide_ui.c plans each 2D layout once a present, from the panes the game places: a pane at a side, or a group of them, moves out to that side; a pane spanning the canvas is drawn the screen's width. Name rules cover the panes that need them: the pause menu's page strips, the item quick select's carousel, the map page and the HUD minimap, which share a layout, and the System page's controls sheet.
  • The pause menu's pages are spaced wider apart, and their background is drawn in three pieces (left half, a stretched centre column, right half) instead of being stretched.
  • nx2/oot_wide.py adds the hook sites, each checked against its original instruction word: the pane transform, the calculate pass, the drawn size, the background's draw, and the end of a layout's build. The carousel is widened as it is built, before it lays out its items, so the frame sits on the selected item on the first open too.
  • The options file goes to version 7: Extended is listed second, before the centred choices, and an older file's centred choice keeps its meaning. The option ID is 52 (49 and 50 are reserved, FOV is 51).
  • Separate commit, fix(ui): the system overlay screen is kept whole in the ultrawide squeeze. Without it, the item quick select's background went into the middle 16:9 after its first opening, in the centred choices too.

Testing

RTX 4090 Laptop GPU, NVIDIA 615.78.08, Linux, 3440x1440 (21:9).

  • HUD, item quick select (first and later opens), and the pause menu's Collection, Equipment, Items, System, Key items, Threads of Time and Map pages, at rest and while sliding between pages; the HUD minimap and its icons; switching between all four choices live.
  • tests/test_wide_ui.py builds the planner against fixture layouts and checks the hook sites, the option ID and the options migration. The full suite passes, apart from the checks that need Python modules this machine lacks (zstandard, _tkinter).
> [@ozwaldorf](https://github.com/ozwaldorf) opened this pull request on GitHub · 2026-11-12 16:15 UTC · [original](https://github.com/NotRexed/Hookshot/pull/2843) On an ultrawide screen the HUD and menus are either stretched or boxed into the middle 16:9, with the space beside them blurred or black. This adds a fourth choice, Extended. The HUD and menus keep their own size and shape, and what sits at their sides moves out to the screen's edges, like the ultrawide UI romfs mods but done at runtime, with no game files changed. ## Preview Extended at 3440x1440: https://github.com/user-attachments/assets/0d0765ca-95fd-434c-b3f2-b86f2b4eaa45 ## What changed - **Ultrawide menus: Extended** (Graphics tab, next to Full width and the two centred choices). It changes at once, like the other choices. The default stays *Centred, blurred sides*. - `host/hos_wide_ui.c` plans each 2D layout once a present, from the panes the game places: a pane at a side, or a group of them, moves out to that side; a pane spanning the canvas is drawn the screen's width. Name rules cover the panes that need them: the pause menu's page strips, the item quick select's carousel, the map page and the HUD minimap, which share a layout, and the System page's controls sheet. - The pause menu's pages are spaced wider apart, and their background is drawn in three pieces (left half, a stretched centre column, right half) instead of being stretched. - `nx2/oot_wide.py` adds the hook sites, each checked against its original instruction word: the pane transform, the calculate pass, the drawn size, the background's draw, and the end of a layout's build. The carousel is widened as it is built, before it lays out its items, so the frame sits on the selected item on the first open too. - The options file goes to version 7: Extended is listed second, before the centred choices, and an older file's centred choice keeps its meaning. The option ID is 52 (49 and 50 are reserved, FOV is 51). - Separate commit, `fix(ui)`: the system overlay screen is kept whole in the ultrawide squeeze. Without it, the item quick select's background went into the middle 16:9 after its first opening, in the centred choices too. ## Testing RTX 4090 Laptop GPU, NVIDIA 615.78.08, Linux, 3440x1440 (21:9). - HUD, item quick select (first and later opens), and the pause menu's Collection, Equipment, Items, System, Key items, Threads of Time and Map pages, at rest and while sliding between pages; the HUD minimap and its icons; switching between all four choices live. - `tests/test_wide_ui.py` builds the planner against fixture layouts and checks the hook sites, the option ID and the options migration. The full suite passes, apart from the checks that need Python modules this machine lacks (`zstandard`, `_tkinter`). <!-- github-sync:item:2843 -->
Author
Owner

@ozwaldorf commented on GitHub · 2026-11-12 17:41 UTC · original

Resolved conflicts on main and rebased

> [@ozwaldorf](https://github.com/ozwaldorf) commented on GitHub · 2026-11-12 17:41 UTC · [original](https://github.com/NotRexed/Hookshot/pull/2843#issuecomment-6831269892) Resolved conflicts on main and rebased <!-- github-sync:c:6831269892 -->
Author
Owner

@ozwaldorf commented on GitHub · 2026-11-12 19:01 UTC · original

Failing checks are also failing on the main branch, so they are ignorable

> [@ozwaldorf](https://github.com/ozwaldorf) commented on GitHub · 2026-11-12 19:01 UTC · [original](https://github.com/NotRexed/Hookshot/pull/2843#issuecomment-6833101458) Failing checks are also failing on the main branch, so they are ignorable <!-- github-sync:c:6833101458 -->
Commenting is not possible because the repository is archived.
No description provided.