Add focus-column-right-or-first, focus-column-left-or-last (#391)

* add focus-column-right-or-first

* add focus-column-left-or-last
This commit is contained in:
James Sully
2024-06-09 21:14:51 +10:00
committed by GitHub
parent af6d84a7f8
commit a55e385b12
6 changed files with 72 additions and 0 deletions
+4
View File
@@ -942,6 +942,8 @@ pub enum Action {
FocusColumnRight, FocusColumnRight,
FocusColumnFirst, FocusColumnFirst,
FocusColumnLast, FocusColumnLast,
FocusColumnRightOrFirst,
FocusColumnLeftOrLast,
FocusWindowDown, FocusWindowDown,
FocusWindowUp, FocusWindowUp,
FocusWindowDownOrColumnLeft, FocusWindowDownOrColumnLeft,
@@ -1016,6 +1018,8 @@ impl From<niri_ipc::Action> for Action {
niri_ipc::Action::FocusColumnRight => Self::FocusColumnRight, niri_ipc::Action::FocusColumnRight => Self::FocusColumnRight,
niri_ipc::Action::FocusColumnFirst => Self::FocusColumnFirst, niri_ipc::Action::FocusColumnFirst => Self::FocusColumnFirst,
niri_ipc::Action::FocusColumnLast => Self::FocusColumnLast, 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::FocusWindowDown => Self::FocusWindowDown,
niri_ipc::Action::FocusWindowUp => Self::FocusWindowUp, niri_ipc::Action::FocusWindowUp => Self::FocusWindowUp,
niri_ipc::Action::FocusWindowDownOrColumnLeft => Self::FocusWindowDownOrColumnLeft, niri_ipc::Action::FocusWindowDownOrColumnLeft => Self::FocusWindowDownOrColumnLeft,
+4
View File
@@ -116,6 +116,10 @@ pub enum Action {
FocusColumnFirst, FocusColumnFirst,
/// Focus the last column. /// Focus the last column.
FocusColumnLast, 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. /// Focus the window below.
FocusWindowDown, FocusWindowDown,
/// Focus the window above. /// Focus the window above.
+12
View File
@@ -565,6 +565,18 @@ impl State {
// FIXME: granular // FIXME: granular
self.niri.queue_redraw_all(); 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 => { Action::FocusWindowDown => {
self.niri.layout.focus_down(); self.niri.layout.focus_down();
self.maybe_warp_cursor_to_focus(); self.maybe_warp_cursor_to_focus();
+22
View File
@@ -1235,6 +1235,20 @@ impl<W: LayoutElement> Layout<W> {
monitor.focus_column_last(); 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) { pub fn focus_down(&mut self) {
let Some(monitor) = self.active_monitor() else { let Some(monitor) = self.active_monitor() else {
return; return;
@@ -2634,6 +2648,8 @@ mod tests {
FocusColumnRight, FocusColumnRight,
FocusColumnFirst, FocusColumnFirst,
FocusColumnLast, FocusColumnLast,
FocusColumnRightOrFirst,
FocusColumnLeftOrLast,
FocusWindowDown, FocusWindowDown,
FocusWindowUp, FocusWindowUp,
FocusWindowDownOrColumnLeft, FocusWindowDownOrColumnLeft,
@@ -2928,6 +2944,8 @@ mod tests {
Op::FocusColumnRight => layout.focus_right(), Op::FocusColumnRight => layout.focus_right(),
Op::FocusColumnFirst => layout.focus_column_first(), Op::FocusColumnFirst => layout.focus_column_first(),
Op::FocusColumnLast => layout.focus_column_last(), 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::FocusWindowDown => layout.focus_down(),
Op::FocusWindowUp => layout.focus_up(), Op::FocusWindowUp => layout.focus_up(),
Op::FocusWindowDownOrColumnLeft => layout.focus_down_or_left(), Op::FocusWindowDownOrColumnLeft => layout.focus_down_or_left(),
@@ -3144,6 +3162,8 @@ mod tests {
Op::FullscreenWindow(3), Op::FullscreenWindow(3),
Op::FocusColumnLeft, Op::FocusColumnLeft,
Op::FocusColumnRight, Op::FocusColumnRight,
Op::FocusColumnRightOrFirst,
Op::FocusColumnLeftOrLast,
Op::FocusWindowUp, Op::FocusWindowUp,
Op::FocusWindowUpOrColumnLeft, Op::FocusWindowUpOrColumnLeft,
Op::FocusWindowUpOrColumnRight, Op::FocusWindowUpOrColumnRight,
@@ -3317,6 +3337,8 @@ mod tests {
}, },
Op::FocusColumnLeft, Op::FocusColumnLeft,
Op::FocusColumnRight, Op::FocusColumnRight,
Op::FocusColumnRightOrFirst,
Op::FocusColumnLeftOrLast,
Op::FocusWindowUp, Op::FocusWindowUp,
Op::FocusWindowUpOrColumnLeft, Op::FocusWindowUpOrColumnLeft,
Op::FocusWindowUpOrColumnRight, Op::FocusWindowUpOrColumnRight,
+8
View File
@@ -320,6 +320,14 @@ impl<W: LayoutElement> Monitor<W> {
self.active_workspace().focus_column_last(); 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) { pub fn focus_down(&mut self) {
self.active_workspace().focus_down(); self.active_workspace().focus_down();
} }
+22
View File
@@ -1536,6 +1536,28 @@ impl<W: LayoutElement> Workspace<W> {
self.activate_column(self.columns.len() - 1); 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) { pub fn focus_down(&mut self) {
if self.columns.is_empty() { if self.columns.is_empty() {
return; return;