diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2023-08-14 16:26:50 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2023-08-14 18:37:33 +0400 |
| commit | dd23e0b6ee7b358f7b154853237866b1fa25d502 (patch) | |
| tree | 997156a0f92675324b339ad33248ad28574fe8c9 /src | |
| parent | dbf998119f3903506f63deb7526849ccbc1bf099 (diff) | |
| download | niri-dd23e0b6ee7b358f7b154853237866b1fa25d502.tar.gz niri-dd23e0b6ee7b358f7b154853237866b1fa25d502.tar.bz2 niri-dd23e0b6ee7b358f7b154853237866b1fa25d502.zip | |
Centralize workspace clean-up logic
Diffstat (limited to 'src')
| -rw-r--r-- | src/layout.rs | 61 |
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) { |
