From a444efd0ebee8e203877daedc7bc65584f72daba Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Wed, 5 Feb 2025 17:18:21 +0300 Subject: Add focus-window-in-column (by index) action --- src/layout/mod.rs | 7 +++++++ src/layout/monitor.rs | 4 ++++ src/layout/scrolling.rs | 12 ++++++++++++ src/layout/tests.rs | 2 ++ src/layout/workspace.rs | 7 +++++++ 5 files changed, 32 insertions(+) (limited to 'src/layout') diff --git a/src/layout/mod.rs b/src/layout/mod.rs index 45c5ffce..419f3fd3 100644 --- a/src/layout/mod.rs +++ b/src/layout/mod.rs @@ -1893,6 +1893,13 @@ impl Layout { true } + pub fn focus_window_in_column(&mut self, index: u8) { + let Some(monitor) = self.active_monitor() else { + return; + }; + monitor.focus_window_in_column(index); + } + pub fn focus_down(&mut self) { let Some(monitor) = self.active_monitor() else { return; diff --git a/src/layout/monitor.rs b/src/layout/monitor.rs index 37f5fb94..ebafad17 100644 --- a/src/layout/monitor.rs +++ b/src/layout/monitor.rs @@ -457,6 +457,10 @@ impl Monitor { self.active_workspace().focus_column_left_or_last(); } + pub fn focus_window_in_column(&mut self, index: u8) { + self.active_workspace().focus_window_in_column(index); + } + pub fn focus_down(&mut self) -> bool { self.active_workspace().focus_down() } diff --git a/src/layout/scrolling.rs b/src/layout/scrolling.rs index 07890284..da193e0d 100644 --- a/src/layout/scrolling.rs +++ b/src/layout/scrolling.rs @@ -1362,6 +1362,14 @@ impl ScrollingSpace { self.activate_column(self.columns.len() - 1); } + pub fn focus_window_in_column(&mut self, index: u8) { + if self.columns.is_empty() { + return; + } + + self.columns[self.active_column_idx].focus_index(index); + } + pub fn focus_down(&mut self) -> bool { if self.columns.is_empty() { return false; @@ -3614,6 +3622,10 @@ impl Column { .unwrap() } + fn focus_index(&mut self, index: u8) { + self.active_tile_idx = min(usize::from(index.saturating_sub(1)), self.tiles.len() - 1); + } + fn focus_up(&mut self) -> bool { if self.active_tile_idx == 0 { return false; diff --git a/src/layout/tests.rs b/src/layout/tests.rs index b08b1de0..05178f01 100644 --- a/src/layout/tests.rs +++ b/src/layout/tests.rs @@ -380,6 +380,7 @@ enum Op { FocusWindowOrWorkspaceDown, FocusWindowOrWorkspaceUp, FocusWindow(#[proptest(strategy = "1..=5usize")] usize), + FocusWindowInColumn(#[proptest(strategy = "1..=5u8")] u8), FocusWindowTop, FocusWindowBottom, FocusWindowDownOrTop, @@ -928,6 +929,7 @@ impl Op { Op::FocusWindowOrWorkspaceDown => layout.focus_window_or_workspace_down(), Op::FocusWindowOrWorkspaceUp => layout.focus_window_or_workspace_up(), Op::FocusWindow(id) => layout.activate_window(&id), + Op::FocusWindowInColumn(index) => layout.focus_window_in_column(index), Op::FocusWindowTop => layout.focus_window_top(), Op::FocusWindowBottom => layout.focus_window_bottom(), Op::FocusWindowDownOrTop => layout.focus_window_down_or_top(), diff --git a/src/layout/workspace.rs b/src/layout/workspace.rs index 680e5e4c..519a9c61 100644 --- a/src/layout/workspace.rs +++ b/src/layout/workspace.rs @@ -848,6 +848,13 @@ impl Workspace { } } + pub fn focus_window_in_column(&mut self, index: u8) { + if self.floating_is_active.get() { + return; + } + self.scrolling.focus_window_in_column(index); + } + pub fn focus_down(&mut self) -> bool { if self.floating_is_active.get() { self.floating.focus_down() -- cgit