From f5aa07aac9bd2999582c2e501f6921bafbdfe69c Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Tue, 2 Nov 2021 14:55:31 +0100 Subject: [PATCH] Remove all windows before quitting This gives all entities a chance of running `Drop::drop` which, in turn, could cause them to spawn a critical task. For example, we use this capability when a language server is dropped and we need to asynchronously send a shutdown message. --- crates/gpui/src/app.rs | 7 +++++++ crates/zed/src/main.rs | 1 + 2 files changed, 8 insertions(+) diff --git a/crates/gpui/src/app.rs b/crates/gpui/src/app.rs index ed2759aa0ccb88939cfc63ea3f7e4a6a960be289..a7675470f5b151cea17d63b30a94e8284dd34970 100644 --- a/crates/gpui/src/app.rs +++ b/crates/gpui/src/app.rs @@ -1230,6 +1230,13 @@ impl MutableAppContext { self.remove_dropped_entities(); } + pub fn remove_all_windows(&mut self) { + for (window_id, _) in self.cx.windows.drain() { + self.presenters_and_platform_windows.remove(&window_id); + } + self.remove_dropped_entities(); + } + fn open_platform_window(&mut self, window_id: usize, window_options: WindowOptions) { let mut window = self.cx diff --git a/crates/zed/src/main.rs b/crates/zed/src/main.rs index 2107a3660fcffe716eca3089d8b9cc42b6ec7150..0fb111693ae2927221487efe291e0214554b8a48 100644 --- a/crates/zed/src/main.rs +++ b/crates/zed/src/main.rs @@ -30,6 +30,7 @@ fn main() { languages.set_theme(&settings.borrow().theme.editor.syntax); app.on_quit(|cx| { + cx.remove_all_windows(); let did_finish = cx .background() .block_on_critical_tasks(Duration::from_millis(100));