Skip to content

[ui] 听写快速连按应在上一轮完全结束前忽略激活(动画已缓解,逻辑未改) #545

Description

@HKLHaoBin

现象

期望逻辑

Toggle 模式下快速连按时,按键语义应为:

按键次序用户意图期望行为
第 1 次开始听写✅ 激活
第 2 次结束听写✅ 关闭
第 3 次(上一轮尚未完全结束误触 / 补按忽略(不得再次 begin_session
下一次(上一轮已完全结束后)新一轮听写✅ 激活

即:「激活 → 关闭 → 忽略(直至结束)→ 激活」,而非 「激活 → 关闭 → 激活」

「完全结束」= 听写会话收尾 胶囊 UI 生命周期结束(见下),不能仅以 coordinator 进入 SessionPhase::Idle 为准。


历史表现(Issue 初报时,约 v1.3.4-13 及更早)

  • 快速连按会触发胶囊 收起(capsule-out)再弹出(capsule-in,动画反复播放,视觉抖动严重。
  • 根因之一:SessionPhaseIdle,但 Capsule.tsx 仍在 leaving 离场动画(约 EXIT_ANIM_MS 360ms)期间,第三次按键被 handle_pressed 当作新激活(dictation.rsIdlebegin_session)。

升级后表现(v1.3.4-14-beta 实测,2026-05-28)

用户升级至最新版本后复测,动画层面的「收起再弹出」已基本消失,但业务逻辑未变

  1. 胶囊会一直显示,不再明显经历「缩回去再弹出来」的循环动画。
  2. 内容仍会随反复激活切换(听写状态/文案随连按变化),说明后端仍在处理本应在「未完全结束前」忽略的按键。
  3. 推测与 PR fix(v1.3.1-5): 胶囊动画 + Qwen3 灰显 + 5 SVG 重画 + 6 项 Windows 视觉修复 + polish 反降级 #423Capsule.tsx 引入 leaving + lastVisibleState)及后续行为有关:期间若 state 再次变为非 idle,会中止离场动画并恢复显示(代码注释:「若期间 state 又切回非 idle(例如用户连按热键),立刻中止 leaving 并恢复显示」)——这缓解了动画闪烁,但不等于在 coordinator 层忽略第三次及以后的激活请求。

结论:近期改动解决的是 UI 动画问题,与本 Issue 要求的「激活未完全结束前忽略热键」不冲突;动画优化可保留,仍需补齐激活互斥 / busy gate。


证据

影响

  • 用户以为已关闭听写,补按仍会重新进入听写流程(只是不再闪动画),与「关闭后应冷却一段时间才能再开」的预期不符。
  • 卡顿后连续补按仍会积压并执行多次激活/关闭,状态与胶囊文案连跳,难以判断当前是否在录音。
  • 动画修复降低了视觉干扰,但未消除误操作带来的功能层反复激活

建议接受标准

  • 三连按语义(Toggle):第 1 激活;第 2 关闭;第 3 次若上一轮尚未完全结束忽略(无 begin_session、无新的听写会话),与是否播放收起动画无关。
  • 完全结束后才允许再激活:胶囊 UI 与 coordinator 均进入维护者定义的「可接受下一次激活」边界后,下一次按键才计为新激活。
  • 与动画修复不冲突:保留现有「避免反复收起/弹出」的 UI 行为;在此基础上增加 coordinator 层(或前后端统一的 busy gate) 忽略无效激活。
  • 关闭/取消路径可用:第 2 次关闭、Hold 松开、Esc 取消等正常结束路径不受影响。
  • 回归:单次 Toggle、Starting pending_stopfix: Starting 阶段忽略热键边沿 — hold 快速松开 / toggle 快速双击会卡死会话 #51)、Hold 模式不受影响。

TODO / 不确定项

  • 请维护者确认 v1.3.4-14 中具体合入了哪些与胶囊/热键相关的 PR,并在实现互斥时标明与动画修复的分工边界。
  • 「完全结束」的权威信号:前端回传、capsule_busy 标志,或延长 Idle 判定条件——由维护者选定。
  • Hold / 组合键 / CLI --toggle-dictation 是否适用同一忽略规则。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions