fix(app-iced): 子进程统一走 platform::child::quiet(消灭启动闪窗)+ 守卫射程扩到整棵 crates/(M217)

用户报「CI 构建版启动时底下闪一个控制台」:M213 统一了 crates/core/src 的 20 处
Command::new,但守卫射程只有 core/src,app-iced 的 reg.exe(每次 GUI 启动都跑)漏网。

- crates/core/tests/child_quiet_guard.rs:扫描根 crates/core/src → crates/(1219 个 .rs),
  角色清单改成相对 crates/ 的路径(文件角色钉精确处数,目录角色至少一处);
  「扫不到文件」兜底断言保留,另加角色文件锚点兜底;顺带修掉全树扫描会撞上的
  「纯 //! 结论页没有代码行」误判
- app-iced:platform/locale.rs 的 reg.exe、app/update/update_action.rs、
  app/boot/fallback.rs、app/boot/termux_window.rs 的 xdpyinfo、
  renderer/acceptance/locale.rs 的 defaults 全部改走 quiet(后三处是同一 exe /
  POSIX 上的 pass-through,为的是规则整体可被守卫钉住)
- app/dialog/export.rs 的 explorer / open / xdg-open 保持裸构造并写清「窗口就是产品」,
  presenter/src/host/opener.rs 同理登记成角色(不在本 mission 改动范围)

门禁:fmt/check --workspace --all-targets/test --workspace -j 4/clippy --workspace
--all-targets -D warnings/全仓 400 行 + <2 字节 .rs 扫描,六步退出码全 0,CHAIN_EXIT=0。
This commit is contained in:
AskaEth committed 2026-11-09 21:12:02 +08:00
1 parent 7521c47944
commit f8acb50156
7 files changed
+225 -165

No files matched your search

+7 -1
View File
@@ -6,6 +6,9 @@
//! 只有注册表知道答案」的问题,它用 `reg.exe query` 解决,`unsafe` 一个没加。本 crate 的 `unsafe`
//! 只允许出现在 [`crate::platform::win32`](D36 的纪律),所以这里照抄那条路。
//!
//! 子进程**一律**经 `unlucky_core::platform::child::quiet` 起(M217):GUI 父进程自己没控制台,
//! 裸构造会给 `reg.exe` 新建一块控制台窗口,用户看到的就是启动时闪一下黑框。
//!
//! 为什么不 `GetUserDefaultLocaleName`:它要 FFI,而它对**本用途**并不比注册表准——Windows 的
//! 「区域格式」与「显示语言」本来就是两个设置,两者都有各自的说法(见下面的诚实边界)。
//!
@@ -83,7 +86,10 @@ impl RegIo for HostReg {
return None;
}
let output = std::process::Command::new(program)
// **必须**走 `quiet`(M217):本 crate 的父进程是没有控制台的 GUI(PE Subsystem=2),
// 裸 `Command::new("reg.exe")` 会让 Windows 给子进程新建一块控制台——用户看到的就是
// 「启动时底下闪一个黑框」。这条路径每次 GUI 启动都跑,所以它闪得准时。
let output = unlucky_core::platform::child::quiet(program)
.args(args)
.output()
.ok()?;