Skip to content

Add Ctrl+1 / Ctrl+2 to Quick Keys and More Keys - #237

Merged
papi-ux merged 1 commit into
papi-ux:masterfrom
FabianZettl:feature/ctrl-1-ctrl-2-quick-keys
Aug 14, 2026
Merged

Add Ctrl+1 / Ctrl+2 to Quick Keys and More Keys#237
papi-ux merged 1 commit into
papi-ux:masterfrom
FabianZettl:feature/ctrl-1-ctrl-2-quick-keys

Conversation

@FabianZettl

Copy link
Copy Markdown
Contributor

Summary

Adds Ctrl+1 and Ctrl+2 as bindable shortcuts, in both:

  • the Command Center Quick Keys row (NovaQuickMenuUiState.kt / NovaQuickMenu.kt / NovaQuickMenuContent.kt)
  • the classic More Keys / Special Keys sheet (GameMenu.kt)

Following the existing Ctrl+V pattern in both places.

Motivation

On SteamOS / Steam Big Picture hosts:

  • Ctrl+1 opens the Big Picture menu
  • Ctrl+2 opens the Quick Access Menu (Decky Loader, volume, chat, etc.)

Both are otherwise only reachable via the physical Xbox Button + A chord on the host, which most controllers/remotes streaming through Nova have no way to send. Having these as on-screen Quick Keys makes Big Picture / Decky Loader fully usable from a Nova session without needing to touch the host.

Changes

  • KeyboardTranslator.kt: added VK_1 / VK_2 constants (0x31 / 0x32), matching the existing VK_0/VK_9 style.
  • NovaQuickMenuUiState.kt: added QUICK_CTRL_1 / QUICK_CTRL_2 to NovaQuickMenuActionId and to quickKeyActions().
  • NovaQuickMenu.kt: added the two new cases to sendQuickKey()'s key mapping.
  • NovaQuickMenuContent.kt: added the two new IDs to the exhaustive when in NovaQuickMenuCallbacks.perform() (required for compilation).
  • GameMenu.kt: added matching MenuOption entries to showSpecialKeysMenu().
  • strings.xml: added game_menu_send_keys_ctrl_1 = "Ctrl + 1", game_menu_send_keys_ctrl_2 = "Ctrl + 2".
  • NovaQuickMenuUiStateTest.kt: extended the existing quick-keys preview-state assertions to cover the two new entries.

Validation

  • nonRoot_game debug build compiles and installs cleanly (arm64-v8a).
  • Tested live on an AYN Thor against a Polaris host: both Ctrl + 1 and Ctrl + 2 fire correctly from Quick Keys and from More Keys during an active stream, confirmed opening Big Picture menu / Quick Access Menu on the host.

Adds two new bindable shortcuts to both the Command Center Quick Keys
row and the classic More Keys / Special Keys sheet, following the
existing Ctrl+V pattern.

On SteamOS/Big Picture hosts, Ctrl+1 opens the Big Picture menu and
Ctrl+2 opens the Quick Access Menu (Decky Loader, volume, chat, etc.).
Both are otherwise only reachable via the physical Xbox Button + A
chord, which most controllers/remotes streaming through Nova can't
send.

Tested on-device (AYN Thor, nonRoot_game debug build) against a
Polaris host: both shortcuts fire correctly from Quick Keys and More
Keys during a live session.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@papi-ux

papi-ux commented Aug 15, 2026

Copy link
Copy Markdown
Owner

Merged! And honestly, what a way to show up: two shortcuts, both surfaces, a test, and a live device check before you even opened the PR.

You hit Quick Keys and the legacy More Keys sheet without anyone asking, which is the bit people always miss. Those two drift apart the second someone touches only one of them, and then six months later I'm sitting there wondering why Ctrl+something fires from one menu and not the other. You matched the Ctrl+V pattern in both, dropped VK_1/VK_2 right next to the other digit constants where they belong, and extended the preview-state test instead of leaving it for me. Chef's kiss.

