fix(calls): Push to Deafen can be switched off, and a typable deafen key can no longer fire while typing
CI / Build & Quality Checks (push) Successful in 1m38s
CI / Docker image build & smoke test (push) Skipped
CI / Secret scan (gitleaks) (push) Successful in 11s
CI / Trigger Desktop Build (push) Successful in 8s
CI / Playwright smoke (e2e) (push) Successful in 2m0s
CI / Build & Quality Checks (push) Successful in 1m38s
CI / Docker image build & smoke test (push) Skipped
CI / Secret scan (gitleaks) (push) Successful in 11s
CI / Trigger Desktop Build (push) Successful in 8s
CI / Playwright smoke (e2e) (push) Successful in 2m0s
Root cause of the 'went deaf while typing' reports: the deafen key (default M) and Cinny's type-anywhere-to-focus-the-composer both listen on window, so the first letter of a message typed after clicking the timeline toggled deafen and was swallowed (reproduced: typing 'mom' → deafened, composer shows 'om'). Now: (1) Settings → Calls → Push to Deafen has an on/off switch (deafenHotkey); (2) a letter/digit/Space deafen key only toggles where no composer is on screen — typing wins; (3) such keys are never bound system-wide on desktop — only F-keys, numpad and the lock/navigation cluster qualify (isSafeGlobalToggleKey) — so 'm' typed in another app can't deafen you. Verified in live calls: M still toggles in the call view, is ignored on a chat screen, switch off disables it entirely. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PPmy3tPq869XDW4njjVaKA
This commit is contained in:
@@ -112,6 +112,7 @@ import { chromeTranslationEngine } from '../../../utils/translation/chromeEngine
|
||||
import { SequenceCardStyle } from '../styles.css';
|
||||
import { useTauriUpdater } from '../../../hooks/useTauriUpdater';
|
||||
import { isTauri as isTauriEnv, invokeTauri, tauriInvoke } from '../../../hooks/useTauri';
|
||||
import { isSafeGlobalToggleKey } from '../../../hooks/useCallHotkeys';
|
||||
import { customWindowChromeAtom } from '../../../state/customWindowChrome';
|
||||
import { useDateFormatItems } from '../../../hooks/useDateFormat';
|
||||
import { useReducedMotion } from '../../../hooks/useReducedMotion';
|
||||
@@ -1644,6 +1645,7 @@ function Calls() {
|
||||
const [pttMode, setPttMode] = useSetting(settingsAtom, 'pttMode');
|
||||
const [pttKey, setPttKey] = useSetting(settingsAtom, 'pttKey');
|
||||
const [deafenKey, setDeafenKey] = useSetting(settingsAtom, 'deafenKey');
|
||||
const [deafenHotkey, setDeafenHotkey] = useSetting(settingsAtom, 'deafenHotkey');
|
||||
const [globalCallHotkeys, setGlobalCallHotkeys] = useSetting(settingsAtom, 'globalCallHotkeys');
|
||||
const [afkAutoMute, setAfkAutoMute] = useSetting(settingsAtom, 'afkAutoMute');
|
||||
const [afkTimeoutMinutes, setAfkTimeoutMinutes] = useSetting(settingsAtom, 'afkTimeoutMinutes');
|
||||
@@ -1962,20 +1964,36 @@ function Calls() {
|
||||
<SettingTile
|
||||
title="Push to Deafen"
|
||||
description={
|
||||
deafenBind.error ?? 'Toggle speaker mute during a call. Press Escape to cancel rebind.'
|
||||
deafenBind.error ??
|
||||
(deafenHotkey
|
||||
? `Press ${keyLabel(deafenKey)} during a call to mute your speakers. Press Escape to cancel rebind.${
|
||||
!isSafeGlobalToggleKey(deafenKey)
|
||||
? ` A letter, digit or Space only works in the call view — on a chat screen typing takes priority${
|
||||
isTauriEnv() && globalCallHotkeys ? ' and other apps are never watched' : ''
|
||||
}. Bind an F-key or Numpad key to make it work everywhere.`
|
||||
: ''
|
||||
}`
|
||||
: 'Off — no key toggles deafen. Use the headphone button in the call bar.')
|
||||
}
|
||||
after={
|
||||
<Button
|
||||
size="300"
|
||||
variant={deafenBind.listening ? 'Warning' : 'Secondary'}
|
||||
fill={deafenBind.listening ? 'Solid' : 'Soft'}
|
||||
radii="300"
|
||||
outlined
|
||||
onClick={deafenBind.startListening}
|
||||
style={{ minWidth: '90px' }}
|
||||
>
|
||||
<Text size="B300">{deafenBind.listening ? 'Press a key…' : keyLabel(deafenKey)}</Text>
|
||||
</Button>
|
||||
<Box alignItems="Center" gap="200">
|
||||
<Switch variant="Primary" value={deafenHotkey} onChange={setDeafenHotkey} />
|
||||
{deafenHotkey && (
|
||||
<Button
|
||||
size="300"
|
||||
variant={deafenBind.listening ? 'Warning' : 'Secondary'}
|
||||
fill={deafenBind.listening ? 'Solid' : 'Soft'}
|
||||
radii="300"
|
||||
outlined
|
||||
onClick={deafenBind.startListening}
|
||||
style={{ minWidth: '90px' }}
|
||||
>
|
||||
<Text size="B300">
|
||||
{deafenBind.listening ? 'Press a key…' : keyLabel(deafenKey)}
|
||||
</Text>
|
||||
</Button>
|
||||
)}
|
||||
</Box>
|
||||
}
|
||||
/>
|
||||
{isTauriEnv() && (
|
||||
|
||||
Reference in New Issue
Block a user