From cc4acdf24a0864e061e7ea54d6b3589402f2082d Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Mon, 15 Jan 2024 10:31:44 +0400 Subject: Add move-column-to-workspace* binds As opposed to move-window-to-workspace* --- src/layout/monitor.rs | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 76 insertions(+), 1 deletion(-) (limited to 'src/layout/monitor.rs') diff --git a/src/layout/monitor.rs b/src/layout/monitor.rs index a5c4d6dd..11eef73a 100644 --- a/src/layout/monitor.rs +++ b/src/layout/monitor.rs @@ -12,7 +12,7 @@ use smithay::output::Output; use smithay::utils::{Logical, Point, Rectangle, Scale}; use super::workspace::{ - compute_working_area, ColumnWidth, OutputId, Workspace, WorkspaceRenderElement, + compute_working_area, Column, ColumnWidth, OutputId, Workspace, WorkspaceRenderElement, }; use super::{LayoutElement, Options}; use crate::animation::Animation; @@ -127,6 +127,25 @@ impl Monitor { } } + pub fn add_column(&mut self, workspace_idx: usize, column: Column, activate: bool) { + let workspace = &mut self.workspaces[workspace_idx]; + + workspace.add_column(column, activate); + + // After adding a new window, workspace becomes this output's own. + workspace.original_output = OutputId::new(&self.output); + + if workspace_idx == self.workspaces.len() - 1 { + // Insert a new empty workspace. + let ws = Workspace::new(self.output.clone(), self.options.clone()); + self.workspaces.push(ws); + } + + if activate { + self.activate_workspace(workspace_idx); + } + } + fn clean_up_workspaces(&mut self) { assert!(self.workspace_switch.is_none()); @@ -323,6 +342,62 @@ impl Monitor { self.clean_up_workspaces(); } + pub fn move_column_to_workspace_up(&mut self) { + let source_workspace_idx = self.active_workspace_idx; + + let new_idx = source_workspace_idx.saturating_sub(1); + if new_idx == source_workspace_idx { + return; + } + + let workspace = &mut self.workspaces[source_workspace_idx]; + if workspace.columns.is_empty() { + return; + } + + let column = workspace.remove_column_by_idx(workspace.active_column_idx); + self.add_column(new_idx, column, true); + } + + pub fn move_column_to_workspace_down(&mut self) { + let source_workspace_idx = self.active_workspace_idx; + + let new_idx = min(source_workspace_idx + 1, self.workspaces.len() - 1); + if new_idx == source_workspace_idx { + return; + } + + let workspace = &mut self.workspaces[source_workspace_idx]; + if workspace.columns.is_empty() { + return; + } + + let column = workspace.remove_column_by_idx(workspace.active_column_idx); + self.add_column(new_idx, column, true); + } + + pub fn move_column_to_workspace(&mut self, idx: usize) { + let source_workspace_idx = self.active_workspace_idx; + + let new_idx = min(idx, self.workspaces.len() - 1); + if new_idx == source_workspace_idx { + return; + } + + let workspace = &mut self.workspaces[source_workspace_idx]; + if workspace.columns.is_empty() { + return; + } + + let column = workspace.remove_column_by_idx(workspace.active_column_idx); + self.add_column(new_idx, column, true); + + // Don't animate this action. + self.workspace_switch = None; + + self.clean_up_workspaces(); + } + pub fn switch_workspace_up(&mut self) { self.activate_workspace(self.active_workspace_idx.saturating_sub(1)); } -- cgit