xwayland: Fix offset x11 geometry after configure request

This commit is contained in:
Victoria Brekenfeld 2024-06-28 13:04:35 +02:00
parent 06c12040f9
commit 62afa4cf61

View file

@ -366,36 +366,47 @@ impl XwmHandler for State {
_reorder: Option<Reorder>, _reorder: Option<Reorder>,
) { ) {
// We only allow floating X11 windows to resize themselves. Nothing else // We only allow floating X11 windows to resize themselves. Nothing else
let mut current_geo = window.geometry();
let shell = self.common.shell.read().unwrap(); let shell = self.common.shell.read().unwrap();
if let Some(mapped) = shell.element_for_surface(&window) { 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 .workspaces
.sets .sets
.values() .iter()
.any(|set| set.sticky_layer.mapped().any(|m| m == mapped)) .find(|(_, set)| set.sticky_layer.mapped().any(|m| m == mapped))
|| shell {
.space_for(&mapped) Some(
.filter(|space| space.is_floating(mapped)) set.sticky_layer
.is_some(); .element_geometry(mapped)
.unwrap()
if is_floating { .to_global(&output),
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(),
) )
} 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 { } else {
let _ = window.configure(None); // ack and force old state let _ = window.configure(None); // ack and force old state
} }
} else { } else {
let mut current_geo = window.geometry();
if let Some(x) = x { if let Some(x) = x {
current_geo.loc.x = x; current_geo.loc.x = x;
} }