aboutsummaryrefslogtreecommitdiff
path: root/src/layout
diff options
context:
space:
mode:
authorTheAngusMcFire <43189215+TheAngusMcFire@users.noreply.github.com>2024-07-05 06:55:04 +0200
committerGitHub <noreply@github.com>2024-07-05 04:55:04 +0000
commita56e4ff436cc4f36d7cda89e985d51e37f0b4f78 (patch)
tree30b5b4b5385173c72042d64ec73660b9f85098d2 /src/layout
parent9dcc9160b3b4be6c44672e8579e1e7107453c8b7 (diff)
downloadniri-a56e4ff436cc4f36d7cda89e985d51e37f0b4f78.tar.gz
niri-a56e4ff436cc4f36d7cda89e985d51e37f0b4f78.tar.bz2
niri-a56e4ff436cc4f36d7cda89e985d51e37f0b4f78.zip
Added Commnads to focus windows or Monitors above/below the active window (#497)
* Implement focus-window-up/down-or-monitor calls * Fixed wrong naming of focus-window-or-monitor commands * fix copy pase errors for focusing direction * Fixed wrong behaviour when the current workspace is empty * Cleanup navigation code to reduce complexity * Fix wrong comments and add testcases for FocusWindowOrMonitorUp/Down --------- Co-authored-by: Christian Rieger <christian.rieger@student.tugraz.at>
Diffstat (limited to 'src/layout')
-rw-r--r--src/layout/mod.rs59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/layout/mod.rs b/src/layout/mod.rs
index 8fabba6a..e93a2556 100644
--- a/src/layout/mod.rs
+++ b/src/layout/mod.rs
@@ -1264,6 +1264,43 @@ impl<W: LayoutElement> Layout<W> {
monitor.focus_column_left_or_last();
}
+ pub fn focus_window_up_or_output(&mut self, output: &Output) -> bool {
+ if let Some(monitor) = self.active_monitor() {
+ let workspace = monitor.active_workspace();
+
+ if !workspace.columns.is_empty() {
+ let curr_idx = workspace.columns[workspace.active_column_idx].active_tile_idx;
+ let new_idx = curr_idx.saturating_sub(1);
+ if curr_idx != new_idx {
+ workspace.focus_up();
+ return false;
+ }
+ }
+ }
+
+ self.focus_output(output);
+ true
+ }
+
+ pub fn focus_window_down_or_output(&mut self, output: &Output) -> bool {
+ if let Some(monitor) = self.active_monitor() {
+ let workspace = monitor.active_workspace();
+
+ if !workspace.columns.is_empty() {
+ let column = &workspace.columns[workspace.active_column_idx];
+ let curr_idx = column.active_tile_idx;
+ let new_idx = min(column.active_tile_idx + 1, column.tiles.len() - 1);
+ if curr_idx != new_idx {
+ workspace.focus_down();
+ return false;
+ }
+ }
+ }
+
+ self.focus_output(output);
+ true
+ }
+
pub fn focus_column_left_or_output(&mut self, output: &Output) -> bool {
if let Some(monitor) = self.active_monitor() {
let workspace = monitor.active_workspace();
@@ -2728,6 +2765,8 @@ mod tests {
FocusColumnLast,
FocusColumnRightOrFirst,
FocusColumnLeftOrLast,
+ FocusWindowOrMonitorUp(#[proptest(strategy = "1..=2u8")] u8),
+ FocusWindowOrMonitorDown(#[proptest(strategy = "1..=2u8")] u8),
FocusColumnOrMonitorLeft(#[proptest(strategy = "1..=2u8")] u8),
FocusColumnOrMonitorRight(#[proptest(strategy = "1..=2u8")] u8),
FocusWindowDown,
@@ -3055,6 +3094,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::FocusWindowOrMonitorUp(id) => {
+ let name = format!("output{id}");
+ let Some(output) = layout.outputs().find(|o| o.name() == name).cloned() else {
+ return;
+ };
+
+ layout.focus_window_up_or_output(&output);
+ }
+ Op::FocusWindowOrMonitorDown(id) => {
+ let name = format!("output{id}");
+ let Some(output) = layout.outputs().find(|o| o.name() == name).cloned() else {
+ return;
+ };
+
+ layout.focus_window_down_or_output(&output);
+ }
Op::FocusColumnOrMonitorLeft(id) => {
let name = format!("output{id}");
let Some(output) = layout.outputs().find(|o| o.name() == name).cloned() else {
@@ -3299,6 +3354,8 @@ mod tests {
Op::FocusColumnRight,
Op::FocusColumnRightOrFirst,
Op::FocusColumnLeftOrLast,
+ Op::FocusWindowOrMonitorUp(0),
+ Op::FocusWindowOrMonitorDown(1),
Op::FocusColumnOrMonitorLeft(0),
Op::FocusColumnOrMonitorRight(1),
Op::FocusWindowUp,
@@ -3476,6 +3533,8 @@ mod tests {
Op::FocusColumnRight,
Op::FocusColumnRightOrFirst,
Op::FocusColumnLeftOrLast,
+ Op::FocusWindowOrMonitorUp(0),
+ Op::FocusWindowOrMonitorDown(1),
Op::FocusColumnOrMonitorLeft(0),
Op::FocusColumnOrMonitorRight(1),
Op::FocusWindowUp,