From d9b5357234db1d449468e11bc9d33ceb09e6a5c8 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Thu, 23 Jun 2022 11:44:14 +0200 Subject: [PATCH] Always prevent window from closing and manually invoke Workspace::close This ensures we ask the user to save their state if there are unsaved changes. --- crates/workspace/src/workspace.rs | 6 +++++- crates/zed/src/zed.rs | 7 +++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index 55da35ca85..0a7c0c1e82 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -907,7 +907,11 @@ impl Workspace { } } - fn close(&mut self, _: &CloseWindow, cx: &mut ViewContext) -> Option>> { + pub fn close( + &mut self, + _: &CloseWindow, + cx: &mut ViewContext, + ) -> Option>> { let prepare = self.prepare_to_close(cx); Some(cx.spawn(|this, mut cx| async move { if prepare.await? { diff --git a/crates/zed/src/zed.rs b/crates/zed/src/zed.rs index bfccd42b6b..35981bda0b 100644 --- a/crates/zed/src/zed.rs +++ b/crates/zed/src/zed.rs @@ -222,6 +222,13 @@ pub fn initialize_workspace( }); auto_update::notify_of_any_new_update(cx.weak_handle(), cx); + + cx.on_window_should_close(|workspace, cx| { + if let Some(task) = workspace.close(&Default::default(), cx) { + task.detach_and_log_err(cx); + } + false + }); } pub fn build_window_options() -> WindowOptions<'static> {