From 62afa4cf61b1230e346d3100b11b003ad409a3ed Mon Sep 17 00:00:00 2001 From: Victoria Brekenfeld Date: Fri, 28 Jun 2024 13:04:35 +0200 Subject: [PATCH] xwayland: Fix offset x11 geometry after configure request --- src/xwayland.rs | 51 ++++++++++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/src/xwayland.rs b/src/xwayland.rs index 34024d58..aaa15544 100644 --- a/src/xwayland.rs +++ b/src/xwayland.rs @@ -366,36 +366,47 @@ impl XwmHandler for State { _reorder: Option, ) { // We only allow floating X11 windows to resize themselves. Nothing else - let mut current_geo = window.geometry(); let shell = self.common.shell.read().unwrap(); if let Some(mapped) = shell.element_for_surface(&window) { - let is_floating = shell + let current_geo = if let Some(workspace) = shell.space_for(mapped) { + workspace.is_floating(mapped).then_some( + workspace + .element_geometry(mapped) + .unwrap() + .to_global(workspace.output()), + ) + } else if let Some((output, set)) = shell .workspaces .sets - .values() - .any(|set| set.sticky_layer.mapped().any(|m| m == mapped)) - || shell - .space_for(&mapped) - .filter(|space| space.is_floating(mapped)) - .is_some(); - - if is_floating { - let ssd_height = if window.is_decorated() { 0 } else { SSD_HEIGHT }; - mapped.set_geometry( - Rectangle::from_loc_and_size( - current_geo.loc, - ( - w.map(|w| w as i32).unwrap_or(current_geo.size.w), - h.map(|h| h as i32).unwrap_or(current_geo.size.h) + ssd_height, - ), - ) - .as_global(), + .iter() + .find(|(_, set)| set.sticky_layer.mapped().any(|m| m == mapped)) + { + Some( + set.sticky_layer + .element_geometry(mapped) + .unwrap() + .to_global(&output), ) + } else { + None + }; + + if let Some(current_geo) = current_geo { + let ssd_height = if window.is_decorated() { 0 } else { SSD_HEIGHT }; + mapped.set_geometry(Rectangle::from_loc_and_size( + current_geo.loc, + ( + w.map(|w| w as i32).unwrap_or(current_geo.size.w), + h.map(|h| h as i32 + ssd_height) + .unwrap_or(current_geo.size.h), + ), + )) } else { let _ = window.configure(None); // ack and force old state } } else { + let mut current_geo = window.geometry(); if let Some(x) = x { current_geo.loc.x = x; }