aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2023-08-14 16:26:50 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2023-08-14 18:37:33 +0400
commitdd23e0b6ee7b358f7b154853237866b1fa25d502 (patch)
tree997156a0f92675324b339ad33248ad28574fe8c9 /src
parentdbf998119f3903506f63deb7526849ccbc1bf099 (diff)
downloadniri-dd23e0b6ee7b358f7b154853237866b1fa25d502.tar.gz
niri-dd23e0b6ee7b358f7b154853237866b1fa25d502.tar.bz2
niri-dd23e0b6ee7b358f7b154853237866b1fa25d502.zip
Centralize workspace clean-up logic
Diffstat (limited to 'src')
-rw-r--r--src/layout.rs61
1 files changed, 24 insertions, 37 deletions
diff --git a/src/layout.rs b/src/layout.rs
index b1bae1b9..5b0c666c 100644
--- a/src/layout.rs
+++ b/src/layout.rs
@@ -777,6 +777,21 @@ impl<W: LayoutElement> Monitor<W> {
}
}
+ fn clean_up_workspaces(&mut self) {
+ for idx in (0..self.workspaces.len() - 1).rev() {
+ if self.active_workspace_idx == idx {
+ continue;
+ }
+
+ if !self.workspaces[idx].has_windows() {
+ self.workspaces.remove(idx);
+ if self.active_workspace_idx > idx {
+ self.active_workspace_idx -= 1;
+ }
+ }
+ }
+ }
+
pub fn move_left(&mut self) {
self.active_workspace().move_left();
}
@@ -826,17 +841,15 @@ impl<W: LayoutElement> Monitor<W> {
let window = column.windows[column.active_window_idx].clone();
workspace.remove_window(&window);
- if !workspace.has_windows() && source_workspace_idx != self.workspaces.len() - 1 {
- self.workspaces.remove(source_workspace_idx);
- }
-
self.add_window(new_idx, window, true);
+
+ self.clean_up_workspaces();
}
pub fn move_to_workspace_down(&mut self) {
let source_workspace_idx = self.active_workspace_idx;
- let mut new_idx = min(source_workspace_idx + 1, self.workspaces.len() - 1);
+ let new_idx = min(source_workspace_idx + 1, self.workspaces.len() - 1);
if new_idx == source_workspace_idx {
return;
}
@@ -850,45 +863,19 @@ impl<W: LayoutElement> Monitor<W> {
let window = column.windows[column.active_window_idx].clone();
workspace.remove_window(&window);
- if !workspace.has_windows() {
- self.workspaces.remove(source_workspace_idx);
- new_idx -= 1;
- }
-
self.add_window(new_idx, window, true);
+
+ self.clean_up_workspaces();
}
pub fn switch_workspace_up(&mut self) {
- let source_workspace_idx = self.active_workspace_idx;
-
- let new_idx = source_workspace_idx.saturating_sub(1);
- if new_idx == source_workspace_idx {
- return;
- }
-
- self.active_workspace_idx = new_idx;
-
- if !self.workspaces[source_workspace_idx].has_windows()
- && source_workspace_idx != self.workspaces.len() - 1
- {
- self.workspaces.remove(source_workspace_idx);
- }
+ self.active_workspace_idx = self.active_workspace_idx.saturating_sub(1);
+ self.clean_up_workspaces();
}
pub fn switch_workspace_down(&mut self) {
- let source_workspace_idx = self.active_workspace_idx;
-
- let mut new_idx = min(source_workspace_idx + 1, self.workspaces.len() - 1);
- if new_idx == source_workspace_idx {
- return;
- }
-
- if !self.workspaces[source_workspace_idx].has_windows() {
- self.workspaces.remove(source_workspace_idx);
- new_idx -= 1;
- }
-
- self.active_workspace_idx = new_idx;
+ self.active_workspace_idx = min(self.active_workspace_idx + 1, self.workspaces.len() - 1);
+ self.clean_up_workspaces();
}
pub fn consume_into_column(&mut self) {