aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2023-10-14 20:32:53 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2023-10-14 20:42:44 +0400
commitd1f431fd7e94ac76cd0a6f47368b376d639a6d71 (patch)
tree7f5d4eb796596f277c8cdd7ecabe4e5ca6bf8f29 /src
parentc29fdcaccb568c0f51dc50d71e4aa05b16a657cb (diff)
downloadniri-d1f431fd7e94ac76cd0a6f47368b376d639a6d71.tar.gz
niri-d1f431fd7e94ac76cd0a6f47368b376d639a6d71.tar.bz2
niri-d1f431fd7e94ac76cd0a6f47368b376d639a6d71.zip
Fix moving empty workspaces to original output
Diffstat (limited to 'src')
-rw-r--r--src/layout.rs45
1 files changed, 40 insertions, 5 deletions
diff --git a/src/layout.rs b/src/layout.rs
index 6eb9d359..f94bf7da 100644
--- a/src/layout.rs
+++ b/src/layout.rs
@@ -479,7 +479,13 @@ impl<W: LayoutElement> Layout<W> {
for i in (0..primary.workspaces.len()).rev() {
if primary.workspaces[i].original_output == id {
let ws = primary.workspaces.remove(i);
- workspaces.push(ws);
+
+ // The user could've closed a window while remaining on this workspace, on
+ // another monitor. However, we will add an empty workspace in the end
+ // instead.
+ if ws.has_windows() {
+ workspaces.push(ws);
+ }
if i <= primary.active_workspace_idx {
primary.active_workspace_idx =
@@ -488,10 +494,9 @@ impl<W: LayoutElement> Layout<W> {
}
}
workspaces.reverse();
- if workspaces.iter().all(|ws| ws.has_windows()) {
- // Make sure there's always an empty workspace.
- workspaces.push(Workspace::new(output.clone(), self.options.clone()));
- }
+
+ // Make sure there's always an empty workspace.
+ workspaces.push(Workspace::new(output.clone(), self.options.clone()));
for ws in &mut workspaces {
ws.set_output(Some(output.clone()));
@@ -1074,6 +1079,11 @@ impl<W: LayoutElement> Layout<W> {
);
}
+ assert!(
+ monitor.workspaces.last().unwrap().columns.is_empty(),
+ "monitor must have an empty workspace in the end"
+ );
+
// FIXME: verify that primary doesn't have any workspaces for which their own monitor
// exists.
@@ -3286,6 +3296,31 @@ mod tests {
assert!(monitors[0].workspaces[0].has_windows());
}
+ #[test]
+ fn empty_workspaces_dont_move_back_to_original_output() {
+ let ops = [
+ Op::AddOutput(1),
+ Op::AddWindow {
+ id: 1,
+ bbox: Rectangle::from_loc_and_size((0, 0), (100, 200)),
+ activate: true,
+ },
+ Op::FocusWorkspaceDown,
+ Op::AddWindow {
+ id: 2,
+ bbox: Rectangle::from_loc_and_size((0, 0), (100, 200)),
+ activate: true,
+ },
+ Op::AddOutput(2),
+ Op::RemoveOutput(1),
+ Op::FocusWorkspace(1),
+ Op::CloseWindow(1),
+ Op::AddOutput(1),
+ ];
+
+ check_ops(&ops);
+ }
+
proptest! {
#![proptest_config(ProptestConfig {
cases: if std::env::var_os("RUN_SLOW_TESTS").is_none() {