diff --git a/crates/gpui2/src/window.rs b/crates/gpui2/src/window.rs index cc435bf0b2..07be281f0a 100644 --- a/crates/gpui2/src/window.rs +++ b/crates/gpui2/src/window.rs @@ -273,6 +273,7 @@ pub struct Window { pub(crate) drawing: bool, activation_observers: SubscriberSet<(), AnyObserver>, pub(crate) focus: Option, + focus_enabled: bool, #[cfg(any(test, feature = "test-support"))] pub(crate) focus_invalidated: bool, @@ -420,6 +421,7 @@ impl Window { drawing: false, activation_observers: SubscriberSet::new(), focus: None, + focus_enabled: true, #[cfg(any(test, feature = "test-support"))] focus_invalidated: false, @@ -496,7 +498,7 @@ impl<'a> WindowContext<'a> { /// Move focus to the element associated with the given `FocusHandle`. pub fn focus(&mut self, handle: &FocusHandle) { - if self.window.focus == Some(handle.id) { + if !self.window.focus_enabled || self.window.focus == Some(handle.id) { return; } @@ -516,10 +518,19 @@ impl<'a> WindowContext<'a> { /// Remove focus from all elements within this context's window. pub fn blur(&mut self) { + if !self.window.focus_enabled { + return; + } + self.window.focus = None; self.notify(); } + pub fn disable_focus(&mut self) { + self.blur(); + self.window.focus_enabled = false; + } + pub fn dispatch_action(&mut self, action: Box) { let focus_handle = self.focused(); diff --git a/crates/workspace2/src/workspace2.rs b/crates/workspace2/src/workspace2.rs index 95b05f314e..a5acd1c1c7 100644 --- a/crates/workspace2/src/workspace2.rs +++ b/crates/workspace2/src/workspace2.rs @@ -502,7 +502,7 @@ impl Workspace { project::Event::DisconnectedFromHost => { this.update_window_edited(cx); - cx.blur(); + cx.disable_focus(); } project::Event::Closed => {