Skip to content

fix(macos): 终端画布按预乘语义清屏,修复亮色白边 - #1359

Open
icefery wants to merge 1 commit into
1lck:previewfrom
icefery:fix/macos-terminal-canvas-compositing
Open

icefery wants to merge 1 commit into
1lck:previewfrom
icefery:fix/macos-terminal-canvas-compositing

Conversation

@icefery

@icefery icefery commented Oct 20, 2026

Copy link
Copy Markdown

背景

亮色模式下终端文字发浅、字缘出现白色小框;暗色模式不易察觉。开启壁纸后同样复现。

根因:LitheTerminalView 把 nativeBackgroundColor 设为编辑器底色的 alpha 0,SwiftTerm 直接把它交给 MTLClearColorMake。Metal 的合成缓冲要求预乘值,A=0 时 RGB 必须为 0;否则清屏写入的是「有效 RGB + 零 alpha」,文字混合后画布 alpha 等于文字覆盖度,窗口合成器再叠加一次底层颜色,亮色背景上边缘像素过曝。

改动

  • 无壁纸:Metal 画布改为不透明编辑器底色,view 与 renderer 的 isOpaque 同步为 true,画布自己承担底色
  • 有壁纸:清屏色改为预乘合法的透明 (0,0,0,0),壁纸正常透出,字缘不再泛白
  • 无壁纸时 OSC 11 仍报告编辑器底色;有壁纸时报告黑色,与画布实际的清屏色一致
  • 单测覆盖壁纸、无壁纸、状态切换与 OSC 11 契约

验证

  • TerminalCanvasCompositingTests + TerminalInputFocusTests:13 tests passed
  • 画布测试固定 NSAppearance(无壁纸用例同时覆盖 aqua / darkAqua),并断言 layer.backgroundColor 与 isOpaque 两处,避免 Core Graphics 回退路径回归
  • 真机(亮色、无壁纸):字缘干净,OSC 11 探针回包 rgb:ffff/ffff/ffff
  • 真机(亮色、有壁纸):字缘干净,壁纸正常透出;OSC 11 探针回包 rgb:0000/0000/0000
  • 本地环境:CLT + MacOSX26 SDK + native 构建系统(机器未安装 Xcode)

备注

有壁纸时报告黑色是本次修复的已知取舍:SwiftTerm 1.15 用同一个 nativeBackgroundColor 既做 Metal 清屏色又做 OSC 11 应答值,且 setBackgroundColor 为 public(非 open),应用侧无法拆开两者。若后续在 SwiftTerm 上游把清屏色改为预乘(MTLClearColorMake(r*a, g*a, b*a, a)),Lithe 可以继续用「编辑器底色 + alpha 0」,同时满足透明清屏与正确的 OSC 11 应答。

Metal 合成缓冲要求清屏色为预乘值。终端画布把编辑器底色以 alpha 0 交给 SwiftTerm,清屏后得到「有效 RGB + 零 alpha」,文字混合后画布 alpha 等于覆盖度,合成器再叠加一次底层颜色,亮色背景上字缘过曝成白框、正文发浅。

- 无壁纸:画布改为不透明编辑器底色,view 与 Metal renderer 的 `isOpaque` 同步为 true
- 有壁纸:清屏色改为预乘合法的透明 `(0,0,0,0)`,保留壁纸透出
- OSC 11 应答与清屏色一致:无壁纸报告编辑器底色,有壁纸报告黑色
- 单测覆盖壁纸、无壁纸、状态切换与 OSC 11 契约
@ghfind-review ghfind-review Bot added the review: medium ghfind author score; see https://ghfind.com label Oct 20, 2026
@lithe-code-review

lithe-code-review Bot commented Oct 20, 2026 •

Copy link
Copy Markdown

Lithe Review

结论: ⚠️ 有建议
范围: preview ← fix/macos-terminal-canvas-compositing · head: f69ecb6

未发现需要阻塞合并的问题。

