Fix sticky toggle crashes on maximized windows (#1110)

This commit is contained in:
David Brochero 2025-01-06 08:10:49 -03:00 committed by GitHub
parent 9b78a2d780
commit 68b6156aa8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -3567,12 +3567,26 @@ impl Shell {
toplevel_leave_workspace(&window, &handle); toplevel_leave_workspace(&window, &handle);
} }
self.workspaces let set = self.workspaces.sets.get_mut(&output).unwrap();
.sets set.sticky_layer.map(mapped.clone(), geometry.loc);
.get_mut(&output)
.unwrap() let mut state = mapped.maximized_state.lock().unwrap();
.sticky_layer if let Some(MaximizedState {
.map(mapped.clone(), geometry.loc); 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 } else if let Some(set) = self
.workspaces .workspaces
.sets .sets
@ -3587,14 +3601,14 @@ impl Shell {
toplevel_enter_workspace(&window, &workspace.handle); toplevel_enter_workspace(&window, &workspace.handle);
window.set_sticky(false); window.set_sticky(false);
} }
let previous_layer = mapped
match mapped
.previous_layer .previous_layer
.lock() .lock()
.unwrap() .unwrap()
.take() .take()
.unwrap_or(ManagedLayer::Floating) .unwrap_or(ManagedLayer::Floating);
{
match previous_layer {
ManagedLayer::Tiling if workspace.tiling_enabled => { ManagedLayer::Tiling if workspace.tiling_enabled => {
let focus_stack = workspace.focus_stack.get(seat); let focus_stack = workspace.focus_stack.get(seat);
workspace workspace
@ -3604,6 +3618,22 @@ impl Shell {
ManagedLayer::Sticky => unreachable!(), ManagedLayer::Sticky => unreachable!(),
_ => workspace.floating_layer.map(mapped.clone(), geometry.loc), _ => 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); self.append_focus_stack(&mapped, seat);