发布前托管重绘与布局封版收口

收口 Dialog/overlay 后鼠标状态同步、Tooltip 临时 coverage 与持久 coverage 拆分、跨 root 脏区补提交、TextBox/Button 绘制副作用修复,并补充 KEY6 回归用例和 BUG/Fix/Feature 开发记录。
This commit is contained in:
Codex
2026-05-17 00:26:08 +08:00
parent 2388f22c99
commit 9155a86a8a
26 changed files with 1355 additions and 175 deletions
@@ -0,0 +1,57 @@
# Fix-BUG-20260511-0010
> 适用场景:记录某个 BUG 的修复方案、影响评估、验证结果与落地信息。
## 关联信息
- Fix ID: Fix-BUG-20260511-0010
- 关联 BUG ID: BUG-20260511-0010
- 修复目标: 避免局部 root 内部 coverage 扩张后漏补 Dialog / 上层 overlay
- 状态:已完成
- 负责人: Codex
- 分支 / 版本: 当前工作区
## 根因分析
- 根因: `commitManagedRepaint()` 只执行绘制,不返回本轮实际写屏 coverage;Window 仍按登记时的初始 coverage 进行上层补画判断。
- 触发条件: Canvas / TabControl 内部局部提交中补画了后序兄弟控件,实际写屏范围大于初始 source coverage。
- 为什么之前没发现:[可选] 需要 Dialog、Tooltip、后序兄弟补画三者同时满足。
- 关键证据:[可选] 临时日志中 `Canvas partial end coverage` 已与 Dialog 相交,但 `dialog overlay check` 使用旧 working coverage 结果为不相交。
## 修复方案
- 修复思路: 在 Window 层进行保守兜底。root 局部提交完成后,如果 root 仍支持局部提交,则将 root 当前 managed coverage 并入上层补画判断 coverage。
- 关键改动:
- `Window::flushManagedRepaint()``root->commitManagedRepaint()` 后合并 `root->getManagedRepaintCoverageRect()`
- 只扩大上层补画判断,不改变 root 自身局部提交策略。
- 涉及文件 / 类 / 函数: `Window.cpp::flushManagedRepaint`
- 影响的 API / 行为:[可选] 无公开 API 变化。
- 关键约束 / 不变量:[可选] Dialog 仍保持顶层 overlay 语义。
- 回滚点 / 开关:[可选] 回退该 coverage 合并逻辑。
## 影响评估
- 影响范围: 托管重绘后的上层普通控件 / Dialog 补画判断。
- 兼容性影响:无
- 行为变化:有(Dialog / 上层控件补画更保守)
- 性能影响:有(可能多补画少量 overlay)
- 回归风险: 中低;主要风险是局部 root 大范围覆盖时上层补画次数增加。
## 验证结果
- 验证步骤:
1. 编译 `Window.cpp / Canvas.cpp`
2. 编译 `z-testDome.cpp /DKEY=6`
3. 编译 `z-testDome.cpp``KEY1 ~ KEY6`
- 验证结果: 编译通过;临时日志已删除
- 回归检查:[可选] KEY6 非模态 Dialog + Tooltip 覆盖链待用户手测
- 验证证据:[可选]
## 落地信息
- Commit: 未提交
- PR[可选]
- 发布版本:[可选]
- 备注: 下版本建议让 `commitManagedRepaint()` 返回 actual coverage,替代 root 全覆盖兜底。