From 68b6156aa8fa2592f24eb9b732b7e2b77c048c34 Mon Sep 17 00:00:00 2001 From: David Brochero <65723952+D-Brox@users.noreply.github.com> Date: Mon, 6 Jan 2025 08:10:49 -0300 Subject: [PATCH] Fix sticky toggle crashes on maximized windows (#1110) --- src/shell/mod.rs | 50 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/src/shell/mod.rs b/src/shell/mod.rs index e9022c67..07b240d9 100644 --- a/src/shell/mod.rs +++ b/src/shell/mod.rs @@ -3567,12 +3567,26 @@ impl Shell { toplevel_leave_workspace(&window, &handle); } - self.workspaces - .sets - .get_mut(&output) - .unwrap() - .sticky_layer - .map(mapped.clone(), geometry.loc); + let set = self.workspaces.sets.get_mut(&output).unwrap(); + set.sticky_layer.map(mapped.clone(), geometry.loc); + + let mut state = mapped.maximized_state.lock().unwrap(); + if let Some(MaximizedState { + original_geometry, + original_layer: _, + }) = *state + { + *state = Some(MaximizedState { + original_geometry, + original_layer: ManagedLayer::Sticky, + }); + std::mem::drop(state); + set.workspaces[set.active].floating_layer.map_maximized( + mapped.clone(), + geometry, + false, + ); + } } else if let Some(set) = self .workspaces .sets @@ -3587,14 +3601,14 @@ impl Shell { toplevel_enter_workspace(&window, &workspace.handle); window.set_sticky(false); } - - match mapped + let previous_layer = mapped .previous_layer .lock() .unwrap() .take() - .unwrap_or(ManagedLayer::Floating) - { + .unwrap_or(ManagedLayer::Floating); + + match previous_layer { ManagedLayer::Tiling if workspace.tiling_enabled => { let focus_stack = workspace.focus_stack.get(seat); workspace @@ -3604,6 +3618,22 @@ impl Shell { ManagedLayer::Sticky => unreachable!(), _ => workspace.floating_layer.map(mapped.clone(), geometry.loc), } + + let mut state = mapped.maximized_state.lock().unwrap(); + if let Some(MaximizedState { + original_geometry, + original_layer: _, + }) = *state + { + *state = Some(MaximizedState { + original_geometry, + original_layer: previous_layer, + }); + std::mem::drop(state); + workspace + .floating_layer + .map_maximized(mapped.clone(), geometry, false); + } } self.append_focus_stack(&mapped, seat);