diff --git a/src/server/decoration.rs b/src/server/decoration.rs index b98a763..8703d16 100644 --- a/src/server/decoration.rs +++ b/src/server/decoration.rs @@ -145,7 +145,6 @@ impl DecorationsDataSatellite { pub fn draw_decorations(&mut self, world: &World, width: i32, parent_scale_factor: f32) { if !self.will_draw_decorations(width) { - println!("not drawing ({} {})", width, self.should_draw); if self.remove_buffer { self.surface.attach(None, 0, 0); self.surface.commit(); diff --git a/src/server/event.rs b/src/server/event.rs index 4ed2833..8a9ab97 100644 --- a/src/server/event.rs +++ b/src/server/event.rs @@ -499,16 +499,26 @@ pub(super) fn update_surface_viewport( return; }; + let decorations_height = if data.decoration.satellite.is_some() { + DecorationsDataSatellite::TITLEBAR_HEIGHT + } else { + 0 + }; + if let Some(min) = hints.min_size { + debug!( + "updated min height: {}", + (min.height as f64 / scale_factor.0) as i32 + decorations_height + ); data.toplevel.set_min_size( (min.width as f64 / scale_factor.0) as i32, - (min.height as f64 / scale_factor.0) as i32, + (min.height as f64 / scale_factor.0) as i32 + decorations_height, ); } if let Some(max) = hints.max_size { data.toplevel.set_max_size( (max.width as f64 / scale_factor.0) as i32, - (max.height as f64 / scale_factor.0) as i32, + (max.height as f64 / scale_factor.0) as i32 + decorations_height, ); } } diff --git a/src/server/mod.rs b/src/server/mod.rs index f972e00..b5fbf92 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -854,20 +854,25 @@ impl InnerServerState { 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, ); } } diff --git a/src/server/tests.rs b/src/server/tests.rs index f40b6b5..3359f7b 100644 --- a/src/server/tests.rs +++ b/src/server/tests.rs @@ -2288,6 +2288,17 @@ fn toplevel_size_limits_scaled() { let toplevel = data.toplevel(); assert_eq!(toplevel.min_size, Some(testwl::Vec2 { x: 20, y: 20 })); assert_eq!(toplevel.max_size, Some(testwl::Vec2 { x: 100, y: 100 })); + + // test sizing with decorations + f.testwl + .force_decoration_mode(id, zxdg_toplevel_decoration_v1::Mode::ClientSide); + f.testwl.configure_toplevel(id, 100, 100, vec![]); + f.run(); + + let data = f.testwl.get_surface_data(id).unwrap(); + let toplevel = data.toplevel(); + assert_eq!(toplevel.min_size, Some(testwl::Vec2 { x: 20, y: 45 })); + assert_eq!(toplevel.max_size, Some(testwl::Vec2 { x: 100, y: 125 })); } #[test]