From a489012a0cb1b450e55878f8bf9f4d3a0d833f9e Mon Sep 17 00:00:00 2001 From: wonfen Date: Wed, 26 Feb 2025 00:36:02 +0800 Subject: [PATCH] feat: Add window state monitoring and auto-save in real-time --- src-tauri/src/feat.rs | 31 ++++++++++++++++++++++++++++++- src-tauri/src/utils/resolve.rs | 3 +++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index c03a5102..b0749dc7 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -85,11 +85,40 @@ pub fn restart_app() { resolve::resolve_reset(); let app_handle = handle::Handle::global().app_handle().unwrap(); std::thread::sleep(std::time::Duration::from_secs(1)); - let _ = app_handle.save_window_state(StateFlags::default()); tauri::process::restart(&app_handle.env()); }); } +/// 设置窗口状态监控,实时保存窗口位置和大小 +pub fn setup_window_state_monitor(app_handle: &tauri::AppHandle) { + let window = app_handle.get_webview_window("main").unwrap(); + let app_handle_clone = app_handle.clone(); + + // 监听窗口移动事件 + let app_handle_move = app_handle_clone.clone(); + window.on_window_event(move |event| { + match event { + // 窗口移动时保存状态 + tauri::WindowEvent::Moved(_) => { + let _ = app_handle_move.save_window_state(StateFlags::all()); + }, + // 窗口调整大小时保存状态 + tauri::WindowEvent::Resized(_) => { + let _ = app_handle_move.save_window_state(StateFlags::all()); + }, + // 其他可能改变窗口状态的事件 + tauri::WindowEvent::ScaleFactorChanged { .. } => { + let _ = app_handle_move.save_window_state(StateFlags::all()); + }, + // 窗口关闭时保存 + tauri::WindowEvent::CloseRequested { .. } => { + let _ = app_handle_move.save_window_state(StateFlags::all()); + }, + _ => {} + } + }); +} + // 切换模式 rule/global/direct/script mode pub fn change_clash_mode(mode: String) { let mut mapping = Mapping::new(); diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index 7afcf356..9203d4c0 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -196,6 +196,9 @@ pub fn create_window() { log::info!(target: "app", "Window created successfully, attempting to show"); let _ = window.show(); let _ = window.set_focus(); + + // 设置窗口状态监控,实时保存窗口位置和大小 + crate::feat::setup_window_state_monitor(&app_handle); } Err(e) => { println!("Failed to create window: {:?}", e);