Repository navigation
Keyboard Shortcut Audit
Source-only audit for issue #30,
against main e0eabe82. Findings
are source findings; proposals are proposed; nothing here is
device-verified. Direction: mouse and keyboard on a workstation target follow
familiar Windows/Linux conventions (Fork Product Direction).
-
DesktopShortcutService(accessibility key filter) feeds each external keyboard's events to its ownKeyboardShortcutStateMachine.accept(...)and passes any resulting action toDesktopShortcutActions.dispatch. Consumption is decided by the state machine, not by the service. - Window chords end in
DesktopOperations.manageActiveWindow(SHORTCUT_*), the same semantic task gateway as the taskbar and MCP, as required by AGENTS.md. Alt+Tab and display switching useadvanceAltTabandDisplaySwitchController. - Outside the filter,
DesktopInputController.handleKeyEventhandles a Meta tap and the Menu key when the MagicDesk shell window has focus. - Outside Desktop (
desktop == false) only Ctrl+Alt+Tab display switching is active; all other chords pass through.
| Chord | Action | Notes |
|---|---|---|
| Alt+Tab / Alt+Shift+Tab | Task switcher, committed on Alt release | Conventional |
| Ctrl+Alt+Tab (then Tab / Shift+Tab, Esc cancels) | Display switch | Not a persistent switcher as on Windows |
| Alt+F4 | Close active window | Conventional |
| Win+Space | Toggle hardware keyboard layout | See G2 |
| Esc | Dismiss transient MagicDesk UI | Not consumed; reaches the app too |
| Win+Up | Fullscreen (SHORTCUT_FULLSCREEN) |
MagicDesk's maximize equivalent |
| Win+Down | Restore, then minimize | Matches Windows |
| Win+Left / Win+Right | Snap half; then Up/Down while Win held walks corners | Windows-like, stateful |
| Win+D | Show/restore desktop | Conventional |
| Win+L | Lock device | Conventional |
| Win+I | MagicDesk settings | Windows opens Settings |
| Win+N | Notifications | Windows: notification center |
| Win+E | Open Files | Built-in file manager; see G4 |
| Ctrl+Shift+Esc | Open Task Manager | Built-in task manager; see G5 |
| Win+S / Ctrl+Esc | Open Start | Intended to focus Start search; device confirmation pending |
| Win+A / Win+Q | Android system controls | Win+Q retained as a compatibility alias; Windows uses Win+A for quick settings |
| Win+Backspace | Android Back | No desktop analog |
| Win+Print Screen / Win+Shift+Print Screen | Screenshot / recording | |
| Win+/ | Shortcut help |
A recognized chord is emitted once on key-down; its repeats return NONE while remaining consumed until key-up. Ctrl+Space now passes to the focused app. Unrecognized combinations return NONE unconsumed and reach the focused application. Every Win+Shift combination other than Print Screen is currently unrecognized.
| # | Convention | Today | Class | Proposal | Confirming check |
|---|---|---|---|---|---|
| G1 | Tapping the Windows key opens Start | A Meta press/release is consumed with Action.NONE by the state machine. Start is toggled only in DesktopInputController when the shell window has focus and !isFullKeyboardShortcutMode(). With the key filter ready, that branch is skipped, so no code path toggles Start on a lone Meta tap. |
Possible missing behavior | Emit a Start action on Meta release when no chord key was used in between, from the state machine; keep suppressing the system's own Meta action. | Filter active, app focused: tap Win → Start opens once; Win+D etc. do not also open Start. |
| G2 (#34; implemented in PR #40) | Layout switch is Win+Space (Windows, GNOME) or Alt+Shift | Main now passes Ctrl+Space through and toggles layout with Win+Space. | Host behavior implemented; device check pending | Keep Win+Space as the default and preserve normal Ctrl+Space delivery. | Terminal/editor receives Ctrl+Space; Win+Space switches layout. |
| G3 (#35; implemented in PR #40) | Win+S / Ctrl+Esc opens Start search; Win+A opens system controls | Main maps Win+S and Ctrl+Esc to Start, and Win+A/Win+Q to system controls. Whether the search field receives keyboard focus needs changed-build device confirmation. | Implemented; focus/device validation pending | Keep the existing dispatch and confirm search focus; preserve Win+Q as an alias. | Chord opens the intended panel on the input display and Start search accepts typing immediately. |
| G4 (#35; implemented in PR #40) | Win+E opens the file manager | Main maps Win+E to the built-in Files launcher through the display-aware gateway. | Implemented; device validation pending | Reuse the existing app-placement path. | Opens on the input display and reuses an existing window. |
| G5 (#35; implemented in PR #40) | Ctrl+Shift+Esc opens the task manager | Main maps the chord to the built-in Task Manager. | Implemented; device validation pending | Reuse the existing built-in launch path. | Opens once on the input display; outside Desktop the chord reaches the focused app. |
| G6 | Win+1…9 activates or launches the nth taskbar item | No chord. | Missing | Activate through DesktopTaskController focus path; launch pinned item when not running. Depends on profile-correct taskbar identity (#18) and stable taskbar order. |
Same entry as the nth taskbar button; no second observer. |
| G7 | Win+Shift+Left/Right moves the window to another display |
if (shift) return NONE after Print Screen. |
Missing | Move through the existing task-transfer path; display ordering must match Ctrl+Alt+Tab. | Window changes display, keeps mode and focus. |
| G8 | Win+Tab / overview | No chord in the state machine. AGENTS.md and product direction refer to an overview that shares the task gateway; its entry point was not traced here. |
Missing | Trace the overview entry point, then map it. Low priority. | Chord opens the same overview as its current trigger. |
| G9 | Alt+Space window menu | No chord. | Missing | Optional; needs a window-menu target by exact task. Low priority. |
Android-owned chords (Home, Recents, Back via system keys, power) remain Android's and are not candidates.
PR #40 is merged at the main baseline above. Its focused desktop host check passed in 18 seconds. The full Android CI build and changed-build keyboard/device checks remain pending. Issues #34 and #35 remain open for those checks; issue #35 specifically tracks Start search focus and built-in app placement.
Issues #33, #34, #35, and #37 split the accepted gaps by owner and environment. Each keeps ordinary typing pass-through intact and adds KeyboardShortcutStateMachineTest coverage before dispatch changes. Source audit claims describe code paths only; device behavior remains unverified until each issue records its changed-build check.