Skip to content

[R2-08][显示] 明确字体网格并验收真实 DPI 与跨显示器切换 #31

Closed as not planned
1 of 1 issue completed
Closed as not planned

Description

@JavaZeroo

当前处置(2026-11-01)

本项已按用户决定关闭:跨屏迁移转#297/R4;单屏96/144仍由#30/#35在正式Qt配置核对。关闭不代表Qt完整输入/显示已验收。已有presentation像素断言及隔离双输出探针各保留原配置身份,下方旧“本项继续开放/跨屏为R2门槛”不再是当前执行状态。


隔离环境已建立(2026-10-29)

#131 / PR137 已合入main 730404de3d6d59dd139fb8d669ad194ee6ccb218:官方 Windows 11 x64 VM真实启动,双向合成文件一致;两个实际Windows输出为96/120 DPI,独立Win32可见窗口两轮96→120→96通过。自有guest请求有独立执行deadline、精确Job回收和失败隔离;超时后下一正常请求通过。环境基础已解除阻塞,连接信息及秘密只留私有记录。

这些是环境和独立探针证据,不是Qt产品验收;本项继续开放。Qt正式程序的字体网格、焦点、IME/Find/rename、输入命中、隐藏会话和child尺寸仍须在该环境验证;物理输入/呈现和性能端点继续分别记录,未知保持null。

当前正式路线(2026-10-28)

用户已确认自主 C++ 终端核心+当前 Qt Widgets GUI+随包固定微软 ConPTY,依据见 ADR-0008。第一批整合由 #115 / PR #116承接。

本项后续在 Qt 路线上验收字体网格、真实不同 DPI 和跨屏。旧 Win32、同96-DPI双屏与受控Qt缩放分别保留;首个Qt offscreen检查不替代原生窗口上屏、物理输入或真实跨DPI。

以下原合同与固定检查点保留各自来源;路线确认不替代实现、完整R2或性能验收。

当前方向与确认边界(2026-10-26)

首个完整版本环境为 Windows 11 x64,真实不同 DPI 和原有输入/显示合同继续保留。字体、12×26 网格、18 DIP、缩字适配和缺字体失败等是现有实现策略,补原版实际对照;重要视觉/交互差异提交用户确认;#34继续收敛已确认Qt路线的接口、支持配置与实际证据。

依据:已确认方向与决策权限。

用户结果

字体来源、网格和缺字行为明确,实际不同 DPI 与跨显示器切换后布局、焦点、IME/Find/rename、输入命中、隐藏会话及 child 尺寸仍正确。

已有基础与产品缺口

字体/显示合同已规定私有 UI 字体及许可、系统终端字体、实际 glyph/fallback、缺失资产拒绝与固定网格;受控 DPI/zoom 回归已有覆盖。两台真实显示器往返有 限定证据,但二者均96 DPI:real_monitor_transition=true、distinct_dpi=false、presented_done=null。

可重复的不同DPI VM环境已由#131交付;剩余缺口是正式Qt产品完整输入/显示流程。Find/rename/IME等尚未迁移的产品能力需先独立实现并验证,无需再请求用户手工配置显示器。

剩余交付与验收

  • 自动探测候选测试宿主的实际显示器/DPI、Windows与输入环境;准备可隔离、可回收的受控宿主和重放流程,明确必须真实硬件/会话支持的边界及环境不可用原因。模拟器仅作测试准备,不冒充真实不同 DPI。
  • 在声明支持的真实异 DPI 环境重复往返,记录真实矩形/窗口DPI、网格、可见/隐藏标签、child尺寸及焦点;核对 IME组合、Find/rename编辑框、鼠标命中与切换,不由请求值或消息模拟推断通过。
  • 实际字体来源/许可、度量、glyph/fallback、缺字与缺失资产拒绝继续回归,不复制未授权或系统字体资产。复杂字素/完整输入与 [R2-07][文字] 验收复杂 Unicode、IME 与键盘/选择语义 #30 联合核对。
  • 受控 DPI、DIB、真实同 DPI 跨屏、实际呈现与物理输入分别留证;未知端点保持 null,不以提交时间冒充实际上屏。
  • 最终声明环境的 R1 DPI/缩放/输入回归保持;FEATURES/EVIDENCE 清楚区分已验与环境缺口。

真实前置与完成边界

父项 #7。无未解除代码前置,可与核心/输入工作并行准备环境;隔离异DPI宿主已具备,最终验收仍待完整Qt产品流程。不修改个人显示缩放或全局设置制造通过,不转为反复要求用户点击或运行。缺环境时保留开放,#34/#35 不豁免显示出口。

