2.8 KiB
Keyboard Layout Shortcut Dispatch
Problem
Keyboard shortcuts must follow the user's active keyboard layout. A shortcut like Cmd+W
means "Command plus the key that produces w", not "Command plus the physical key labeled
W on a US keyboard." Physical-position matching breaks Dvorak, Colemak, AZERTY, JIS, and
other non-US layouts, and it also makes user keybinding overrides impossible to reason about.
Decision
Orca app shortcuts dispatch by logical key by default.
The shared keybinding registry in src/shared/keybindings.ts is the source of truth for
app commands, configurable commands, shortcut recording, labels, conflict detection, browser
guest forwarding, and terminal pane commands. Code handling a user-facing app command must
call keybindingMatchesAction, keybindingMatchesInput, or a policy function built on those
helpers.
Physical KeyboardEvent.code may only decide a shortcut when the key is layout-invariant or
the platform cannot provide a real logical key.
Allowed physical-code uses:
- Modifier key release tracking, such as left/right Control release for held
Ctrl+Tab. - Layout-invariant keys, such as arrows, Tab, Enter, Escape, Backspace, Delete, Insert, PageUp, PageDown, and explicit numpad bindings.
- Dead, unidentified, or missing logical keys where
KeyboardEvent.keycannot describe the produced key. - Terminal byte encoding where the intent is a physical terminal escape sequence rather than an Orca command.
Disallowed physical-code uses:
- Letter shortcuts for app actions.
- Punctuation shortcuts for app actions when
KeyboardEvent.keyreports the produced punctuation. - Clipboard shortcuts that are exposed as app or terminal UI commands.
- Hardcoded undo/redo/new/close/copy/paste handling outside the shared registry.
Terminal Boundary
Terminal handling has two different jobs:
- Orca commands that act on terminal UI, such as copy selection, paste, search, clear, pane focus, split, and close. These are app shortcuts and must be layout-aware.
- Bytes sent to the shell, such as readline escapes and Option-as-Alt sequences. These may use physical key positions when terminal compatibility requires it.
This boundary is intentional. It lets non-US layouts use Orca commands naturally while preserving shell behavior where users expect physical terminal-control sequences.
Regression Requirements
Shortcut tests must cover both directions of a non-QWERTY swap:
- The key that produces the configured logical character must match, even if its physical code differs.
- The physical US key must not match when it produces a different logical character.
Tests must also cover intentional exceptions:
- Dead or missing key fallback.
- Shifted punctuation aliases.
- Numpad-specific bindings.
- Terminal byte-encoding paths that intentionally use physical codes.