From 32008b93640050110decc1eaa3e3d274c7fc25cf Mon Sep 17 00:00:00 2001 From: wonfen Date: Fri, 16 May 2025 17:22:53 +0800 Subject: [PATCH] fix: update main window creation logic with improved logging and UI readiness handling --- src-tauri/src/utils/resolve.rs | 156 ++++++++++++++++++++------------- 1 file changed, 94 insertions(+), 62 deletions(-) diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index 08b3caa1..b37df470 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -302,8 +302,8 @@ pub fn create_window(is_show: bool) -> bool { .visible(false) .build() { - Ok(_) => { - logging!(info, Type::Window, true, "主窗口创建成功"); + Ok(newly_created_window) => { + logging!(debug, Type::Window, true, "主窗口实例创建成功"); *creating = (false, Instant::now()); @@ -311,82 +311,114 @@ pub fn create_window(is_show: bool) -> bool { AsyncHandler::spawn(move || async move { handle::Handle::global().mark_startup_completed(); - logging!(info, Type::Window, true, "标记启动完成"); + logging!( + debug, + Type::Window, + true, + "异步窗口任务开始 (启动已标记完成)" + ); - if let Some(app_handle) = handle::Handle::global().app_handle() { - if let Some(window) = app_handle.get_webview_window("main") { - let _ = window.emit("verge://startup-completed", ()); - logging!(info, Type::Window, true, "已发送启动完成事件"); + if is_show { + let window_clone = newly_created_window.clone(); - if is_show { - let window_clone = window.clone(); + // Attempt to show and focus the window first. + let _ = window_clone.show(); + let _ = window_clone.set_focus(); + logging!(debug, Type::Window, true, "窗口已尝试显示和聚焦"); - let timeout_seconds = - if crate::module::lightweight::is_in_lightweight_mode() { - 2 - } else { - 5 - }; + tokio::time::sleep(Duration::from_millis(100)).await; // Crucial delay + logging!( + debug, + Type::Window, + true, + "延时后,尝试发送 verge://startup-completed 事件" + ); + if let Err(e) = newly_created_window.emit("verge://startup-completed", ()) { + logging!( + error, + Type::Window, + true, + "发送 verge://startup-completed 事件失败: {}", + e + ); + } else { + logging!( + info, + Type::Window, + true, + "已发送 verge://startup-completed 事件" + ); + } + + let timeout_seconds = if crate::module::lightweight::is_in_lightweight_mode() { + 2 + } else { + 5 + }; + + logging!( + info, + Type::Window, + true, + "等待UI就绪 (最多{}秒)...", + timeout_seconds + ); + + let wait_result = + tokio::time::timeout(Duration::from_secs(timeout_seconds), async { + while !*get_ui_ready().read() { + tokio::time::sleep(Duration::from_millis(100)).await; + } + }) + .await; + + match wait_result { + Ok(_) => { + logging!(info, Type::Window, true, "UI就绪"); + } + Err(_) => { logging!( - info, + warn, Type::Window, true, - "等待UI就绪,最多{}秒", + "等待UI就绪超时({}秒),强制标记就绪", timeout_seconds ); - - let wait_result = - tokio::time::timeout(Duration::from_secs(timeout_seconds), async { - let mut check_count = 0; - while !*get_ui_ready().read() { - check_count += 1; - if check_count % 10 == 0 { - let state = get_ui_ready_state(); - let stage = *state.stage.read(); - logging!( - info, - Type::Window, - true, - "等待UI就绪中... 当前阶段: {:?}, 已等待: {}ms", - stage, - check_count * 100 - ); - } - tokio::time::sleep(Duration::from_millis(100)).await; - } - }) - .await; - - match wait_result { - Ok(_) => { - logging!(info, Type::Window, true, "UI就绪,显示窗口"); - } - Err(_) => { - logging!( - warn, - Type::Window, - true, - "等待UI就绪超时({}秒),强制显示窗口", - timeout_seconds - ); - - *get_ui_ready().write() = true; - } - } - - let _ = window_clone.show(); - let _ = window_clone.set_focus(); - - logging!(info, Type::Window, true, "窗口创建和显示流程已完成"); + *get_ui_ready().write() = true; } } + logging!(info, Type::Window, true, "窗口显示流程完成"); + } else { + logging!( + debug, + Type::Window, + true, + "is_show为false,窗口保持隐藏。尝试发送启动事件。" + ); + if let Err(e) = newly_created_window.emit("verge://startup-completed", ()) { + logging!( + warn, + Type::Window, + true, + "发送 verge://startup-completed 事件失败 (is_show=false, 窗口隐藏): {}", + e + ); + } else { + logging!( + debug, + Type::Window, + true, + "已发送 verge://startup-completed 事件 (is_show=false, 窗口隐藏)" + ); + } } }); true } Err(e) => { - logging!(error, Type::Window, true, "Failed to create window: {}", e); + logging!(error, Type::Window, true, "主窗口构建失败: {}", e); + *creating = (false, Instant::now()); // Reset the creating state if window creation failed false } }