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:
1 parent
5e60aa9872
commit
cc09611d0b
1 file changed
+44
-27
+44
-27
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user