Repository navigation
feat: v0.6 — accessible keys, panel scanning, themed chips, tabbed settings - #7
Merged
Merged
Conversation
The prediction search stopped after 500 nodes of an unordered dictionary walk, so one- and two-letter prefixes missed frequent words and returned different results between runs. Nodes now carry the best rank of their subtree and the search follows it. Learned counts move out of the trie into a dictionary and get a clearLearned(), which "Clear learned words" needs to take effect before the next launch. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Preference keys become the public Preferences.Key enum; the change notification carries the key and is skipped when the value did not change, so observers can react to one setting instead of rebuilding for all of them. Adds per-panel origin storage, reading the v0.5 keyboard position as a fallback. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
A .build symlinked off a File Provider mount is a file to git; the trailing slash only matched the directory. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…d settings Keyboard - Split KeyboardView.swift into KeyView, SuggestionBarView, DwellTimer and KeyPresentation. - Replace the NSButton suggestions with theme-drawn chips that show dwell progress and drop suggestions that do not fit. - Expose keys and chips as accessibility buttons with spoken names and a press action (VoiceOver, Voice Control). - Themes gain border, panelText, scanHighlight and usesVibrancy; the System theme blurs the desktop behind the panel. The High Contrast current-text bar used a key-cap color that was unreadable on black. - Key and panel corner radii scale with the key size; media keys and the System panel use SF Symbols instead of emoji; the variant popup follows the theme. Behaviour - KeyboardController reacts to the changed preference key instead of rebuilding the keyboard and all panels on every change. - ScanController scans the groups of a provider: the visible keyboard plus open panels. - Panels remember their position and keep it across rebuilds. - "Clear learned words" also clears the in-memory counts and asks for confirmation. Settings - Replace the single 25-row grid with toolbar tabs (General, Typing, Access, Panels), value labels on sliders, and dependent controls that disable with their switch. Key size applies on release. - SettingsController takes a closure instead of the KeyboardController. Tooling - Add --snapshot DIR, which renders every theme and settings pane to PNGs off-screen. Bump the version to 0.6.0. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
NotificationCenter's object: filter on Linux never matches a sender that is not an NSObject, so the keyed-change test saw no notifications there and the no-op test passed without observing anything. The tests now observe unfiltered and compare the sender themselves; the no-op test also asserts that a real change is logged. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
There was a problem hiding this comment.
🟡 Changes recommended
Opacity changes no longer update the main keyboard, and the settings window title was dropped during the refactor.
Get a fresh assessment by requesting another Copilot review.
Pull request overview
This PR delivers v0.6 across prediction, preferences, accessibility, scanning, theming, settings, and documentation.
Changes:
- Reworked trie prediction and learned-word clearing.
- Added accessible themed keys/chips, panel scanning, position persistence, and vibrancy themes.
- Added tabbed settings, snapshots, tests, and updated documentation.
File summaries
| File | Description |
|---|---|
TODO.md |
Marks v0.6 work complete. |
Tests/OpenOSKCoreTests/WordPredictorTests.swift |
Adds predictor regression tests. |
Tests/OpenOSKCoreTests/PreferencesTests.swift |
Adds preference notification and position tests. |
Sources/OpenOSKCore/WordPredictor.swift |
Implements ranked trie search and clearing. |
Sources/OpenOSKCore/Resources/Panels/system.json |
Adds themed macro icons. |
Sources/OpenOSKCore/Preferences.swift |
Adds keyed notifications and panel origins. |
Sources/OpenOSK/VariantPopup.swift |
Applies themes to variant popups. |
Sources/OpenOSK/Theme.swift |
Adds borders, panel text, highlights, and vibrancy. |
Sources/OpenOSK/SuggestionBarView.swift |
Adds themed accessible suggestion chips. |
Sources/OpenOSK/Snapshot.swift |
Adds off-screen keyboard/settings rendering. |
Sources/OpenOSK/SettingsController.swift |
Adds tabbed settings and confirmation UI. |
Sources/OpenOSK/ScanController.swift |
Scans dynamic keyboard and panel groups. |
Sources/OpenOSK/Resources/en.lproj/Localizable.strings |
Adds English v0.6 strings. |
Sources/OpenOSK/Resources/de.lproj/Localizable.strings |
Adds German v0.6 strings. |
Sources/OpenOSK/PanelsController.swift |
Persists panels and exposes scan groups. |
Sources/OpenOSK/main.swift |
Updates version and adds --snapshot. |
Sources/OpenOSK/KeyView.swift |
Adds accessible, themed key rendering and input behavior. |
Sources/OpenOSK/KeyPresentation.swift |
Adds spoken names and media symbols. |
Sources/OpenOSK/KeyboardView.swift |
Refactors the keyboard container and themed backdrop. |
Sources/OpenOSK/KeyboardPanel.swift |
Adds per-panel origin restoration. |
Sources/OpenOSK/KeyboardController.swift |
Integrates scanning, keyed preferences, and learned-word clearing. |
Sources/OpenOSK/DwellTimer.swift |
Centralizes dwell timing. |
Sources/OpenOSK/AppDelegate.swift |
Wires learned-word clearing into settings. |
README.md |
Documents v0.6 capabilities and snapshot support. |
CLAUDE.md |
Documents snapshot usage. |
AGENTS.md |
Updates architecture and preference guidance. |
.gitignore |
Ignores .build directories and symlinks. |
Review details
- Files reviewed: 26/27 changed files
- Comments generated: 2
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Every make target and scripts/bundle.sh pass SCRATCH_PATH (default .build) to SwiftPM as --scratch-path; the bundle script resolves the product directory with --show-bin-path instead of assuming .build/release. On a synced or network volume codesign rejects the volume's extended attributes and `make test` fails; building into a local directory avoids that. AGENTS.md drops the .build symlink advice: Synology Drive restores the server's directory and renames the symlink away. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The toolbar-style tab controller titles the settings window after the selected tab, so the string lost its only use. Comments now say so, and say that noteActivity() is what applies a new opacity to the keyboard. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
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
v0.6 across core, app and docs. Six commits, meant to be read in order; the first two are core-only and keep the app building on their own.
Core
fix(core)): the trie walk stopped after 500 nodes of an unordered dictionary traversal, so short prefixes missed frequent words and results differed between runs. Nodes now carry the best rank of their subtree and the search follows it. Learned counts live beside the trie and can be cleared.feat(core)): keys are a publicPreferences.Keyenum; the change notification carries the key and is only posted for real changes. Adds per-panel origin storage (reads the v0.5 keyboard position as fallback).App
KeyboardView.swiftsplit intoKeyView,SuggestionBarView,DwellTimer,KeyPresentation.NSButtons.KeyboardControllerreacts to the changed preference instead of rebuilding everything per change.border,panelText,scanHighlight,usesVibrancy; System theme blurs the desktop; High Contrast current-text bar was unreadable (key-cap color on black) and latched modifiers turned muddy.--snapshot DIRrenders every theme and settings pane to PNGs off-screen.Test plan
make test— 76 tests pass (5 new: predictor search,clearLearned, keyed/no-op preference notifications, panel origins)swift buildandswift build -c releasewithout warningsopenosk --smoke-testprintsSMOKE_TEST_OK--snapshotoutput reviewed for all four themes and all settings panesNotificationCenter'sobject:filter on Linux never matches a non-NSObjectsender. Reproduced inswift:6.1, fixed in thetest(core)commit by matching the sender by identity.🤖 Generated with Claude Code