diff --git a/crates/workspace/src/multi_workspace.rs b/crates/workspace/src/multi_workspace.rs index a61ad3576c57ecd8b1811363d6b5607ead737821..1b057e3fb1e3b5e0639e4a44462fc7528f6db85d 100644 --- a/crates/workspace/src/multi_workspace.rs +++ b/crates/workspace/src/multi_workspace.rs @@ -276,6 +276,7 @@ pub struct MultiWorkspace { pending_removal_tasks: Vec>, _serialize_task: Option>, _subscriptions: Vec, + previous_focus_handle: Option, } impl EventEmitter for MultiWorkspace {} @@ -333,6 +334,7 @@ impl MultiWorkspace { quit_subscription, settings_subscription, ], + previous_focus_handle: None, } } @@ -387,6 +389,7 @@ impl MultiWorkspace { if self.sidebar_open() { self.close_sidebar(window, cx); } else { + self.previous_focus_handle = window.focused(cx); self.open_sidebar(cx); if let Some(sidebar) = &self.sidebar { sidebar.prepare_for_focus(window, cx); @@ -417,14 +420,16 @@ impl MultiWorkspace { .is_some_and(|s| s.focus_handle(cx).contains_focused(window, cx)); if sidebar_is_focused { - let pane = self.workspace().read(cx).active_pane().clone(); - let pane_focus = pane.read(cx).focus_handle(cx); - window.focus(&pane_focus, cx); - } else if let Some(sidebar) = &self.sidebar { - sidebar.prepare_for_focus(window, cx); - sidebar.focus(window, cx); + self.restore_previous_focus(false, window, cx); + } else { + self.previous_focus_handle = window.focused(cx); + if let Some(sidebar) = &self.sidebar { + sidebar.prepare_for_focus(window, cx); + sidebar.focus(window, cx); + } } } else { + self.previous_focus_handle = window.focused(cx); self.open_sidebar(cx); if let Some(sidebar) = &self.sidebar { sidebar.prepare_for_focus(window, cx); @@ -457,13 +462,26 @@ impl MultiWorkspace { workspace.set_sidebar_focus_handle(None); }); } - let pane = self.workspace().read(cx).active_pane().clone(); - let pane_focus = pane.read(cx).focus_handle(cx); - window.focus(&pane_focus, cx); + self.restore_previous_focus(true, window, cx); self.serialize(cx); cx.notify(); } + fn restore_previous_focus(&mut self, clear: bool, window: &mut Window, cx: &mut Context) { + let focus_handle = if clear { + self.previous_focus_handle.take() + } else { + self.previous_focus_handle.clone() + }; + + if let Some(previous_focus) = focus_handle { + previous_focus.focus(window, cx); + } else { + let pane = self.workspace().read(cx).active_pane().clone(); + window.focus(&pane.read(cx).focus_handle(cx), cx); + } + } + pub fn close_window(&mut self, _: &CloseWindow, window: &mut Window, cx: &mut Context) { cx.spawn_in(window, async move |this, cx| { let workspaces = this.update(cx, |multi_workspace, _cx| {