Always prevent window from closing and manually invoke Workspace::close

Antonio Scandurra created

This ensures we ask the user to save their state if there are unsaved
changes.

Change summary

crates/workspace/src/workspace.rs | 6 +++++-
crates/zed/src/zed.rs             | 7 +++++++
2 files changed, 12 insertions(+), 1 deletion(-)

Detailed changes

crates/workspace/src/workspace.rs 🔗

@@ -907,7 +907,11 @@ impl Workspace {
         }
     }
 
-    fn close(&mut self, _: &CloseWindow, cx: &mut ViewContext<Self>) -> Option<Task<Result<()>>> {
+    pub fn close(
+        &mut self,
+        _: &CloseWindow,
+        cx: &mut ViewContext<Self>,
+    ) -> Option<Task<Result<()>>> {
         let prepare = self.prepare_to_close(cx);
         Some(cx.spawn(|this, mut cx| async move {
             if prepare.await? {

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> {