Add optional fallback to workspace focus/move for window focus/move (#93)

* Add optional fallback to workspace focus/move for window focus/move commands

* Refactored to separate commands

* fix indentation

* fix white space

* Stylistic fixes

---------

Co-authored-by: Ivan Molodetskikh <yalterz@gmail.com>
This commit is contained in:
Matt Cuneo
2023-12-19 19:25:05 +11:00
committed by GitHub
parent d155f5cd6c
commit d6b62ad09d
4 changed files with 139 additions and 0 deletions
+7
View File
@@ -167,6 +167,13 @@ binds {
Mod+Ctrl+Up { move-window-up; } Mod+Ctrl+Up { move-window-up; }
Mod+Ctrl+Right { move-column-right; } Mod+Ctrl+Right { move-column-right; }
// Alternative commands that move across workspaces when reaching
// the first or last window in a column.
// Mod+J { focus-window-or-workspace-down; }
// Mod+K { focus-window-or-workspace-up; }
// Mod+Ctrl+J { move-window-down-or-to-workspace-down; }
// Mod+Ctrl+K { move-window-up-or-to-workspace-up; }
Mod+Shift+H { focus-monitor-left; } Mod+Shift+H { focus-monitor-left; }
Mod+Shift+J { focus-monitor-down; } Mod+Shift+J { focus-monitor-down; }
Mod+Shift+K { focus-monitor-up; } Mod+Shift+K { focus-monitor-up; }
+4
View File
@@ -288,10 +288,14 @@ pub enum Action {
FocusColumnRight, FocusColumnRight,
FocusWindowDown, FocusWindowDown,
FocusWindowUp, FocusWindowUp,
FocusWindowOrWorkspaceDown,
FocusWindowOrWorkspaceUp,
MoveColumnLeft, MoveColumnLeft,
MoveColumnRight, MoveColumnRight,
MoveWindowDown, MoveWindowDown,
MoveWindowUp, MoveWindowUp,
MoveWindowDownOrToWorkspaceDown,
MoveWindowUpOrToWorkspaceUp,
ConsumeWindowIntoColumn, ConsumeWindowIntoColumn,
ExpelWindowFromColumn, ExpelWindowFromColumn,
CenterColumn, CenterColumn,
+20
View File
@@ -339,6 +339,16 @@ impl State {
// FIXME: granular // FIXME: granular
self.niri.queue_redraw_all(); self.niri.queue_redraw_all();
} }
Action::MoveWindowDownOrToWorkspaceDown => {
self.niri.layout.move_down_or_to_workspace_down();
// FIXME: granular
self.niri.queue_redraw_all();
}
Action::MoveWindowUpOrToWorkspaceUp => {
self.niri.layout.move_up_or_to_workspace_up();
// FIXME: granular
self.niri.queue_redraw_all();
}
Action::FocusColumnLeft => { Action::FocusColumnLeft => {
self.niri.layout.focus_left(); self.niri.layout.focus_left();
} }
@@ -351,6 +361,16 @@ impl State {
Action::FocusWindowUp => { Action::FocusWindowUp => {
self.niri.layout.focus_up(); self.niri.layout.focus_up();
} }
Action::FocusWindowOrWorkspaceDown => {
self.niri.layout.focus_window_or_workspace_down();
// FIXME: granular
self.niri.queue_redraw_all();
}
Action::FocusWindowOrWorkspaceUp => {
self.niri.layout.focus_window_or_workspace_up();
// FIXME: granular
self.niri.queue_redraw_all();
}
Action::MoveWindowToWorkspaceDown => { Action::MoveWindowToWorkspaceDown => {
self.niri.layout.move_to_workspace_down(); self.niri.layout.move_to_workspace_down();
// FIXME: granular // FIXME: granular
+108
View File
@@ -977,6 +977,20 @@ impl<W: LayoutElement> Layout<W> {
monitor.move_up(); monitor.move_up();
} }
pub fn move_down_or_to_workspace_down(&mut self) {
let Some(monitor) = self.active_monitor() else {
return;
};
monitor.move_down_or_to_workspace_down();
}
pub fn move_up_or_to_workspace_up(&mut self) {
let Some(monitor) = self.active_monitor() else {
return;
};
monitor.move_up_or_to_workspace_up();
}
pub fn focus_left(&mut self) { pub fn focus_left(&mut self) {
let Some(monitor) = self.active_monitor() else { let Some(monitor) = self.active_monitor() else {
return; return;
@@ -1005,6 +1019,20 @@ impl<W: LayoutElement> Layout<W> {
monitor.focus_up(); monitor.focus_up();
} }
pub fn focus_window_or_workspace_down(&mut self) {
let Some(monitor) = self.active_monitor() else {
return;
};
monitor.focus_window_or_workspace_down();
}
pub fn focus_window_or_workspace_up(&mut self) {
let Some(monitor) = self.active_monitor() else {
return;
};
monitor.focus_window_or_workspace_up();
}
pub fn move_to_workspace_up(&mut self) { pub fn move_to_workspace_up(&mut self) {
let Some(monitor) = self.active_monitor() else { let Some(monitor) = self.active_monitor() else {
return; return;
@@ -1612,6 +1640,35 @@ impl<W: LayoutElement> Monitor<W> {
self.active_workspace().move_up(); self.active_workspace().move_up();
} }
pub fn move_down_or_to_workspace_down(&mut self) {
let workspace = self.active_workspace();
if workspace.columns.is_empty() {
return;
}
let column = &mut workspace.columns[workspace.active_column_idx];
let curr_idx = column.active_window_idx;
let new_idx = min(column.active_window_idx + 1, column.windows.len() - 1);
if curr_idx == new_idx {
self.move_to_workspace_down();
} else {
workspace.move_down();
}
}
pub fn move_up_or_to_workspace_up(&mut self) {
let workspace = self.active_workspace();
if workspace.columns.is_empty() {
return;
}
let curr_idx = workspace.columns[workspace.active_column_idx].active_window_idx;
let new_idx = curr_idx.saturating_sub(1);
if curr_idx == new_idx {
self.move_to_workspace_up();
} else {
workspace.move_up();
}
}
pub fn focus_left(&mut self) { pub fn focus_left(&mut self) {
self.active_workspace().focus_left(); self.active_workspace().focus_left();
} }
@@ -1628,6 +1685,37 @@ impl<W: LayoutElement> Monitor<W> {
self.active_workspace().focus_up(); self.active_workspace().focus_up();
} }
pub fn focus_window_or_workspace_down(&mut self) {
let workspace = self.active_workspace();
if workspace.columns.is_empty() {
self.switch_workspace_down();
} else {
let column = &workspace.columns[workspace.active_column_idx];
let curr_idx = column.active_window_idx;
let new_idx = min(column.active_window_idx + 1, column.windows.len() - 1);
if curr_idx == new_idx {
self.switch_workspace_down();
} else {
workspace.focus_down();
}
}
}
pub fn focus_window_or_workspace_up(&mut self) {
let workspace = self.active_workspace();
if workspace.columns.is_empty() {
self.switch_workspace_up();
} else {
let curr_idx = workspace.columns[workspace.active_column_idx].active_window_idx;
let new_idx = curr_idx.saturating_sub(1);
if curr_idx == new_idx {
self.switch_workspace_up();
} else {
workspace.focus_up();
}
}
}
pub fn move_to_workspace_up(&mut self) { pub fn move_to_workspace_up(&mut self) {
let source_workspace_idx = self.active_workspace_idx; let source_workspace_idx = self.active_workspace_idx;
@@ -3337,10 +3425,14 @@ mod tests {
FocusColumnRight, FocusColumnRight,
FocusWindowDown, FocusWindowDown,
FocusWindowUp, FocusWindowUp,
FocusWindowOrWorkspaceDown,
FocusWindowOrWorkspaceUp,
MoveColumnLeft, MoveColumnLeft,
MoveColumnRight, MoveColumnRight,
MoveWindowDown, MoveWindowDown,
MoveWindowUp, MoveWindowUp,
MoveWindowDownOrToWorkspaceDown,
MoveWindowUpOrToWorkspaceUp,
ConsumeWindowIntoColumn, ConsumeWindowIntoColumn,
ExpelWindowFromColumn, ExpelWindowFromColumn,
CenterColumn, CenterColumn,
@@ -3444,10 +3536,14 @@ mod tests {
Op::FocusColumnRight => layout.focus_right(), Op::FocusColumnRight => layout.focus_right(),
Op::FocusWindowDown => layout.focus_down(), Op::FocusWindowDown => layout.focus_down(),
Op::FocusWindowUp => layout.focus_up(), Op::FocusWindowUp => layout.focus_up(),
Op::FocusWindowOrWorkspaceDown => layout.focus_window_or_workspace_down(),
Op::FocusWindowOrWorkspaceUp => layout.focus_window_or_workspace_up(),
Op::MoveColumnLeft => layout.move_left(), Op::MoveColumnLeft => layout.move_left(),
Op::MoveColumnRight => layout.move_right(), Op::MoveColumnRight => layout.move_right(),
Op::MoveWindowDown => layout.move_down(), Op::MoveWindowDown => layout.move_down(),
Op::MoveWindowUp => layout.move_up(), Op::MoveWindowUp => layout.move_up(),
Op::MoveWindowDownOrToWorkspaceDown => layout.move_down_or_to_workspace_down(),
Op::MoveWindowUpOrToWorkspaceUp => layout.move_up_or_to_workspace_up(),
Op::ConsumeWindowIntoColumn => layout.consume_into_column(), Op::ConsumeWindowIntoColumn => layout.consume_into_column(),
Op::ExpelWindowFromColumn => layout.expel_from_column(), Op::ExpelWindowFromColumn => layout.expel_from_column(),
Op::CenterColumn => layout.center_column(), Op::CenterColumn => layout.center_column(),
@@ -3548,6 +3644,10 @@ mod tests {
Op::CloseWindow(2), Op::CloseWindow(2),
Op::FocusColumnLeft, Op::FocusColumnLeft,
Op::FocusColumnRight, Op::FocusColumnRight,
Op::FocusWindowUp,
Op::FocusWindowOrWorkspaceUp,
Op::FocusWindowDown,
Op::FocusWindowOrWorkspaceDown,
Op::MoveColumnLeft, Op::MoveColumnLeft,
Op::MoveColumnRight, Op::MoveColumnRight,
Op::ConsumeWindowIntoColumn, Op::ConsumeWindowIntoColumn,
@@ -3564,7 +3664,9 @@ mod tests {
Op::MoveWindowToWorkspace(2), Op::MoveWindowToWorkspace(2),
Op::MoveWindowToWorkspace(3), Op::MoveWindowToWorkspace(3),
Op::MoveWindowDown, Op::MoveWindowDown,
Op::MoveWindowDownOrToWorkspaceDown,
Op::MoveWindowUp, Op::MoveWindowUp,
Op::MoveWindowUpOrToWorkspaceUp,
]; ];
for third in every_op { for third in every_op {
@@ -3656,6 +3758,10 @@ mod tests {
Op::CloseWindow(2), Op::CloseWindow(2),
Op::FocusColumnLeft, Op::FocusColumnLeft,
Op::FocusColumnRight, Op::FocusColumnRight,
Op::FocusWindowUp,
Op::FocusWindowOrWorkspaceUp,
Op::FocusWindowDown,
Op::FocusWindowOrWorkspaceDown,
Op::MoveColumnLeft, Op::MoveColumnLeft,
Op::MoveColumnRight, Op::MoveColumnRight,
Op::ConsumeWindowIntoColumn, Op::ConsumeWindowIntoColumn,
@@ -3672,7 +3778,9 @@ mod tests {
Op::MoveWindowToWorkspace(2), Op::MoveWindowToWorkspace(2),
Op::MoveWindowToWorkspace(3), Op::MoveWindowToWorkspace(3),
Op::MoveWindowDown, Op::MoveWindowDown,
Op::MoveWindowDownOrToWorkspaceDown,
Op::MoveWindowUp, Op::MoveWindowUp,
Op::MoveWindowUpOrToWorkspaceUp,
]; ];
for third in every_op { for third in every_op {