From f94d6c644c90722faed21fa0d593527a2c5a19fd Mon Sep 17 00:00:00 2001 From: atagen Date: Mon, 6 Apr 2026 22:30:45 +1000 Subject: [PATCH] container: predict window size for initial configure previously, windows were allowed determine their own initial dimensions, then fed a resize afterwards. we now look up the parent container and try to predict + report the real size up front to minimise visual artifacting on spawn/destroy --- .../wl_surface/xdg_surface/xdg_toplevel.rs | 3 ++- src/state.rs | 22 ++++++++++++++++ src/tree/container.rs | 26 +++++++++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/ifs/wl_surface/xdg_surface/xdg_toplevel.rs b/src/ifs/wl_surface/xdg_surface/xdg_toplevel.rs index 4d85be92..71a3d42c 100644 --- a/src/ifs/wl_surface/xdg_surface/xdg_toplevel.rs +++ b/src/ifs/wl_surface/xdg_surface/xdg_toplevel.rs @@ -780,7 +780,8 @@ impl XdgSurfaceExt for XdgToplevel { fn initial_configure(self: Rc) { let rect = self.xdg.absolute_desired_extents.get(); if rect.is_empty() { - self.send_configure(0, 0); + let (w, h) = self.state.predict_tiled_body_size().unwrap_or((0, 0)); + self.send_configure(w, h); } else { self.send_configure_checked(rect.width(), rect.height()); } diff --git a/src/state.rs b/src/state.rs index a328353a..afd0e545 100644 --- a/src/state.rs +++ b/src/state.rs @@ -1597,6 +1597,28 @@ impl State { self.config.get()?.initial_tile_state(data) } + pub fn predict_tiled_body_size(&self) -> Option<(i32, i32)> { + let seat = self.seat_queue.last(); + let ws = self.ensure_map_workspace(seat.as_deref()); + let pos = ws.position.get(); + if pos.is_empty() { + return None; + } + if let Some(c) = ws.container.get() { + let la = c.clone().tl_last_active_child(); + let target = la + .tl_data() + .parent + .get() + .and_then(|n| n.node_into_container()) + .unwrap_or(c); + Some(target.predict_child_body_size()) + } else { + let tpuh = self.theme.title_plus_underline_height(); + Some((pos.width(), (pos.height() - tpuh).max(0))) + } + } + pub fn update_capabilities( &self, data: &Rc, diff --git a/src/tree/container.rs b/src/tree/container.rs index 87a218ef..df1c87b7 100644 --- a/src/tree/container.rs +++ b/src/tree/container.rs @@ -377,6 +377,32 @@ impl ContainerNode { } } + pub fn predict_child_body_size(&self) -> (i32, i32) { + let tpuh = self.state.theme.title_plus_underline_height(); + if self.mono_child.is_some() { + let mb = self.mono_body.get(); + return (mb.width(), mb.height()); + } + let spacing = self.state.theme.sizes.gap.get().max( + self.state.theme.sizes.border_width.get(), + ); + let nc = self.num_children.get() as i32 + 1; + match self.split.get() { + ContainerSplit::Horizontal => { + let content_w = self.width.get().sub((nc - 1) * spacing).max(0); + (content_w / nc, self.height.get().sub(tpuh).max(0)) + } + ContainerSplit::Vertical => { + let content_h = self + .height + .get() + .sub(tpuh + (nc - 1) * (spacing + tpuh)) + .max(0); + (self.width.get(), content_h / nc) + } + } + } + pub fn on_spaces_changed(self: &Rc) { self.update_content_size(); // log::info!("on_spaces_changed");