diff options
| -rw-r--r-- | niri-config/src/lib.rs | 42 | ||||
| -rw-r--r-- | niri-ipc/src/lib.rs | 12 | ||||
| -rw-r--r-- | src/input/mod.rs | 18 |
3 files changed, 72 insertions, 0 deletions
diff --git a/niri-config/src/lib.rs b/niri-config/src/lib.rs index fca9313e..d6fac26b 100644 --- a/niri-config/src/lib.rs +++ b/niri-config/src/lib.rs @@ -1575,12 +1575,14 @@ pub enum Action { MoveWindowToMonitorUp, MoveWindowToMonitorPrevious, MoveWindowToMonitorNext, + MoveWindowToMonitor(#[knuffel(argument)] String), MoveColumnToMonitorLeft, MoveColumnToMonitorRight, MoveColumnToMonitorDown, MoveColumnToMonitorUp, MoveColumnToMonitorPrevious, MoveColumnToMonitorNext, + MoveColumnToMonitor(#[knuffel(argument)] String), SetWindowWidth(#[knuffel(argument, str)] SizeChange), #[knuffel(skip)] SetWindowWidthById { @@ -1778,12 +1780,14 @@ impl From<niri_ipc::Action> for Action { niri_ipc::Action::MoveWindowToMonitorUp {} => Self::MoveWindowToMonitorUp, niri_ipc::Action::MoveWindowToMonitorPrevious {} => Self::MoveWindowToMonitorPrevious, niri_ipc::Action::MoveWindowToMonitorNext {} => Self::MoveWindowToMonitorNext, + niri_ipc::Action::MoveWindowToMonitor { output } => Self::MoveWindowToMonitor(output), niri_ipc::Action::MoveColumnToMonitorLeft {} => Self::MoveColumnToMonitorLeft, niri_ipc::Action::MoveColumnToMonitorRight {} => Self::MoveColumnToMonitorRight, niri_ipc::Action::MoveColumnToMonitorDown {} => Self::MoveColumnToMonitorDown, niri_ipc::Action::MoveColumnToMonitorUp {} => Self::MoveColumnToMonitorUp, niri_ipc::Action::MoveColumnToMonitorPrevious {} => Self::MoveColumnToMonitorPrevious, niri_ipc::Action::MoveColumnToMonitorNext {} => Self::MoveColumnToMonitorNext, + niri_ipc::Action::MoveColumnToMonitor { output } => Self::MoveColumnToMonitor(output), niri_ipc::Action::SetWindowWidth { id: None, change } => Self::SetWindowWidth(change), niri_ipc::Action::SetWindowWidth { id: Some(id), @@ -3774,6 +3778,8 @@ mod tests { Mod+Shift+H { focus-monitor-left; } Mod+Shift+O { focus-monitor "eDP-1"; } Mod+Ctrl+Shift+L { move-window-to-monitor-right; } + Mod+Ctrl+Alt+O { move-window-to-monitor "eDP-1"; } + Mod+Ctrl+Alt+P { move-column-to-monitor "DP-1"; } Mod+Comma { consume-window-into-column; } Mod+1 { focus-workspace 1; } Mod+Shift+1 { focus-workspace "workspace-1"; } @@ -4646,6 +4652,42 @@ mod tests { Bind { key: Key { trigger: Keysym( + XK_o, + ), + modifiers: Modifiers( + CTRL | ALT | COMPOSITOR, + ), + }, + action: MoveWindowToMonitor( + "eDP-1", + ), + repeat: true, + cooldown: None, + allow_when_locked: false, + allow_inhibiting: true, + hotkey_overlay_title: None, + }, + Bind { + key: Key { + trigger: Keysym( + XK_p, + ), + modifiers: Modifiers( + CTRL | ALT | COMPOSITOR, + ), + }, + action: MoveColumnToMonitor( + "DP-1", + ), + repeat: true, + cooldown: None, + allow_when_locked: false, + allow_inhibiting: true, + hotkey_overlay_title: None, + }, + Bind { + key: Key { + trigger: Keysym( XK_comma, ), modifiers: Modifiers( diff --git a/niri-ipc/src/lib.rs b/niri-ipc/src/lib.rs index 444349ec..680734cc 100644 --- a/niri-ipc/src/lib.rs +++ b/niri-ipc/src/lib.rs @@ -475,6 +475,12 @@ pub enum Action { MoveWindowToMonitorPrevious {}, /// Move the focused window to the next monitor. MoveWindowToMonitorNext {}, + /// Move the focused window to a specific monitor. + MoveWindowToMonitor { + /// The target output name. + #[cfg_attr(feature = "clap", arg())] + output: String, + }, /// Move the focused column to the monitor to the left. MoveColumnToMonitorLeft {}, /// Move the focused column to the monitor to the right. @@ -487,6 +493,12 @@ pub enum Action { MoveColumnToMonitorPrevious {}, /// Move the focused column to the next monitor. MoveColumnToMonitorNext {}, + /// Move the focused column to a specific monitor. + MoveColumnToMonitor { + /// The target output name. + #[cfg_attr(feature = "clap", arg())] + output: String, + }, /// Change the width of a window. #[cfg_attr( feature = "clap", diff --git a/src/input/mod.rs b/src/input/mod.rs index badf7cd8..4dce9376 100644 --- a/src/input/mod.rs +++ b/src/input/mod.rs @@ -1449,6 +1449,15 @@ impl State { } } } + Action::MoveWindowToMonitor(output) => { + if let Some(output) = self.niri.output_by_name_match(&output).cloned() { + self.niri.layout.move_to_output(None, &output, None); + self.niri.layout.focus_output(&output); + if !self.maybe_warp_cursor_to_focus_centered() { + self.move_cursor_to_output(&output); + } + } + } Action::MoveColumnToMonitorLeft => { if let Some(output) = self.niri.output_left() { self.niri.layout.move_column_to_output(&output); @@ -1503,6 +1512,15 @@ impl State { } } } + Action::MoveColumnToMonitor(output) => { + if let Some(output) = self.niri.output_by_name_match(&output).cloned() { + self.niri.layout.move_column_to_output(&output); + self.niri.layout.focus_output(&output); + if !self.maybe_warp_cursor_to_focus_centered() { + self.move_cursor_to_output(&output); + } + } + } Action::SetColumnWidth(change) => { self.niri.layout.set_column_width(change); } |
