From 6347f4903e8201091779c58fe1db7379ecd3aaa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=A4=E6=98=8E=E5=9B=9B=E5=AD=A3?= <84919145+Komeiji-Shiki@users.noreply.github.com> Date: Sat, 17 Oct 2026 20:49:48 +0800 Subject: [PATCH] =?UTF-8?q?fix(server):=20=E8=AE=BE=E7=BD=AE=E7=AA=97?= =?UTF-8?q?=E5=8F=A3=E8=B7=9F=E9=9A=8F=E7=B3=BB=E7=BB=9F=E6=98=8E=E6=9A=97?= =?UTF-8?q?=E4=B8=BB=E9=A2=98=E5=8F=98=E5=8C=96=20(#1023)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(server): 设置窗口跟随系统明暗主题变化 * fix(server): 系统主题切换时强制同步设置页并合并重复广播 快照只含 theme_* 原始值,跟随系统时切换前后内容相同,ConfigCompletion 会因与上次一致而不推给页面,预览停在旧主题。改为强制推送快照。 一次切换会连发多条 ImmersiveColorSet 广播,在途期间只排一次; worker 上的异常就地吞掉,不再弹出与用户操作无关的失败提示。 --------- Co-authored-by: fanlusky <1730976608@qq.com> --- server/src/settings/settings_app.cpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/server/src/settings/settings_app.cpp b/server/src/settings/settings_app.cpp index f91fda89..785ad082 100644 --- a/server/src/settings/settings_app.cpp +++ b/server/src/settings/settings_app.cpp @@ -75,6 +75,7 @@ std::unique_ptr g_worker; bool g_closing = false; bool g_lingering = false; bool g_reload_pending = false; +bool g_theme_refresh_pending = false; bool g_settings_light = false; // appearance.settings_window_linger 的 UI 线程副本,由 ConfigCompletion 更新。 std::string g_settings_window_linger = "off"; @@ -1832,6 +1833,31 @@ LRESULT CALLBACK WindowProc(HWND hwnd, UINT message, WPARAM w_param, LPARAM l_pa case kScanSkinCatalog: PostConfig(true); return 0; + case WM_SETTINGCHANGE: + if (l_param && lstrcmpiW(reinterpret_cast(l_param), L"ImmersiveColorSet") == 0 && g_worker && + !g_closing && !g_theme_refresh_pending) + { + // 系统主题变化不会修改 config.toml,必须主动重算主题并在 UI 线程应用。 + // 快照里只有 theme_* 原始值,跟随系统时切换前后内容相同,必须强制推给页面才会重算预览。 + // 一次切换会连发几条广播,在途期间只排一次。 + g_theme_refresh_pending = true; + g_worker->Submit([] { + SerialTaskQueue::Completion completion; + try + { + completion = ConfigCompletion(false, true); + } + catch (...) + { /* 不是用户操作,失败不弹框,下次广播或配置变化再同步。 */ + } + return [completion = std::move(completion)] { + g_theme_refresh_pending = false; + if (completion) + completion(); + }; + }); + } + break; case WM_NCCALCSIZE: if (w_param) {