Fix save_last_workspace (#41907)

Closes #37348

Release Notes:

- Fixed last workspace window restoration on linux/windows
This commit is contained in:
localcc
2025-11-04 18:47:49 +01:00
committed by GitHub
parent d8655f0656
commit 38cd16aad9
+30 -5
View File
@@ -1179,6 +1179,7 @@ pub struct Workspace {
session_id: Option<String>,
scheduled_tasks: Vec<Task<()>>,
last_open_dock_positions: Vec<DockPosition>,
removing: bool,
}
impl EventEmitter<Event> for Workspace {}
@@ -1522,6 +1523,7 @@ impl Workspace {
scheduled_tasks: Vec::new(),
last_open_dock_positions: Vec::new(),
removing: false,
}
}
@@ -2335,12 +2337,13 @@ impl Workspace {
) -> Task<Result<bool>> {
let active_call = self.active_call().cloned();
// On Linux and Windows, closing the last window should restore the last workspace.
let save_last_workspace = cfg!(not(target_os = "macos"))
&& close_intent != CloseIntent::ReplaceWindow
&& cx.windows().len() == 1;
cx.spawn_in(window, async move |this, cx| {
this.update(cx, |this, _| {
if close_intent == CloseIntent::CloseWindow {
this.removing = true;
}
})?;
let workspace_count = cx.update(|_window, cx| {
cx.windows()
.iter()
@@ -2348,6 +2351,28 @@ impl Workspace {
.count()
})?;
#[cfg(target_os = "macos")]
let save_last_workspace = false;
// On Linux and Windows, closing the last window should restore the last workspace.
#[cfg(not(target_os = "macos"))]
let save_last_workspace = {
let remaining_workspaces = cx.update(|_window, cx| {
cx.windows()
.iter()
.filter_map(|window| window.downcast::<Workspace>())
.filter_map(|workspace| {
workspace
.update(cx, |workspace, _, _| workspace.removing)
.ok()
})
.filter(|removing| !removing)
.count()
})?;
close_intent != CloseIntent::ReplaceWindow && remaining_workspaces == 0
};
if let Some(active_call) = active_call
&& workspace_count == 1
&& active_call.read_with(cx, |call, _| call.room().is_some())?