Activity

  1. added
    enhancementNew feature or request
    ready-for-agent范围明确且真实阻塞已解除,可开始实施
    on Oct 24, 2026
  2. JavaZeroo commented on Oct 24, 2026

    @JavaZeroo
    OwnerAuthor

    #31 的字体/网格合同与真实跨屏切片已形成,本项保持 OPEN,未声称不同 DPI 或实际呈现验收。

    新增入口:

    • docs/milestones/R2-font-display.md:字体来源、固定 12×26 网格、glyph/fallback 和证据层级。
    • experiments/shell/workspace_monitor_scenario.hpp:真实 EnumDisplayMonitors / MonitorFromWindow / SetWindowPos 往返。
    • experiments/shell/results/2026-10-24-r2-monitor-font/:两次公开 synthetic 记录与验证。

    实际环境与结果:

    • Windows 11 build 26200,两台真实显示器有效 DPI 均为 96。
    • 两次 origin→target→origin 均通过;窗口/子 HWND、rename 焦点与内容、隐藏/可见标签、网格和 dirty/full 图像保持。
    • real_monitor_transition=true、distinct_dpi=false、presented_done=null;每轮 3 会话回收、Job active=0、desktop 删除。
    • 受控 ui-dpi、renderer_metrics、layout_state 通过;篡改真实跨屏、异 DPI、窗口位置和可见性均能触发校验失败。

    未完成:不同 DPI 的真实跨屏、物理输入/实际呈现、真实 IME 跨屏、复杂 Unicode/fallback 全量行为。未修改系统显示设置,#36 的完整 CTest 失败仍独立保留。待提交后,本切片证据才可计为交付;#31 的全部出口仍需后续环境。

  3. JavaZeroo commented on Oct 24, 2026

    @JavaZeroo
    OwnerAuthor

    补充一个无窗口字体/fallback 切片;未截图、未操作用户桌面:

    • experiments/presentation/renderer_metrics_test.cpp 现在断言实际 DWrite glyph run 的字体身份:ASCII 与 e + U+0301 保持 Consolas;中文无缺字且实际使用非 Consolas fallback;U+10FFFF 负例仍产生 glyph run 并被缺字检测识别。
    • 不再仅凭“请求 Consolas”“非空单元有墨迹”推断字体或 fallback 正确。GDI 仍只作绘制对照,不冒领 DWrite 字体身份证据。
    • Release 重建后 renderer_metrics 的 GDI/DirectWrite × 4 DPI × 4 zoom 共 32 组通过;git diff --check 与 research.tests.test_headless 通过。
    • experiments/shell/README.md 和 docs/EVIDENCE.md 已同步。

    本项仍未提交,#31 保持 OPEN。复杂 Unicode/完整字素归 #30;不同 DPI、物理输入、真实 IME 跨屏和实际呈现仍未验收。#36 也保持 OPEN,不用本次局部测试替代完整 CTest。

  4. JavaZeroo commented on Oct 24, 2026

    @JavaZeroo
    OwnerAuthor

    继续完成无窗口 UI 字体度量切片:

    • renderer_metrics 现在还直接实例化生产 WorkspaceFont,覆盖 96/120/144/192 DPI,核对私有 Roboto Mono 的实际 GDI face、HFONT em 高度和 TEXTMETRIC.tmHeight,并拒绝 47/769 DPI。
    • 实测区分了两种度量:9pt 对应 em 12/15/18/24 像素,固定字体的实际行高为 16/20/24/32 像素。最初把 em 错当行高的测试预期已依据实测修正,没有改生产字体或放宽身份检查。
    • renderer_metrics_test 显式依赖 termforge_shell_assets,单独构建该测试也会准备相同字体资产。
    • Release 重建及 32 组 renderer_metrics、research.tests.test_headless、git diff --check 通过。assets/fonts/README.md、字体合同和工作区说明已同步。

    #31 仍 OPEN;本切片不覆盖缺失字体资产、不同 DPI、物理输入、真实 IME 跨屏或实际呈现,也不改变 #36 与完整 CTest 的未通过状态。

  5. JavaZeroo commented on Oct 24, 2026

    @JavaZeroo
    OwnerAuthor

    补齐上一评论保留的缺失字体资产路径:

    • renderer_metrics 在构建目录创建唯一临时目录,只复制测试 EXE、不复制 assets/,再以 CREATE_NO_WINDOW 启动独立进程。
    • 子进程直接实例化生产 WorkspaceFont;只有收到预期 UI font missing: 错误才返回约定码 42,父进程核对该码。未抛错或其他错误均失败。
    • 父进程等待上限 10 秒,异常等待会终止并回收子进程;正常/异常退出均通过 RAII 删除临时目录。本次运行后无残留目录。
    • Release 下完整 32 组 renderer_metrics、4 个 headless 测试和 git diff --check 通过;字体合同与工作区说明已同步。

    #31 继续 OPEN。字体/glyph/度量/缺失资产切片不覆盖不同 DPI、物理输入、真实 IME 跨屏或实际呈现;#36 和完整 CTest 状态不变。

  6. JavaZeroo commented on Oct 24, 2026

    @JavaZeroo
    OwnerAuthor

    此前字体/glyph/度量/缺失资产与两台 96-DPI 显示器切片已随提交 7880c2a 推送。完整 39 项 CTest 自然结束为 37 通过,唯一失败仍是 #36 的 shell normal/resize;renderer_metrics 通过。不同 DPI、物理输入、真实 IME 跨屏与实际呈现未验收,本项和 R2 路标继续 OPEN。

  7. JavaZeroo commented on Oct 25, 2026

    @JavaZeroo
    OwnerAuthor

    复核当前最终实现后的真实显示证据:ui-monitors 两轮真实往返通过,隐藏/可见会话网格、rename 焦点与 frame_matches_full 均保持;两台实际显示器的 effective DPI 都是 96,JSON 明确 real_monitor_transition=true、distinct_dpi=false、presented_done=null。

    字体来源/OFL、私有加载、缺失资产拒绝、96/120/144/192 的 GDI em/行高及 32 组 backend/DPI/zoom glyph 检查已有覆盖。此次仅复核,未新增提交或扩大验收范围。

    #31 保持 OPEN:当前仍没有真实不同 DPI 流程,也没有实际呈现和物理输入证据。后续不通过修改用户显示设置、受控消息或截图来制造这些结论;受控 96/144/192 与真实相同 DPI 跨屏不能替代缺失验收。

  8. added
    blocked有明确未完成前置;见原生 blocked-by
    and removed
    ready-for-agent范围明确且真实阻塞已解除,可开始实施
    on Oct 26, 2026
  9. removed
    blocked有明确未完成前置;见原生 blocked-by
    on Oct 28, 2026
  10. added a commit that references this issue on Oct 31, 2026
  11. JavaZeroo commented on Oct 31, 2026

    @JavaZeroo
    OwnerAuthor

    按决策 4C:#31 的 R2 范围收窄为「单显示器 96/144 DPI」

    决策 4C(docs/adr/0009-r2-scope-decisions.md,本轮已合入文档):

    • R2 只验收单显示器下的 96/144 DPI;
    • 真实跨屏迁移移出 R2,推迟到 R4;
    • 跨屏证据缺失不构成 R2 阻塞,但也不能被表述为已验证。

    与本文验收项的对照

    本文要求 决策后归属 现状
    真实异 DPI 环境往返、窗口/网格/焦点/IME/Find 命中 R4 未验(本机只有 96 DPI 记录,distinct_dpi=false)
    单显示器 96/144 DPI 渲染正确性 R2 presentation 探针在 96 与 144 DPI 下有像素断言(reverse/underline/strikethrough 等),但未覆盖正式 Qt 产品的完整输入流程
    字体来源/许可、glyph/fallback、缺失资产拒绝 R2 已有回归(R2-font-display.md 合同)

    因此本项暂不关闭

    • R2 剩余部分(单显示器 96/144 的正式 Qt 流程)仍未验收;
    • R4 部分(真实异 DPI 跨屏)需要真实环境,本机无法生成;
    • 按本文"缺环境时保留开放"的既有约定,保持 open。

    边界

    • 本条只做范围归属的更新,不宣称任何验收完成;
    • 若你希望把 R4 部分拆成独立 issue,我可以另开一条并把本文收窄为 R2 单屏验收。
  12. added a commit that references this issue on Oct 31, 2026
  13. JavaZeroo commented on Nov 1, 2026

    @JavaZeroo
    OwnerAuthor

    按用户决定:本项按单屏范围关闭,跨屏迁移转 R4(#297)

    决定依据

    用户明确:「选A 不需要一直死磕一个问题。可以接受不完美」。

    对应 ADR-0009 的决策 4C:R2 只验收单显示器 96/144 DPI。

    处置

    内容 归属
    R2 单显示器 96/144 DPI 的渲染正确性 保留在 R2(presentation 探针有 96/144 像素断言)
    真实跨屏迁移、异 DPI 往返、跨屏后焦点/IME/Find 命中 移出 R2,转 #297(R4)

    关闭时的真实状态(不加修饰)

    项 状态
    单屏 96/144 渲染 有像素级断言,但未覆盖正式 Qt 产品的完整输入流程
    真实异 DPI 跨屏 从未验证(既有记录 distinct_dpi=false)
    真实异 DPI 环境 本机不可得;VM 内改分辨率不能替代

    即:本项关闭不代表显示能力已验收,只代表 R2 出口不再等待跨屏证据。

    文档同步

  14. added a commit that references this issue on Nov 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions