diff --git a/crates/gpui/src/platform.rs b/crates/gpui/src/platform.rs index 098836723da4250e2854756c1e2e21cf2344a9e0..e9c1b81f4b1f0ce325a839e76dfdf510492f0617 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 b8e11fdd20f452a08786bfe35014baf456c218d6..b2302d80f3b01e9d126f2d6475b1cb16b4675c69 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 95c17624b49182023535cbce6e76dba99c09c138..2a21358d2a1f9fe0b22cd42f43357162403c9aaa 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 c5767ad27a0c09f87a32be2c26b4c18f43f1ae9f..cc519139199a645cee5847f9d3c88ab78231eed1 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 b0b25c7a33e01110d385e59b1f17326e729f827b..66d231a79886485965f4ab8578e209dac57286c5 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 1b8e9321b89f638fe77fc1d91947f4a44e6f1214..094c45108a88734b0459256ef5f8738be2b550f8 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 247c51ed87f6b5b460da889e6b137d59c4b40c67..82b09479717d850fc674a03e733a543f0437504b 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 c30af8f841a115acb0decca162cb44a62e77419f..c8d2c021b85643d3e2e5e487f2ddc0c5f4dd726e 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);