From 69733168ede4f69f9d6f4e82d5b226278fffd243 Mon Sep 17 00:00:00 2001 From: byGalax Date: Sat, 16 May 2026 16:38:51 +0200 Subject: [PATCH] feat(desktop): add 'global' flag to voice hotkey binding (default false) --- apps/desktop/src/lib/voiceHotkeys.ts | 53 +++++++--------------------- 1 file changed, 13 insertions(+), 40 deletions(-) diff --git a/apps/desktop/src/lib/voiceHotkeys.ts b/apps/desktop/src/lib/voiceHotkeys.ts index 7943eed..9a96ab7 100644 --- a/apps/desktop/src/lib/voiceHotkeys.ts +++ b/apps/desktop/src/lib/voiceHotkeys.ts @@ -20,6 +20,13 @@ export interface VoiceHotkeyBinding { shift: boolean; alt: boolean; enabled: boolean; + /** + * When true, the hotkey is registered as an OS-level shortcut and fires + * even when the app isn't focused. When false (default) the binding only + * fires from the window's keydown listener — so e.g. setting "M" as mute + * doesn't break typing "m" everywhere else on the system. + */ + global: boolean; } export interface VoiceHotkeys { @@ -36,46 +43,11 @@ export interface VoiceHotkeys { export type VoiceHotkeyKind = keyof VoiceHotkeys; const DEFAULTS: VoiceHotkeys = { - mute: { - key: 'KeyM', - keyLabel: 'Ctrl+Shift+M', - ctrl: true, - shift: true, - alt: false, - enabled: false, - }, - deafen: { - key: 'KeyD', - keyLabel: 'Ctrl+Shift+D', - ctrl: true, - shift: true, - alt: false, - enabled: false, - }, - hangup: { - key: 'KeyH', - keyLabel: 'Ctrl+Shift+H', - ctrl: true, - shift: true, - alt: false, - enabled: false, - }, - screenShare: { - key: 'KeyE', - keyLabel: 'Ctrl+Shift+E', - ctrl: true, - shift: true, - alt: false, - enabled: false, - }, - video: { - key: 'KeyV', - keyLabel: 'Ctrl+Shift+V', - ctrl: true, - shift: true, - alt: false, - enabled: false, - }, + mute: { key: 'KeyM', keyLabel: 'Ctrl+Shift+M', ctrl: true, shift: true, alt: false, enabled: false, global: false }, + deafen: { key: 'KeyD', keyLabel: 'Ctrl+Shift+D', ctrl: true, shift: true, alt: false, enabled: false, global: false }, + hangup: { key: 'KeyH', keyLabel: 'Ctrl+Shift+H', ctrl: true, shift: true, alt: false, enabled: false, global: false }, + screenShare: { key: 'KeyE', keyLabel: 'Ctrl+Shift+E', ctrl: true, shift: true, alt: false, enabled: false, global: false }, + video: { key: 'KeyV', keyLabel: 'Ctrl+Shift+V', ctrl: true, shift: true, alt: false, enabled: false, global: false }, }; type Listener = (s: VoiceHotkeys) => void; @@ -93,6 +65,7 @@ function validateBinding(raw: unknown, fallback: VoiceHotkeyBinding): VoiceHotke shift: typeof b.shift === 'boolean' ? b.shift : fallback.shift, alt: typeof b.alt === 'boolean' ? b.alt : fallback.alt, enabled: typeof b.enabled === 'boolean' ? b.enabled : fallback.enabled, + global: typeof b.global === 'boolean' ? b.global : fallback.global, }; }