WIP: feat(input): add mouse item wheels with local icons #616

Draft
TheDevil wants to merge 5 commits from TheDevil/Longshot:feat/mouse-item-wheels into main
First-time contributor

Type: feat · Risk: medium · Tested on: Windows renderer build and game-free fixtures · Needs: fresh gameplay and Linux validation

Why

Mouse selection should offer a radial item selector without changing controller selection. This replaces the wheel portion of #173 and depends on #613.

What changed

Opt-in Mouse item wheels uses Q/R and mouse direction, scroll pages and release to equip. Item art is extracted locally during the user's build; no game art is distributed. Controller selection remains native. Host callbacks preserve the full guest register context around selection calls. API advances 23 to 24.

This is stacked on #613. Review the wheel-only delta from parent 04fa541dc8 to current head c14f4005de (original feature commit 5eadb470); the upstream diff includes that parent until it lands.

Measurements

Verdict: Windows renderer links and focused production-code/context/icon tests pass. No fresh gameplay performance claim.

Before: #613 @ 92e8eba875
After: wheel commit @ 5eadb470
Hardware: Windows x64, i7-14700F, 16 GB; GPU not exercised.
Scene: synthetic input, guest-context and icon fixtures; no game running.
Method: production-code fixtures and renderer-only build.
How to reproduce: python -I -B tests/run_all.py --jobs 5; focused checks test_pc_guest_call.py, test_pc_item_icons.py, test_pc_controls.py, test_fps_overlay_order.py, test_option_ids.py, test_audio_output_menu.py, test_stick_dead_zone.py.

Full suite: 534 passed, 14 failed, 34 skipped. The 14 failures match main @ 2b1d38c682 (530 passed): test_appimage_player_build, test_cpm_discovery, test_crash_dialog, test_env_on, test_finish_output, test_lift_cleanup_error, test_linux_preflight, test_make_game_cache, test_oot_state_tap, test_readback_late, test_tested_configurations, test_vk_pgo, test_vram_budget_row, test_walk_key. Seven focused checks above pass; renderer links with zero failures.

Baseline: the keyboard-controls parent #613 is the comparison because this wheel depends on its input API.

Check Before: keyboard parent @ 92e8eba8 After: this PR @ 5eadb470
Game-free suite 532 pass, 14 fail, 34 skip 534 pass, same 14 fail, 34 skip
Wheel/context/icon fixtures absent pass

Flags and settings

item_wheels=0 by default. Enable PC keyboard controls and Mouse item wheels to use it. No environment switch. Controller selection uses the original path. Turning the setting off restores the column selector for keyboard input.

Flag What it is Before this PR After this PR Effect Helps / doesn't help / untested Recommendation
item_wheels menu/ini absent 0 (off) radial keyboard selectors with local icons opt-in; live GPU/device behavior pending off by default

Testing

Tested: full game-free Windows suite, register-context preservation and invalid/null guest calls, synthetic local icon extraction, overlay ordering, option IDs, renderer compilation. git diff --check passes.

Not tested: fresh game build/runtime, physical devices, actual local art extraction from a game, Linux host/renderer; user's installed game remains untouched.

Must be tested:

  • Windows and Linux: build matching API-24 host/renderer and enable PC controls plus wheels; Q/R opens, mouse selects, scrolling changes pages, release equips, pause/focus clears, controller stays native, expecting correct icons, selection and timing (by hand).

Risks

Guest screen/layout assumptions, focus transitions and icon extraction can fail on unsupported game layouts. Input hooks validate before applying. Disable the wheel to restore native selector behavior.

Compatibility: API 24 requires rebuilding host and renderer together. Save/cache formats unchanged. Optional ini key defaults off. This PR excludes NR, the runtime bridge and the FPS cap.

Checklist

Everyone

  • One topic.
  • The title is a Conventional Commit (type(scope): description) of the status line's type.
  • Why gives the reason plainly and links the issues that fit (the tracker searched).
  • Measurements has a verdict, or one line saying why there is nothing to measure.
  • Testing names what was tested, what wasn't, and what must still be tested, where and how.
  • Rebased on current main.
  • python -I -B tests/run_all.py passes (any failure that also fails on main is named).
  • No game files, dumps, build output or generated files.
  • third_party/ untouched (a new folder with a PROVENANCE.md instead).
  • The license is OK: GPL-3.0-or-later, nothing incompatible and nothing decompiled.

When it applies

  • AI assistance recorded with Assisted-by: trailer.
  • New settings documented, opt-in and default bindings stated.
  • API bumped to 24, keeping main's text-input callback.
  • Regression fixtures added and affected source-reading checks updated.
  • Fresh wheel-revision in-game measurements/screenshots and docs/tested/ fragment: pending; WIP.
  • Host build/runtime on Windows and Linux: renderer and production-code Windows fixtures pass; full host/Linux/live validation pending.
  • Docs updated.

Upstream refresh

