From d6c553091f037f482f63d8a8afce306b236c404b Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Fri, 29 Dec 2023 07:51:14 +0400 Subject: Add focus-column-{first,last} --- resources/default-config.kdl | 3 +++ src/config.rs | 2 ++ src/input.rs | 6 ++++++ src/layout/mod.rs | 18 ++++++++++++++++++ src/layout/monitor.rs | 8 ++++++++ src/layout/workspace.rs | 12 ++++++++++++ 6 files changed, 49 insertions(+) diff --git a/resources/default-config.kdl b/resources/default-config.kdl index bf1c004b..1cee634a 100644 --- a/resources/default-config.kdl +++ b/resources/default-config.kdl @@ -203,6 +203,9 @@ binds { // Mod+Ctrl+J { move-window-down-or-to-workspace-down; } // Mod+Ctrl+K { move-window-up-or-to-workspace-up; } + Mod+Home { focus-column-first; } + Mod+End { focus-column-last; } + Mod+Shift+H { focus-monitor-left; } Mod+Shift+J { focus-monitor-down; } Mod+Shift+K { focus-monitor-up; } diff --git a/src/config.rs b/src/config.rs index 9ca61e20..df9d0ecd 100644 --- a/src/config.rs +++ b/src/config.rs @@ -313,6 +313,8 @@ pub enum Action { FullscreenWindow, FocusColumnLeft, FocusColumnRight, + FocusColumnFirst, + FocusColumnLast, FocusWindowDown, FocusWindowUp, FocusWindowOrWorkspaceDown, diff --git a/src/input.rs b/src/input.rs index d315754a..9e7e66f2 100644 --- a/src/input.rs +++ b/src/input.rs @@ -357,6 +357,12 @@ impl State { Action::FocusColumnRight => { self.niri.layout.focus_right(); } + Action::FocusColumnFirst => { + self.niri.layout.focus_column_first(); + } + Action::FocusColumnLast => { + self.niri.layout.focus_column_last(); + } Action::FocusWindowDown => { self.niri.layout.focus_down(); } diff --git a/src/layout/mod.rs b/src/layout/mod.rs index c60211a3..02287db6 100644 --- a/src/layout/mod.rs +++ b/src/layout/mod.rs @@ -816,6 +816,20 @@ impl Layout { monitor.focus_right(); } + pub fn focus_column_first(&mut self) { + let Some(monitor) = self.active_monitor() else { + return; + }; + monitor.focus_column_first(); + } + + pub fn focus_column_last(&mut self) { + let Some(monitor) = self.active_monitor() else { + return; + }; + monitor.focus_column_last(); + } + pub fn focus_down(&mut self) { let Some(monitor) = self.active_monitor() else { return; @@ -1524,6 +1538,8 @@ mod tests { FullscreenWindow(#[proptest(strategy = "1..=5usize")] usize), FocusColumnLeft, FocusColumnRight, + FocusColumnFirst, + FocusColumnLast, FocusWindowDown, FocusWindowUp, FocusWindowOrWorkspaceDown, @@ -1635,6 +1651,8 @@ mod tests { } Op::FocusColumnLeft => layout.focus_left(), Op::FocusColumnRight => layout.focus_right(), + Op::FocusColumnFirst => layout.focus_column_first(), + Op::FocusColumnLast => layout.focus_column_last(), Op::FocusWindowDown => layout.focus_down(), Op::FocusWindowUp => layout.focus_up(), Op::FocusWindowOrWorkspaceDown => layout.focus_window_or_workspace_down(), diff --git a/src/layout/monitor.rs b/src/layout/monitor.rs index aa4c439e..28d7921e 100644 --- a/src/layout/monitor.rs +++ b/src/layout/monitor.rs @@ -197,6 +197,14 @@ impl Monitor { self.active_workspace().focus_right(); } + pub fn focus_column_first(&mut self) { + self.active_workspace().focus_column_first(); + } + + pub fn focus_column_last(&mut self) { + self.active_workspace().focus_column_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 aa00b348..d496cd69 100644 --- a/src/layout/workspace.rs +++ b/src/layout/workspace.rs @@ -617,6 +617,18 @@ impl Workspace { self.activate_column(min(self.active_column_idx + 1, self.columns.len() - 1)); } + pub fn focus_column_first(&mut self) { + self.activate_column(0); + } + + pub fn focus_column_last(&mut self) { + if self.columns.is_empty() { + return; + } + + self.activate_column(self.columns.len() - 1); + } + pub fn focus_down(&mut self) { if self.columns.is_empty() { return; -- cgit