From 4d4d6e5052877d9578bac73f52eaf323e9089998 Mon Sep 17 00:00:00 2001 From: Kirill Chibisov Date: Thu, 1 Feb 2024 00:11:31 +0400 Subject: [PATCH] On Wayland, fix min/max inner size setting The size is only applied on the next `wl_surface::commit` thus we must trigger the redraw. --- CHANGELOG.md | 1 + src/platform_impl/linux/wayland/window/mod.rs | 13 ++++++++++--- src/platform_impl/linux/wayland/window/state.rs | 8 ++++++-- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a9e52b02..a9d8e4f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,6 +46,7 @@ Unreleased` header. - On X11, reload dpi on `_XSETTINGS_SETTINGS` update. - On X11, fix deadlock when adjusting DPI and resizing at the same time. - On Wayland, fix `Focused(false)` being send when other seats still have window focused. +- On Wayland, fix `Window::set_{min,max}_inner_size` not always applied. # 0.29.10 diff --git a/src/platform_impl/linux/wayland/window/mod.rs b/src/platform_impl/linux/wayland/window/mod.rs index dda168e7..c6578b6f 100644 --- a/src/platform_impl/linux/wayland/window/mod.rs +++ b/src/platform_impl/linux/wayland/window/mod.rs @@ -332,7 +332,9 @@ impl Window { self.window_state .lock() .unwrap() - .set_min_inner_size(min_size) + .set_min_inner_size(min_size); + // NOTE: Requires commit to be applied. + self.request_redraw(); } /// Set the maximum inner size for the window. @@ -343,7 +345,9 @@ impl Window { self.window_state .lock() .unwrap() - .set_max_inner_size(max_size) + .set_max_inner_size(max_size); + // NOTE: Requires commit to be applied. + self.request_redraw(); } #[inline] @@ -392,7 +396,10 @@ impl Window { #[inline] pub fn set_resizable(&self, resizable: bool) { - self.window_state.lock().unwrap().set_resizable(resizable); + if self.window_state.lock().unwrap().set_resizable(resizable) { + // NOTE: Requires commit to be applied. + self.request_redraw(); + } } #[inline] diff --git a/src/platform_impl/linux/wayland/window/state.rs b/src/platform_impl/linux/wayland/window/state.rs index 65092c64..4a59a074 100644 --- a/src/platform_impl/linux/wayland/window/state.rs +++ b/src/platform_impl/linux/wayland/window/state.rs @@ -504,10 +504,12 @@ impl WindowState { } /// Set the resizable state on the window. + /// + /// Returns `true` when the state was applied. #[inline] - pub fn set_resizable(&mut self, resizable: bool) { + pub fn set_resizable(&mut self, resizable: bool) -> bool { if self.resizable == resizable { - return; + return false; } self.resizable = resizable; @@ -523,6 +525,8 @@ impl WindowState { if let Some(frame) = self.frame.as_mut() { frame.set_resizable(resizable); } + + true } /// Whether the window is focused by any seat.