aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDuncan Overbruck <mail@duncano.de>2025-03-13 03:09:06 +0100
committerIvan Molodetskikh <yalterz@gmail.com>2025-03-14 12:57:33 -0700
commitf6aa8c17937fadd1da3c8f2f080ea402ae17da87 (patch)
tree8a4ca8f238c98a238e86b8c5331e33e414547601
parenta5d58d670bde166ff8bca8a83bb6f1136c7fa67b (diff)
downloadniri-f6aa8c17937fadd1da3c8f2f080ea402ae17da87.tar.gz
niri-f6aa8c17937fadd1da3c8f2f080ea402ae17da87.tar.bz2
niri-f6aa8c17937fadd1da3c8f2f080ea402ae17da87.zip
Add move-column-to-index action
-rw-r--r--niri-config/src/lib.rs2
-rw-r--r--niri-ipc/src/lib.rs8
-rw-r--r--src/input/mod.rs6
-rw-r--r--src/layout/mod.rs7
-rw-r--r--src/layout/scrolling.rs8
-rw-r--r--src/layout/tests.rs2
-rw-r--r--src/layout/workspace.rs7
7 files changed, 40 insertions, 0 deletions
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<niri_ipc::Action> 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<W: LayoutElement> Layout<W> {
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<W: LayoutElement> ScrollingSpace<W> {
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<W: LayoutElement> Workspace<W> {
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();