Files
StellarX-kaifa/开发记录/Fix/Fix-BUG-20260511-0011-事件尾脏root补收集修复.md
Codex 9155a86a8a 发布前托管重绘与布局封版收口
收口 Dialog/overlay 后鼠标状态同步、Tooltip 临时 coverage 与持久 coverage 拆分、跨 root 脏区补提交、TextBox/Button 绘制副作用修复,并补充 KEY6 回归用例和 BUG/Fix/Feature 开发记录。
2026-05-17 00:26:08 +08:00

61 lines
2.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Fix-BUG-20260511-0011
> 适用场景:记录某个 BUG 的修复方案、影响评估、验证结果与落地信息。
## 关联信息
- Fix ID: Fix-BUG-20260511-0011
- 关联 BUG ID: BUG-20260511-0011
- 修复目标: 事件尾补收集跨 root dirty 子树,保证同轮托管提交
- 状态:已完成
- 负责人: Codex
- 分支 / 版本: 当前工作区
## 根因分析
- 根因: `Window::requestManagedRepaint()` 只登记当前事件链触发的 source/root;回调里直接修改其他 root 的控件时,该 root 只变 dirty,没有进入 `managedRepaintItems`
- 触发条件: 点击一个 root 中的控件,回调修改另一个 root 下的 Label / 控件状态。
- 为什么之前没发现:[可选] 需要跨 root 回调才能稳定暴露。
- 关键证据:[可选] 下一次鼠标消息后 Label 才刷新,说明目标 root dirty 状态滞留。
## 修复方案
- 修复思路: 在普通输入事件收口阶段、`flushManagedRepaint()` 前扫描所有顶层普通控件和可见 Dialog,发现未登记但存在 dirty 子树的 root,则补登记为托管重绘项。
- 关键改动:
- 新增 `Window::collectDirtyRootsForManagedRepaint()`
- `runEventLoop()``flushManagedRepaint()` 前调用该函数。
- 涉及文件 / 类 / 函数:
- `Window.h`
- `Window.cpp::collectDirtyRootsForManagedRepaint`
- `Window.cpp::runEventLoop`
- 影响的 API / 行为:[可选] 无公开 API 变化。
- 关键约束 / 不变量:[可选] 只处理可见 root;已登记 root 不重复登记。
- 回滚点 / 开关:[可选] 移除事件尾补收集调用。
## 影响评估
- 影响范围: 普通输入事件尾的托管重绘收口。
- 兼容性影响:无
- 行为变化:有(跨 root dirty 会更及时刷新)
- 性能影响:有(事件尾多一次顶层 dirty 子树扫描)
- 回归风险: 中;如果存在历史残留 dirty,可能更早暴露重绘问题。
## 验证结果
- 验证步骤:
1. 编译 `Window.cpp`
2. 编译 `z-testDome.cpp /DKEY=6`
3. 编译 `z-testDome.cpp``KEY1 ~ KEY6`
- 验证结果: 编译通过
- 回归检查:[可选] KEY6 Right 页内按钮更新 A 区状态 Label 待用户手测
- 验证证据:[可选]
## 落地信息
- Commit: 未提交
- PR[可选]
- 发布版本:[可选]
- 备注:[可选]