diff options
| author | nyx <nnyyxxxx@protonmail.com> | 2025-03-29 02:40:08 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-03-29 06:40:08 +0000 |
| commit | 0db48e2f1bf001bfd05c686002ff1998d0f1205b (patch) | |
| tree | afc86c3f1652675750f3c6d0db0c6e0d932d4438 /src | |
| parent | 7cfecf4b1b9b8c11c80061fb31926f888228499d (diff) | |
| download | niri-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>
Diffstat (limited to 'src')
| -rw-r--r-- | src/input/mod.rs | 21 | ||||
| -rw-r--r-- | src/layout/mod.rs | 9 | ||||
| -rw-r--r-- | src/layout/monitor.rs | 26 | ||||
| -rw-r--r-- | src/layout/tests.rs | 2 |
4 files changed, 41 insertions, 17 deletions
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(), |
