现象
期望逻辑
Toggle 模式下快速连按 时,按键语义应为:
按键次序
用户意图
期望行为
第 1 次
开始听写
✅ 激活
第 2 次
结束听写
✅ 关闭
第 3 次(上一轮尚未完全结束 )
误触 / 补按
✅ 忽略 (不得再次 begin_session)
下一次(上一轮已完全结束 后)
新一轮听写
✅ 激活
即:「激活 → 关闭 → 忽略(直至结束)→ 激活」 ,而非 「激活 → 关闭 → 激活」 。
「完全结束」= 听写会话收尾 且 胶囊 UI 生命周期结束(见下),不能仅以 coordinator 进入 SessionPhase::Idle 为准。
历史表现(Issue 初报时,约 v1.3.4-13 及更早)
快速连按会触发胶囊 收起(capsule-out)再弹出(capsule-in) ,动画反复播放,视觉抖动严重。
根因之一:SessionPhase 已 Idle,但 Capsule.tsx 仍在 leaving 离场动画(约 EXIT_ANIM_MS 360ms)期间,第三次按键被 handle_pressed 当作新激活(dictation.rs:Idle → begin_session)。
升级后表现(v1.3.4-14-beta 实测,2026-05-28)
用户升级至最新版本后复测,动画层面的「收起再弹出」已基本消失 ,但业务逻辑未变 :
胶囊会一直显示 ,不再明显经历「缩回去再弹出来」的循环动画。
内容仍会随反复激活切换 (听写状态/文案随连按变化),说明后端仍在处理本应在「未完全结束前」忽略的按键。
推测与 PR fix(v1.3.1-5): 胶囊动画 + Qwen3 灰显 + 5 SVG 重画 + 6 项 Windows 视觉修复 + polish 反降级 #423 (Capsule.tsx 引入 leaving + lastVisibleState)及后续行为有关:期间若 state 再次变为非 idle,会中止离场动画并恢复显示 (代码注释:「若期间 state 又切回非 idle(例如用户连按热键),立刻中止 leaving 并恢复显示」)——这缓解了动画闪烁 ,但不等于 在 coordinator 层忽略第三次及以后的激活请求。
结论:近期改动解决的是 UI 动画问题,与本 Issue 要求的「激活未完全结束前忽略热键」不冲突;动画优化可保留,仍需补齐激活互斥 / busy gate。
证据
影响
用户以为已关闭听写,补按仍会重新进入听写流程 (只是不再闪动画),与「关闭后应冷却一段时间才能再开」的预期不符。
卡顿后连续补按仍会积压并执行多次激活/关闭,状态与胶囊文案连跳,难以判断当前是否在录音。
动画修复降低了视觉干扰,但未消除误操作带来的功能层反复激活 。
建议接受标准
TODO / 不确定项
请维护者确认 v1.3.4-14 中具体合入了哪些与胶囊/热键相关的 PR,并在实现互斥时标明与动画修复的分工边界。
「完全结束」的权威信号:前端回传、capsule_busy 标志,或延长 Idle 判定条件——由维护者选定。
Hold / 组合键 / CLI --toggle-dictation 是否适用同一忽略规则。
现象
期望逻辑
Toggle 模式下快速连按时,按键语义应为:
begin_session)即:「激活 → 关闭 → 忽略(直至结束)→ 激活」,而非 「激活 → 关闭 → 激活」。
「完全结束」= 听写会话收尾 且 胶囊 UI 生命周期结束(见下),不能仅以 coordinator 进入
SessionPhase::Idle为准。历史表现(Issue 初报时,约 v1.3.4-13 及更早)
capsule-out)再弹出(capsule-in),动画反复播放,视觉抖动严重。SessionPhase已Idle,但Capsule.tsx仍在leaving离场动画(约EXIT_ANIM_MS360ms)期间,第三次按键被handle_pressed当作新激活(dictation.rs:Idle→begin_session)。升级后表现(v1.3.4-14-beta 实测,2026-05-28)
用户升级至最新版本后复测,动画层面的「收起再弹出」已基本消失,但业务逻辑未变:
Capsule.tsx引入leaving+lastVisibleState)及后续行为有关:期间若state再次变为非idle,会中止离场动画并恢复显示(代码注释:「若期间 state 又切回非 idle(例如用户连按热键),立刻中止 leaving 并恢复显示」)——这缓解了动画闪烁,但不等于在 coordinator 层忽略第三次及以后的激活请求。结论:近期改动解决的是 UI 动画问题,与本 Issue 要求的「激活未完全结束前忽略热键」不冲突;动画优化可保留,仍需补齐激活互斥 / busy gate。
证据
Capsule.tsx(leaving/EXIT_ANIM_MS)、coordinator/dictation.rs(handle_pressed、HOTKEY_DEBOUNCE250ms 仅防抖边沿)影响
建议接受标准
begin_session、无新的听写会话),与是否播放收起动画无关。pending_stop(fix: Starting 阶段忽略热键边沿 — hold 快速松开 / toggle 快速双击会卡死会话 #51)、Hold 模式不受影响。TODO / 不确定项
capsule_busy标志,或延长Idle判定条件——由维护者选定。--toggle-dictation是否适用同一忽略规则。