From f6aa8c17937fadd1da3c8f2f080ea402ae17da87 Mon Sep 17 00:00:00 2001 From: Duncan Overbruck Date: Thu, 13 Mar 2025 03:09:06 +0100 Subject: Add move-column-to-index action --- niri-config/src/lib.rs | 2 ++ niri-ipc/src/lib.rs | 8 ++++++++ src/input/mod.rs | 6 ++++++ src/layout/mod.rs | 7 +++++++ src/layout/scrolling.rs | 8 ++++++++ src/layout/tests.rs | 2 ++ src/layout/workspace.rs | 7 +++++++ 7 files changed, 40 insertions(+) diff --git a/niri-config/src/lib.rs b/niri-config/src/lib.rs index 0b776b67..5b557b5f 100644 --- a/niri-config/src/lib.rs +++ b/niri-config/src/lib.rs @@ -1509,6 +1509,7 @@ pub enum Action { MoveColumnToLast, MoveColumnLeftOrToMonitorLeft, MoveColumnRightOrToMonitorRight, + MoveColumnToIndex(#[knuffel(argument)] usize), MoveWindowDown, MoveWindowUp, MoveWindowDownOrToWorkspaceDown, @@ -1704,6 +1705,7 @@ impl From for Action { niri_ipc::Action::MoveColumnRight {} => Self::MoveColumnRight, niri_ipc::Action::MoveColumnToFirst {} => Self::MoveColumnToFirst, niri_ipc::Action::MoveColumnToLast {} => Self::MoveColumnToLast, + niri_ipc::Action::MoveColumnToIndex { index } => Self::MoveColumnToIndex(index), niri_ipc::Action::MoveColumnLeftOrToMonitorLeft {} => { Self::MoveColumnLeftOrToMonitorLeft } diff --git a/niri-ipc/src/lib.rs b/niri-ipc/src/lib.rs index c7dd2083..870fce45 100644 --- a/niri-ipc/src/lib.rs +++ b/niri-ipc/src/lib.rs @@ -301,6 +301,14 @@ pub enum Action { MoveColumnLeftOrToMonitorLeft {}, /// Move the focused column to the right or to the monitor to the right. MoveColumnRightOrToMonitorRight {}, + /// Move the focused column to a specific index on its workspace. + MoveColumnToIndex { + /// New index for the column. + /// + /// The index starts from 1 for the first column. + #[cfg_attr(feature = "clap", arg())] + index: usize, + }, /// Move the focused window down in a column. MoveWindowDown {}, /// Move the focused window up in a column. diff --git a/src/input/mod.rs b/src/input/mod.rs index b38da2a0..95d30457 100644 --- a/src/input/mod.rs +++ b/src/input/mod.rs @@ -1167,6 +1167,12 @@ impl State { self.niri.queue_redraw_all(); } } + Action::MoveColumnToIndex(idx) => { + self.niri.layout.move_column_to_index(idx); + self.maybe_warp_cursor_to_focus(); + // FIXME: granular + self.niri.queue_redraw_all(); + } Action::FocusWorkspaceDown => { self.niri.layout.switch_workspace_down(); self.maybe_warp_cursor_to_focus(); diff --git a/src/layout/mod.rs b/src/layout/mod.rs index 11469551..67963f2e 100644 --- a/src/layout/mod.rs +++ b/src/layout/mod.rs @@ -1830,6 +1830,13 @@ impl Layout { true } + pub fn move_column_to_index(&mut self, index: usize) { + let Some(workspace) = self.active_workspace_mut() else { + return; + }; + workspace.move_column_to_index(index); + } + pub fn move_down(&mut self) { let Some(workspace) = self.active_workspace_mut() else { return; diff --git a/src/layout/scrolling.rs b/src/layout/scrolling.rs index cad65881..8659b8f8 100644 --- a/src/layout/scrolling.rs +++ b/src/layout/scrolling.rs @@ -1583,6 +1583,14 @@ impl ScrollingSpace { self.columns[self.active_column_idx].focus_bottom() } + pub fn move_column_to_index(&mut self, index: usize) { + if self.columns.is_empty() { + return; + } + + self.move_column_to(index.saturating_sub(1).min(self.columns.len() - 1)); + } + fn move_column_to(&mut self, new_idx: usize) { if self.active_column_idx == new_idx { return; diff --git a/src/layout/tests.rs b/src/layout/tests.rs index cfd5d053..29a44877 100644 --- a/src/layout/tests.rs +++ b/src/layout/tests.rs @@ -399,6 +399,7 @@ enum Op { MoveColumnToLast, MoveColumnLeftOrToMonitorLeft(#[proptest(strategy = "1..=2u8")] u8), MoveColumnRightOrToMonitorRight(#[proptest(strategy = "1..=2u8")] u8), + MoveColumnToIndex(#[proptest(strategy = "1..=5usize")] usize), MoveWindowDown, MoveWindowUp, MoveWindowDownOrToWorkspaceDown, @@ -975,6 +976,7 @@ impl Op { layout.move_column_right_or_to_output(&output); } + Op::MoveColumnToIndex(index) => layout.move_column_to_index(index), Op::MoveWindowDown => layout.move_down(), Op::MoveWindowUp => layout.move_up(), Op::MoveWindowDownOrToWorkspaceDown => layout.move_down_or_to_workspace_down(), diff --git a/src/layout/workspace.rs b/src/layout/workspace.rs index 08614308..873af715 100644 --- a/src/layout/workspace.rs +++ b/src/layout/workspace.rs @@ -972,6 +972,13 @@ impl Workspace { self.scrolling.move_column_to_last(); } + pub fn move_column_to_index(&mut self, index: usize) { + if self.floating_is_active.get() { + return; + } + self.scrolling.move_column_to_index(index); + } + pub fn move_down(&mut self) -> bool { if self.floating_is_active.get() { self.floating.move_down(); -- cgit