From 6231df978bfbb7b67dc5d5f55e8b7ece44234b7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=B1=B1=E9=A2=A8=E9=9C=B2?= Date: Tue, 26 Mar 2024 03:44:18 +0900 Subject: [PATCH] Windows: fix initial active status (#9694) Separate from #9451 On Windows, a new window may already active immediate after creation. Release Notes: - N/A --------- Co-authored-by: Mikayla --- crates/gpui/src/platform.rs | 1 + crates/gpui/src/platform/linux/wayland/window.rs | 5 +++++ crates/gpui/src/platform/linux/x11/window.rs | 5 +++++ crates/gpui/src/platform/mac/window.rs | 4 ++++ crates/gpui/src/platform/test/window.rs | 4 ++++ crates/gpui/src/platform/windows/window.rs | 4 ++++ crates/gpui/src/window.rs | 2 +- 7 files changed, 24 insertions(+), 1 deletion(-) diff --git a/crates/gpui/src/platform.rs b/crates/gpui/src/platform.rs index e9c1b81f4b1f0ce325a839e76dfdf510492f0617..744dd2fe92e95b6dc368e9d80176ad0400b4d647 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 b2302d80f3b01e9d126f2d6475b1cb16b4675c69..1fe265970444635505dc89ba9dbe0978b86bc313 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 2a21358d2a1f9fe0b22cd42f43357162403c9aaa..a11b361195db9b94d76680a696c635095b6e8de4 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 ec238358965d551082eb7c6bc4641ae72b11d0c0..41e550c587917620cb3513f03863343b588b6c13 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 66d231a79886485965f4ab8578e209dac57286c5..60bf3ec6830d2da069986256649feb7e59d2a620 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 a05f57565dfb4dce33e653de307b4ef6ab498ecf..fbc0b2efe53d008a71013ebc9c6abf454dccb115 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 82b09479717d850fc674a03e733a543f0437504b..fd1d549ad6739a75c953b785aecd1137e9bf3471 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()));