Skip to content

Toggle Mode

LeonXu edited this page Feb 28, 2026 · 2 revisions

Toggle 模式

概述

Toggle 录音模式:单击开始录音,再次单击结束并自动输出文字。适合走动、站立等不方便长按的场景。

功能

  • 双 Toggle 快捷键 — 文本注入和闪念笔记各有独立 Toggle 键
  • 共用键智能判定 — Toggle 键可与 PTT 键设为同一个键:
    • 按住 < 1s 释放 → Toggle 模式(录音继续)
    • 按住 ≥ 1s 释放 → PTT 模式(立即停止)
  • 最大录音时长保护 — 可选 1/3/5/10 分钟上限

核心逻辑

_handleKey() 优先级分发:

  1. Toggle stop(正在 Toggle 录音时再次按键 → 停止)
  2. 共用键判定(同键时通过时间阈值区分)
  3. 独立 Toggle start
  4. PTT / Diary 长按

状态字段

  • _isToggleMode — 当前是否处于 Toggle 录音
  • _toggleMaxTimer — 最大时长计时器
  • _keyDownTime — 按键按下时间戳

阈值常量

  • AppConstants.kToggleThresholdMs — 共用键时间阈值(1000ms)

FN/Globe 键双事件去重 (v1.3.2)

macOS 26+ 的 FN/Globe 键同时产生两种事件:

  • FlagsChanged (keyCode=63) — 传统修饰键事件
  • KeyDown/KeyUp (keyCode=179) — macOS 26 新增

问题:到达顺序不固定。若 FlagsChanged 先到并启动 Toggle 录音,随后到达的 KeyDown 179 会被 Toggle stop 逻辑误判为"第二次点击"而立即停止。

修复:原生层双向时间戳去重 (native_input.m):

  • lastGlobe179Time — 179 事件记录时间戳,100ms 内到达的 63 被抑制
  • lastFn63Time — 63 事件记录时间戳,100ms 内到达的 179 被抑制
  • 先到者赢,后到者静默丢弃

Dart 层额外守卫 (core_engine.dart):

  • Toggle 模式下,_handleKey 第 4 步 PTT/diary keyUp 被 _isToggleMode && !isDown 拦截

Clone this wiki locally