VoiceOver: dictation overlay steals focus and Cmd+Tab becomes sluggish
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
- #402 di @postoso — chiusa senza merge
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 35/100
- Tipo di issue
- Bug
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Ferma
- Stack tecnologico
- swift
- Ambito
- accessibility
Direzione di ricerca
The remaining work is in the DynamicNotchKit dependency at Sources/DynamicNotchKit/Utility/DynamicNotchPanel.swift; start by reading its canBecomeKey and canBecomeMain overrides. The issue says both should return false and the panel should be hidden from the accessibility tree. Done means the notch overlay no longer takes focus or appears to VoiceOver; coordinate this dependency change separately from the fixes already described for the main app.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Summary
FluidVoice is unusable with VoiceOver enabled. Two distinct problems make it impossible to keep working in another app while dictating:
- Overlay panels announce to VoiceOver and can shift focus — when dictation starts, VoiceOver announces the overlay window and the user loses their place in the working app.
- Cmd+Tab becomes sluggish — app switching takes noticeably longer while FluidVoice is running, even when idle (not recording). This affects all app switching, not just switching to/from FluidVoice.
As a VoiceOver user, I deleted the app entirely before finding the repository and investigating.
Status — PR #590
PR #590 implements the two fixes that live in the main app (the default bottom overlay path):
- ✅ Root cause 1 (overlay panels visible to VoiceOver) — fixed in
BottomOverlayView.swift. - ✅ Root cause 3 (CGEvent tap latency on system shortcuts) — fixed in
GlobalHotkeyManager.swift. The fast-path was refined during review: it is scoped to Cmd+Tab / Cmd+Space (the ANSI-only backtick keycode was dropped because it differs on ISO layouts), it is skipped when the chord matches a configured Fluid shortcut so real bindings are never swallowed, and it preserves the modifier-only bookkeeping. The snippet under Root Cause 3 below is the original illustration, not the final implementation. - ⏳ Root cause 2 (DynamicNotchKit panel steals focus) — not in #590. That fix belongs in the separate
DynamicNotchKitdependency repo and only affects the non-default notch overlay, so it is tracked separately. This issue stays open until the DynamicNotchKit fix is also handled.
Environment
- macOS 26.5.1 (Sequoia)
- VoiceOver enabled
- FluidVoice 1.6.0 (build 12)
- Overlay position: Bottom (default)
Root Causes
1. Overlay panels visible to VoiceOver
The four floating NSPanel instances in BottomOverlayView.swift (main overlay, prompt selector, mode selector, actions selector) do not hide themselves from the accessibility tree. VoiceOver discovers and announces them, which can shift focus away from the user's working app.
Fix: Add setAccessibilityElement(false) and setAccessibilityRole(.unknown) to all panel creation sites, and add .accessibilityHidden(true) to the BottomOverlayView SwiftUI body.
2. DynamicNotchKit panel steals focus
DynamicNotchPanel.swift in the DynamicNotchKit dependency overrides canBecomeKey and canBecomeMain to return true. When the notch overlay is used, this allows the panel to become the key window and activate the app.
Fix: Change both overrides to return false. Also add setAccessibilityElement(false) and setAccessibilityRole(.unknown).
3. CGEvent tap adds latency to system shortcuts
GlobalHotkeyManager.swift creates a CGEvent tap at .headInsertEventTap that intercepts all keyDown, keyUp, and flagsChanged events system-wide. The callback does significant work (modifier tracking, shortcut matching, spawning async tasks for PostTranscriptionEditTracker) before passing non-matching events through.
With VoiceOver also intercepting keyboard events, both handlers run on every keystroke. System shortcuts like Cmd+Tab pass through both the event tap callback and VoiceOver's processing, adding noticeable latency.
Fix: Add an early return at the top of handleKeyEvent that immediately passes through system shortcuts (Cmd+Tab, Cmd+Shift+Tab, Cmd+Space, Cmd+`) before any processing:
// Fast path: pass through system shortcuts to avoid adding latency
// to app switching, especially with VoiceOver.
if type == .keyDown || type == .keyUp {
let flags = event.flags
if flags.contains(.maskCommand) {
let kc = UInt16(event.getIntegerValueField(.keyboardEventKeycode))
// Tab(48), Space(49), Backtick(50)
if kc == 48 || kc == 49 || kc == 50 {
return Unmanaged.passUnretained(event)
}
}
}
Steps to Reproduce
- Enable VoiceOver (Cmd+F5)
- Open any app (e.g. TextEdit) and start typing
- Press the FluidVoice dictation shortcut
- Problem 1: VoiceOver announces the overlay, focus may shift
- Stop dictation, then try Cmd+Tab between apps
- Problem 2: Cmd+Tab feels sluggish/delayed compared to when FluidVoice is not running
Expected Behavior
- Dictation overlay should be invisible to VoiceOver — no announcements, no focus changes
- Cmd+Tab and other system shortcuts should have zero added latency from FluidVoice's event tap
Files to Change
Sources/Fluid/Views/BottomOverlayView.swift— 4 panel creation sites + SwiftUI bodySources/Fluid/Services/GlobalHotkeyManager.swift—handleKeyEventmethod- DynamicNotchKit dependency:
Sources/DynamicNotchKit/Utility/DynamicNotchPanel.swift
- Lingua principale
- Swift
- Stelle
- 11.9k
- Fork
- 863
- Merge medio
- 1g 13h
- PR unite (30g)
- 27
Preparare l'ambiente
Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di altic-dev/FluidVoice
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 45/100
altic-dev/FluidVoice#1149 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 40/100
altic-dev/FluidVoice#1148 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 22/100
altic-dev/FluidVoice#1147 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 3/5 Mezza giornata Idoneità per principianti 55/100
altic-dev/FluidVoice#1146 ·
I maintainer di solito rispondono entro 1 giorno
-
[BUG] transcripted text sometimes disappears after 2nd press of the shortcut to end recordingApertabug
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
altic-dev/FluidVoice#1144 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di altic-dev/FluidVoice
Issue simili
-
bug core p3
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
RunanywhereAI/runanywhere-sdks#1083 ·
I maintainer di solito rispondono entro 5 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
nightscout/nightguard#368 ·
-
Duplicate CFBundleIdentifier in copied _Testing_* overlay frameworks breaks simulator installAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
johnno1962/InjectionNext#175 · 2 commenti ·
-
builtin-port enhancement
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
cmlarsen/writemorebetter#235 ·
I maintainer di solito rispondono entro 1 giorno
-
bug-pending-triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
NativeScript/NativeScript#11525 ·
I maintainer di solito rispondono entro 1 giorno