Skip to content

Commit 3b0aa9e

Browse files
ids1024Drakulix
authored andcommitted
shell: Remove last workspace if it follows empty active workspace
Partly fixes pop-os/cosmic-workspaces-epoch#83, but it seems like there's at least one other issue with workspaces not being removed when they should be. The if condition got a bit complicated here, so I've split it up and inverted the condition.
1 parent 476470e commit 3b0aa9e

File tree

1 file changed

+27
-18
lines changed

1 file changed

+27
-18
lines changed

src/shell/mod.rs

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -553,34 +553,43 @@ impl WorkspaceSet {
553553

554554
fn ensure_last_empty(&mut self, state: &mut WorkspaceUpdateGuard<State>) {
555555
// add empty at the end, if necessary
556-
if self
557-
.workspaces
558-
.last()
559-
.map(|last| !last.is_empty())
560-
.unwrap_or(true)
561-
{
556+
if self.workspaces.last().map_or(true, |last| !last.is_empty()) {
562557
self.add_empty_workspace(state);
563558
}
564559

565-
// remove empty workspaces in between, if they are not active
560+
// remove other empty workspaces
566561
let len = self.workspaces.len();
567-
let mut keep = vec![true; len];
568-
for (i, workspace) in self.workspaces.iter().enumerate() {
569-
if workspace.is_empty() && i != self.active && i != len - 1 {
570-
state.remove_workspace(workspace.handle);
571-
keep[i] = false;
572-
}
573-
}
562+
let kept: Vec<bool> = self
563+
.workspaces
564+
.iter()
565+
.enumerate()
566+
.map(|(i, workspace)| {
567+
let previous_is_empty =
568+
i > 0 && self.workspaces.get(i - 1).map_or(false, |w| w.is_empty());
569+
let keep = if workspace.is_empty() {
570+
// Keep empty workspace if it's active, or it's the last workspace,
571+
// and the previous worspace is not both active and empty.
572+
i == self.active
573+
|| (i == len - 1 && !(i == self.active + 1 && previous_is_empty))
574+
} else {
575+
true
576+
};
577+
if !keep {
578+
state.remove_workspace(workspace.handle);
579+
}
580+
keep
581+
})
582+
.collect();
574583

575-
let mut iter = keep.iter();
584+
let mut iter = kept.iter();
576585
self.workspaces.retain(|_| *iter.next().unwrap());
577-
self.active -= keep
586+
self.active -= kept
578587
.iter()
579588
.take(self.active + 1)
580-
.filter(|keep| !**keep)
589+
.filter(|kept| !**kept)
581590
.count();
582591

583-
if keep.iter().any(|val| *val == false) {
592+
if kept.iter().any(|val| *val == false) {
584593
for (i, workspace) in self.workspaces.iter().enumerate() {
585594
workspace_set_idx(state, i as u8 + 1, self.idx, &workspace.handle);
586595
}

0 commit comments

Comments
 (0)