diff options
| author | James Sully <sullyj3@gmail.com> | 2024-06-09 21:14:51 +1000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-06-09 11:14:51 +0000 |
| commit | a55e385b12f27e3e700ae759d620b401f910288f (patch) | |
| tree | f60b8f7860bc5a531c83c64a4ef0308935970e1e /src | |
| parent | af6d84a7f85c3804bcf60d066f26e33070a17d1c (diff) | |
| download | niri-a55e385b12f27e3e700ae759d620b401f910288f.tar.gz niri-a55e385b12f27e3e700ae759d620b401f910288f.tar.bz2 niri-a55e385b12f27e3e700ae759d620b401f910288f.zip | |
Add `focus-column-right-or-first`, `focus-column-left-or-last` (#391)
* add focus-column-right-or-first
* add focus-column-left-or-last
Diffstat (limited to 'src')
| -rw-r--r-- | src/input/mod.rs | 12 | ||||
| -rw-r--r-- | src/layout/mod.rs | 22 | ||||
| -rw-r--r-- | src/layout/monitor.rs | 8 | ||||
| -rw-r--r-- | src/layout/workspace.rs | 22 |
4 files changed, 64 insertions, 0 deletions
diff --git a/src/input/mod.rs b/src/input/mod.rs index c8bb334e..40607ad5 100644 --- a/src/input/mod.rs +++ b/src/input/mod.rs @@ -565,6 +565,18 @@ impl State { // FIXME: granular self.niri.queue_redraw_all(); } + Action::FocusColumnRightOrFirst => { + self.niri.layout.focus_column_right_or_first(); + self.maybe_warp_cursor_to_focus(); + // FIXME: granular + self.niri.queue_redraw_all(); + } + Action::FocusColumnLeftOrLast => { + self.niri.layout.focus_column_left_or_last(); + self.maybe_warp_cursor_to_focus(); + // FIXME: granular + self.niri.queue_redraw_all(); + } Action::FocusWindowDown => { self.niri.layout.focus_down(); self.maybe_warp_cursor_to_focus(); diff --git a/src/layout/mod.rs b/src/layout/mod.rs index ac8db5d3..05c1550c 100644 --- a/src/layout/mod.rs +++ b/src/layout/mod.rs @@ -1235,6 +1235,20 @@ impl<W: LayoutElement> Layout<W> { monitor.focus_column_last(); } + pub fn focus_column_right_or_first(&mut self) { + let Some(monitor) = self.active_monitor() else { + return; + }; + monitor.focus_column_right_or_first(); + } + + pub fn focus_column_left_or_last(&mut self) { + let Some(monitor) = self.active_monitor() else { + return; + }; + monitor.focus_column_left_or_last(); + } + pub fn focus_down(&mut self) { let Some(monitor) = self.active_monitor() else { return; @@ -2634,6 +2648,8 @@ mod tests { FocusColumnRight, FocusColumnFirst, FocusColumnLast, + FocusColumnRightOrFirst, + FocusColumnLeftOrLast, FocusWindowDown, FocusWindowUp, FocusWindowDownOrColumnLeft, @@ -2928,6 +2944,8 @@ mod tests { Op::FocusColumnRight => layout.focus_right(), Op::FocusColumnFirst => layout.focus_column_first(), Op::FocusColumnLast => layout.focus_column_last(), + Op::FocusColumnRightOrFirst => layout.focus_column_right_or_first(), + Op::FocusColumnLeftOrLast => layout.focus_column_left_or_last(), Op::FocusWindowDown => layout.focus_down(), Op::FocusWindowUp => layout.focus_up(), Op::FocusWindowDownOrColumnLeft => layout.focus_down_or_left(), @@ -3144,6 +3162,8 @@ mod tests { Op::FullscreenWindow(3), Op::FocusColumnLeft, Op::FocusColumnRight, + Op::FocusColumnRightOrFirst, + Op::FocusColumnLeftOrLast, Op::FocusWindowUp, Op::FocusWindowUpOrColumnLeft, Op::FocusWindowUpOrColumnRight, @@ -3317,6 +3337,8 @@ mod tests { }, Op::FocusColumnLeft, Op::FocusColumnRight, + Op::FocusColumnRightOrFirst, + Op::FocusColumnLeftOrLast, Op::FocusWindowUp, Op::FocusWindowUpOrColumnLeft, Op::FocusWindowUpOrColumnRight, diff --git a/src/layout/monitor.rs b/src/layout/monitor.rs index b9cd431a..c4bf8429 100644 --- a/src/layout/monitor.rs +++ b/src/layout/monitor.rs @@ -320,6 +320,14 @@ impl<W: LayoutElement> Monitor<W> { self.active_workspace().focus_column_last(); } + pub fn focus_column_right_or_first(&mut self) { + self.active_workspace().focus_column_right_or_first(); + } + + pub fn focus_column_left_or_last(&mut self) { + self.active_workspace().focus_column_left_or_last(); + } + pub fn focus_down(&mut self) { self.active_workspace().focus_down(); } diff --git a/src/layout/workspace.rs b/src/layout/workspace.rs index fadbf00c..d18f37e0 100644 --- a/src/layout/workspace.rs +++ b/src/layout/workspace.rs @@ -1536,6 +1536,28 @@ impl<W: LayoutElement> Workspace<W> { self.activate_column(self.columns.len() - 1); } + pub fn focus_column_right_or_first(&mut self) { + if self.columns.is_empty() { + return; + } + + let column_idx = (self.active_column_idx + 1) % self.columns.len(); + self.activate_column(column_idx); + } + + pub fn focus_column_left_or_last(&mut self) { + if self.columns.is_empty() { + return; + } + + let column_idx = if self.active_column_idx == 0 { + self.columns.len() - 1 + } else { + self.active_column_idx - 1 + }; + self.activate_column(column_idx); + } + pub fn focus_down(&mut self) { if self.columns.is_empty() { return; |
