diff options
| author | 魏曹先生 <1992414357@qq.com> | 2026-07-21 22:49:54 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2026-07-21 22:49:54 +0800 |
| commit | 5a924883a29dcdd2d1e105d96b0dccaeea183ba9 (patch) | |
| tree | 62a43ceaf548d0b69986f9ffe37c4988a0a33708 | |
| parent | 368ababb633453b2be6c9f207ed4584341c7768b (diff) | |
docs: update main loop description with IME and event filtering details
| -rw-r--r-- | ANSI-DRAW.md | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/ANSI-DRAW.md b/ANSI-DRAW.md index 45f049d..eec5042 100644 --- a/ANSI-DRAW.md +++ b/ANSI-DRAW.md @@ -166,18 +166,37 @@ cargo clippy -- -D warnings - `visual_anchor`:可选的坐标对。仅在选择模式下有值,为进入选择模式时光标所在的位置。退出选择模式时重置为无值 - `cmd_buffer`:字符串,命令输入模式下的输入缓冲区。初始为空字符串 - `msg`:可选的字符串,用于在状态栏右侧显示临时消息。显示一次后应被消费并重置为无值 +- `ime_composing`:布尔值,标记 IME 是否正在组合中。初始为 false +- `last_key_event`:(仅 Windows)记录上一次按键事件和时间的元组,用于检测重复事件。初始为无值 --- ## 主循环 -程序主循环按以下顺序反复执行: +### 事件驱动架构 -1. **渲染**:根据当前 App 状态绘制一帧画面到终端 -2. **等待输入**:等待一个键盘事件,设置一个合适的超时时间(建议 100 毫秒),使画面能以合理帧率刷新 -3. **解析绑定**:将键盘事件与当前模式一起传入绑定解析函数,得到一组待执行的命令 -4. **执行命令**:按顺序逐一执行这组命令,每条命令可能会修改 App 的任意字段 -5. 回到第 1 步 +主循环使用**阻塞式事件读取**(而非定时轮询),以保证连续按键输入不丢帧、不卡顿。 + +### 输入缓冲清理 + +进入主循环前,先执行一次输入缓冲清理:轮询所有已排队的事件并丢弃。这可以防止启动前(如命令执行期间)残留的按键进入编辑器。 + +### 初始渲染 + +清理完毕后,执行第一次渲染。 + +### 事件循环 + +然后进入循环,反复执行以下步骤: + +1. **阻塞等待事件**:调用阻塞的 `event::read()` 等待下一个事件。不设超时 +2. **忽略非按键事件**:`Resize` 事件只更新终端尺寸(重新获取即可),`KeyEventKind::Release`(键盘释放事件)直接忽略 +3. **IME 组合过滤**:如果事件来自 IME 组合过程(控制字符、组合进行中的中间字符),忽略 +4. **重复事件去重**:(仅 Windows)如果同一个按键事件在 20 毫秒内重复到达,忽略第二次。这是 Windows 终端驱动在某些情况下会重复发送同一个事件 +5. **解析绑定**:将键盘事件与当前模式一起传入绑定解析函数,得到一组待执行的命令 +6. **执行命令**:按顺序逐一执行这组命令 +7. **渲染**:渲染一帧 +8. 回到第 1 步 退出条件:`Quit` 命令执行成功后,退出循环并恢复终端。 |
