aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Sully <sullyj3@gmail.com>2024-06-09 21:14:51 +1000
committerGitHub <noreply@github.com>2024-06-09 11:14:51 +0000
commita55e385b12f27e3e700ae759d620b401f910288f (patch)
treef60b8f7860bc5a531c83c64a4ef0308935970e1e
parentaf6d84a7f85c3804bcf60d066f26e33070a17d1c (diff)
downloadniri-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.rs4
-rw-r--r--niri-ipc/src/lib.rs4
-rw-r--r--src/input/mod.rs12
-rw-r--r--src/layout/mod.rs22
-rw-r--r--src/layout/monitor.rs8
-rw-r--r--src/layout/workspace.rs22
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;