fix(config): restart and quit application or shutdown system can not remember user's behavior #5347, #5359, #5430

This commit is contained in:
Tunglies
2025-11-20 15:57:54 +08:00
parent e42ae0e8c5
commit 131cd6c3b8
4 changed files with 20 additions and 3 deletions

View File

@@ -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)]

View File

@@ -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",

View File

@@ -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模式

View File

@@ -139,7 +139,7 @@ pub(super) fn init_signal() {
clash_verge_signal::register(
#[cfg(windows)]
handle::Handle::app_handle(),
feat::clean_async,
feat::quit,
);
}