From 0ec7d224a28d4cfecf39706eb3d9593d7dfb32dd Mon Sep 17 00:00:00 2001 From: Alex Blank Date: Tue, 25 Aug 2026 23:17:50 +0200 Subject: [PATCH] fix(quick-pane): serialize native visibility --- ui/src-tauri/src/lib.rs | 52 +++++++++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 12 deletions(-) diff --git a/ui/src-tauri/src/lib.rs b/ui/src-tauri/src/lib.rs index 5c02764..50ca085 100644 --- a/ui/src-tauri/src/lib.rs +++ b/ui/src-tauri/src/lib.rs @@ -9,6 +9,7 @@ use tauri::{ }; struct LegacySubscription(Mutex>>); +struct QuickPaneVisibility(Mutex); struct WorkspaceSubscription { generation: Arc, task: Mutex>>, @@ -64,9 +65,9 @@ fn should_hide_close_request(label: &str) -> bool { label == "quick-pane" } -fn get_or_create_quick_pane(app: &AppHandle) -> Result { +fn get_or_create_quick_pane(app: &AppHandle) -> Result<(WebviewWindow, bool), String> { if let Some(window) = app.get_webview_window("quick-pane") { - return Ok(window); + return Ok((window, false)); } let config = app .config() @@ -75,31 +76,47 @@ fn get_or_create_quick_pane(app: &AppHandle) -> Result { .iter() .find(|window| window.label == "quick-pane") .ok_or_else(|| "Quick Pane window configuration is missing".to_owned())?; - WebviewWindowBuilder::from_config(app, config) + let window = WebviewWindowBuilder::from_config(app, config) .map_err(|error| error.to_string())? .build() - .map_err(|error| error.to_string()) + .map_err(|error| error.to_string())?; + Ok((window, true)) } fn toggle_quick_pane(app: &AppHandle) { - let window = match get_or_create_quick_pane(app) { - Ok(window) => window, + let (window, created) = match get_or_create_quick_pane(app) { + Ok(result) => result, Err(error) => { eprintln!("Could not create Quick Pane window: {error}"); return; } }; - match quick_pane_action(window.is_visible().unwrap_or(false)) { + let Some(state) = app.try_state::() else { + eprintln!("Quick Pane visibility state is unavailable"); + return; + }; + let mut current = state + .0 + .lock() + .unwrap_or_else(|poisoned| poisoned.into_inner()); + if created { + *current = false; + } + match quick_pane_action(*current) { WindowAction::Hide => { - let _ = window.hide(); + if window.hide().is_ok() { + *current = false; + } } WindowAction::ShowAndFocus => { if let Some(main) = app.get_webview_window("main") { let _ = main.hide(); } - let _ = window.show(); - let _ = window.unminimize(); - let _ = window.set_focus(); + if window.show().is_ok() { + *current = true; + let _ = window.unminimize(); + let _ = window.set_focus(); + } } } } @@ -426,6 +443,7 @@ pub fn run() { let builder = tauri::Builder::default() .plugin(tauri_plugin_dialog::init()) .manage(LegacySubscription(Mutex::new(None))) + .manage(QuickPaneVisibility(Mutex::new(false))) .manage(WorkspaceSubscription { generation: Arc::new(bridge::SubscriptionGeneration::default()), task: Mutex::new(None), @@ -452,7 +470,17 @@ pub fn run() { if should_hide_close_request(window.label()) { if let WindowEvent::CloseRequested { api, .. } = event { api.prevent_close(); - let _ = window.hide(); + if let Some(state) = window.app_handle().try_state::() { + let mut current = state + .0 + .lock() + .unwrap_or_else(|poisoned| poisoned.into_inner()); + if window.hide().is_ok() { + *current = false; + } + } else { + let _ = window.hide(); + } } } })