diff options
| author | Winter <102400503+exoess@users.noreply.github.com> | 2024-07-09 21:52:48 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-07-10 04:52:48 +0000 |
| commit | a283c34dbbad44dfddfa4b5eafa6d8e3b47b7c14 (patch) | |
| tree | 3999eec34fa448f919f410966bccb16f555e5db4 /src | |
| parent | f9fe86ee3e82ff02ac9f75869cc4219850ae3f4c (diff) | |
| download | niri-a283c34dbbad44dfddfa4b5eafa6d8e3b47b7c14.tar.gz niri-a283c34dbbad44dfddfa4b5eafa6d8e3b47b7c14.tar.bz2 niri-a283c34dbbad44dfddfa4b5eafa6d8e3b47b7c14.zip | |
Add move-column-{left/right}-or-to-monitor-{left/right} (#528)
* feature added, move-column-left-or-monitor-left and move-column-right-or-monitor-right
* fixed stupid mistake
* yalter's fixes
* fixed names
* fixed a stupid mistake
---------
Co-authored-by: Ivan Molodetskikh <yalterz@gmail.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/input/mod.rs | 34 | ||||
| -rw-r--r-- | src/layout/mod.rs | 52 |
2 files changed, 86 insertions, 0 deletions
diff --git a/src/input/mod.rs b/src/input/mod.rs index d96de0cb..148129cf 100644 --- a/src/input/mod.rs +++ b/src/input/mod.rs @@ -571,6 +571,40 @@ impl State { // FIXME: granular self.niri.queue_redraw_all(); } + Action::MoveColumnLeftOrToMonitorLeft => { + if let Some(output) = self.niri.output_left() { + if self.niri.layout.move_column_left_or_to_output(&output) + && !self.maybe_warp_cursor_to_focus_centered() + { + self.move_cursor_to_output(&output); + } else { + self.maybe_warp_cursor_to_focus(); + } + } else { + self.niri.layout.move_left(); + self.maybe_warp_cursor_to_focus(); + } + + // FIXME: granular + self.niri.queue_redraw_all(); + } + Action::MoveColumnRightOrToMonitorRight => { + if let Some(output) = self.niri.output_right() { + if self.niri.layout.move_column_right_or_to_output(&output) + && !self.maybe_warp_cursor_to_focus_centered() + { + self.move_cursor_to_output(&output); + } else { + self.maybe_warp_cursor_to_focus(); + } + } else { + self.niri.layout.move_right(); + self.maybe_warp_cursor_to_focus(); + } + + // FIXME: granular + self.niri.queue_redraw_all(); + } Action::MoveWindowDown => { self.niri.layout.move_down(); self.maybe_warp_cursor_to_focus(); diff --git a/src/layout/mod.rs b/src/layout/mod.rs index fadde1fb..21e90668 100644 --- a/src/layout/mod.rs +++ b/src/layout/mod.rs @@ -1196,6 +1196,36 @@ impl<W: LayoutElement> Layout<W> { monitor.move_column_to_last(); } + pub fn move_column_left_or_to_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.move_left(); + return false; + } + } + + self.move_column_to_output(output); + true + } + + pub fn move_column_right_or_to_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 != workspace.columns.len() - 1 { + monitor.move_right(); + return false; + } + } + + self.move_column_to_output(output); + true + } + pub fn move_down(&mut self) { let Some(monitor) = self.active_monitor() else { return; @@ -2797,6 +2827,8 @@ mod tests { MoveColumnRight, MoveColumnToFirst, MoveColumnToLast, + MoveColumnLeftOrToMonitorLeft(#[proptest(strategy = "1..=2u8")] u8), + MoveColumnRightOrToMonitorRight(#[proptest(strategy = "1..=2u8")] u8), MoveWindowDown, MoveWindowUp, MoveWindowDownOrToWorkspaceDown, @@ -3154,6 +3186,22 @@ mod tests { Op::MoveColumnRight => layout.move_right(), Op::MoveColumnToFirst => layout.move_column_to_first(), Op::MoveColumnToLast => layout.move_column_to_last(), + Op::MoveColumnLeftOrToMonitorLeft(id) => { + let name = format!("output{id}"); + let Some(output) = layout.outputs().find(|o| o.name() == name).cloned() else { + return; + }; + + layout.move_column_left_or_to_output(&output); + } + Op::MoveColumnRightOrToMonitorRight(id) => { + let name = format!("output{id}"); + let Some(output) = layout.outputs().find(|o| o.name() == name).cloned() else { + return; + }; + + layout.move_column_right_or_to_output(&output); + } Op::MoveWindowDown => layout.move_down(), Op::MoveWindowUp => layout.move_up(), Op::MoveWindowDownOrToWorkspaceDown => layout.move_down_or_to_workspace_down(), @@ -3384,6 +3432,8 @@ mod tests { Op::FocusWindowOrWorkspaceDown, Op::MoveColumnLeft, Op::MoveColumnRight, + Op::MoveColumnLeftOrToMonitorLeft(0), + Op::MoveColumnRightOrToMonitorRight(1), Op::ConsumeWindowIntoColumn, Op::ExpelWindowFromColumn, Op::CenterColumn, @@ -3563,6 +3613,8 @@ mod tests { Op::FocusWindowOrWorkspaceDown, Op::MoveColumnLeft, Op::MoveColumnRight, + Op::MoveColumnLeftOrToMonitorLeft(0), + Op::MoveColumnRightOrToMonitorRight(1), Op::ConsumeWindowIntoColumn, Op::ExpelWindowFromColumn, Op::CenterColumn, |
