From 96ba44613d063d17871e15602d310b3d4e916a03 Mon Sep 17 00:00:00 2001 From: Wind-Explorer Date: Sun, 4 Jan 2026 17:56:36 +0800 Subject: [PATCH] fix windows threadding ccm window bug --- src-tauri/src/lib.rs | 2 +- .../src/services/client_config_manager.rs | 42 +++++++++++++++---- src-tauri/src/services/health_manager.rs | 8 ++++ src/routes/health-manager/+page.svelte | 11 ++++- 4 files changed, 54 insertions(+), 9 deletions(-) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 43de6b4..3adff88 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -364,7 +364,7 @@ fn save_client_config(config: AppConfig) -> Result<(), String> { } #[tauri::command] -fn open_client_config_manager() -> Result<(), String> { +async fn open_client_config_manager() -> Result<(), String> { open_config_manager_window().map_err(|e| e.to_string()) } diff --git a/src-tauri/src/services/client_config_manager.rs b/src-tauri/src/services/client_config_manager.rs index ecc6f7e..18bc80f 100644 --- a/src-tauri/src/services/client_config_manager.rs +++ b/src-tauri/src/services/client_config_manager.rs @@ -3,7 +3,7 @@ use std::{fs, path::PathBuf}; use serde::{Deserialize, Serialize}; use tauri::Manager; use thiserror::Error; -use tracing::{error, info, warn}; +use tracing::{error, warn}; use url::Url; use crate::get_app_handle; @@ -28,6 +28,8 @@ pub enum ClientConfigError { Io(#[from] std::io::Error), #[error("failed to parse client config: {0}")] Parse(#[from] serde_json::Error), + #[error("failed to run on main thread: {0}")] + Dispatch(#[from] tauri::Error), #[error("failed to build client config manager window: {0}")] Window(tauri::Error), #[error("failed to show client config manager window: {0}")] @@ -78,8 +80,8 @@ fn sanitize(mut config: AppConfig) -> AppConfig { .map(|v| strip_trailing_slash(&v)); let auth_url_trimmed = config.auth.auth_url.trim(); - config.auth.auth_url = parse_http_url(auth_url_trimmed) - .unwrap_or_else(|| DEFAULT_AUTH_URL.to_string()); + config.auth.auth_url = + parse_http_url(auth_url_trimmed).unwrap_or_else(|| DEFAULT_AUTH_URL.to_string()); if config.auth.audience.trim().is_empty() { config.auth.audience = DEFAULT_JWT_AUDIENCE.to_string(); @@ -149,6 +151,24 @@ pub fn save_app_config(config: AppConfig) -> Result Result<(), ClientConfigError> { let app_handle = get_app_handle(); + + // Directly run on main thread via dispatch but handle errors properly + // This is essentially what we did but let's simplify and make sure we don't block + let handle_for_closure = app_handle.clone(); + + // We want to return immediately, the window creation happens asynchronously on main thread + let _ = app_handle.run_on_main_thread(move || { + if let Err(e) = open_config_manager_window_inner(&handle_for_closure) { + error!("Failed to open client config manager window: {e}"); + } + }); + + Ok(()) +} + +fn open_config_manager_window_inner( + app_handle: &tauri::AppHandle, +) -> Result<(), ClientConfigError> { let existing_webview_window = app_handle.get_window(CLIENT_CONFIG_MANAGER_WINDOW_LABEL); if let Some(window) = existing_webview_window { @@ -156,10 +176,12 @@ pub fn open_config_manager_window() -> Result<(), ClientConfigError> { error!("Failed to show client config manager window: {e}"); return Err(ClientConfigError::ShowWindow(e)); } + if let Err(e) = window.set_focus() { + error!("Failed to focus client config manager window: {e}"); + } return Ok(()); } - info!("Starting client config manager..."); match tauri::WebviewWindowBuilder::new( app_handle, CLIENT_CONFIG_MANAGER_WINDOW_LABEL, @@ -167,11 +189,17 @@ pub fn open_config_manager_window() -> Result<(), ClientConfigError> { ) .title("Friendolls Client Config Manager") .inner_size(600.0, 500.0) + .visible(false) .build() { - Ok(_) => { - info!("Client config manager window builder succeeded"); - info!("Client config manager window initialized successfully."); + Ok(window) => { + if let Err(e) = window.show() { + error!("Failed to show client config manager window: {}", e); + return Err(ClientConfigError::ShowWindow(e)); + } + if let Err(e) = window.set_focus() { + error!("Failed to focus client config manager window: {e}"); + } Ok(()) } Err(e) => { diff --git a/src-tauri/src/services/health_manager.rs b/src-tauri/src/services/health_manager.rs index 661350f..5475b05 100644 --- a/src-tauri/src/services/health_manager.rs +++ b/src-tauri/src/services/health_manager.rs @@ -10,9 +10,14 @@ pub static HEALTH_MANAGER_EVENT: &str = "health-error"; fn close_window_if_exists(label: &str) { let app_handle = get_app_handle(); if let Some(window) = app_handle.get_window(label) { + info!("Closing window with label: {}", label); if let Err(e) = window.close() { error!("Failed to close {} window: {}", label, e); + } else { + info!("Closed window with label: {}", label); } + } else { + info!("No window found with label: {}", label); } } @@ -46,6 +51,7 @@ pub fn show_health_manager_with_error(error_message: Option) { return; } + info!("Building health manager window"); let webview_window = match tauri::WebviewWindowBuilder::new( app_handle, HEALTH_MANAGER_WINDOW_LABEL, @@ -95,6 +101,8 @@ pub fn show_health_manager_with_error(error_message: Option) { ) .kind(MessageDialogKind::Error) .show(|_| {}); + } else { + info!("Health manager window shown successfully"); } } diff --git a/src/routes/health-manager/+page.svelte b/src/routes/health-manager/+page.svelte index af16abf..ca4cafc 100644 --- a/src/routes/health-manager/+page.svelte +++ b/src/routes/health-manager/+page.svelte @@ -56,7 +56,16 @@ Try again {/if} -