aboutsummaryrefslogtreecommitdiff
path: root/src/layout/mod.rs
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-01-15 10:36:59 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2024-01-15 10:36:59 +0400
commitfb38ae26c9a1ebc9691372acae9009d52dc68bb5 (patch)
tree0b93c0ddded5d7fa183a29b796021e8b07db9979 /src/layout/mod.rs
parentcc4acdf24a0864e061e7ea54d6b3589402f2082d (diff)
downloadniri-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.rs58
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(),