diff --git a/crates/gpui/src/app.rs b/crates/gpui/src/app.rs index 42179dfcc05310640c3426a600a23e36eafa9aee..b35eda41fadea6110fa6986e5eb960db691e8c3d 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 0d81ab59dec43d1602574d16237adf14c5e88896..c04145294c494d7e1b72cc4845fd6453bf25e3df 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 e383286ae9ceb7b4d4945fb802dd20d0bcc4b138..ba75964039e9c36a7d439a3e2246fd3c9fca9b7c 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 4f0306ff56fbf29deddc6e26bcb49183c61d24cf..3e3ec60acb10fc4d67b66ba5f6064b8e67c9f21f 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 0f0f2a77fb5c2a10b3e07139db228d6244ee797d..ef91d4b015c8dfdc47fad81550cb9e1f7321f37f 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