Skip to content

Commit d63f1ab

Browse files
committed
workspace: Correctly handle unmapping maximized elements
1 parent 77084ba commit d63f1ab

File tree

2 files changed

+24
-19
lines changed

2 files changed

+24
-19
lines changed

src/shell/mod.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3489,7 +3489,9 @@ impl Shell {
34893489

34903490
let mut new_size = if mapped.maximized_state.lock().unwrap().is_some() {
34913491
// If surface is maximized then unmaximize it
3492-
workspace.unmaximize_request(&mapped)
3492+
workspace
3493+
.unmaximize_request(&mapped)
3494+
.map(|geo| geo.size.as_logical())
34933495
} else {
34943496
None
34953497
};
@@ -4139,7 +4141,9 @@ impl Shell {
41394141
None
41404142
}
41414143
} else if let Some(workspace) = self.space_for_mut(mapped) {
4142-
workspace.unmaximize_request(mapped)
4144+
workspace
4145+
.unmaximize_request(mapped)
4146+
.map(|geo| geo.size.as_logical())
41434147
} else {
41444148
None
41454149
}

src/shell/workspace.rs

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -574,10 +574,9 @@ impl Workspace {
574574
pub fn unmap_element(&mut self, mapped: &CosmicMapped) -> Option<WorkspaceRestoreData> {
575575
let was_maximized = if mapped.maximized_state.lock().unwrap().is_some() {
576576
// If surface is maximized then unmaximize it, so it is assigned to only one layer
577-
let _ = self.unmaximize_request(&mapped);
578-
true
577+
self.unmaximize_request(&mapped)
579578
} else {
580-
false
579+
None
581580
};
582581

583582
self.focus_stack
@@ -598,20 +597,24 @@ impl Workspace {
598597
});
599598
}
600599

601-
if let Some(floating_geometry) = self.floating_layer.unmap(&mapped, None) {
602-
return Some(WorkspaceRestoreData::Floating(Some(FloatingRestoreData {
603-
geometry: floating_geometry,
604-
output_size: self.output.geometry().size.as_logical(),
605-
was_maximized,
606-
})));
607-
};
608600
if let Ok(state) = self.tiling_layer.unmap(&mapped, None) {
609601
return Some(WorkspaceRestoreData::Tiling(Some(TilingRestoreData {
610602
state,
611-
was_maximized,
603+
was_maximized: was_maximized.is_some(),
612604
})));
613605
}
614606

607+
// unmaximize_request might have triggered a `floating_layer.refresh()`,
608+
// which may have already removed a non-alive surface.
609+
if let Some(floating_geometry) = self.floating_layer.unmap(&mapped, None).or(was_maximized)
610+
{
611+
return Some(WorkspaceRestoreData::Floating(Some(FloatingRestoreData {
612+
geometry: floating_geometry,
613+
output_size: self.output.geometry().size.as_logical(),
614+
was_maximized: was_maximized.is_some(),
615+
})));
616+
};
617+
615618
None
616619
}
617620

@@ -935,12 +938,12 @@ impl Workspace {
935938
self.floating_layer.recalculate();
936939
}
937940

938-
pub fn unmaximize_request(&mut self, elem: &CosmicMapped) -> Option<Size<i32, Logical>> {
941+
pub fn unmaximize_request(&mut self, elem: &CosmicMapped) -> Option<Rectangle<i32, Local>> {
939942
let mut state = elem.maximized_state.lock().unwrap();
940943
if let Some(state) = state.take() {
941944
if let Some(minimized) = self.minimized_windows.iter_mut().find(|m| *m == elem) {
942945
minimized.unmaximize(state.original_geometry);
943-
Some(state.original_geometry.size.as_logical())
946+
Some(state.original_geometry)
944947
} else {
945948
match state.original_layer {
946949
ManagedLayer::Tiling if self.tiling_enabled => {
@@ -951,9 +954,7 @@ impl Workspace {
951954
elem.set_geometry(state.original_geometry.to_global(&self.output));
952955
elem.configure();
953956
self.tiling_layer.recalculate();
954-
self.tiling_layer
955-
.element_geometry(&elem)
956-
.map(|geo| geo.size.as_logical())
957+
self.tiling_layer.element_geometry(&elem)
957958
}
958959
ManagedLayer::Sticky => unreachable!(),
959960
_ => {
@@ -964,7 +965,7 @@ impl Workspace {
964965
Some(state.original_geometry.size.as_logical()),
965966
None,
966967
);
967-
Some(state.original_geometry.size.as_logical())
968+
Some(state.original_geometry)
968969
}
969970
}
970971
}

0 commit comments

Comments
 (0)