diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-01-15 10:36:59 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-01-15 10:36:59 +0400 |
| commit | fb38ae26c9a1ebc9691372acae9009d52dc68bb5 (patch) | |
| tree | 0b93c0ddded5d7fa183a29b796021e8b07db9979 /src/layout/mod.rs | |
| parent | cc4acdf24a0864e061e7ea54d6b3589402f2082d (diff) | |
| download | niri-fb38ae26c9a1ebc9691372acae9009d52dc68bb5.tar.gz niri-fb38ae26c9a1ebc9691372acae9009d52dc68bb5.tar.bz2 niri-fb38ae26c9a1ebc9691372acae9009d52dc68bb5.zip | |
Add move-column-to-monitor* binds
As opposed to move-window-to-monitor*
Diffstat (limited to 'src/layout/mod.rs')
| -rw-r--r-- | src/layout/mod.rs | 58 |
1 files changed, 57 insertions, 1 deletions
diff --git a/src/layout/mod.rs b/src/layout/mod.rs index 5933b217..539177cb 100644 --- a/src/layout/mod.rs +++ b/src/layout/mod.rs @@ -49,7 +49,7 @@ use smithay::wayland::shell::xdg::SurfaceCachedState; pub use self::monitor::MonitorRenderElement; use self::monitor::{Monitor, WorkspaceSwitch, WorkspaceSwitchGesture}; use self::workspace::{ - compute_working_area, ColumnWidth, OutputId, Workspace, WorkspaceRenderElement, + compute_working_area, Column, ColumnWidth, OutputId, Workspace, WorkspaceRenderElement, }; use crate::animation::Animation; 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. /// /// 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) { if !matches!(&self.monitor_set, MonitorSet::Normal { .. }) { return; @@ -1635,6 +1682,7 @@ mod tests { MoveWorkspaceDown, MoveWorkspaceUp, MoveWindowToOutput(#[proptest(strategy = "1..=5u8")] u8), + MoveColumnToOutput(#[proptest(strategy = "1..=5u8")] u8), SwitchPresetColumnWidth, MaximizeColumn, SetColumnWidth(#[proptest(strategy = "arbitrary_size_change()")] SizeChange), @@ -1764,6 +1812,14 @@ mod tests { 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::MoveWorkspaceUp => layout.move_workspace_up(), Op::SwitchPresetColumnWidth => layout.toggle_width(), |
