Add move-column-to-monitor* binds

As opposed to move-window-to-monitor*
This commit is contained in:
Ivan Molodetskikh
2024-01-15 10:36:59 +04:00
parent cc4acdf24a
commit fb38ae26c9
3 changed files with 85 additions and 1 deletions
+4
View File
@@ -421,6 +421,10 @@ pub enum Action {
MoveWindowToMonitorRight, MoveWindowToMonitorRight,
MoveWindowToMonitorDown, MoveWindowToMonitorDown,
MoveWindowToMonitorUp, MoveWindowToMonitorUp,
MoveColumnToMonitorLeft,
MoveColumnToMonitorRight,
MoveColumnToMonitorDown,
MoveColumnToMonitorUp,
SetWindowHeight(#[knuffel(argument, str)] SizeChange), SetWindowHeight(#[knuffel(argument, str)] SizeChange),
SwitchPresetColumnWidth, SwitchPresetColumnWidth,
MaximizeColumn, MaximizeColumn,
+24
View File
@@ -569,6 +569,30 @@ impl State {
self.move_cursor_to_output(&output); self.move_cursor_to_output(&output);
} }
} }
Action::MoveColumnToMonitorLeft => {
if let Some(output) = self.niri.output_left() {
self.niri.layout.move_column_to_output(&output);
self.move_cursor_to_output(&output);
}
}
Action::MoveColumnToMonitorRight => {
if let Some(output) = self.niri.output_right() {
self.niri.layout.move_column_to_output(&output);
self.move_cursor_to_output(&output);
}
}
Action::MoveColumnToMonitorDown => {
if let Some(output) = self.niri.output_down() {
self.niri.layout.move_column_to_output(&output);
self.move_cursor_to_output(&output);
}
}
Action::MoveColumnToMonitorUp => {
if let Some(output) = self.niri.output_up() {
self.niri.layout.move_column_to_output(&output);
self.move_cursor_to_output(&output);
}
}
Action::SetColumnWidth(change) => { Action::SetColumnWidth(change) => {
self.niri.layout.set_column_width(change); self.niri.layout.set_column_width(change);
} }
+57 -1
View File
@@ -49,7 +49,7 @@ use smithay::wayland::shell::xdg::SurfaceCachedState;
pub use self::monitor::MonitorRenderElement; pub use self::monitor::MonitorRenderElement;
use self::monitor::{Monitor, WorkspaceSwitch, WorkspaceSwitchGesture}; use self::monitor::{Monitor, WorkspaceSwitch, WorkspaceSwitchGesture};
use self::workspace::{ use self::workspace::{
compute_working_area, ColumnWidth, OutputId, Workspace, WorkspaceRenderElement, compute_working_area, Column, ColumnWidth, OutputId, Workspace, WorkspaceRenderElement,
}; };
use crate::animation::Animation; use crate::animation::Animation;
use crate::utils::output_size; use crate::utils::output_size;
@@ -457,6 +457,29 @@ impl<W: LayoutElement> Layout<W> {
} }
} }
pub fn add_column_by_idx(
&mut self,
monitor_idx: usize,
workspace_idx: usize,
column: Column<W>,
activate: bool,
) {
let MonitorSet::Normal {
monitors,
active_monitor_idx,
..
} = &mut self.monitor_set
else {
panic!()
};
monitors[monitor_idx].add_column(workspace_idx, column, activate);
if activate {
*active_monitor_idx = monitor_idx;
}
}
/// Adds a new window to the layout. /// Adds a new window to the layout.
/// ///
/// Returns an output that the window was added to, if there were any outputs. /// Returns an output that the window was added to, if there were any outputs.
@@ -1205,6 +1228,30 @@ impl<W: LayoutElement> Layout<W> {
} }
} }
pub fn move_column_to_output(&mut self, output: &Output) {
if let MonitorSet::Normal {
monitors,
active_monitor_idx,
..
} = &mut self.monitor_set
{
let new_idx = monitors
.iter()
.position(|mon| &mon.output == output)
.unwrap();
let current = &mut monitors[*active_monitor_idx];
let ws = current.active_workspace();
if !ws.has_windows() {
return;
}
let column = ws.remove_column_by_idx(ws.active_column_idx);
let workspace_idx = monitors[new_idx].active_workspace_idx;
self.add_column_by_idx(new_idx, workspace_idx, column, true);
}
}
pub fn move_window_to_output(&mut self, window: W, output: &Output) { pub fn move_window_to_output(&mut self, window: W, output: &Output) {
if !matches!(&self.monitor_set, MonitorSet::Normal { .. }) { if !matches!(&self.monitor_set, MonitorSet::Normal { .. }) {
return; return;
@@ -1635,6 +1682,7 @@ mod tests {
MoveWorkspaceDown, MoveWorkspaceDown,
MoveWorkspaceUp, MoveWorkspaceUp,
MoveWindowToOutput(#[proptest(strategy = "1..=5u8")] u8), MoveWindowToOutput(#[proptest(strategy = "1..=5u8")] u8),
MoveColumnToOutput(#[proptest(strategy = "1..=5u8")] u8),
SwitchPresetColumnWidth, SwitchPresetColumnWidth,
MaximizeColumn, MaximizeColumn,
SetColumnWidth(#[proptest(strategy = "arbitrary_size_change()")] SizeChange), SetColumnWidth(#[proptest(strategy = "arbitrary_size_change()")] SizeChange),
@@ -1764,6 +1812,14 @@ mod tests {
layout.move_to_output(&output); layout.move_to_output(&output);
} }
Op::MoveColumnToOutput(id) => {
let name = format!("output{id}");
let Some(output) = layout.outputs().find(|o| o.name() == name).cloned() else {
return;
};
layout.move_column_to_output(&output);
}
Op::MoveWorkspaceDown => layout.move_workspace_down(), Op::MoveWorkspaceDown => layout.move_workspace_down(),
Op::MoveWorkspaceUp => layout.move_workspace_up(), Op::MoveWorkspaceUp => layout.move_workspace_up(),
Op::SwitchPresetColumnWidth => layout.toggle_width(), Op::SwitchPresetColumnWidth => layout.toggle_width(),