aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornyx <nnyyxxxx@protonmail.com>2025-03-29 02:40:08 -0400
committerGitHub <noreply@github.com>2025-03-29 06:40:08 +0000
commit0db48e2f1bf001bfd05c686002ff1998d0f1205b (patch)
treeafc86c3f1652675750f3c6d0db0c6e0d932d4438
parent7cfecf4b1b9b8c11c80061fb31926f888228499d (diff)
downloadniri-0db48e2f1bf001bfd05c686002ff1998d0f1205b.tar.gz
niri-0db48e2f1bf001bfd05c686002ff1998d0f1205b.tar.bz2
niri-0db48e2f1bf001bfd05c686002ff1998d0f1205b.zip
Add focus argument to move-window-to-workspace (#1332)
* layout: add focus flag to move-window-to-workspace * lib: update comment * misc: minor dup refactor * input: format code * layout: minor nit * layout: update comment * input: remove unnecessary conditionals * misc: replace boolean * tests: fix the failing one * layout: change to smart * ipc: Option<bool> -> bool * lib: format code * Rewrite focus doc comment --------- Co-authored-by: Ivan Molodetskikh <yalterz@gmail.com>
-rw-r--r--niri-config/src/lib.rs11
-rw-r--r--niri-ipc/src/lib.rs8
-rw-r--r--src/input/mod.rs21
-rw-r--r--src/layout/mod.rs9
-rw-r--r--src/layout/monitor.rs26
-rw-r--r--src/layout/tests.rs2
6 files changed, 58 insertions, 19 deletions
diff --git a/niri-config/src/lib.rs b/niri-config/src/lib.rs
index db379746..6ae66aeb 100644
--- a/niri-config/src/lib.rs
+++ b/niri-config/src/lib.rs
@@ -1592,11 +1592,15 @@ pub enum Action {
FocusWorkspacePrevious,
MoveWindowToWorkspaceDown,
MoveWindowToWorkspaceUp,
- MoveWindowToWorkspace(#[knuffel(argument)] WorkspaceReference),
+ MoveWindowToWorkspace(
+ #[knuffel(argument)] WorkspaceReference,
+ #[knuffel(property(name = "focus"), default = true)] bool,
+ ),
#[knuffel(skip)]
MoveWindowToWorkspaceById {
window_id: u64,
reference: WorkspaceReference,
+ focus: bool,
},
MoveColumnToWorkspaceDown,
MoveColumnToWorkspaceUp,
@@ -1817,13 +1821,16 @@ impl From<niri_ipc::Action> for Action {
niri_ipc::Action::MoveWindowToWorkspace {
window_id: None,
reference,
- } => Self::MoveWindowToWorkspace(WorkspaceReference::from(reference)),
+ focus,
+ } => Self::MoveWindowToWorkspace(WorkspaceReference::from(reference), focus),
niri_ipc::Action::MoveWindowToWorkspace {
window_id: Some(window_id),
reference,
+ focus,
} => Self::MoveWindowToWorkspaceById {
window_id,
reference: WorkspaceReference::from(reference),
+ focus,
},
niri_ipc::Action::MoveColumnToWorkspaceDown {} => Self::MoveColumnToWorkspaceDown,
niri_ipc::Action::MoveColumnToWorkspaceUp {} => Self::MoveColumnToWorkspaceUp,
diff --git a/niri-ipc/src/lib.rs b/niri-ipc/src/lib.rs
index 591c1bf6..fb90dbe7 100644
--- a/niri-ipc/src/lib.rs
+++ b/niri-ipc/src/lib.rs
@@ -426,6 +426,14 @@ pub enum Action {
/// Reference (index or name) of the workspace to move the window to.
#[cfg_attr(feature = "clap", arg())]
reference: WorkspaceReferenceArg,
+
+ /// Whether the focus should follow the moved window.
+ ///
+ /// If `true` (the default) and the window to move is focused, the focus will follow the
+ /// window to the new workspace. If `false`, the focus will remain on the original
+ /// workspace.
+ #[cfg_attr(feature = "clap", arg(long, action = clap::ArgAction::Set, default_value_t = true))]
+ focus: bool,
},
/// Move the focused column to the workspace below.
MoveColumnToWorkspaceDown {},
diff --git a/src/input/mod.rs b/src/input/mod.rs
index 2744561c..961df54a 100644
--- a/src/input/mod.rs
+++ b/src/input/mod.rs
@@ -40,7 +40,7 @@ use self::move_grab::MoveGrab;
use self::resize_grab::ResizeGrab;
use self::spatial_movement_grab::SpatialMovementGrab;
use crate::layout::scrolling::ScrollDirection;
-use crate::layout::LayoutElement as _;
+use crate::layout::{ActivateWindow, LayoutElement as _};
use crate::niri::{CastTarget, State};
use crate::ui::screenshot_ui::ScreenshotUi;
use crate::utils::spawning::spawn;
@@ -1072,7 +1072,7 @@ impl State {
// FIXME: granular
self.niri.queue_redraw_all();
}
- Action::MoveWindowToWorkspace(reference) => {
+ Action::MoveWindowToWorkspace(reference, focus) => {
if let Some((mut output, index)) =
self.niri.find_output_and_workspace_index(reference)
{
@@ -1091,7 +1091,12 @@ impl State {
self.move_cursor_to_output(&output);
}
} else {
- self.niri.layout.move_to_workspace(None, index);
+ let activate = if focus {
+ ActivateWindow::Smart
+ } else {
+ ActivateWindow::No
+ };
+ self.niri.layout.move_to_workspace(None, index, activate);
self.maybe_warp_cursor_to_focus();
}
@@ -1102,6 +1107,7 @@ impl State {
Action::MoveWindowToWorkspaceById {
window_id: id,
reference,
+ focus,
} => {
let window = self.niri.layout.windows().find(|(_, m)| m.id().get() == id);
let window = window.map(|(_, m)| m.window.clone());
@@ -1130,7 +1136,14 @@ impl State {
}
}
} else {
- self.niri.layout.move_to_workspace(Some(&window), index);
+ let activate = if focus {
+ ActivateWindow::Smart
+ } else {
+ ActivateWindow::No
+ };
+ self.niri
+ .layout
+ .move_to_workspace(Some(&window), index, activate);
// If we focused the target window.
let new_focus = self.niri.layout.focus();
diff --git a/src/layout/mod.rs b/src/layout/mod.rs
index 64e6877c..62ece8c0 100644
--- a/src/layout/mod.rs
+++ b/src/layout/mod.rs
@@ -2120,7 +2120,12 @@ impl<W: LayoutElement> Layout<W> {
monitor.move_to_workspace_down();
}
- pub fn move_to_workspace(&mut self, window: Option<&W::Id>, idx: usize) {
+ pub fn move_to_workspace(
+ &mut self,
+ window: Option<&W::Id>,
+ idx: usize,
+ activate: ActivateWindow,
+ ) {
if let Some(InteractiveMoveState::Moving(move_)) = &mut self.interactive_move {
if window.is_none() || window == Some(move_.tile.window().id()) {
return;
@@ -2143,7 +2148,7 @@ impl<W: LayoutElement> Layout<W> {
};
monitor
};
- monitor.move_to_workspace(window, idx);
+ monitor.move_to_workspace(window, idx, activate);
}
pub fn move_column_to_workspace_up(&mut self) {
diff --git a/src/layout/monitor.rs b/src/layout/monitor.rs
index 851bffbd..b0879606 100644
--- a/src/layout/monitor.rs
+++ b/src/layout/monitor.rs
@@ -474,7 +474,12 @@ impl<W: LayoutElement> Monitor<W> {
);
}
- pub fn move_to_workspace(&mut self, window: Option<&W::Id>, idx: usize) {
+ pub fn move_to_workspace(
+ &mut self,
+ window: Option<&W::Id>,
+ idx: usize,
+ activate: ActivateWindow,
+ ) {
let source_workspace_idx = if let Some(window) = window {
self.workspaces
.iter()
@@ -490,14 +495,11 @@ impl<W: LayoutElement> Monitor<W> {
}
let new_id = self.workspaces[new_idx].id();
- let activate = window.map_or(true, |win| {
- self.active_window().map(|win| win.id()) == Some(win)
+ let activate = activate.map_smart(|| {
+ window.map_or(true, |win| {
+ self.active_window().map(|win| win.id()) == Some(win)
+ })
});
- let activate = if activate {
- ActivateWindow::Yes
- } else {
- ActivateWindow::No
- };
let workspace = &mut self.workspaces[source_workspace_idx];
let transaction = Transaction::new();
@@ -515,7 +517,11 @@ impl<W: LayoutElement> Monitor<W> {
id: new_id,
column_idx: None,
},
- activate,
+ if activate {
+ ActivateWindow::Yes
+ } else {
+ ActivateWindow::No
+ },
removed.width,
removed.is_full_width,
removed.is_floating,
@@ -578,7 +584,7 @@ impl<W: LayoutElement> Monitor<W> {
let workspace = &mut self.workspaces[source_workspace_idx];
if workspace.floating_is_active() {
- self.move_to_workspace(None, idx);
+ self.move_to_workspace(None, idx, ActivateWindow::Smart);
return;
}
diff --git a/src/layout/tests.rs b/src/layout/tests.rs
index f7e5c759..727f53f5 100644
--- a/src/layout/tests.rs
+++ b/src/layout/tests.rs
@@ -1063,7 +1063,7 @@ impl Op {
workspace_idx,
} => {
let window_id = window_id.filter(|id| layout.has_window(id));
- layout.move_to_workspace(window_id.as_ref(), workspace_idx);
+ layout.move_to_workspace(window_id.as_ref(), workspace_idx, ActivateWindow::Smart);
}
Op::MoveColumnToWorkspaceDown => layout.move_column_to_workspace_down(),
Op::MoveColumnToWorkspaceUp => layout.move_column_to_workspace_up(),