From bc3a2b56a4d10ff43fb0023fb2362d5b0b7e739c Mon Sep 17 00:00:00 2001 From: AskaEth Date: Wed, 4 Nov 2026 18:27:23 +0800 Subject: [PATCH] =?UTF-8?q?docs(app-iced):=20M116=20r3=20=E5=A4=8D?= =?UTF-8?q?=E5=AE=A1=20=E2=80=94=E2=80=94=20=E5=8F=AA=E5=AF=B9=E9=BD=90?= =?UTF-8?q?=E6=B3=A8=E9=87=8A=E9=87=8C=E7=9A=84=E3=80=8C=E5=8F=AA=E8=AF=BB?= =?UTF-8?q?=E4=B8=8B=E5=B1=82=E9=94=AE=E3=80=8D=E6=95=B0=E9=87=8F=E4=B8=8E?= =?UTF-8?q?=E5=8F=96=E8=AF=81=E6=97=A5=E5=BF=97=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 复审 r3:p2 ×2,纯注释/文档漂移,**行为零改动、断言零改动**。 1. `app/appearance.rs:8,15-20,68` 与 `app/state.rs:170-171`:M116 之后 `AppearanceBase` 是**四个**字段(整窗 α / 标题栏三态 / 配色来源 / 窗口圆角), 走 `AppCommand::SetSetting` 的是**三个**键(标题栏三态还没有 UI 写者,D37 接线未落地)。 两处数字与列举按 grep 到的实际代码改(`AppearanceBase` 的 `pub` 字段数 = 4; `on_appearance` 的 match 守卫 = WindowOpacity / PaletteSource / Corner)。 2. `pages/appearance/mod.rs:41` 的取证件模板补 `corner=`:`[appearance]` 行确实有这一栏, 圆角还有一条独立管线 `[corner] corner=policy=… source=… os=… excluded_reason=… radius=system pref=… readback=… read_hr=… frame=… layered=…`(取值形状取自探针实跑, 见 corner/tests.rs 的格式单测),模板已按此补齐,并注明「看上去圆不圆」同样不可信。 门禁(`CARGO_TARGET_DIR=C:/Temp/ull-target/wt-116`, `-j 4`,退出码逐个落盘): check 0 / fmt --check 0 / `cargo test -p unlucky-app-iced --lib` 0(447 passed, 0 failed, 2 ignored)。 行数:appearance.rs 130、state.rs 343、pages/appearance/mod.rs 180(均 ≤400)。 --- crates/app-iced/src/app/appearance.rs | 11 +++++++---- crates/app-iced/src/app/state.rs | 4 ++-- crates/app-iced/src/pages/appearance/mod.rs | 8 ++++++-- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/crates/app-iced/src/app/appearance.rs b/crates/app-iced/src/app/appearance.rs index 0890af2..68fe4c7 100644 --- a/crates/app-iced/src/app/appearance.rs +++ b/crates/app-iced/src/app/appearance.rs @@ -5,16 +5,18 @@ //! | 动作 | 唯一落点 | 为什么 | //! |---|---|---| //! | 下发整窗 α | [`App::apply_window_alpha`] → `app::window_alpha::dispatch` | 判据在 `platform`、FFI 在 `platform/win32`,这里只做「取 α → 交给执行侧 → 记日志」 | -//! | 写回配置 | [`App::persist_appearance`](8 个 UI 字段)+ `AppCommand::SetSetting`(另外两个只读键) | 每个键**只有一个写者**:`AppearancePrefs` 里没有 `window_opacity` / `palette_source`,它们只能走 schema 指令 | +//! | 写回配置 | [`App::persist_appearance`](8 个 UI 字段)+ `AppCommand::SetSetting`(另外**三个**只读键) | 每个键**只有一个写者**:`AppearancePrefs` 里没有 `window_opacity` / `palette_source` / `window_corner`,它们只能走 schema 指令 | //! | 取证日志 | [`App::log_appearance`] | 一行里同时有请求值、生效值、下发字节与 FFI 结局 | //! //! ## 为什么「写回」要分两条路 //! //! `SettingsBridge::persist` 收的是 `AppearancePrefs`(背景图四件 + 面板 α + 玻璃 + 强调色), //! 它的实现是「先读文件当前值,再覆盖我们改的那几个字段」——所以用它写**它覆盖的键**最省事, -//! 也不会把用户的自定义强调色冲掉。而 `appearance.window_opacity` / `appearance.palette_source` -//! 不在那个结构里(它们是「只读下层键」,见 `presenter::prefs::AppearanceBase`), +//! 也不会把用户的自定义强调色冲掉。而 `appearance.window_opacity` / `appearance.palette_source` / +//! `appearance.window_corner` 不在那个结构里(它们是「只读下层键」,见 +//! `presenter::prefs::AppearanceBase` 的**四个**字段:整窗 α / 标题栏三态 / 配色来源 / 窗口圆角), //! 写它们只能走 schema 白名单指令 `AppCommand::SetSetting`(真 host 用 `SettingStore::set` 落盘)。 +//! 其中「标题栏三态」目前**没有 UI 写者**(D37 的接线未落地),所以走 `SetSetting` 的是**三个**键。 use unlucky_presenter::dto::AppCommand; @@ -65,7 +67,8 @@ impl App { self.refresh_view(); match change.key() { - // 两个只读下层键:走 schema 指令(`SettingsBridge` 的结构里没有它们)。 + // 三个只读下层键(整窗 α / 配色来源 / 窗口圆角):走 schema 指令 + // (`SettingsBridge` 的结构里没有它们;标题栏三态还没有 UI 写者,不在此列)。 Some(_) if matches!( change, diff --git a/crates/app-iced/src/app/state.rs b/crates/app-iced/src/app/state.rs index c3bce41..ea33fc0 100644 --- a/crates/app-iced/src/app/state.rs +++ b/crates/app-iced/src/app/state.rs @@ -193,8 +193,8 @@ impl App { let width = WINDOW_SIZE.width; let height = WINDOW_SIZE.height; let theme_mode = bridge.load().1; - // 外观两半分开读:`load()` 给 8 个 UI 写入字段,`load_base()` 给 3 个只读下层键 - // (整窗 α / 标题栏三态 / 配色来源)。M93 之前这两个键在 app 侧**根本读不到**。 + // 外观两半分开读:`load()` 给 8 个 UI 写入字段,`load_base()` 给 4 个只读下层键 + // (整窗 α / 标题栏三态 / 配色来源 / 窗口圆角)。M93 之前这些键在 app 侧**根本读不到**。 // // 截图通道**不读用户配置**(D30:同一份代码在两台机器上要出同一张图):外观一律取出厂值, // 矩阵需要的值由 `ULL_APPEARANCE_*` 显式灌进来。 diff --git a/crates/app-iced/src/pages/appearance/mod.rs b/crates/app-iced/src/pages/appearance/mod.rs index 4d9e1e6..0492f47 100644 --- a/crates/app-iced/src/pages/appearance/mod.rs +++ b/crates/app-iced/src/pages/appearance/mod.rs @@ -39,8 +39,12 @@ //! ## 取证 //! //! 每一处改动都打一行 [`state::State::log_line`]:`[appearance] window_alpha=… panel_alpha=… -//! byte=…`。数值是**下发前**的字节(不是观感),因为在 RDP + 虚拟显示适配器上「看上去多透明」 -//! 不可信。截图矩阵用 `ULL_APPEARANCE_*` 环境变量灌值(见 [`state`] 的常量)。 +//! byte=… corner=…`;圆角另有一条独立管线,行形如 +//! `[corner] corner=policy=system source=dwm os=10.0.26100 excluded_reason=none +//! radius=system pref=2 readback=? read_hr=0x80070057 frame=popup layered=on` +//! (见 `app::update::appearance` 与 `platform::win32::corner::format_line`)。数值是**下发前**的 +//! 字节/属性值(不是观感),因为在 RDP + 虚拟显示适配器上「看上去多透明 / 圆不圆」不可信。 +//! 截图矩阵用 `ULL_APPEARANCE_*` 环境变量灌值(见 [`state`] 的常量)。 pub mod alpha; pub mod background;