Findings

  1. [P2] 配色主题变化时需要刷新不透明终端背景
    macos/Sources/Lithe/Platform/MacOS/Terminal/MacTerminalTransport.swift:170

    • 实际影响:现有终端会保留旧配色的不透明底色,与当前编辑器主题不一致。
    • 触发条件:无壁纸,保持相同明暗外观,切换 Lithe、Codex 或 Linear 配色主题。
    • 复现步骤:在暗色 Lithe 配色下打开终端,再切到 Codex。AppSettings.colorTheme 只更新 AppThemeRuntime,不会改变 NSAppearance;TerminalSurfaceView.updateNSView 仍传入相同的壁纸状态,被 setWorkbenchBackgroundVisible 的 guard 跳过,因此没有调用 applyThemeColors(),背景仍为旧的 #191A1C,而非 Codex 的 #111111。
    • 来源:本次引入。此前透明画布由底层面板提供背景;现在画布持有一次解析后的不透明颜色,需要同步配色主题变化。
  2. [P2] 为平台行为变更补充功能矩阵记录
    macos/Sources/Lithe/Platform/MacOS/Terminal/MacTerminalTransport.swift:172

    • 实际影响:功能矩阵遗漏新的透明度及 OSC 11 行为,且默认 CI 矩阵变更校验会失败。
    • 触发条件:本次修改了 macos/Sources,但完整变更清单没有任何功能矩阵 JSON 更新。
    • 复现依据:scripts/verify-platform-feature-matrix-change.mjs:10 将该路径纳入检查;没有实质能力记录更新时,进入第 31 行的抛错分支。该脚本已接入 PR 工作流。本次属于用户可见行为修复,不适用无行为变化重构的豁免规则。
    • 来源:本次引入。

Scope Check

  • 关联需求:未找到可验证的关联 Issue;按 PR 描述检查画布合成修复。
  • 已完成:壁纸与无壁纸的背景色分支、图层透明度同步,以及颜色、状态切换和 OSC 11 底层状态断言。
  • 未完成:配色主题切换刷新、功能矩阵同步及视觉证据。
  • 上游复用:继续使用固定版本 SwiftTerm 1.15.0,改动位于 macOS 适配层,没有新增平行终端渲染实现。
  • 两项 Finding 均由本次变更引入,属于本次职责范围。

Suggestions

  1. 将配色主题变化传递到现有终端并刷新颜色,保留终端会话身份;增加保持 darkAqua、从 Lithe 切到 Codex 的回归测试。
  2. 更新相关功能矩阵记录,补充画布透明度、OSC 11 取舍及验证动作,并由作者运行矩阵校验。
  3. 在 PR 描述或评论补充受影响终端的前后对比截图,展示明暗主题及有无壁纸的效果。

Summary

改动集中在正确的平台适配层,新增测试覆盖主要配置分支。需要补齐配色主题刷新路径和矩阵记录;图层属性断言尚不能证明实际字缘合成效果。

Verification

  • 静态检查了指定 base...head 的两个变更文件,并追踪终端宿主更新、主题设置与颜色解析、功能矩阵校验及对应 CI 工作流。
  • PR 作者报告两个测试套件共 13 tests passed,并提供亮色下有无壁纸的人工验收文字;本次未独立验证这些结果。head 暂无 Check Run 结果。
  • 遵守只读要求,未运行应用、测试、构建或仓库验证脚本,未访问网络。
  • 上下文没有截图,视觉效果尚未验证;需补充上述前后对比。实际 Metal/Core Graphics 渲染及测试计时报告仍缺少可核对证据。

@xiaoyumuxi

Copy link
Copy Markdown
Collaborator

这是啥改动?有点没看懂

@icefery

icefery commented Oct 20, 2026

Copy link
Copy Markdown
Author

这是啥改动?有点没看懂

浅色主题下,字体显式有问题,还有几个问题还在排查。

image image

@xiaoyumuxi

Copy link
Copy Markdown
Collaborator

这是啥改动?有点没看懂

浅色主题下,字体显式有问题,还有几个问题还在排查。

image image

okok

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

review: medium ghfind author score; see https://ghfind.com

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants