From a266acc5d44f8b6e8319d0f49889c2ee0e13d6e6 Mon Sep 17 00:00:00 2001 From: Leafd Date: Fri, 10 Oct 2025 15:36:20 -0400 Subject: [PATCH] fix: app now hides on closing --- src-tauri/src/lib.rs | 14 +++++++++----- src-tauri/src/tray.rs | 9 +++++++++ src-tauri/src/window.rs | 13 +++++++++++++ 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index c55a73b..5acbfaa 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -71,6 +71,9 @@ pub fn run() { push_log("info", "backend", format!("Single instance detected. Args: {:?}, CWD: {}", args, cwd)); if let Some(window) = app.get_webview_window("main") { + #[cfg(target_os = "macos")] + let _ = app.set_activation_policy(tauri::ActivationPolicy::Regular); + let _ = window.show(); let _ = window.set_focus(); push_log("info", "backend", "Brought existing window to front".to_string()); @@ -306,22 +309,23 @@ pub fn run() { push_log("info", "backend", "🪟 Window close requested - hiding to tray".to_string()); api.prevent_close(); - // Use the app handle to get the window and hide it asynchronously - // This prevents potential re-entrancy issues let app_clone = app_handle.clone(); std::thread::spawn(move || { if let Some(win) = app_clone.get_webview_window("main") { let _ = win.hide(); push_log("info", "backend", "✅ Window hidden to tray".to_string()); + + #[cfg(target_os = "macos")] + { + let _ = app_clone.set_activation_policy(tauri::ActivationPolicy::Accessory); + push_log("info", "backend", "✅ App removed from Dock".to_string()); + } } }); } WindowEvent::Resized(_) => { - // Handle resize events gracefully - no action needed - // This prevents potential crashes on macOS with transparent windows } WindowEvent::Moved(_) => { - // Handle move events gracefully } _ => {} } diff --git a/src-tauri/src/tray.rs b/src-tauri/src/tray.rs index 2a5e78d..12e1675 100644 --- a/src-tauri/src/tray.rs +++ b/src-tauri/src/tray.rs @@ -54,7 +54,12 @@ pub fn setup_tray(app: &AppHandle) -> Result<(), Box> { if let Some(window) = app.get_webview_window("main") { if window.is_visible().unwrap_or(false) { let _ = window.hide(); + #[cfg(target_os = "macos")] + let _ = app.set_activation_policy(tauri::ActivationPolicy::Accessory); } else { + #[cfg(target_os = "macos")] + let _ = app.set_activation_policy(tauri::ActivationPolicy::Regular); + let _ = window.show(); let _ = window.set_focus(); } @@ -65,6 +70,10 @@ pub fn setup_tray(app: &AppHandle) -> Result<(), Box> { .. } => { let app = tray.app_handle(); + + #[cfg(target_os = "macos")] + let _ = app.set_activation_policy(tauri::ActivationPolicy::Regular); + if let Some(window) = app.get_webview_window("main") { let _ = window.show(); let _ = window.set_focus(); diff --git a/src-tauri/src/window.rs b/src-tauri/src/window.rs index 71620d3..f43f5ff 100644 --- a/src-tauri/src/window.rs +++ b/src-tauri/src/window.rs @@ -2,6 +2,9 @@ use tauri::Manager; #[tauri::command] pub async fn show_window(app: tauri::AppHandle) -> Result<(), String> { + #[cfg(target_os = "macos")] + let _ = app.set_activation_policy(tauri::ActivationPolicy::Regular); + if let Some(window) = app.get_webview_window("main") { window .show() @@ -20,6 +23,10 @@ pub async fn hide_window(app: tauri::AppHandle) -> Result<(), String> { .hide() .map_err(|e| format!("Failed to hide window: {}", e))?; } + + #[cfg(target_os = "macos")] + let _ = app.set_activation_policy(tauri::ActivationPolicy::Accessory); + Ok(()) } @@ -30,7 +37,13 @@ pub async fn toggle_window(app: tauri::AppHandle) -> Result<(), String> { window .hide() .map_err(|e| format!("Failed to hide window: {}", e))?; + + #[cfg(target_os = "macos")] + let _ = app.set_activation_policy(tauri::ActivationPolicy::Accessory); } else { + #[cfg(target_os = "macos")] + let _ = app.set_activation_policy(tauri::ActivationPolicy::Regular); + window .show() .map_err(|e| format!("Failed to show window: {}", e))?;