From c1ca7ad41d685a0f1a51f9b3943277ca007561d2 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Thu, 2 Nov 2023 13:37:55 +0100 Subject: [PATCH] Implement WindowContext::remove_window --- crates/gpui2/src/app.rs | 11 +++++++---- crates/gpui2/src/window.rs | 7 +++++++ crates/workspace2/src/workspace2.rs | 3 +-- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/crates/gpui2/src/app.rs b/crates/gpui2/src/app.rs index 5a6e36080291e03600674349332295e2e62a4c7f..463aac1c5903cf7643b8990126323685ca6917ad 100644 --- a/crates/gpui2/src/app.rs +++ b/crates/gpui2/src/app.rs @@ -789,10 +789,13 @@ impl Context for AppContext { let root_view = window.root_view.clone().unwrap(); let result = update(root_view, &mut WindowContext::new(cx, &mut window)); - cx.windows - .get_mut(handle.id) - .ok_or_else(|| anyhow!("window not found"))? - .replace(window); + + if !window.removed { + cx.windows + .get_mut(handle.id) + .ok_or_else(|| anyhow!("window not found"))? + .replace(window); + } Ok(result) }) diff --git a/crates/gpui2/src/window.rs b/crates/gpui2/src/window.rs index 0202b7521eebc36735077e3199f0322e25a80e91..055c31af16920003d6d32404bbcb0c073e327bba 100644 --- a/crates/gpui2/src/window.rs +++ b/crates/gpui2/src/window.rs @@ -159,6 +159,7 @@ impl Drop for FocusHandle { // Holds the state for a specific window. pub struct Window { pub(crate) handle: AnyWindowHandle, + pub(crate) removed: bool, platform_window: Box, display_id: DisplayId, sprite_atlas: Arc, @@ -229,6 +230,7 @@ impl Window { Window { handle, + removed: false, platform_window, display_id, sprite_atlas, @@ -320,6 +322,11 @@ impl<'a> WindowContext<'a> { self.window.dirty = true; } + /// Close this window. + pub fn remove_window(&mut self) { + self.window.removed = true; + } + /// Obtain a new `FocusHandle`, which allows you to track and manipulate the keyboard focus /// for elements rendered within this window. pub fn focus_handle(&mut self) -> FocusHandle { diff --git a/crates/workspace2/src/workspace2.rs b/crates/workspace2/src/workspace2.rs index 3f550e64c31b61985aedcf1758014f3722270651..3f59312b116f9f057877126308797667b2bc27a7 100644 --- a/crates/workspace2/src/workspace2.rs +++ b/crates/workspace2/src/workspace2.rs @@ -621,8 +621,7 @@ impl Workspace { } project2::Event::Closed => { - // todo!() - // cx.remove_window(); + cx.remove_window(); } project2::Event::DeletedEntry(entry_id) => {