From c61361de3ca4484387f39b067eadc612908560eb Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Tue, 19 Mar 2024 15:20:03 +0400 Subject: Implement window rule reloading and min/max size rules --- src/window/mapped.rs | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) (limited to 'src/window/mapped.rs') diff --git a/src/window/mapped.rs b/src/window/mapped.rs index 4476dede..6afd995e 100644 --- a/src/window/mapped.rs +++ b/src/window/mapped.rs @@ -1,3 +1,5 @@ +use std::cmp::{max, min}; + use smithay::backend::renderer::element::{AsRenderElements as _, Id}; use smithay::desktop::space::SpaceElement as _; use smithay::desktop::Window; @@ -82,17 +84,43 @@ impl LayoutElement for Mapped { } fn min_size(&self) -> Size { - with_states(self.toplevel().wl_surface(), |state| { + let mut size = with_states(self.toplevel().wl_surface(), |state| { let curr = state.cached_state.current::(); curr.min_size - }) + }); + + if let Some(x) = self.rules.min_width { + size.w = max(size.w, i32::from(x)); + } + if let Some(x) = self.rules.min_height { + size.h = max(size.h, i32::from(x)); + } + + size } fn max_size(&self) -> Size { - with_states(self.toplevel().wl_surface(), |state| { + let mut size = with_states(self.toplevel().wl_surface(), |state| { let curr = state.cached_state.current::(); curr.max_size - }) + }); + + if let Some(x) = self.rules.max_width { + if size.w == 0 { + size.w = i32::from(x); + } else if x > 0 { + size.w = min(size.w, i32::from(x)); + } + } + if let Some(x) = self.rules.max_height { + if size.h == 0 { + size.h = i32::from(x); + } else if x > 0 { + size.h = min(size.h, i32::from(x)); + } + } + + size } fn is_wl_surface(&self, wl_surface: &WlSurface) -> bool { -- cgit