Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions .github/workflows/qt-cpp.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ jobs:
"-DTERMFORGE_CONPTY_BACKEND_DIR=$dependencyRoot/conpty" `
"-DTERMFORGE_MSVC_RUNTIME_DIR=$dependencyRoot/crt"
- name: Build Qt product and independent smoke
run: cmake --build build/qt-cpp --config Release --target termforge_qt_shell qt_cpp_shell_smoke qt_cpp_resize_smoke qt_unicode_input_test qt_unicode_render_test qt_eight_session_test qt_terminal_modes_test qt_hidden_retention_test qt_history_navigation_test qt_selection_migration_test qt_find_test qt_scrollbar_size_test qt_clipboard_system_test qt_query_reply_test qt_paste_test --parallel 2
run: cmake --build build/qt-cpp --config Release --target termforge_qt_shell qt_cpp_shell_smoke qt_cpp_resize_smoke qt_unicode_input_test qt_unicode_render_test qt_eight_session_test qt_terminal_modes_test qt_hidden_retention_test qt_history_navigation_test qt_selection_migration_test qt_find_test qt_scrollbar_size_test qt_autoscroll_test qt_clipboard_system_test qt_query_reply_test qt_paste_test --parallel 2
- name: Stage the frozen Qt product and verify every file identity
run: |
python -m tools.stage_qt_product stage `
Expand Down Expand Up @@ -100,6 +100,8 @@ jobs:
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
python tools/msvc_runtime.py manifest --directory build/qt-cpp/qt-scrollbar-size-bin/Release --executable qt_scrollbar_size_test.exe
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
python tools/msvc_runtime.py manifest --directory build/qt-cpp/qt-autoscroll-bin/Release --executable qt_autoscroll_test.exe
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
python tools/msvc_runtime.py manifest --directory build/qt-cpp/qt-clipboard-bin/Release --executable qt_clipboard_system_test.exe
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
python tools/msvc_runtime.py manifest --directory build/qt-cpp/qt-query-reply-bin/Release --executable qt_query_reply_test.exe
Expand Down Expand Up @@ -127,7 +129,7 @@ jobs:
build/qt-cpp/qt-query-reply-bin/Release/runtime-manifest.json
build/qt-cpp/qt-paste-bin/Release/runtime-manifest.json
- name: Run Qt offscreen smoke in its owned Job
run: ctest --test-dir build/qt-cpp -C Release -R '^(qt_cpp_(shell|resize)|qt_unicode_input|qt_unicode_render|qt_eight_session|qt_terminal_modes(_retained)?|qt_hidden_retention|qt_history_navigation|qt_selection_migration|qt_find|qt_scrollbar_size|qt_query_reply|qt_paste)$' --no-tests=error --verbose
run: ctest --test-dir build/qt-cpp -C Release -R '^(qt_cpp_(shell|resize)|qt_unicode_input|qt_unicode_render|qt_eight_session|qt_terminal_modes(_retained)?|qt_hidden_retention|qt_history_navigation|qt_selection_migration|qt_find|qt_scrollbar_size|qt_autoscroll|qt_query_reply|qt_paste)$' --no-tests=error --verbose
- name: Run hosted-only Qt system clipboard copy
run: python src/qt/run_smoke.py build/qt-cpp/qt-clipboard-bin/Release/qt_clipboard_system_test.exe --hosted-copy
- name: Run hosted Windows QPA product-writer clipboard copy
Expand Down
29 changes: 29 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -873,6 +873,35 @@ if(TERMFORGE_BUILD_QT_SHELL)
"${PROJECT_SOURCE_DIR}/src/qt/run_smoke.py" "$<TARGET_FILE:qt_find_test>")
set_tests_properties(qt_find PROPERTIES TIMEOUT 45
ENVIRONMENT "QT_QPA_PLATFORM=offscreen")
add_executable(qt_autoscroll_test src/qt/autoscroll_test.cpp)
set_target_properties(qt_autoscroll_test PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/qt-autoscroll-bin/$<CONFIG>")
termforge_qt_entry(qt_autoscroll_test)
target_link_libraries(qt_autoscroll_test PRIVATE Qt6::Test)
add_custom_command(TARGET qt_autoscroll_test POST_BUILD
COMMAND "${CMAKE_COMMAND}" -E copy_if_different
"$<TARGET_FILE:Qt6::QOffscreenIntegrationPlugin>"
"$<TARGET_FILE_DIR:qt_autoscroll_test>/platforms/"
VERBATIM)
add_test(NAME qt_autoscroll COMMAND "${Python3_EXECUTABLE}"
"${PROJECT_SOURCE_DIR}/src/qt/run_smoke.py" "$<TARGET_FILE:qt_autoscroll_test>")
set_tests_properties(qt_autoscroll PROPERTIES TIMEOUT 45
ENVIRONMENT "QT_QPA_PLATFORM=offscreen")
# Opt-in single-run literal oracle for the #327 recovery protocol v2. It is
# built on demand but deliberately NOT registered with add_test(): the
# literal run consumes a separately authorized one-shot budget, so CTest,
# push and PR runs must never execute it. Invoke it manually through
# run_smoke.py with --literal-v2 and an evidence path.
add_executable(qt_autoscroll_literal_test src/qt/autoscroll_literal_test.cpp)
set_target_properties(qt_autoscroll_literal_test PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/qt-autoscroll-literal-bin/$<CONFIG>")
termforge_qt_entry(qt_autoscroll_literal_test)
target_link_libraries(qt_autoscroll_literal_test PRIVATE Qt6::Test)
add_custom_command(TARGET qt_autoscroll_literal_test POST_BUILD
COMMAND "${CMAKE_COMMAND}" -E copy_if_different
"$<TARGET_FILE:Qt6::QOffscreenIntegrationPlugin>"
"$<TARGET_FILE_DIR:qt_autoscroll_literal_test>/platforms/"
VERBATIM)
add_executable(qt_scrollbar_size_test src/qt/scrollbar_size_test.cpp)
set_target_properties(qt_scrollbar_size_test PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/qt-scrollbar-size-bin/$<CONFIG>")
Expand Down
1 change: 1 addition & 0 deletions docs/EVIDENCE.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
| Qt 正式路径恢复 Windows 原生滚轮设置(#29 收尾) | [原生合同、注入回归与边界](../experiments/shell/results/2026-11-05-qt-wheel-native/README.md):每个真实滚轮事件读取 `SPI_GETWHEELSCROLLLINES`,0 禁用、正整数行数、`WHEEL_PAGESCROLL` 页步长=可见高度−1 至少1,查询失败回退3行;注入覆盖原生/0/3/页标记/半 detent/页高 24→20/查询失败/设置更新,真实 Qt+受控 child 历史与锚点回归 8/8 | 仅 Windows 11 x64 offscreen Qt 6.10.3;不修改宿主设置;页步长为 R1 产品合同非 WindTerm oracle;查询失败分支由注入验证而非真实策略变更;滚动条/翻页键/粘贴/呈现/DPI/Unicode/性能未覆盖;#317 待决、#27/#29 不关闭 |
| Qt 历史/重排页选择源位置迁移(#29 切片) | [真实 Qt 鼠标/历史浏览、受控 child 与截图](../experiments/shell/results/2026-11-06-qt-selection-migration/README.md):反向跨软续行、部分列+硬行边界、60×20 重排/恢复、浏览页变化、无关输出、真实淘汰/ED3/RIS 失效、双会话隔离;字面文本与高亮列数独立核对,Qt 正式路径 9/9 | 单屏 offscreen、固定短 ASCII/单一软续行;宽字/结合字选择列、系统剪贴板/复制 UI、粘贴、选词选行、自动滚动、Find、物理呈现/DPI/其他尺寸/性能未覆盖;内部提取≠系统剪贴板;旧失败/A/B/C/#27/#29 状态不变 |
| Qt 历史滚动条与源阅读锚点(#29 切片) | [实现、真实鼠标/键盘与截图](../experiments/shell/results/2026-11-07-qt-history-scrollbar/README.md):真实 QScrollBar 拖动/页区/Home/End,值仅显示页 top,经 HistoryViewport 源锚点定位;覆盖新输出锚点、回底、缩窄恢复、Find 同步、双会话;Qt 正式路径 10/10 | 离屏 Qt;不覆盖物理呈现/DPI、TUI/备用屏、自动滚动/选词选行/持久化/性能;滚动条+child 尺寸独立 ACK 仍为边界;不代表 #29/#30/R2 完成 |
| Qt 跨历史拖选有界自动滚动(#29 切片) | [实现、策略映射与真实 child 结果](../experiments/shell/results/2026-11-07-qt-selection-autoscroll/README.md):指针拖出可见上/下边缘时每 tick 滚动 1 源行并扩展选区;拖回/松开/失焦/隐藏/resize/关闭停止;高亮/Copy/滚动条同源;双会话隔离;本地 Qt 12/12 | 离屏;Copy 为注入 writer 非真实 CF;不含选词/选行/矩形/TUI/持久化/性能阈值;不关闭 #29/#30/R2 |
| Qt 有界系统复制入口(#29/#30 切片) | [实现、fake 入口回归与 hosted 阻塞](../experiments/shell/results/2026-11-06-qt-system-copy/README.md):Ctrl+Shift+C/实际 Copy 菜单接入 CF_UNICODETEXT,空/失效/容量/失败分列;本地 fake writer 入口测试通过,Qt 正式路径 9/9;hosted-only CF 入口通过(QPA/offscreen 分层) | **系统 CF 已在一次性 GitHub-hosted Windows run `42160062253` 分层验证**:offscreen 注入 owner 与 Windows QPA 默认 writer/真实控件 HWND 均独立读回键盘/实际菜单/空 sentinel/占用失败/释放后成功/淘汰;首次 offscreen winId 非 HWND 的 `OpenClipboard:1400` 只修正测试 owner,不改产品;宽字/结合字复制列、占用重试、粘贴、Find、物理呈现/性能未覆盖;不把 offscreen 缓存当 CF;旧 B/CD/A/B/C/#27/#29/#30 状态不变 |
| Qt 有界系统粘贴入口(#29/#30 切片) | [实现、本地 child 字节回归与 hosted Windows QPA CF](../experiments/shell/results/2026-11-06-qt-system-paste/README.md):Ctrl+Shift+V/Shift+Insert/实际 Paste 菜单接默认 CF 读取器、分块发送、目标绑定、多行确认;本地 fake reader + 真实 child 1/1、Qt 10/10(含双会话切换/读取中关闭/新会话隔离);hosted Windows QPA run `42183487961`/job `127778260596` 三入口/真实占用失败/释放后成功通过 | hosted 多行确认保留为历史失败(首次 `eecf21f`、修复后 `5ea8e44` 均未收到 `L1\rL2`;恢复额度已用尽,未再 hosted 重试,见[尝试账本](../experiments/shell/results/2026-11-06-qt-system-paste/attempt-ledger.md));不覆盖 bracketed paste/TUI/自动逐行/Find/物理呈现/DPI/性能;系统 CF 仅该一次性 hosted 运行;#27/#29/#30/#35/#7 不关闭 |
| Qt 有界字面量 Find(#29 切片) | [实现、本地确定性 child 与截图](../experiments/shell/results/2026-11-06-qt-find/README.md):Ctrl+Shift+F/查询/Previous/Next/Close,复用 TextSearch 的 4096 字节/1024 结果/字面量/ASCII case folding;源位置经 ViewMapping 在正常主屏与历史页高亮导航;本地 Qt 正式路径 10/10(qt_find 1/1) | 固定 ASCII 样例、离屏 Qt;中文/NFD 只声明字面标量匹配,不宣称字素/glyph 等价;不含选词/选行、滚动条/翻页键历史、TUI/备用屏 Find、物理呈现/DPI/性能阈值;不代表 #29/#30/R2 完成 |
Expand Down
Loading
Loading