fix(app-iced): M100 r1 返工 —— 一次一采样 + OS 层密闭指标 + 文档口径订正
三条复审意见 + 六条 p3,全部落在原有文件里(另加两个拆分文件)。 P2-1 截图落盘「最后写入者说了算」(真竞态) `Message::Frame` 以前在 `frames >= CAPTURE_AT_FRAME` 之后每帧都发一次 `window::screenshot`, `Captured` 每次都覆盖同一文件才 `exit()`;已派发的采样不会因 exit 撤回 ⇒ 落盘内容是调度结果 (复审实测 12 次里 7 次写了两次;把窗口在两次采样之间改成 900×600,落盘就是 900×600)。 现在闸门 = `should_request_capture(frames, dispatched, capture_mode)`,派发即置位、只开一次; `Captured` 计数落盘次数并打进日志。实测 12/12 次「[shot] -> 文件」行恒为 1、`落盘次数=1`。 P2-2 密闭证据换成 OS 层 `platform/win32/transparency.rs` 加安全 getter `click_through`(unsafe 仍只在既有唯一落点); 该文件因超 400 行又拆出 `transparency/exstyle.rs`(子模块继承父模块的 `#![allow(unsafe_code)]`, `unsafe-scope` 门禁判据不受影响)。日志三态 `[caps] passthrough_ext=on|off|unknown`: `None` 记 `unknown`,绝不记 `off`。实测默认 on 12/12、`--passthrough=off` 为 off 3/3。 P2-3 头注释「下放」→「新增」,并订正「接真控件改 3 个文件」 (section 文件里的 body 绊线 + 该 section 的 `GROUP` 文件 + `tests/mod.rs` 跨 section 绊线)。 p3 六条:shell 断言说明改准(默认值那条归 cli 的测试)、harness 文档给「指针事件=0」加对照限定、 数字订正(纯搬移 234 / 新增 134)、三文件口径、ai+about 对本文件的两处必改、`Rest` 与真 Disabled 撞语义写进「抓不住」。 文档口径:「8 连跑全稳」不再当密闭证据——同 argv 开/关穿透 hash 相同(实测 0d7b4f5b 两边一样), 它只说明「帧静止 + 落盘确定」。密闭主证据是 `[caps] passthrough_ext=`。 顺带:`run()` 从 `harness.rs` 拆到 `harness/app.rs`(272 / 190 行)。搬移中丢过一条既有断言 `ensure_layered_refuses_a_missing_or_invalid_window`,被编译器 unused-import 警告抓出并复原。
This commit is contained in:
1 parent
2061296615
commit
380fac0324
13 files changed
+545
-201
No files matched your search
@@ -1,9 +1,11 @@
|
||||
//! `pages::harness` 的断言(M90 r2 从 `harness.rs` 外置:那边曾 402 行,guards 的 file-size 会判红)。
|
||||
//!
|
||||
//! 只测**参数解析**与**出图 slug**,不碰 iced 运行时——所以「指针穿透真的把窗口的鼠标输入关了」
|
||||
//! 这类事这里证明不了,只能靠出图时日志里的 `指针事件=N`(见 `harness.rs` 的模块文档)。
|
||||
//! 只测**参数解析 / slug / 采样闸门 / 三态标签**,不碰 iced 运行时。所以「穿透在真实窗口上真的
|
||||
//! 关掉了命中测试」这条这里证明不了——它要看出图日志里的 `[caps] passthrough_ext=`(三态,
|
||||
//! 来自 `GWL_EXSTYLE` 的 `WS_EX_TRANSPARENT`);`指针事件=N` 只是辅助指标(它只证明消息到没到)。
|
||||
|
||||
use super::request::Request;
|
||||
use super::should_request_capture;
|
||||
use crate::cli::Backend;
|
||||
use crate::pages::Screen;
|
||||
|
||||
@@ -102,8 +104,7 @@ fn the_control_run_can_turn_the_passthrough_off() {
|
||||
assert!(shot.screenshot.is_some(), "off 只对截图通道有意义");
|
||||
}
|
||||
|
||||
/// **外观真状态那一屏(M100)**:`--appearance=real` 只在设置页成立,且 slug 要与演示行版分开。
|
||||
///
|
||||
/// **外观真状态那一屏(M100)**:`--appearance=real` 只在设置页成立,且 slug 要与演示行版分开。///
|
||||
/// 抓得住:① 谁把 real 接到别的页(那会出一张「假装接了线」的图);
|
||||
/// ② 两张图落成同名文件(归档后无法区分哪张是真控件版)。
|
||||
/// 抓不住:那张图里到底有没有控件——那是像素的事,由两张图的 sha256 不同 + tower 亲自看图判。
|
||||
@@ -123,3 +124,50 @@ fn the_real_control_screen_is_settings_only_and_says_so_in_the_slug() {
|
||||
);
|
||||
assert!(parse(&["--screen=settings", "--appearance=x"]).is_err());
|
||||
}
|
||||
|
||||
/// **一次一采样(M100 r1 P2-1)**:采样请求最多发一次,且最早在 `CAPTURE_AT_FRAME`。
|
||||
///
|
||||
/// 抓得住:谁把闸门改回 `frames >= CAPTURE_AT_FRAME`(那样第 3 帧之后每帧都发一次采样,
|
||||
/// `Captured` 每次都覆盖同一文件 ⇒ **最后写入者说了算**;复审实测 12 次里 7 次写了两次,
|
||||
/// 并把窗口在两次采样之间改成 900×600 之后落盘的就是 900×600 那张)。
|
||||
/// 抓不住:「落盘次数真的是 1」——那要看真实运行的日志 `落盘次数=1`(本测试只测闸门逻辑)。
|
||||
#[test]
|
||||
fn the_capture_gate_opens_once_and_never_again() {
|
||||
// 窗口到第 4 帧才就绪也要恰好请求一次(`window` 未就绪时不置位,保留重试,不会挂死)
|
||||
let mut dispatched = false;
|
||||
let mut requests = 0;
|
||||
for frames in 1..=10u32 {
|
||||
let window_ready = frames >= 4;
|
||||
if should_request_capture(frames, dispatched, true) && window_ready {
|
||||
dispatched = true;
|
||||
requests += 1;
|
||||
}
|
||||
}
|
||||
assert_eq!(requests, 1, "整个进程只许请求一次采样");
|
||||
|
||||
assert!(!should_request_capture(1, false, true), "第 3 帧前不许采样");
|
||||
assert!(should_request_capture(3, false, true), "第 3 帧取第一张");
|
||||
assert!(
|
||||
!should_request_capture(99, true, true),
|
||||
"已派发过就不再请求(这条就是 P2-1 的修复本身)"
|
||||
);
|
||||
assert!(
|
||||
!should_request_capture(99, false, false),
|
||||
"交互模式(没有 --screenshot)不采样"
|
||||
);
|
||||
}
|
||||
|
||||
/// **密闭日志三态(M100 r1 P2-2)**:拿不到句柄必须记 `unknown`,不许记 `off`。
|
||||
///
|
||||
/// 抓得住:谁把 `None` 掉成 `off`(那会把「没读到」说成「读到了、没开」——这台机器上从此永远
|
||||
/// 看不出密闭到底生效没有)。
|
||||
/// 抓不住:真实窗口上的位(那要看运行日志里的 `passthrough_ext=on`)。
|
||||
#[test]
|
||||
fn the_passthrough_capability_is_three_states() {
|
||||
assert_eq!(super::caps::passthrough_label(None), "unknown");
|
||||
assert_eq!(
|
||||
super::caps::passthrough_label(Some(0)),
|
||||
"unknown",
|
||||
"句柄 0 = 还没拿到窗口"
|
||||
);
|
||||
}
|
||||
Reference in new issue
Block a user