aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-06-02 08:17:26 +0300
committerIvan Molodetskikh <yalterz@gmail.com>2024-06-02 08:21:19 +0300
commitb5ad0e12fd46f7ab06f4bbc0e80bf3f2d4395cbf (patch)
tree1bfad724b8ec7c3b9f4f507bd59132fc2f9a0767
parentc8e46b9d172dfa2ca89d82b87055b8e39622f80c (diff)
downloadniri-b5ad0e12fd46f7ab06f4bbc0e80bf3f2d4395cbf.tar.gz
niri-b5ad0e12fd46f7ab06f4bbc0e80bf3f2d4395cbf.tar.bz2
niri-b5ad0e12fd46f7ab06f4bbc0e80bf3f2d4395cbf.zip
Preserve empty named workspaces upon output removal
Not sure how we missed this.
-rw-r--r--src/layout/mod.rs29
1 files changed, 28 insertions, 1 deletions
diff --git a/src/layout/mod.rs b/src/layout/mod.rs
index 6e8fa292..a444601b 100644
--- a/src/layout/mod.rs
+++ b/src/layout/mod.rs
@@ -403,7 +403,7 @@ impl<W: LayoutElement> Layout<W> {
}
// Get rid of empty workspaces.
- workspaces.retain(|ws| ws.has_windows());
+ workspaces.retain(|ws| ws.has_windows() || ws.name.is_some());
if monitors.is_empty() {
// Removed the last monitor.
@@ -3811,6 +3811,33 @@ mod tests {
check_ops(&ops);
}
+ #[test]
+ fn removing_all_outputs_preserves_empty_named_workspaces() {
+ let ops = [
+ Op::AddOutput(1),
+ Op::AddNamedWorkspace {
+ ws_name: 1,
+ output_name: None,
+ },
+ Op::AddNamedWorkspace {
+ ws_name: 2,
+ output_name: None,
+ },
+ Op::RemoveOutput(1),
+ ];
+
+ let mut layout = Layout::default();
+ for op in ops {
+ op.apply(&mut layout);
+ }
+
+ let MonitorSet::NoOutputs { workspaces } = layout.monitor_set else {
+ unreachable!()
+ };
+
+ assert_eq!(workspaces.len(), 2);
+ }
+
fn arbitrary_spacing() -> impl Strategy<Value = u16> {
// Give equal weight to:
// - 0: the element is disabled