用户问「为什么窗口没有圆角」。核实:组件层圆角齐,但窗口外框**零处理**——代码里没有任何 Dwm* / SetWindowRgn。本 mission 先做实测,再按平台分开落策略。 判据(纯函数、可真值表): - `platform::plan_corner(策略 × 系统版本 × 渲染档)` → `source=dwm|square` + `excluded_reason`。 Win11 / Server 2025(build ≥ 22000)→ DWM;Win10 及更早 → 直角(不做 SetWindowRgn 毛边默认); 探测不到版本(macOS / X11 / Wayland)→ 直角 + `unknown-os`(「不承诺」而不是「做不到」)。 CPU 档在 Win11 上照样用 DWM(D36 限制的是我们自己的合成技巧,不是系统合成器)。 落点:`platform/win32/transparency.rs` 仍是全仓唯一 unsafe 文件,新增 DWM 的 FFI 与安全包装; `alpha.rs` / `dwm.rs` / `probe.rs` 三个新子模块零 unsafe、零 extern(沿 exstyle.rs 的既有形状)。 实测(本机 Server 2025 build 26100、RDP 会话断开、同进程三窗口对照): - `DwmSetWindowAttribute(DWMWA_WINDOW_CORNER_PREFERENCE)` 在 WS_OVERLAPPEDWINDOW / WS_POPUP / WS_POPUP|WS_EX_LAYERED(α=0.8) 上**全部成功** ⇒ 无边框与整窗 α 不会让属性设不上; - `DwmGetWindowAttribute` 同一属性三种样式**全部 E_INVALIDARG** ⇒ 本机不支持回读,与样式无关; - `DWMWA_EXTENDED_FRAME_BOUNDS − GetWindowRect`:有边框 = +0,−7,popup = +0,+0 ⇒ DWM 只给有边框窗口加不可见调整带,我们的窗口没有可画的圆角区域(结构性解释)。 - 像素(角上透明/方块)**未验**:RDP 断连导致 CopyFromScreen / gdigrab 全废。 同时修掉一个自己踩到的判据错误:`i32::unsigned_abs()` 不能用来打印 HRESULT (E_INVALIDARG 0x80070057 会被印成 0x7FF8FFA9)。现在 HRESULT 用 `hr as u32` + 严重性位, GetLastError 的 DWORD 语义保持 `unsigned_abs` 并写死注释(两者不同源,别统一)。 配置:新键 `appearance.window_corner ∈ {system, square}`(出厂 system),schema 1.5.0 只推 minor、 不写迁移:老文件缺键 = 取默认 = 跟随系统;旧版本读新文件时未知键被登记并原样写回(`RenderMode::Full`), 只在显式 `store.set` 该键时才 `UnknownKey`。 设置 UI:外观组只留两档(跟随系统 / 直角)+ 一句按平台说清的说明,文案走 i18n 中英。 日志:`[corner] <ctx> corner=policy=… source=… os=… excluded_reason=… radius=system pref=… readback=… frame=… layered=…` (形状由 `corner::format_line` 的格式化单测钉住,用探针窗口真实读数构造)。 证据:DevDocs/artifacts/m116/{README.md,probe-table.md}
core(D36/D37/D38 的键与范围) - appearance.window_opacity(0.08..=1.0,默认 1.0,越界钳位且不报错;下限 D36 定案) - appearance.titlebar_mode(auto|always|never,默认 auto;判定逻辑不在本 mission) - appearance.palette_source(background-image|wallpaper|preset,与 design 的 Level::code() 同名) - schema 1.3.0 → 1.4.0:纯增量、不加迁移步骤(新键出厂值 = 老文件缺键) - appearance 拆成目录 mod/modes/tests(单文件 ≤400 行),非法枚举由 diagnostics() 给可读回落说明 presenter(只读语义,不破 M89 零 UI 门禁) - AppearanceBase { window_opacity, titlebar_mode, palette_source } + from_document() - 单测:缺键→出厂值、越界→钳位、非法枚举→回落且合法值照读 app-iced(D36 唯一 unsafe 落点) - platform::effective_window_alpha(backend, requested) 纯函数:≤0/非有限 → None(拒绝整窗穿透), 其余夹到 0.08..=1.0;CPU 档同样允许窗口级 α(D36 对 D27 的修订),4 组真值表测试 - platform/win32/transparency.rs:SetLayeredWindowAttributes(LWA_ALPHA) 的 FFI + alpha_byte 量化 + apply_window_alpha;非 Windows 同签名空实现返回 Unsupported CI - guards.yml 新增 unsafe-scope job:全仓 allow(unsafe_code) 文件集合必须恰好等于 crates/app-iced/src/platform/win32/transparency.rs(集合相等,不是黑名单命中) 版本号绊线 - isolation_keys / java_install_keys:字面量 1.3.0 → 1.4.0(绊线保留字面量) - store / document 的两个关系夹具改成相对 launcher_version() 构造(「更高 minor 只读」/ 「同 minor 更高 patch 保留 $schema」),下次 bump 不再假绿或假红
Rust 原生单文件 Minecraft 启动器:CLI 完整可用(install/launch/accounts/java/diagnose/agent), MCP server 接入外部 Agent 工具,GUI 开发中。