From f17915891325a5a1fdeaadcf822448b5dd0c052a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=B1=B1=E9=A2=A8=E9=9C=B2?= Date: Fri, 22 Mar 2024 01:15:16 +0900 Subject: [PATCH] windows: Avoid recording minimized position to database (#9407) Minimizing window records strange position to DB. When Zed is restarted, the window goes far away. image So I fixed. Release Notes: - N/A --- crates/gpui/src/platform.rs | 1 + .../gpui/src/platform/linux/wayland/window.rs | 5 +++++ crates/gpui/src/platform/linux/x11/window.rs | 5 +++++ crates/gpui/src/platform/mac/window.rs | 9 +++++++++ crates/gpui/src/platform/test/window.rs | 4 ++++ crates/gpui/src/platform/windows/window.rs | 19 +++++++++---------- crates/gpui/src/window.rs | 6 ++++++ crates/workspace/src/workspace.rs | 2 +- 8 files changed, 40 insertions(+), 11 deletions(-) diff --git a/crates/gpui/src/platform.rs b/crates/gpui/src/platform.rs index 098836723d..e9c1b81f4b 100644 --- a/crates/gpui/src/platform.rs +++ b/crates/gpui/src/platform.rs @@ -170,6 +170,7 @@ unsafe impl Send for DisplayId {} pub(crate) trait PlatformWindow: HasWindowHandle + HasDisplayHandle { fn bounds(&self) -> Bounds; fn is_maximized(&self) -> bool; + fn is_minimized(&self) -> bool; fn content_size(&self) -> Size; fn scale_factor(&self) -> f32; fn appearance(&self) -> WindowAppearance; diff --git a/crates/gpui/src/platform/linux/wayland/window.rs b/crates/gpui/src/platform/linux/wayland/window.rs index b8e11fdd20..b2302d80f3 100644 --- a/crates/gpui/src/platform/linux/wayland/window.rs +++ b/crates/gpui/src/platform/linux/wayland/window.rs @@ -283,6 +283,11 @@ impl PlatformWindow for WaylandWindow { false } + // todo(linux) + fn is_minimized(&self) -> bool { + false + } + fn content_size(&self) -> Size { let inner = self.0.inner.borrow(); Size { diff --git a/crates/gpui/src/platform/linux/x11/window.rs b/crates/gpui/src/platform/linux/x11/window.rs index 95c17624b4..2a21358d2a 100644 --- a/crates/gpui/src/platform/linux/x11/window.rs +++ b/crates/gpui/src/platform/linux/x11/window.rs @@ -338,6 +338,11 @@ impl PlatformWindow for X11Window { false } + // todo(linux) + fn is_minimized(&self) -> bool { + false + } + fn content_size(&self) -> Size { self.0.inner.borrow_mut().content_size() } diff --git a/crates/gpui/src/platform/mac/window.rs b/crates/gpui/src/platform/mac/window.rs index c5767ad27a..cc51913919 100644 --- a/crates/gpui/src/platform/mac/window.rs +++ b/crates/gpui/src/platform/mac/window.rs @@ -419,6 +419,11 @@ impl MacWindowState { } } + // todo(macos) + fn is_minimized(&self) -> bool { + false + } + fn is_fullscreen(&self) -> bool { unsafe { let style_mask = self.native_window.styleMask(); @@ -728,6 +733,10 @@ impl PlatformWindow for MacWindow { self.0.as_ref().lock().is_maximized() } + fn is_minimized(&self) -> bool { + self.0.as_ref().lock().is_minimized() + } + fn content_size(&self) -> Size { self.0.as_ref().lock().content_size() } diff --git a/crates/gpui/src/platform/test/window.rs b/crates/gpui/src/platform/test/window.rs index b0b25c7a33..66d231a798 100644 --- a/crates/gpui/src/platform/test/window.rs +++ b/crates/gpui/src/platform/test/window.rs @@ -115,6 +115,10 @@ impl PlatformWindow for TestWindow { false } + fn is_minimized(&self) -> bool { + false + } + fn content_size(&self) -> Size { self.bounds().size.into() } diff --git a/crates/gpui/src/platform/windows/window.rs b/crates/gpui/src/platform/windows/window.rs index 1b8e9321b8..094c45108a 100644 --- a/crates/gpui/src/platform/windows/window.rs +++ b/crates/gpui/src/platform/windows/window.rs @@ -126,12 +126,11 @@ impl WindowsWindowInner { } fn is_maximized(&self) -> bool { - let mut placement = WINDOWPLACEMENT::default(); - placement.length = std::mem::size_of::() as u32; - if unsafe { GetWindowPlacement(self.hwnd, &mut placement) }.is_ok() { - return placement.showCmd == SW_SHOWMAXIMIZED.0 as u32; - } - return false; + unsafe { IsZoomed(self.hwnd) }.as_bool() + } + + fn is_minimized(&self) -> bool { + unsafe { IsIconic(self.hwnd) }.as_bool() } pub(crate) fn title_bar_padding(&self) -> Pixels { @@ -1168,10 +1167,6 @@ impl WindowsWindow { unsafe { ShowWindow(wnd.inner.hwnd, SW_SHOW) }; wnd } - - fn maximize(&self) { - unsafe { ShowWindowAsync(self.inner.hwnd, SW_MAXIMIZE) }; - } } impl HasWindowHandle for WindowsWindow { @@ -1215,6 +1210,10 @@ impl PlatformWindow for WindowsWindow { self.inner.is_maximized() } + fn is_minimized(&self) -> bool { + self.inner.is_minimized() + } + /// get the logical size of the app's drawable area. /// /// Currently, GPUI uses logical size of the app to handle mouse interactions (such as diff --git a/crates/gpui/src/window.rs b/crates/gpui/src/window.rs index 247c51ed87..82b0947971 100644 --- a/crates/gpui/src/window.rs +++ b/crates/gpui/src/window.rs @@ -722,6 +722,12 @@ impl<'a> WindowContext<'a> { self.window.platform_window.is_maximized() } + /// Check if the platform window is minimized + /// On some platforms (namely Windows) the position is incorrect when minimized + pub fn is_minimized(&self) -> bool { + self.window.platform_window.is_minimized() + } + /// Dispatch the given action on the currently focused element. pub fn dispatch_action(&mut self, action: Box) { let focus_handle = self.focused(); diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index c30af8f841..c8d2c021b8 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -754,7 +754,7 @@ impl Workspace { cx.background_executor() .spawn(DB.set_fullscreen(workspace_id, true)) .detach_and_log_err(cx); - } else { + } else if !cx.is_minimized() { cx.background_executor() .spawn(DB.set_fullscreen(workspace_id, false)) .detach_and_log_err(cx);