From 3f68eee8465be0e4e16422ff7335b5463d9aad6b Mon Sep 17 00:00:00 2001 From: Ilia Malanin Date: Mon, 23 Feb 2026 17:22:51 +0100 Subject: [PATCH] shell: Extract FloatingLayout::snap_to_corner to deduplicate snap restore logic --- src/shell/layout/floating/mod.rs | 11 ++++++++++- src/shell/mod.rs | 12 ++---------- src/shell/workspace.rs | 6 +----- 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/src/shell/layout/floating/mod.rs b/src/shell/layout/floating/mod.rs index dcb6d50f..582ec1b4 100644 --- a/src/shell/layout/floating/mod.rs +++ b/src/shell/layout/floating/mod.rs @@ -1641,7 +1641,16 @@ impl FloatingLayout { elements } - pub fn snapped_geometry(&self, corners: &TiledCorners) -> Rectangle { + pub fn snap_to_corner(&self, mapped: &CosmicMapped, corners: &TiledCorners) { + *mapped.floating_tiled.lock().unwrap() = Some(*corners); + mapped.set_tiled(true); + let snapped_geo = self.snapped_geometry(corners); + let output = self.space.outputs().next().unwrap(); + mapped.set_geometry(snapped_geo.to_global(output)); + mapped.configure(); + } + + fn snapped_geometry(&self, corners: &TiledCorners) -> Rectangle { let output = self.space.outputs().next().unwrap().clone(); let layers = layer_map_for_output(&output); let non_exclusive = layers.non_exclusive_zone(); diff --git a/src/shell/mod.rs b/src/shell/mod.rs index 79d065e8..6ba300d1 100644 --- a/src/shell/mod.rs +++ b/src/shell/mod.rs @@ -2596,11 +2596,7 @@ impl Shell { true, ); } else if let Some(corners) = was_snapped { - *window.floating_tiled.lock().unwrap() = Some(corners); - window.set_tiled(true); - let snapped_geo = workspace.floating_layer.snapped_geometry(&corners); - window.set_geometry(snapped_geo.to_global(&workspace.output)); - window.configure(); + workspace.floating_layer.snap_to_corner(&window, &corners); } } Some(FullscreenRestoreState::Tiling { @@ -3371,11 +3367,7 @@ impl Shell { .floating_layer .map_maximized(mapped.clone(), geometry, false); } else if let Some(corners) = was_snapped { - *mapped.floating_tiled.lock().unwrap() = Some(corners); - mapped.set_tiled(true); - let snapped_geo = to_workspace.floating_layer.snapped_geometry(&corners); - mapped.set_geometry(snapped_geo.to_global(&to_workspace.output)); - mapped.configure(); + to_workspace.floating_layer.snap_to_corner(mapped, &corners); } } else { for mapped in to_workspace diff --git a/src/shell/workspace.rs b/src/shell/workspace.rs index ac8c8271..b03ac776 100644 --- a/src/shell/workspace.rs +++ b/src/shell/workspace.rs @@ -1142,11 +1142,7 @@ impl Workspace { std::mem::drop(state); self.floating_layer.map_maximized(window, geometry, true); } else if let Some(corners) = previous.was_snapped { - *window.floating_tiled.lock().unwrap() = Some(corners); - window.set_tiled(true); - let snapped_geo = self.floating_layer.snapped_geometry(&corners); - window.set_geometry(snapped_geo.to_global(&self.output)); - window.configure(); + self.floating_layer.snap_to_corner(&window, &corners); } None