diff --git a/crates/gpui/src/platform.rs b/crates/gpui/src/platform.rs index e9c1b81f4b..744dd2fe92 100644 --- a/crates/gpui/src/platform.rs +++ b/crates/gpui/src/platform.rs @@ -188,6 +188,7 @@ pub(crate) trait PlatformWindow: HasWindowHandle + HasDisplayHandle { answers: &[&str], ) -> Option>; fn activate(&self); + fn is_active(&self) -> bool; fn set_title(&mut self, title: &str); fn set_edited(&mut self, edited: bool); fn show_character_palette(&self); diff --git a/crates/gpui/src/platform/linux/wayland/window.rs b/crates/gpui/src/platform/linux/wayland/window.rs index b2302d80f3..1fe2659704 100644 --- a/crates/gpui/src/platform/linux/wayland/window.rs +++ b/crates/gpui/src/platform/linux/wayland/window.rs @@ -346,6 +346,11 @@ impl PlatformWindow for WaylandWindow { // todo(linux) } + // todo(linux) + fn is_active(&self) -> bool { + false + } + fn set_title(&mut self, title: &str) { self.0.toplevel.set_title(title.to_string()); } diff --git a/crates/gpui/src/platform/linux/x11/window.rs b/crates/gpui/src/platform/linux/x11/window.rs index 2a21358d2a..a11b361195 100644 --- a/crates/gpui/src/platform/linux/x11/window.rs +++ b/crates/gpui/src/platform/linux/x11/window.rs @@ -406,6 +406,11 @@ impl PlatformWindow for X11Window { .unwrap(); } + // todo(linux) + fn is_active(&self) -> bool { + false + } + fn set_title(&mut self, title: &str) { self.0 .xcb_connection diff --git a/crates/gpui/src/platform/mac/window.rs b/crates/gpui/src/platform/mac/window.rs index ec23835896..41e550c587 100644 --- a/crates/gpui/src/platform/mac/window.rs +++ b/crates/gpui/src/platform/mac/window.rs @@ -916,6 +916,10 @@ impl PlatformWindow for MacWindow { .detach(); } + fn is_active(&self) -> bool { + unsafe { self.0.lock().native_window.isKeyWindow() == YES } + } + fn set_title(&mut self, title: &str) { unsafe { let app = NSApplication::sharedApplication(nil); diff --git a/crates/gpui/src/platform/test/window.rs b/crates/gpui/src/platform/test/window.rs index 66d231a798..60bf3ec683 100644 --- a/crates/gpui/src/platform/test/window.rs +++ b/crates/gpui/src/platform/test/window.rs @@ -181,6 +181,10 @@ impl PlatformWindow for TestWindow { .set_active_window(Some(self.clone())) } + fn is_active(&self) -> bool { + false + } + fn set_title(&mut self, title: &str) { self.0.lock().title = Some(title.to_owned()); } diff --git a/crates/gpui/src/platform/windows/window.rs b/crates/gpui/src/platform/windows/window.rs index a05f57565d..fbc0b2efe5 100644 --- a/crates/gpui/src/platform/windows/window.rs +++ b/crates/gpui/src/platform/windows/window.rs @@ -1389,6 +1389,10 @@ impl PlatformWindow for WindowsWindow { unsafe { SetForegroundWindow(self.inner.hwnd) }; } + fn is_active(&self) -> bool { + self.inner.hwnd == unsafe { GetActiveWindow() } + } + // todo(windows) fn set_title(&mut self, title: &str) { unsafe { SetWindowTextW(self.inner.hwnd, &HSTRING::from(title)) } diff --git a/crates/gpui/src/window.rs b/crates/gpui/src/window.rs index 82b0947971..fd1d549ad6 100644 --- a/crates/gpui/src/window.rs +++ b/crates/gpui/src/window.rs @@ -421,7 +421,7 @@ impl Window { let appearance = platform_window.appearance(); let text_system = Arc::new(WindowTextSystem::new(cx.text_system().clone())); let dirty = Rc::new(Cell::new(true)); - let active = Rc::new(Cell::new(false)); + let active = Rc::new(Cell::new(platform_window.is_active())); let needs_present = Rc::new(Cell::new(false)); let next_frame_callbacks: Rc>> = Default::default(); let last_input_timestamp = Rc::new(Cell::new(Instant::now()));