Current head: c14f4005deaa2c1cb00e548bd3eb401321f03810. Main snapshot 6c9edffe is incorporated by merge, preserving published history. 8 focused checks passed after the merge; zero failures/skips. Earlier full-suite measurements remain tied to their named feature commits above. The literal rebase checklist remains unticked because history was merged, not rewritten. Fresh game/Linux checks remain WIP.

**Type:** feat · **Risk:** medium · **Tested on:** Windows renderer build and game-free fixtures · **Needs:** fresh gameplay and Linux validation ## Why Mouse selection should offer a radial item selector without changing controller selection. This replaces the wheel portion of #173 and depends on #613. ## What changed Opt-in Mouse item wheels uses Q/R and mouse direction, scroll pages and release to equip. Item art is extracted locally during the user's build; no game art is distributed. Controller selection remains native. Host callbacks preserve the full guest register context around selection calls. API advances 23 to 24. This is stacked on #613. Review the wheel-only delta from parent 04fa541dc8ccbaf29b089b5058a541de4436827a to current head c14f4005deaa2c1cb00e548bd3eb401321f03810 (original feature commit 5eadb470); the upstream diff includes that parent until it lands. ## Measurements **Verdict:** Windows renderer links and focused production-code/context/icon tests pass. No fresh gameplay performance claim. Before: #613 @ 92e8eba875c8fb9bab682b5161a3e856c6f988a9 After: wheel commit @ 5eadb470 Hardware: Windows x64, i7-14700F, 16 GB; GPU not exercised. Scene: synthetic input, guest-context and icon fixtures; no game running. Method: production-code fixtures and renderer-only build. How to reproduce: `python -I -B tests/run_all.py --jobs 5`; focused checks `test_pc_guest_call.py`, `test_pc_item_icons.py`, `test_pc_controls.py`, `test_fps_overlay_order.py`, `test_option_ids.py`, `test_audio_output_menu.py`, `test_stick_dead_zone.py`. Full suite: 534 passed, 14 failed, 34 skipped. The 14 failures match main @ 2b1d38c682baaa4d52f2cacc75fffb9505c1f34f (530 passed): test_appimage_player_build, test_cpm_discovery, test_crash_dialog, test_env_on, test_finish_output, test_lift_cleanup_error, test_linux_preflight, test_make_game_cache, test_oot_state_tap, test_readback_late, test_tested_configurations, test_vk_pgo, test_vram_budget_row, test_walk_key. Seven focused checks above pass; renderer links with zero failures. Baseline: the keyboard-controls parent #613 is the comparison because this wheel depends on its input API. | Check | Before: keyboard parent @ 92e8eba8 | After: this PR @ 5eadb470 | |---|---|---| | Game-free suite | 532 pass, 14 fail, 34 skip | 534 pass, same 14 fail, 34 skip | | Wheel/context/icon fixtures | absent | pass | ### Flags and settings `item_wheels=0` by default. Enable PC keyboard controls and Mouse item wheels to use it. No environment switch. Controller selection uses the original path. Turning the setting off restores the column selector for keyboard input. | Flag | What it is | Before this PR | After this PR | Effect | Helps / doesn't help / untested | Recommendation | |---|---|---|---|---|---|---| | item_wheels | menu/ini | absent | 0 (off) | radial keyboard selectors with local icons | opt-in; live GPU/device behavior pending | off by default | ## Testing **Tested:** full game-free Windows suite, register-context preservation and invalid/null guest calls, synthetic local icon extraction, overlay ordering, option IDs, renderer compilation. `git diff --check` passes. **Not tested:** fresh game build/runtime, physical devices, actual local art extraction from a game, Linux host/renderer; user's installed game remains untouched. **Must be tested:** - Windows and Linux: build matching API-24 host/renderer and enable PC controls plus wheels; Q/R opens, mouse selects, scrolling changes pages, release equips, pause/focus clears, controller stays native, expecting correct icons, selection and timing (by hand). ## Risks Guest screen/layout assumptions, focus transitions and icon extraction can fail on unsupported game layouts. Input hooks validate before applying. Disable the wheel to restore native selector behavior. **Compatibility:** API 24 requires rebuilding host and renderer together. Save/cache formats unchanged. Optional ini key defaults off. This PR excludes NR, the runtime bridge and the FPS cap. ## Checklist ### Everyone - [x] One topic. - [x] The title is a Conventional Commit (`type(scope): description`) of the status line's type. - [x] Why gives the reason plainly and links the issues that fit (the tracker searched). - [x] Measurements has a verdict, or one line saying why there is nothing to measure. - [x] Testing names what was tested, what wasn't, and what must still be tested, where and how. - [ ] Rebased on current `main`. - [x] `python -I -B tests/run_all.py` passes (any failure that also fails on `main` is named). - [x] No game files, dumps, build output or generated files. - [x] `third_party/` untouched (a new folder with a `PROVENANCE.md` instead). - [x] The license is OK: GPL-3.0-or-later, nothing incompatible and nothing decompiled. ### When it applies - [x] AI assistance recorded with `Assisted-by:` trailer. - [x] New settings documented, opt-in and default bindings stated. - [x] API bumped to 24, keeping main's text-input callback. - [x] Regression fixtures added and affected source-reading checks updated. - [ ] Fresh wheel-revision in-game measurements/screenshots and `docs/tested/` fragment: pending; WIP. - [ ] Host build/runtime on Windows and Linux: renderer and production-code Windows fixtures pass; full host/Linux/live validation pending. - [x] Docs updated. ## Upstream refresh Current head: `c14f4005deaa2c1cb00e548bd3eb401321f03810`. Main snapshot `6c9edffe` is incorporated by merge, preserving published history. 8 focused checks passed after the merge; zero failures/skips. Earlier full-suite measurements remain tied to their named feature commits above. The literal rebase checklist remains unticked because history was merged, not rewritten. Fresh game/Linux checks remain WIP.
feat(input): separate keyboard actions and binding pages
Some checks failed
PR description / Description follows the template (pull_request_target) Successful in 16s
CI / Conventional Commit title (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been cancelled
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been cancelled
CI / Workflow lint (actionlint) (pull_request) Has been cancelled
Third-party parts / As their notes say (pull_request) Has been cancelled
Third-party parts / The same as upstream (pull_request) Has been cancelled
9a7dd1f059
Assisted-by: OpenAI Codex
test(input): keep extracted menu fixtures complete
Some checks failed
PR description / Description follows the template (pull_request_target) Successful in 5s
CI / Conventional Commit title (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been cancelled
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been cancelled
CI / Workflow lint (actionlint) (pull_request) Has been cancelled
Third-party parts / As their notes say (pull_request) Has been cancelled
Third-party parts / The same as upstream (pull_request) Has been cancelled
92e8eba875
Assisted-by: OpenAI Codex
feat(input): add mouse item wheels with local icons
Some checks failed
PR description / Description follows the template (pull_request_target) Successful in 6s
CI / Conventional Commit title (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been cancelled
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been cancelled
CI / Workflow lint (actionlint) (pull_request) Has been cancelled
Third-party parts / As their notes say (pull_request) Has been cancelled
Third-party parts / The same as upstream (pull_request) Has been cancelled
5eadb47058
Assisted-by: Codex
Merge current main into keyboard controls
Some checks are pending
CI / Conventional Commit title (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Blocked by required conditions
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Blocked by required conditions
CI / Workflow lint (actionlint) (pull_request) Blocked by required conditions
Third-party parts / As their notes say (pull_request) Blocked by required conditions
Third-party parts / The same as upstream (pull_request) Blocked by required conditions
PR description / Description follows the template (pull_request_target) Successful in 5s
Website / Website on Cloudflare (pull_request_target) Has been skipped
04fa541dc8
Assisted-by: Codex
Merge refreshed keyboard controls into item wheels
Some checks are pending
CI / Workflow lint (actionlint) (pull_request) Blocked by required conditions
CI / Conventional Commit title (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Blocked by required conditions
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Blocked by required conditions
Third-party parts / As their notes say (pull_request) Blocked by required conditions
Third-party parts / The same as upstream (pull_request) Blocked by required conditions
PR description / Description follows the template (pull_request_target) Successful in 6s
Website / Website on Cloudflare (pull_request_target) Has been skipped
c14f4005de
Assisted-by: Codex
Author
First-time contributor

Updated the branch to include main @ 6c9edffe by non-rewriting merge. Current head c14f4005de; 8 focused post-merge checks passed, 0 failed/skipped. Description preserves commit-specific full-suite results and remaining live/Linux validation. Still WIP.

Updated the branch to include main @ 6c9edffe by non-rewriting merge. Current head c14f4005deaa2c1cb00e548bd3eb401321f03810; 8 focused post-merge checks passed, 0 failed/skipped. Description preserves commit-specific full-suite results and remaining live/Linux validation. Still WIP.
Some checks are pending
CI / Workflow lint (actionlint) (pull_request) Blocked by required conditions
CI / Conventional Commit title (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Blocked by required conditions
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Blocked by required conditions
Third-party parts / As their notes say (pull_request) Blocked by required conditions
Third-party parts / The same as upstream (pull_request) Blocked by required conditions
PR description / Description follows the template (pull_request_target) Successful in 6s
Website / Website on Cloudflare (pull_request_target) Has been skipped
This pull request has changes conflicting with the target branch.
  • gpu/vk/menu_i18n.h
  • gpu/vk/vk_api.h
  • host/rx_backend.c
Some workflows are waiting to be reviewed.
View command line instructions

Manual merge helper

Use this merge commit message when completing the merge manually.

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u 'feat/mouse-item-wheels:TheDevil-feat/mouse-item-wheels'
git switch 'TheDevil-feat/mouse-item-wheels'
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
MagicBeanDev/Longshot!616
No description provided.