diff --git a/crates/gpui/src/app.rs b/crates/gpui/src/app.rs index 892c129547..725e0416a7 100644 --- a/crates/gpui/src/app.rs +++ b/crates/gpui/src/app.rs @@ -851,6 +851,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 0e1bb3fca9..9d5acf90e9 100644 --- a/crates/gpui/src/platform.rs +++ b/crates/gpui/src/platform.rs @@ -96,6 +96,7 @@ pub trait Window: WindowContext { answers: &[&str], done_fn: Box, ); + 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 518c91a5f5..2d6ea0055e 100644 --- a/crates/gpui/src/platform/mac/window.rs +++ b/crates/gpui/src/platform/mac/window.rs @@ -347,6 +347,12 @@ impl platform::Window for Window { ]; } } + + 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 984da925f4..bffa985815 100644 --- a/crates/gpui/src/platform/test.rs +++ b/crates/gpui/src/platform/test.rs @@ -223,6 +223,8 @@ impl super::Window for Window { fn prompt(&self, _: crate::PromptLevel, _: &str, _: &[&str], f: Box) { self.last_prompt.replace(Some(f)); } + + fn activate(&self) {} } pub fn platform() -> Platform { diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index 531d976fd5..e1f2123761 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -1462,10 +1462,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