diff --git a/packages/wm/src/app_command.rs b/packages/wm/src/app_command.rs index aacba1ea4..e409eddeb 100644 --- a/packages/wm/src/app_command.rs +++ b/packages/wm/src/app_command.rs @@ -12,10 +12,12 @@ use crate::{ cycle_focus, disable_binding_mode, enable_binding_mode, reload_config, shell_exec, }, - Direction, LengthValue, RectDelta, + Direction, LengthValue, RectDelta, TilingDirection, }, containers::{ - commands::{focus_in_direction, toggle_tiling_direction}, + commands::{ + focus_in_direction, set_tiling_direction, toggle_tiling_direction, + }, traits::CommonGetters, Container, }, @@ -225,6 +227,10 @@ pub enum InvokeCommand { ToggleMinimized, ToggleTiling, ToggleTilingDirection, + SetTilingDirection { + #[clap(required = true)] + tiling_direction: TilingDirection, + }, WmCycleFocus { #[clap(long, default_value_t = false)] omit_fullscreen: bool, @@ -573,6 +579,14 @@ impl InvokeCommand { InvokeCommand::ToggleTilingDirection => { toggle_tiling_direction(subject_container, state, config) } + InvokeCommand::SetTilingDirection { tiling_direction } => { + set_tiling_direction( + subject_container, + state, + config, + tiling_direction.clone(), + ) + } InvokeCommand::WmCycleFocus { omit_fullscreen, omit_minimized, diff --git a/packages/wm/src/containers/commands/toggle_tiling_direction.rs b/packages/wm/src/containers/commands/toggle_tiling_direction.rs index 203aa92ae..8b9c854dd 100644 --- a/packages/wm/src/containers/commands/toggle_tiling_direction.rs +++ b/packages/wm/src/containers/commands/toggle_tiling_direction.rs @@ -2,6 +2,7 @@ use anyhow::Context; use super::{flatten_split_container, wrap_in_split_container}; use crate::{ + common::TilingDirection, containers::{ traits::{CommonGetters, TilingDirectionGetters}, Container, DirectionContainer, SplitContainer, @@ -82,3 +83,19 @@ fn toggle_window_direction( Ok(split_container.into()) } + +pub fn set_tiling_direction( + container: Container, + state: &mut WmState, + config: &UserConfig, + tiling_direction: TilingDirection, +) -> anyhow::Result<()> { + let direction_container = container + .direction_container() + .context("No direction container.")?; + + match direction_container.tiling_direction() == tiling_direction { + true => Ok(()), + false => toggle_tiling_direction(container, state, config) + } +}