9155a86a8a
收口 Dialog/overlay 后鼠标状态同步、Tooltip 临时 coverage 与持久 coverage 拆分、跨 root 脏区补提交、TextBox/Button 绘制副作用修复,并补充 KEY6 回归用例和 BUG/Fix/Feature 开发记录。
61 lines
2.3 KiB
Markdown
61 lines
2.3 KiB
Markdown
# 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:[可选]
|
||
- 发布版本:[可选]
|
||
- 备注:[可选]
|