diff options
| author | Duncan Overbruck <mail@duncano.de> | 2025-03-13 03:05:55 +0100 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2025-03-14 12:57:33 -0700 |
| commit | a5d58d670bde166ff8bca8a83bb6f1136c7fa67b (patch) | |
| tree | fbbf33348af1b22b4f1d3a214bdbee32a6985e18 /src | |
| parent | b4922086ce298bb3d7806437c6dbea4a86f52c38 (diff) | |
| download | niri-a5d58d670bde166ff8bca8a83bb6f1136c7fa67b.tar.gz niri-a5d58d670bde166ff8bca8a83bb6f1136c7fa67b.tar.bz2 niri-a5d58d670bde166ff8bca8a83bb6f1136c7fa67b.zip | |
Add focus-column (by index) action
Diffstat (limited to 'src')
| -rw-r--r-- | src/input/mod.rs | 7 | ||||
| -rw-r--r-- | src/layout/mod.rs | 7 | ||||
| -rw-r--r-- | src/layout/scrolling.rs | 8 | ||||
| -rw-r--r-- | src/layout/tests.rs | 2 | ||||
| -rw-r--r-- | src/layout/workspace.rs | 7 |
5 files changed, 31 insertions, 0 deletions
diff --git a/src/input/mod.rs b/src/input/mod.rs index 1141d5ce..b38da2a0 100644 --- a/src/input/mod.rs +++ b/src/input/mod.rs @@ -882,6 +882,13 @@ impl State { // FIXME: granular self.niri.queue_redraw_all(); } + Action::FocusColumn(index) => { + self.niri.layout.focus_column(index); + self.maybe_warp_cursor_to_focus(); + self.niri.layer_shell_on_demand_focus = None; + // FIXME: granular + self.niri.queue_redraw_all(); + } Action::FocusWindowOrMonitorUp => { if let Some(output) = self.niri.output_up() { if self.niri.layout.focus_window_up_or_output(&output) diff --git a/src/layout/mod.rs b/src/layout/mod.rs index dc7daa65..11469551 100644 --- a/src/layout/mod.rs +++ b/src/layout/mod.rs @@ -1946,6 +1946,13 @@ impl<W: LayoutElement> Layout<W> { workspace.focus_column_left_or_last(); } + pub fn focus_column(&mut self, index: usize) { + let Some(workspace) = self.active_workspace_mut() else { + return; + }; + workspace.focus_column(index); + } + pub fn focus_window_up_or_output(&mut self, output: &Output) -> bool { if let Some(workspace) = self.active_workspace_mut() { if workspace.focus_up() { diff --git a/src/layout/scrolling.rs b/src/layout/scrolling.rs index a6df4045..cad65881 100644 --- a/src/layout/scrolling.rs +++ b/src/layout/scrolling.rs @@ -1491,6 +1491,14 @@ impl<W: LayoutElement> ScrollingSpace<W> { self.activate_column(self.columns.len() - 1); } + pub fn focus_column(&mut self, index: usize) { + if self.columns.is_empty() { + return; + } + + self.activate_column(index.saturating_sub(1).min(self.columns.len() - 1)); + } + pub fn focus_window_in_column(&mut self, index: u8) { if self.columns.is_empty() { return; diff --git a/src/layout/tests.rs b/src/layout/tests.rs index 160e4e97..cfd5d053 100644 --- a/src/layout/tests.rs +++ b/src/layout/tests.rs @@ -374,6 +374,7 @@ enum Op { FocusColumnLast, FocusColumnRightOrFirst, FocusColumnLeftOrLast, + FocusColumn(#[proptest(strategy = "1..=5usize")] usize), FocusWindowOrMonitorUp(#[proptest(strategy = "1..=2u8")] u8), FocusWindowOrMonitorDown(#[proptest(strategy = "1..=2u8")] u8), FocusColumnOrMonitorLeft(#[proptest(strategy = "1..=2u8")] u8), @@ -907,6 +908,7 @@ impl Op { Op::FocusColumnLast => layout.focus_column_last(), Op::FocusColumnRightOrFirst => layout.focus_column_right_or_first(), Op::FocusColumnLeftOrLast => layout.focus_column_left_or_last(), + Op::FocusColumn(index) => layout.focus_column(index), Op::FocusWindowOrMonitorUp(id) => { let name = format!("output{id}"); let Some(output) = layout.outputs().find(|o| o.name() == name).cloned() else { diff --git a/src/layout/workspace.rs b/src/layout/workspace.rs index 1cb55233..08614308 100644 --- a/src/layout/workspace.rs +++ b/src/layout/workspace.rs @@ -850,6 +850,13 @@ impl<W: LayoutElement> Workspace<W> { } } + pub fn focus_column(&mut self, index: usize) { + if self.floating_is_active.get() { + self.focus_tiling(); + } + self.scrolling.focus_column(index); + } + pub fn focus_window_in_column(&mut self, index: u8) { if self.floating_is_active.get() { return; |
