diff --git a/crates/gpui/src/app.rs b/crates/gpui/src/app.rs index 42179dfcc0..b35eda41fa 100644 --- a/crates/gpui/src/app.rs +++ b/crates/gpui/src/app.rs @@ -854,6 +854,12 @@ impl MutableAppContext { self.cx.windows.keys().cloned() } + pub fn activate_window(&self, window_id: usize) { + if let Some((_, window)) = self.presenters_and_platform_windows.get(&window_id) { + window.activate() + } + } + pub fn root_view(&self, window_id: usize) -> Option> { self.cx .windows diff --git a/crates/gpui/src/platform.rs b/crates/gpui/src/platform.rs index 0d81ab59de..c04145294c 100644 --- a/crates/gpui/src/platform.rs +++ b/crates/gpui/src/platform.rs @@ -86,6 +86,7 @@ pub trait Window: WindowContext { fn on_resize(&mut self, callback: Box); fn on_close(&mut self, callback: Box); fn prompt(&self, level: PromptLevel, msg: &str, answers: &[&str]) -> oneshot::Receiver; + fn activate(&self); } pub trait WindowContext { diff --git a/crates/gpui/src/platform/mac/window.rs b/crates/gpui/src/platform/mac/window.rs index e383286ae9..ba75964039 100644 --- a/crates/gpui/src/platform/mac/window.rs +++ b/crates/gpui/src/platform/mac/window.rs @@ -349,6 +349,12 @@ impl platform::Window for Window { done_rx } } + + fn activate(&self) { + unsafe { + let _: () = msg_send![self.0.borrow().native_window, makeKeyAndOrderFront: nil]; + } + } } impl platform::WindowContext for Window { diff --git a/crates/gpui/src/platform/test.rs b/crates/gpui/src/platform/test.rs index 4f0306ff56..3e3ec60acb 100644 --- a/crates/gpui/src/platform/test.rs +++ b/crates/gpui/src/platform/test.rs @@ -229,6 +229,8 @@ impl super::Window for Window { self.last_prompt.replace(Some(done_tx)); done_rx } + + fn activate(&self) {} } pub fn platform() -> Platform { diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index 0f0f2a77fb..ef91d4b015 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -1432,10 +1432,11 @@ pub fn open_paths( // Open paths in existing workspace if possible let mut existing = None; for window_id in cx.window_ids().collect::>() { - if let Some(workspace) = cx.root_view::(window_id) { - if workspace.update(cx, |view, cx| { - if view.contains_paths(abs_paths, cx.as_ref()) { - existing = Some(workspace.clone()); + if let Some(workspace_handle) = cx.root_view::(window_id) { + if workspace_handle.update(cx, |workspace, cx| { + if workspace.contains_paths(abs_paths, cx.as_ref()) { + cx.activate_window(window_id); + existing = Some(workspace_handle.clone()); true } else { false