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 | |
| 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
| -rw-r--r-- | niri-config/src/lib.rs | 4 | ||||
| -rw-r--r-- | niri-ipc/src/lib.rs | 4 | ||||
| -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 |
6 files changed, 72 insertions, 0 deletions
diff --git a/niri-config/src/lib.rs b/niri-config/src/lib.rs index 02c6ff41..cbf70e59 100644 --- a/niri-config/src/lib.rs +++ b/niri-config/src/lib.rs @@ -942,6 +942,8 @@ pub enum Action { FocusColumnRight, FocusColumnFirst, FocusColumnLast, + FocusColumnRightOrFirst, + FocusColumnLeftOrLast, FocusWindowDown, FocusWindowUp, FocusWindowDownOrColumnLeft, @@ -1016,6 +1018,8 @@ impl From<niri_ipc::Action> for Action { niri_ipc::Action::FocusColumnRight => Self::FocusColumnRight, niri_ipc::Action::FocusColumnFirst => Self::FocusColumnFirst, niri_ipc::Action::FocusColumnLast => Self::FocusColumnLast, + niri_ipc::Action::FocusColumnRightOrFirst => Self::FocusColumnRightOrFirst, + niri_ipc::Action::FocusColumnLeftOrLast => Self::FocusColumnLeftOrLast, niri_ipc::Action::FocusWindowDown => Self::FocusWindowDown, niri_ipc::Action::FocusWindowUp => Self::FocusWindowUp, niri_ipc::Action::FocusWindowDownOrColumnLeft => Self::FocusWindowDownOrColumnLeft, diff --git a/niri-ipc/src/lib.rs b/niri-ipc/src/lib.rs index e7b1ca19..72e050e4 100644 --- a/niri-ipc/src/lib.rs +++ b/niri-ipc/src/lib.rs @@ -116,6 +116,10 @@ pub enum Action { FocusColumnFirst, /// Focus the last column. FocusColumnLast, + /// Focus the next column to the right, looping if at end. + FocusColumnRightOrFirst, + /// Focus the next column to the left, looping if at start. + FocusColumnLeftOrLast, /// Focus the window below. FocusWindowDown, /// Focus the window above. 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; |
