Skip to content

Let the Dictate key be set to None - #308

Merged
alexkroman merged 1 commit into
mainfrom
dictate-key-none
Nov 6, 2026
Merged

alexkroman merged 1 commit into
mainfrom
dictate-key-none

Conversation

@alexkroman

Copy link
Copy Markdown
Collaborator

What

Every row on Settings › Keys now offers None, Dictate included. Before, the only dictating key's pop-up hid None, so Blurt always had a dictation key. Now you can run it with only Rewrite, Compose, Read Aloud and so on.

How

  • Rule change (TriggerKeyBindings, TriggerKeyStyleStore): the bound key is no longer forced to dictate. The one rule kept is that while any key dictates, the bound key is one of them. Taking the bound key off Dictate still moves the binding to the next dictating key. With none left, nothing dictates, and the next key set to dictate (styled or not) takes the binding.
  • New TriggerKeyBindings.dictationKey: TriggerKey? (nil when nothing dictates) for the views. isOnlyDictatingKey is gone. extraKeys now excludes the dictation key rather than the bound key, so a bound key moved to Read Aloud with nothing else dictating still shows on the main window.
  • setChoice / assign can no longer refuse, so they return Void.

When nothing dictates

Where Shows
Main window, Dictate row a Choose Key… link button that opens Settings
Menu bar a Choose Dictation Key… command
Empty Library prompt "To dictate, choose a key in Settings › Keys"
Permissions step "Records when you dictate."

The macOS HIG reviewer was run over these states, and its suggestions are in: actions rather than tooltip-only hints, title case and an ellipsis on the menu command, and spelled-out VoiceOver strings instead of "›". Not done: deep-linking Settings straight to the Keys tab. SettingsWindowRoot's TabView has no selection binding, so that's a separate change.

Tests

The engine tests that pinned "the only dictating key can't be cleared" now pin the new rule: the last key turned off, the next dictating key taking the binding, extraKeys with a non-dictating bound key, and None via assign. The Keys UI test now asserts that None is offered on Dictate.

Local scripts/check.sh is green (engine coverage 93.73%). The UI suite and leak scan are left to CI.

🤖 Generated with Claude Code

Every Keys-tab row now offers None, Dictate included, so a user can run
Blurt with no dictation key (e.g. only rewrite, compose or read aloud).

- TriggerKeyBindings no longer forces the bound key to dictate; the one rule
  kept (in TriggerKeyStyleStore.setChoice) is that while any key dictates, the
  bound key is one of them. With none left nothing dictates, and the next key
  set to dictate takes the binding. New `dictationKey` (nil when none);
  `isOnlyDictatingKey` removed; `extraKeys` excludes the dictation key, not
  the bound key, so a bound key moved to another action still shows.
- setChoice/assign no longer refuse, so they return Void.
- No-dictation-key states: the main window's Dictate row offers a
  "Choose Key…" link to Settings, the menu bar a "Choose Dictation Key…"
  command, the empty Library and permissions step stop naming a key.
- Tests that pinned "can't be cleared" now pin the new rule; the Keys UI test
  asserts None is offered. AGENTS.md and the engine README updated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@alexkroman
alexkroman enabled auto-merge (squash) November 6, 2026 17:59
@alexkroman
alexkroman merged commit 5e1d5e2 into main Nov 6, 2026
13 checks passed
@alexkroman
alexkroman deleted the dictate-key-none branch November 6, 2026 18:38
@alexkroman alexkroman mentioned this pull request Nov 6, 2026
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