diff --git a/nebula_app/src/gpui_shell/mod.rs b/nebula_app/src/gpui_shell/mod.rs index ec693e4..483a8d5 100644 --- a/nebula_app/src/gpui_shell/mod.rs +++ b/nebula_app/src/gpui_shell/mod.rs @@ -263,6 +263,11 @@ pub(crate) fn reveal_native_window(window: &gpui::Window) { pub(crate) fn reveal_all_windows(cx: &mut App) { cx.defer(|cx| { for handle in cx.windows() { + // 快速终端由自己的显隐状态机管理;托盘设置变化只能恢复普通窗口, + // 否则一个已向上收起的 Quake 窗口会在后台被无动画地重新显示。 + if workspace::windowing::is_quick_terminal_window(handle, cx) { + continue; + } if let Err(err) = handle.update(cx, |_, window, _| { reveal_native_window(window); }) { diff --git a/nebula_app/src/gpui_shell/workspace/windowing.rs b/nebula_app/src/gpui_shell/workspace/windowing.rs index b3eda18..f037a51 100644 --- a/nebula_app/src/gpui_shell/workspace/windowing.rs +++ b/nebula_app/src/gpui_shell/workspace/windowing.rs @@ -203,7 +203,14 @@ pub(crate) fn initialize(cx: &mut App, runtime_hub: crate::runtime_api::RuntimeH }); let closed_subscription = cx.on_window_closed(|cx, _window_id| { prune_entries(cx); - if !cx.global::().entries.is_empty() { + // 快速终端不能改变普通 session 的生命周期:最后一扇普通窗口关闭后, + // 即使隐藏的 Quake 窗口仍存活,也不能再补写一份空的普通 session。 + if cx + .global::() + .entries + .iter() + .any(|entry| entry.role == WindowRole::Regular) + { save_combined_session(cx, false); } }); @@ -1218,7 +1225,9 @@ pub(crate) fn close_empty_workspace_window( cx: &mut App, ) { unregister(runtime_window_id, cx); - if cx.global::().entries.is_empty() { + let has_regular_window = + cx.global::().entries.iter().any(|entry| entry.role == WindowRole::Regular); + if !has_regular_window { let mut empty = crate::session::Session::new(0, Vec::new()); crate::session::save_final(&mut empty); } else {