server: adjust minimum and maximum window sizes to account for decorations

Fixes #271
This commit is contained in:
Shawn Wallace 2025-11-27 11:08:40 -05:00
parent ae98f974e0
commit 83e4aab4d5
4 changed files with 31 additions and 6 deletions

View file

@ -854,20 +854,25 @@ impl<S: X11Selection + 'static> InnerServerState<S> {
let mut win = data.get::<&mut WindowData>().unwrap();
if win.attrs.size_hints.is_none() || *win.attrs.size_hints.as_ref().unwrap() != hints {
if win.attrs.size_hints.is_none_or(|h| h != hints) {
debug!("setting {window:?} hints {hints:?}");
let mut query = data.query::<(&SurfaceRole, &SurfaceScaleFactor)>();
if let Some((SurfaceRole::Toplevel(Some(data)), scale_factor)) = query.get() {
let decorations_height = if data.decoration.satellite.is_some() {
DecorationsDataSatellite::TITLEBAR_HEIGHT
} else {
0
};
if let Some(min_size) = &hints.min_size {
data.toplevel.set_min_size(
(min_size.width as f64 / scale_factor.0) as i32,
(min_size.height as f64 / scale_factor.0) as i32,
(min_size.height as f64 / scale_factor.0) as i32 + decorations_height,
);
}
if let Some(max_size) = &hints.max_size {
data.toplevel.set_max_size(
(max_size.width as f64 / scale_factor.0) as i32,
(max_size.height as f64 / scale_factor.0) as i32,
(max_size.height as f64 / scale_factor.0) as i32 + decorations_height,
);
}
}