diff options
| author | Filipe Paniguel <paniguel.lpnh@gmail.com> | 2024-06-28 11:44:24 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-06-28 07:44:24 -0700 |
| commit | bdf9894020f184643ac98fbbc74402689edfe3f4 (patch) | |
| tree | 1829fac0d2d224e161c6faa78db3f3163dcd3836 /src/layout | |
| parent | d180e60e0584e0c43682d7aca612c366f881dd85 (diff) | |
| download | niri-bdf9894020f184643ac98fbbc74402689edfe3f4.tar.gz niri-bdf9894020f184643ac98fbbc74402689edfe3f4.tar.bz2 niri-bdf9894020f184643ac98fbbc74402689edfe3f4.zip | |
feat: add `focus-column-or-monitor-left`, `focus-column-or-monitor-right` (#456)
* feat: add support for focus-window-or-monitor
* addresses output without window case
* refactor: reduce verbosity
* update this..
* refactor: rename `maybe_focus_window` functions
* refactor: flip focus_window_or_output return logic
* Update src/layout/mod.rs
Co-authored-by: Ivan Molodetskikh <yalterz@gmail.com>
* refactor: rename to Column
* move blocks next to other Column variables
---------
Co-authored-by: Ivan Molodetskikh <yalterz@gmail.com>
Diffstat (limited to 'src/layout')
| -rw-r--r-- | src/layout/mod.rs | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/layout/mod.rs b/src/layout/mod.rs index b74ef729..8fabba6a 100644 --- a/src/layout/mod.rs +++ b/src/layout/mod.rs @@ -1264,6 +1264,37 @@ impl<W: LayoutElement> Layout<W> { monitor.focus_column_left_or_last(); } + pub fn focus_column_left_or_output(&mut self, output: &Output) -> bool { + if let Some(monitor) = self.active_monitor() { + let workspace = monitor.active_workspace(); + let curr_idx = workspace.active_column_idx; + + if !workspace.columns.is_empty() && curr_idx != 0 { + monitor.focus_left(); + return false; + } + } + + self.focus_output(output); + true + } + + pub fn focus_column_right_or_output(&mut self, output: &Output) -> bool { + if let Some(monitor) = self.active_monitor() { + let workspace = monitor.active_workspace(); + let curr_idx = workspace.active_column_idx; + let columns = &workspace.columns; + + if !workspace.columns.is_empty() && curr_idx != columns.len() - 1 { + monitor.focus_right(); + return false; + } + } + + self.focus_output(output); + true + } + pub fn focus_down(&mut self) { let Some(monitor) = self.active_monitor() else { return; @@ -2697,6 +2728,8 @@ mod tests { FocusColumnLast, FocusColumnRightOrFirst, FocusColumnLeftOrLast, + FocusColumnOrMonitorLeft(#[proptest(strategy = "1..=2u8")] u8), + FocusColumnOrMonitorRight(#[proptest(strategy = "1..=2u8")] u8), FocusWindowDown, FocusWindowUp, FocusWindowDownOrColumnLeft, @@ -3022,6 +3055,22 @@ mod tests { Op::FocusColumnLast => layout.focus_column_last(), Op::FocusColumnRightOrFirst => layout.focus_column_right_or_first(), Op::FocusColumnLeftOrLast => layout.focus_column_left_or_last(), + Op::FocusColumnOrMonitorLeft(id) => { + let name = format!("output{id}"); + let Some(output) = layout.outputs().find(|o| o.name() == name).cloned() else { + return; + }; + + layout.focus_column_left_or_output(&output); + } + Op::FocusColumnOrMonitorRight(id) => { + let name = format!("output{id}"); + let Some(output) = layout.outputs().find(|o| o.name() == name).cloned() else { + return; + }; + + layout.focus_column_right_or_output(&output); + } Op::FocusWindowDown => layout.focus_down(), Op::FocusWindowUp => layout.focus_up(), Op::FocusWindowDownOrColumnLeft => layout.focus_down_or_left(), @@ -3250,6 +3299,8 @@ mod tests { Op::FocusColumnRight, Op::FocusColumnRightOrFirst, Op::FocusColumnLeftOrLast, + Op::FocusColumnOrMonitorLeft(0), + Op::FocusColumnOrMonitorRight(1), Op::FocusWindowUp, Op::FocusWindowUpOrColumnLeft, Op::FocusWindowUpOrColumnRight, @@ -3425,6 +3476,8 @@ mod tests { Op::FocusColumnRight, Op::FocusColumnRightOrFirst, Op::FocusColumnLeftOrLast, + Op::FocusColumnOrMonitorLeft(0), + Op::FocusColumnOrMonitorRight(1), Op::FocusWindowUp, Op::FocusWindowUpOrColumnLeft, Op::FocusWindowUpOrColumnRight, |
