diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index f77da91e..067b7f69 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -20,12 +20,16 @@ use tauri_plugin_window_state::{AppHandleExt, StateFlags}; // 打开面板 pub fn open_or_close_dashboard() { if let Some(window) = handle::Handle::global().get_window() { - if let Ok(true) = window.is_focused() { + // 如果窗口存在,则切换其显示状态 + if window.is_visible().unwrap_or(false) { let _ = window.hide(); - return; + } else { + let _ = window.show(); + let _ = window.set_focus(); } + } else { + resolve::create_window(); } - resolve::create_window(); } // 重启clash diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index 8e6a23af..11402318 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -37,7 +37,7 @@ pub fn find_unused_port() -> Result { /// handle something when start app pub async fn resolve_setup(app: &mut App) { error::redirect_panic_to_log(); - // #[cfg(target_os = "macos")] + #[cfg(target_os = "macos")] app.set_activation_policy(tauri::ActivationPolicy::Accessory); let version = app.package_info().version.to_string(); @@ -128,7 +128,29 @@ pub fn create_window() { return; } - let builder = tauri::WebviewWindowBuilder::new( + #[cfg(target_os = "windows")] + let window = { + let app_handle = app_handle.clone(); + std::thread::spawn(move || { + tauri::WebviewWindowBuilder::new( + &app_handle, + "main".to_string(), + tauri::WebviewUrl::App("index.html".into()), + ) + .title("Clash Verge") + .visible(false) + .fullscreen(false) + .min_inner_size(600.0, 520.0) + .decorations(false) + .maximizable(true) + .additional_browser_args("--enable-features=msWebView2EnableDraggableRegions --disable-features=OverscrollHistoryNavigation,msExperimentalScrolling") + .transparent(true) + .build() + }).join().unwrap() + }.unwrap(); + + #[cfg(not(target_os = "windows"))] + let window = tauri::WebviewWindowBuilder::new( &app_handle, "main".to_string(), tauri::WebviewUrl::App("index.html".into()), @@ -136,31 +158,9 @@ pub fn create_window() { .title("Clash Verge") .visible(false) .fullscreen(false) - .min_inner_size(600.0, 520.0); - - #[cfg(target_os = "windows")] - let window = builder - .decorations(false) - .maximizable(true) - .additional_browser_args("--enable-features=msWebView2EnableDraggableRegions --disable-features=OverscrollHistoryNavigation,msExperimentalScrolling") - .transparent(true) - .visible(false) - .build().unwrap(); - - #[cfg(target_os = "macos")] - let window = builder - .decorations(true) - .hidden_title(true) - .title_bar_style(tauri::TitleBarStyle::Overlay) - .build() - .unwrap(); - - #[cfg(target_os = "linux")] - let window = builder - .decorations(false) - .transparent(true) - .build() - .unwrap(); + .min_inner_size(600.0, 520.0) + .build() + .unwrap(); match window.restore_state(StateFlags::all()) { Ok(_) => { @@ -169,12 +169,14 @@ pub fn create_window() { Err(e) => { log::error!(target: "app", "failed to restore window state: {}", e); #[cfg(target_os = "windows")] - window - .set_size(tauri::Size::Physical(tauri::PhysicalSize { - width: 800, - height: 636, - })) - .unwrap(); + { + window.clone().on_window_event(move |_event| { + let _ = window.set_size(tauri::Size::Physical(tauri::PhysicalSize { + width: 800, + height: 636, + })); + }); + } #[cfg(not(target_os = "windows"))] window