workspace: Fix opening closed projects randomly when Zed restarts (#50961)

Closes #49854 

Before you mark this PR as ready for review, make sure that you have:
- [x] Added a solid test coverage and/or screenshots from doing manual
testing
- [x] Done a self-review taking into account security and performance
aspects
- [x] No UI changes

Video for the fix: 
in the video i open a project -> close the project -> quit out of zed ->
reopen zed -> zed opens to an empty workspace which was not the case
before


https://github.com/user-attachments/assets/1afb44a1-932b-4dab-8228-9d9d65750b6e



Release Notes:
 - Fixed closed projects re-opening erroneously
This commit is contained in:
Amaan authored and GitHub committed 2026-03-12 22:43:34 +00:00
1 parent 5e60aa9872
commit cc09611d0b
1 file changed
+44 -27
+44 -27
View File
@@ -1066,37 +1066,54 @@ fn register_actions(
})
.register_action({
let app_state = Arc::downgrade(&app_state);
move |_, _: &CloseProject, window, cx| {
move |_workspace, _: &CloseProject, window, cx| {
let Some(window_handle) = window.window_handle().downcast::<MultiWorkspace>() else {
return;
};
if let Some(app_state) = app_state.upgrade() {
open_new(
workspace::OpenOptions {
replace_window: Some(window_handle),
..Default::default()
},
app_state,
cx,
|workspace, window, cx| {
cx.activate(true);
// Create buffer synchronously to avoid flicker
let project = workspace.project().clone();
let buffer = project.update(cx, |project, cx| {
project.create_local_buffer("", None, true, cx)
});
let editor = cx.new(|cx| {
Editor::for_buffer(buffer, Some(project), window, cx)
});
workspace.add_item_to_active_pane(
Box::new(editor),
None,
true,
window,
cx,
);
},
)
cx.spawn_in(window, async move |this, cx| {
let should_continue = this
.update_in(cx, |workspace, window, cx| {
workspace.prepare_to_close(
CloseIntent::ReplaceWindow,
window,
cx,
)
})?
.await?;
if should_continue {
let task = cx.update(|_window, cx| {
open_new(
workspace::OpenOptions {
replace_window: Some(window_handle),
..Default::default()
},
app_state,
cx,
|workspace, window, cx| {
cx.activate(true);
let project = workspace.project().clone();
let buffer = project.update(cx, |project, cx| {
project.create_local_buffer("", None, true, cx)
});
let editor = cx.new(|cx| {
Editor::for_buffer(buffer, Some(project), window, cx)
});
workspace.add_item_to_active_pane(
Box::new(editor),
None,
true,
window,
cx,
);
},
)
})?;
task.await
} else {
Ok(())
}
})
.detach_and_log_err(cx);
}
}