From a75d388e972f21d68bb416c9b686975a5616513d Mon Sep 17 00:00:00 2001 From: atagen Date: Tue, 7 Apr 2026 12:40:07 +1000 Subject: [PATCH] xdg_toplevel: automatically float windows based on xdg-dialog and requested size --- .../wl_surface/xdg_surface/xdg_toplevel.rs | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/ifs/wl_surface/xdg_surface/xdg_toplevel.rs b/src/ifs/wl_surface/xdg_surface/xdg_toplevel.rs index 71a3d42c..2e9a47b3 100644 --- a/src/ifs/wl_surface/xdg_surface/xdg_toplevel.rs +++ b/src/ifs/wl_surface/xdg_surface/xdg_toplevel.rs @@ -417,6 +417,29 @@ impl XdgToplevel { } return; } + let is_dialog = self.dialog.is_some(); + let fixed_size = match ( + self.min_width.get(), + self.max_width.get(), + self.min_height.get(), + self.max_height.get(), + ) { + (Some(min_w), Some(max_w), Some(min_h), Some(max_h)) if min_w == max_w && min_h == max_h => { + Some((min_w, min_h)) + } + _ => None, + }; + if is_dialog || fixed_size.is_some() { + let ws = parent + .and_then(|p| p.xdg.workspace.get()) + .unwrap_or_else(|| self.state.ensure_map_workspace(None)); + if let Some((w, h)) = fixed_size { + self.toplevel_data.float_width.set(w); + self.toplevel_data.float_height.set(h); + } + self.map_floating(&ws, pos.map(|p| (p.1, p.2))); + return; + } match parent { None => self.map_tiled(), Some(p) => self.map_child(p, pos),