From 4c0c7607f666eed32956bbde69e9fa2207d06724 Mon Sep 17 00:00:00 2001 From: amrbashir Date: Wed, 2 Mar 2022 15:39:18 +0200 Subject: [PATCH] fix size overflow when window is undecorated --- src/platform_impl/windows/event_loop/runner.rs | 1 + src/platform_impl/windows/util.rs | 12 ++++++++++-- src/platform_impl/windows/window.rs | 6 +++++- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/platform_impl/windows/event_loop/runner.rs b/src/platform_impl/windows/event_loop/runner.rs index cf32767465..59542ba24e 100644 --- a/src/platform_impl/windows/event_loop/runner.rs +++ b/src/platform_impl/windows/event_loop/runner.rs @@ -436,6 +436,7 @@ impl BufferedEvent { (window_id.0).0, new_inner_size.width as _, new_inner_size.height as _, + false, ); } } diff --git a/src/platform_impl/windows/util.rs b/src/platform_impl/windows/util.rs index 6c1dc767f1..f51a6ab2bf 100644 --- a/src/platform_impl/windows/util.rs +++ b/src/platform_impl/windows/util.rs @@ -88,14 +88,22 @@ pub fn adjust_size(hwnd: HWND, size: PhysicalSize) -> PhysicalSize { PhysicalSize::new((rect.right - rect.left) as _, (rect.bottom - rect.top) as _) } -pub(crate) fn set_inner_size_physical(window: HWND, x: u32, y: u32) { +pub(crate) fn set_inner_size_physical(window: HWND, x: u32, y: u32, is_decorated: bool) { unsafe { + let dpi = hwnd_dpi(window); + let titlebar_height = if !is_decorated { + winuser::GetSystemMetricsForDpi(winuser::SM_CYSIZE, dpi) + + winuser::GetSystemMetricsForDpi(winuser::SM_CXPADDEDBORDER, dpi) * 2 + + winuser::GetSystemMetricsForDpi(winuser::SM_CYBORDER, dpi) + } else { + 0 + }; let rect = adjust_window_rect( window, RECT { top: 0, left: 0, - bottom: y as LONG, + bottom: (y - titlebar_height as u32) as LONG, right: x as LONG, }, ) diff --git a/src/platform_impl/windows/window.rs b/src/platform_impl/windows/window.rs index e3dd723ca0..a6befffb85 100644 --- a/src/platform_impl/windows/window.rs +++ b/src/platform_impl/windows/window.rs @@ -180,6 +180,10 @@ impl Window { pub fn set_inner_size(&self, size: Size) { let scale_factor = self.scale_factor(); let (width, height) = size.to_physical::(scale_factor).into(); + let is_decorated = { + let window_flags = Arc::clone(&self.window_state).lock().window_flags; + window_flags.contains(WindowFlags::DECORATIONS) + }; let window_state = Arc::clone(&self.window_state); let window = self.window.clone(); @@ -189,7 +193,7 @@ impl Window { }); }); - util::set_inner_size_physical(self.window.0, width, height); + util::set_inner_size_physical(self.window.0, width, height, is_decorated); } #[inline]