From 489a225fae57adba01057893d244c64c749bccfe Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Sun, 24 Dec 2023 18:00:46 +0400 Subject: Add and use remove_window_by_idx --- src/layout/mod.rs | 3 +-- src/layout/monitor.rs | 18 +++++++++--------- src/layout/workspace.rs | 45 +++++++++++++++++++++++++-------------------- 3 files changed, 35 insertions(+), 31 deletions(-) (limited to 'src') diff --git a/src/layout/mod.rs b/src/layout/mod.rs index 9e8cbe53..b5cb7178 100644 --- a/src/layout/mod.rs +++ b/src/layout/mod.rs @@ -1045,10 +1045,9 @@ impl Layout { return; } let column = &ws.columns[ws.active_column_idx]; - let window = column.windows[column.active_window_idx].clone(); let width = column.width; let is_full_width = column.is_full_width; - ws.remove_window(&window); + let window = ws.remove_window_by_idx(ws.active_column_idx, column.active_window_idx); let workspace_idx = monitors[new_idx].active_workspace_idx; self.add_window_by_idx(new_idx, workspace_idx, window, true, width, is_full_width); diff --git a/src/layout/monitor.rs b/src/layout/monitor.rs index 0fe7af00..bf3b61e0 100644 --- a/src/layout/monitor.rs +++ b/src/layout/monitor.rs @@ -249,11 +249,11 @@ impl Monitor { return; } - let column = &mut workspace.columns[workspace.active_column_idx]; + let column = &workspace.columns[workspace.active_column_idx]; let width = column.width; let is_full_width = column.is_full_width; - let window = column.windows[column.active_window_idx].clone(); - workspace.remove_window(&window); + let window = + workspace.remove_window_by_idx(workspace.active_column_idx, column.active_window_idx); self.add_window(new_idx, window, true, width, is_full_width); } @@ -271,11 +271,11 @@ impl Monitor { return; } - let column = &mut workspace.columns[workspace.active_column_idx]; + let column = &workspace.columns[workspace.active_column_idx]; let width = column.width; let is_full_width = column.is_full_width; - let window = column.windows[column.active_window_idx].clone(); - workspace.remove_window(&window); + let window = + workspace.remove_window_by_idx(workspace.active_column_idx, column.active_window_idx); self.add_window(new_idx, window, true, width, is_full_width); } @@ -293,11 +293,11 @@ impl Monitor { return; } - let column = &mut workspace.columns[workspace.active_column_idx]; + let column = &workspace.columns[workspace.active_column_idx]; let width = column.width; let is_full_width = column.is_full_width; - let window = column.windows[column.active_window_idx].clone(); - workspace.remove_window(&window); + let window = + workspace.remove_window_by_idx(workspace.active_column_idx, column.active_window_idx); self.add_window(new_idx, window, true, width, is_full_width); diff --git a/src/layout/workspace.rs b/src/layout/workspace.rs index 16424ffb..0c06404c 100644 --- a/src/layout/workspace.rs +++ b/src/layout/workspace.rs @@ -482,21 +482,15 @@ impl Workspace { } } - pub fn remove_window(&mut self, window: &W) { + pub fn remove_window_by_idx(&mut self, column_idx: usize, window_idx: usize) -> W { + let column = &mut self.columns[column_idx]; + let window = column.windows.remove(window_idx); + column.heights.remove(window_idx); + if let Some(output) = &self.output { window.output_leave(output); } - let column_idx = self - .columns - .iter() - .position(|col| col.contains(window)) - .unwrap(); - let column = &mut self.columns[column_idx]; - - let window_idx = column.windows.iter().position(|win| win == window).unwrap(); - column.windows.remove(window_idx); - column.heights.remove(window_idx); if column.windows.is_empty() { if column_idx + 1 == self.active_column_idx { // The previous column, that we were going to activate upon removal of the active @@ -509,7 +503,7 @@ impl Workspace { // view jumps. self.columns.remove(column_idx); if self.columns.is_empty() { - return; + return window; } if self.active_column_idx > column_idx @@ -523,11 +517,25 @@ impl Workspace { self.activate_column(min(self.active_column_idx, self.columns.len() - 1)); } - return; + return window; } column.active_window_idx = min(column.active_window_idx, column.windows.len() - 1); column.update_window_sizes(); + + window + } + + pub fn remove_window(&mut self, window: &W) { + let column_idx = self + .columns + .iter() + .position(|col| col.contains(window)) + .unwrap(); + let column = &self.columns[column_idx]; + + let window_idx = column.windows.iter().position(|win| win == window).unwrap(); + self.remove_window_by_idx(column_idx, window_idx); } pub fn update_window(&mut self, window: &W) { @@ -662,10 +670,7 @@ impl Workspace { } let source_column_idx = self.active_column_idx + 1; - - let source_column = &mut self.columns[source_column_idx]; - let window = source_column.windows[0].clone(); - self.remove_window(&window); + let window = self.remove_window_by_idx(source_column_idx, 0); let target_column = &mut self.columns[self.active_column_idx]; target_column.add_window(window); @@ -676,15 +681,15 @@ impl Workspace { return; } - let source_column = &mut self.columns[self.active_column_idx]; + let source_column = &self.columns[self.active_column_idx]; if source_column.windows.len() == 1 { return; } let width = source_column.width; let is_full_width = source_column.is_full_width; - let window = source_column.windows[source_column.active_window_idx].clone(); - self.remove_window(&window); + let window = + self.remove_window_by_idx(self.active_column_idx, source_column.active_window_idx); self.add_window(window, true, width, is_full_width); } -- cgit