Extract reusable menu and keyboard scanner core - #803
Merged
Merged
Conversation
added 2 commits
September 20, 2026 10:32
- Share menu and keyboard traversal, timing and activation suspension\n- Reconcile identified content and reject stale activation completions\n- Preserve existing scanner policies and document provider integration
2 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Menus and the scanning keyboard previously maintained separate traversal, timing and suspension implementations. Both now delegate to a pure typed item scanner while preserving their current resume and pass-count policies.
The shared navigator can reconcile identified groups and action identities across content changes. Pending activations block scanning, and stale or repeated completions are rejected. Continuous point movement, countdowns, typed execution requests and session/input-generation ownership remain in their existing shared layers.
This is stage 1 of #799. It adds the reusable item core and integration documentation. User customisation (#801, PR #804) follows as a separate stacked PR. App/settings-screen scanning (#802) is out of scope and closed as not planned. No settings or BLE changes.
Closes #800.
Validation
d8fbd5d1bf2abf73ee8e9a3faadbbac9157bd8f4. All review findings (Back identity, suspension during content updates, and groups shrinking to one child) were fixed and regression-tested. Reviewer independently ran 16 pure navigation/item tests.a2afd97(before the final pure reconciliation fix): launched the development-signed app; used J/K/L switches to open the action menu, More and Keyboard; typed the mapped switch letter twice without recursion; returned through Back and closed the keyboard. TextEdit retained focus. TextEdit autocapitalised savedjjtoJj. Existing native prediction availability limitation persists in this VM and is not claimed as passed.d8fbd5d: Parallels Devices → Keyboard actions bypassed the mouse-coordinate control error. Verified grouped menu navigation, opening the keyboard, row/key highlighting, Back to rows and Close keyboard. Character activation did not produce text in the disposable editor; later virtual switch presses stopped producing observable scan movement, including after restarting the test app. This run does not qualify Windows typing or sustained capture. No root cause or product regression is asserted from the test-control evidence alone.Remaining gate
Keep draft until Windows typing/focus and sustained capture can be qualified. The earlier mouse-control blocker has a virtual-key workaround, but the additional run above remains unresolved. All required CI checks pass.