feat(cli): add cycle-move-workspace-to-monitor cmd

This commit adds a new cli command, cycle-move-workspace-to-monitor.

After the introduction of the monitor reconciliator module in
combination with display_index_preferences, this command should never
really be necessary, however it is worth having as a backup.

resolve #718
This commit is contained in:
LGUG2Z
2024-05-15 14:06:33 -07:00
parent 82aa2edf8f
commit 1420334c94
3 changed files with 19 additions and 0 deletions

View File

@@ -59,6 +59,7 @@ pub enum SocketMessage {
SendContainerToMonitorWorkspaceNumber(usize, usize), SendContainerToMonitorWorkspaceNumber(usize, usize),
MoveContainerToMonitorWorkspaceNumber(usize, usize), MoveContainerToMonitorWorkspaceNumber(usize, usize),
SendContainerToNamedWorkspace(String), SendContainerToNamedWorkspace(String),
CycleMoveWorkspaceToMonitor(CycleDirection),
MoveWorkspaceToMonitorNumber(usize), MoveWorkspaceToMonitorNumber(usize),
SwapWorkspacesToMonitorNumber(usize), SwapWorkspacesToMonitorNumber(usize),
ForceFocus, ForceFocus,

View File

@@ -465,6 +465,15 @@ impl WindowManager {
SocketMessage::MoveWorkspaceToMonitorNumber(monitor_idx) => { SocketMessage::MoveWorkspaceToMonitorNumber(monitor_idx) => {
self.move_workspace_to_monitor(monitor_idx)?; self.move_workspace_to_monitor(monitor_idx)?;
} }
SocketMessage::CycleMoveWorkspaceToMonitor(direction) => {
let monitor_idx = direction.next_idx(
self.focused_monitor_idx(),
NonZeroUsize::new(self.monitors().len())
.ok_or_else(|| anyhow!("there must be at least one monitor"))?,
);
self.move_workspace_to_monitor(monitor_idx)?;
}
SocketMessage::TogglePause => { SocketMessage::TogglePause => {
if self.is_paused { if self.is_paused {
tracing::info!("resuming"); tracing::info!("resuming");

View File

@@ -160,6 +160,7 @@ gen_enum_subcommand_args! {
CycleMoveToMonitor: CycleDirection, CycleMoveToMonitor: CycleDirection,
CycleMonitor: CycleDirection, CycleMonitor: CycleDirection,
CycleWorkspace: CycleDirection, CycleWorkspace: CycleDirection,
CycleMoveWorkspaceToMonitor: CycleDirection,
Stack: OperationDirection, Stack: OperationDirection,
CycleStack: CycleDirection, CycleStack: CycleDirection,
FlipLayout: Axis, FlipLayout: Axis,
@@ -955,6 +956,9 @@ enum SubCommand {
/// Move the focused workspace to the specified monitor /// Move the focused workspace to the specified monitor
#[clap(arg_required_else_help = true)] #[clap(arg_required_else_help = true)]
MoveWorkspaceToMonitor(MoveWorkspaceToMonitor), MoveWorkspaceToMonitor(MoveWorkspaceToMonitor),
/// Move the focused workspace monitor in the given cycle direction
#[clap(arg_required_else_help = true)]
CycleMoveWorkspaceToMonitor(CycleMoveWorkspaceToMonitor),
/// Swap focused monitor workspaces with specified monitor /// Swap focused monitor workspaces with specified monitor
#[clap(arg_required_else_help = true)] #[clap(arg_required_else_help = true)]
SwapWorkspacesWithMonitor(SwapWorkspacesWithMonitor), SwapWorkspacesWithMonitor(SwapWorkspacesWithMonitor),
@@ -1583,6 +1587,11 @@ fn main() -> Result<()> {
SubCommand::MoveWorkspaceToMonitor(arg) => { SubCommand::MoveWorkspaceToMonitor(arg) => {
send_message(&SocketMessage::MoveWorkspaceToMonitorNumber(arg.target).as_bytes()?)?; send_message(&SocketMessage::MoveWorkspaceToMonitorNumber(arg.target).as_bytes()?)?;
} }
SubCommand::CycleMoveWorkspaceToMonitor(arg) => {
send_message(
&SocketMessage::CycleMoveWorkspaceToMonitor(arg.cycle_direction).as_bytes()?,
)?;
}
SubCommand::SwapWorkspacesWithMonitor(arg) => { SubCommand::SwapWorkspacesWithMonitor(arg) => {
send_message(&SocketMessage::SwapWorkspacesToMonitorNumber(arg.target).as_bytes()?)?; send_message(&SocketMessage::SwapWorkspacesToMonitorNumber(arg.target).as_bytes()?)?;
} }