Totally unplanned bonus, too: the Quick Keys grid lays out three per row, so seven keys left this sad little ragged tail sitting in the panel. Nine fills it perfectly. The thing looks better now than it did before you touched it, and I'm choosing to believe you planned that.

One thing did break, and it's mine, not yours! A source guard in NovaComposeSourceGuardTest pinned the literal QUICK_CTRL_V -> onQuickKey(action.id) to prove Insert routes through the shared quick-key bucket. Which... only ever held while Ctrl+V happened to be last in the fall-through group. So your two ids very reasonably pushed the arm onto QUICK_CTRL_2, and the assertion went red. Past me pinned the letter instead of the spirit. #238 re-points it at what the guard actually cares about, that Insert sits inside the bucket whose arm calls onQuickKey, so the next person appending a quick key doesn't get yelled at by a test they didn't break. Nothing for you to do.

Sooo here's the fun part: this lands exactly where I'm going anyway. Getting Nova properly integrated with the Steam Machine and the new Steam Controllers is a real goal of mine, not a someday-maybe item, and "reach the host's own menus from the couch without ever touching the host" is step one of that whole thing. You shipped a piece of the roadmap unprompted.

So pleeease keep going! If you're living in Big Picture and Decky through Nova, tell me what else you catch yourself walking over to the host to do. That's exactly the kind of gap I can't see from in here.

papi-ux added a commit that referenced this pull request Aug 15, 2026
…ck bucket (#238)

The source guard asserted on the literal "NovaQuickMenuActionId.QUICK_CTRL_V -> onQuickKey(action.id)", which only held while Ctrl+V happened to be the last id in the fall-through group. Adding Ctrl+1 and Ctrl+2 in #237 moved the arm onto QUICK_CTRL_2, so the assertion went red on master even though Insert still routes exactly as the guard intends.

The invariant the guard carries is that Insert sits inside the group whose arm calls onQuickKey, so assert that directly. Slice the bucket between the QUICK_ESC entry and the onQuickKey arm, then look for Insert inside the slice. Both substring calls pass an empty missing-delimiter value, so losing either anchor empties the slice and fails the assertion instead of silently passing on the whole file. Appending a further quick key no longer needs a guard edit.
papi-ux pushed a commit that referenced this pull request Aug 15, 2026
Adds two new bindable shortcuts to both the Command Center Quick Keys
row and the classic More Keys / Special Keys sheet, following the
existing Ctrl+V pattern.

On SteamOS/Big Picture hosts, Ctrl+1 opens the Big Picture menu and
Ctrl+2 opens the Quick Access Menu (Decky Loader, volume, chat, etc.).
Both are otherwise only reachable via the physical Xbox Button + A
chord, which most controllers/remotes streaming through Nova can't
send.

Tested on-device (AYN Thor, nonRoot_game debug build) against a
Polaris host: both shortcuts fire correctly from Quick Keys and More
Keys during a live session.

Co-authored-by: FabianZettl <hollywoodkillsvideos@gmail.com>
papi-ux added a commit that referenced this pull request Aug 15, 2026
…ck bucket (#238)

The source guard asserted on the literal "NovaQuickMenuActionId.QUICK_CTRL_V -> onQuickKey(action.id)", which only held while Ctrl+V happened to be the last id in the fall-through group. Adding Ctrl+1 and Ctrl+2 in #237 moved the arm onto QUICK_CTRL_2, so the assertion went red on master even though Insert still routes exactly as the guard intends.

The invariant the guard carries is that Insert sits inside the group whose arm calls onQuickKey, so assert that directly. Slice the bucket between the QUICK_ESC entry and the onQuickKey arm, then look for Insert inside the slice. Both substring calls pass an empty missing-delimiter value, so losing either anchor empties the slice and fails the assertion instead of silently passing on the whole file. Appending a further quick key no longer needs a guard edit.
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.

2 participants