From 131cd6c3b8cdacc64010c80755c06fefc6b8ba6f Mon Sep 17 00:00:00 2001 From: Tunglies <77394545+Tunglies@users.noreply.github.com> Date: Thu, 20 Nov 2025 15:57:54 +0800 Subject: [PATCH] fix(config): restart and quit application or shutdown system can not remember user's behavior #5347, #5359, #5430 --- src-tauri/src/config/config.rs | 16 ++++++++++++++++ src-tauri/src/feat/clash.rs | 1 + src-tauri/src/feat/window.rs | 4 ++-- src-tauri/src/utils/resolve/mod.rs | 2 +- 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src-tauri/src/config/config.rs b/src-tauri/src/config/config.rs index 767667b56..671ec586e 100644 --- a/src-tauri/src/config/config.rs +++ b/src-tauri/src/config/config.rs @@ -200,6 +200,22 @@ impl Config { logging!(error, Type::Setup, "Config init verification failed: {}", e); } } + + // 升级草稿为正式数据,并写入文件。避免用户行为丢失。 + // 仅在应用退出、重启、关机监听事件启用 + pub async fn apply_all_and_save_file() { + let clash = Self::clash().await; + clash.apply(); + logging_error!(Type::Config, clash.data_arc().save_config().await); + + let verge = Self::verge().await; + verge.apply(); + logging_error!(Type::Config, verge.data_arc().save_file().await); + + let profiles = Self::profiles().await; + profiles.apply(); + logging_error!(Type::Config, profiles.data_arc().save_file().await); + } } #[derive(Debug)] diff --git a/src-tauri/src/feat/clash.rs b/src-tauri/src/feat/clash.rs index 84f49b6d7..a133ab28d 100644 --- a/src-tauri/src/feat/clash.rs +++ b/src-tauri/src/feat/clash.rs @@ -25,6 +25,7 @@ pub async fn restart_clash_core() { /// Restart the application pub async fn restart_app() { utils::server::shutdown_embedded_server(); + Config::apply_all_and_save_file().await; if let Err(err) = resolve::resolve_reset_async().await { handle::Handle::notice_message( "restart_app::error", diff --git a/src-tauri/src/feat/window.rs b/src-tauri/src/feat/window.rs index b54ae5666..fe1d7848b 100644 --- a/src-tauri/src/feat/window.rs +++ b/src-tauri/src/feat/window.rs @@ -4,6 +4,7 @@ use crate::module::lightweight; use crate::utils; use crate::utils::window_manager::WindowManager; use clash_verge_logging::{Type, logging}; +use tokio::time::{Duration, timeout}; /// Public API: open or close the dashboard pub async fn open_or_close_dashboard() { @@ -20,6 +21,7 @@ async fn open_or_close_dashboard_internal() { pub async fn quit() { logging!(debug, Type::System, "启动退出流程"); utils::server::shutdown_embedded_server(); + Config::apply_all_and_save_file().await; // 获取应用句柄并设置退出标志 let app_handle = handle::Handle::app_handle(); @@ -38,8 +40,6 @@ pub async fn quit() { } pub async fn clean_async() -> bool { - use tokio::time::{Duration, timeout}; - logging!(info, Type::System, "开始执行异步清理操作..."); // 1. 处理TUN模式 diff --git a/src-tauri/src/utils/resolve/mod.rs b/src-tauri/src/utils/resolve/mod.rs index 1f03e279b..cf32cb434 100644 --- a/src-tauri/src/utils/resolve/mod.rs +++ b/src-tauri/src/utils/resolve/mod.rs @@ -139,7 +139,7 @@ pub(super) fn init_signal() { clash_verge_signal::register( #[cfg(windows)] handle::Handle::app_handle(), - feat::clean_async, + feat::quit, ); }