diff --git a/komorebi-core/src/lib.rs b/komorebi-core/src/lib.rs index 72978480..15f78dd8 100644 --- a/komorebi-core/src/lib.rs +++ b/komorebi-core/src/lib.rs @@ -47,11 +47,13 @@ pub enum SocketMessage { CycleStack(CycleDirection), MoveContainerToMonitorNumber(usize), MoveContainerToWorkspaceNumber(usize), + MoveContainerToNamedWorkspace(String), CycleMoveContainerToWorkspace(CycleDirection), SendContainerToMonitorNumber(usize), SendContainerToWorkspaceNumber(usize), CycleSendContainerToWorkspace(CycleDirection), SendContainerToMonitorWorkspaceNumber(usize, usize), + SendContainerToNamedWorkspace(String), MoveWorkspaceToMonitorNumber(usize), ForceFocus, Close, @@ -94,14 +96,22 @@ pub enum SocketMessage { FocusMonitorWorkspaceNumber(usize, usize), FocusNamedWorkspace(String), ContainerPadding(usize, usize, i32), + NamedWorkspaceContainerPadding(String, i32), WorkspacePadding(usize, usize, i32), + NamedWorkspacePadding(String, i32), WorkspaceTiling(usize, usize, bool), + NamedWorkspaceTiling(String, bool), WorkspaceName(usize, usize, String), WorkspaceLayout(usize, usize, DefaultLayout), + NamedWorkspaceLayout(String, DefaultLayout), WorkspaceLayoutCustom(usize, usize, PathBuf), + NamedWorkspaceLayoutCustom(String, PathBuf), WorkspaceLayoutRule(usize, usize, usize, DefaultLayout), + NamedWorkspaceLayoutRule(String, usize, DefaultLayout), WorkspaceLayoutCustomRule(usize, usize, usize, PathBuf), + NamedWorkspaceLayoutCustomRule(String, usize, PathBuf), ClearWorkspaceLayoutRules(usize, usize), + ClearNamedWorkspaceLayoutRules(String), // Configuration ReloadConfiguration, WatchConfiguration(bool), diff --git a/komorebi.generated.ahk b/komorebi.generated.ahk index a2c88ac8..f8b539bc 100644 --- a/komorebi.generated.ahk +++ b/komorebi.generated.ahk @@ -5,6 +5,12 @@ ; 1Password Run, komorebic.exe float-rule exe "1Password.exe", , Hide +; Ableton Live +; Targets VST2 windows +Run, komorebic.exe float-rule class "AbletonVstPlugClass", , Hide +; Targets VST3 windows +Run, komorebic.exe float-rule class "Vst3PlugWindow", , Hide + ; Adobe Creative Cloud ; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line Run, komorebic.exe identify-tray-application class "CreativeCloudDesktopWindowClass", , Hide @@ -153,6 +159,10 @@ Run, komorebic.exe identify-border-overflow-application exe "Kotatogram.exe", , ; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line Run, komorebic.exe identify-tray-application exe "Kotatogram.exe", , Hide +; LocalSend +; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line +Run, komorebic.exe identify-tray-application exe "localsend_app.exe", , Hide + ; Logi Bolt Run, komorebic.exe float-rule exe "LogiBolt.exe", , Hide @@ -287,6 +297,11 @@ Run, komorebic.exe float-rule exe "QuickLook.exe", , Hide ; RepoZ Run, komorebic.exe float-rule exe "RepoZ.exe", , Hide +; Rider +Run, komorebic.exe identify-object-name-change-application exe "rider64.exe", , Hide +; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line +Run, komorebic.exe identify-tray-application exe "rider64.exe", , Hide + ; Roblox FPS Unlocker ; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line Run, komorebic.exe identify-tray-application exe "rbxfpsunlocker.exe", , Hide @@ -304,6 +319,9 @@ Run, komorebic.exe identify-border-overflow-application exe "ShareX.exe", , Hide ; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line Run, komorebic.exe identify-tray-application exe "ShareX.exe", , Hide +; Sideloadly +Run, komorebic.exe float-rule exe "sideloadly.exe", , Hide + ; Signal ; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line Run, komorebic.exe identify-tray-application exe "signal.exe", , Hide @@ -342,6 +360,10 @@ Run, komorebic.exe identify-tray-application exe "Spotify.exe", , Hide ; Steam Run, komorebic.exe identify-border-overflow-application class "vguiPopupWindow", , Hide +; Stremio +; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line +Run, komorebic.exe identify-tray-application exe "stremio.exe", , Hide + ; System Informer ; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line Run, komorebic.exe identify-tray-application exe "SystemInformer.exe", , Hide @@ -375,12 +397,21 @@ Run, komorebic.exe identify-border-overflow-application exe "UnrealEditor.exe", ; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line Run, komorebic.exe identify-tray-application exe "UnrealEditor.exe", , Hide +; VRCX +; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line +Run, komorebic.exe identify-tray-application exe "VRCX.exe", , Hide + ; Visual Studio Run, komorebic.exe identify-object-name-change-application exe "devenv.exe", , Hide ; Visual Studio Code Run, komorebic.exe identify-border-overflow-application exe "Code.exe", , Hide +; Voice.ai +Run, komorebic.exe identify-border-overflow-application exe "VoiceAI.exe", , Hide +; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line +Run, komorebic.exe identify-tray-application exe "VoiceAI.exe", , Hide + ; WebTorrent Desktop ; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line Run, komorebic.exe identify-tray-application exe "WebTorrent.exe", , Hide @@ -394,8 +425,7 @@ Run, komorebic.exe float-rule class "OperationStatusWindow", , Hide Run, komorebic.exe float-rule title "Control Panel", , Hide ; Windows Installer -; Targets MSI Installers -Run, komorebic.exe float-rule class "MsiDialogCloseClass", , Hide +Run, komorebic.exe float-rule exe "msiexec.exe", , Hide ; WingetUI ; If you have disabled minimize/close to tray for this application, you can delete/comment out the next line diff --git a/komorebi/src/process_command.rs b/komorebi/src/process_command.rs index 1b15085d..68fe98cf 100644 --- a/komorebi/src/process_command.rs +++ b/komorebi/src/process_command.rs @@ -197,9 +197,23 @@ impl WindowManager { SocketMessage::ContainerPadding(monitor_idx, workspace_idx, size) => { self.set_container_padding(monitor_idx, workspace_idx, size)?; } + SocketMessage::NamedWorkspaceContainerPadding(ref workspace, size) => { + if let Some((monitor_idx, workspace_idx)) = + self.monitor_workspace_index_by_name(workspace) + { + self.set_container_padding(monitor_idx, workspace_idx, size)?; + } + } SocketMessage::WorkspacePadding(monitor_idx, workspace_idx, size) => { self.set_workspace_padding(monitor_idx, workspace_idx, size)?; } + SocketMessage::NamedWorkspacePadding(ref workspace, size) => { + if let Some((monitor_idx, workspace_idx)) = + self.monitor_workspace_index_by_name(workspace) + { + self.set_workspace_padding(monitor_idx, workspace_idx, size)?; + } + } SocketMessage::WorkspaceRule(_, ref id, monitor_idx, workspace_idx) => { { let mut workspace_rules = WORKSPACE_RULES.lock(); @@ -332,6 +346,25 @@ impl WindowManager { SocketMessage::SendContainerToMonitorWorkspaceNumber(monitor_idx, workspace_idx) => { self.move_container_to_monitor(monitor_idx, Option::from(workspace_idx), false)?; } + SocketMessage::SendContainerToNamedWorkspace(ref workspace) => { + if let Some((monitor_idx, workspace_idx)) = + self.monitor_workspace_index_by_name(workspace) + { + self.move_container_to_monitor( + monitor_idx, + Option::from(workspace_idx), + false, + )?; + } + } + SocketMessage::MoveContainerToNamedWorkspace(ref workspace) => { + if let Some((monitor_idx, workspace_idx)) = + self.monitor_workspace_index_by_name(workspace) + { + self.move_container_to_monitor(monitor_idx, Option::from(workspace_idx), true)?; + } + } + SocketMessage::MoveWorkspaceToMonitorNumber(monitor_idx) => { self.move_workspace_to_monitor(monitor_idx)?; } @@ -406,6 +439,62 @@ impl WindowManager { SocketMessage::ClearWorkspaceLayoutRules(monitor_idx, workspace_idx) => { self.clear_workspace_layout_rules(monitor_idx, workspace_idx)?; } + SocketMessage::NamedWorkspaceLayoutCustom(ref workspace, ref path) => { + if let Some((monitor_idx, workspace_idx)) = + self.monitor_workspace_index_by_name(workspace) + { + self.set_workspace_layout_custom(monitor_idx, workspace_idx, path.clone())?; + } + } + SocketMessage::NamedWorkspaceTiling(ref workspace, tile) => { + if let Some((monitor_idx, workspace_idx)) = + self.monitor_workspace_index_by_name(workspace) + { + self.set_workspace_tiling(monitor_idx, workspace_idx, tile)?; + } + } + SocketMessage::NamedWorkspaceLayout(ref workspace, layout) => { + if let Some((monitor_idx, workspace_idx)) = + self.monitor_workspace_index_by_name(workspace) + { + self.set_workspace_layout_default(monitor_idx, workspace_idx, layout)?; + } + } + SocketMessage::NamedWorkspaceLayoutRule(ref workspace, at_container_count, layout) => { + if let Some((monitor_idx, workspace_idx)) = + self.monitor_workspace_index_by_name(workspace) + { + self.add_workspace_layout_default_rule( + monitor_idx, + workspace_idx, + at_container_count, + layout, + )?; + } + } + SocketMessage::NamedWorkspaceLayoutCustomRule( + ref workspace, + at_container_count, + ref path, + ) => { + if let Some((monitor_idx, workspace_idx)) = + self.monitor_workspace_index_by_name(workspace) + { + self.add_workspace_layout_custom_rule( + monitor_idx, + workspace_idx, + at_container_count, + path.clone(), + )?; + } + } + SocketMessage::ClearNamedWorkspaceLayoutRules(ref workspace) => { + if let Some((monitor_idx, workspace_idx)) = + self.monitor_workspace_index_by_name(workspace) + { + self.clear_workspace_layout_rules(monitor_idx, workspace_idx)?; + } + } SocketMessage::CycleFocusWorkspace(direction) => { // This is to ensure that even on an empty workspace on a secondary monitor, the // secondary monitor where the cursor is focused will be used as the target for diff --git a/komorebic.lib.ahk b/komorebic.lib.ahk index 5d76415c..16e94f51 100644 --- a/komorebic.lib.ahk +++ b/komorebic.lib.ahk @@ -100,6 +100,10 @@ MoveToWorkspace(target) { RunWait, komorebic.exe move-to-workspace %target%, , Hide } +MoveToNamedWorkspace(workspace) { + RunWait, komorebic.exe move-to-named-workspace %workspace%, , Hide +} + CycleMoveToWorkspace(cycle_direction) { RunWait, komorebic.exe cycle-move-to-workspace %cycle_direction%, , Hide } @@ -112,6 +116,10 @@ SendToWorkspace(target) { RunWait, komorebic.exe send-to-workspace %target%, , Hide } +SendToNamedWorkspace(workspace) { + RunWait, komorebic.exe send-to-named-workspace %workspace%, , Hide +} + CycleSendToWorkspace(cycle_direction) { RunWait, komorebic.exe cycle-send-to-workspace %cycle_direction%, , Hide } @@ -132,6 +140,10 @@ FocusMonitorWorkspace(target_monitor, target_workspace) { RunWait, komorebic.exe focus-monitor-workspace %target_monitor% %target_workspace%, , Hide } +FocusNamedWorkspace(workspace) { + RunWait, komorebic.exe focus-named-workspace %workspace%, , Hide +} + CycleMonitor(cycle_direction) { RunWait, komorebic.exe cycle-monitor %cycle_direction%, , Hide } @@ -204,38 +216,74 @@ EnsureWorkspaces(monitor, workspace_count) { RunWait, komorebic.exe ensure-workspaces %monitor% %workspace_count%, , Hide } +EnsureNamedWorkspaces(monitor, names) { + RunWait, komorebic.exe ensure-named-workspaces %monitor% %names%, , Hide +} + ContainerPadding(monitor, workspace, size) { RunWait, komorebic.exe container-padding %monitor% %workspace% %size%, , Hide } +NamedWorkspaceContainerPadding(workspace, size) { + RunWait, komorebic.exe named-workspace-container-padding %workspace% %size%, , Hide +} + WorkspacePadding(monitor, workspace, size) { RunWait, komorebic.exe workspace-padding %monitor% %workspace% %size%, , Hide } +NamedWorkspacePadding(workspace, size) { + RunWait, komorebic.exe named-workspace-padding %workspace% %size%, , Hide +} + WorkspaceLayout(monitor, workspace, value) { RunWait, komorebic.exe workspace-layout %monitor% %workspace% %value%, , Hide } +NamedWorkspaceLayout(workspace, value) { + RunWait, komorebic.exe named-workspace-layout %workspace% %value%, , Hide +} + WorkspaceCustomLayout(monitor, workspace, path) { RunWait, komorebic.exe workspace-custom-layout %monitor% %workspace% %path%, , Hide } +NamedWorkspaceCustomLayout(workspace, path) { + RunWait, komorebic.exe named-workspace-custom-layout %workspace% %path%, , Hide +} + WorkspaceLayoutRule(monitor, workspace, at_container_count, layout) { RunWait, komorebic.exe workspace-layout-rule %monitor% %workspace% %at_container_count% %layout%, , Hide } +NamedWorkspaceLayoutRule(workspace, at_container_count, layout) { + RunWait, komorebic.exe named-workspace-layout-rule %workspace% %at_container_count% %layout%, , Hide +} + WorkspaceCustomLayoutRule(monitor, workspace, at_container_count, path) { RunWait, komorebic.exe workspace-custom-layout-rule %monitor% %workspace% %at_container_count% %path%, , Hide } +NamedWorkspaceCustomLayoutRule(workspace, at_container_count, path) { + RunWait, komorebic.exe named-workspace-custom-layout-rule %workspace% %at_container_count% %path%, , Hide +} + ClearWorkspaceLayoutRules(monitor, workspace) { RunWait, komorebic.exe clear-workspace-layout-rules %monitor% %workspace%, , Hide } +ClearNamedWorkspaceLayoutRules(workspace) { + RunWait, komorebic.exe clear-named-workspace-layout-rules %workspace%, , Hide +} + WorkspaceTiling(monitor, workspace, value) { RunWait, komorebic.exe workspace-tiling %monitor% %workspace% %value%, , Hide } +NamedWorkspaceTiling(workspace, value) { + RunWait, komorebic.exe named-workspace-tiling %workspace% %value%, , Hide +} + WorkspaceName(monitor, workspace, value) { RunWait, komorebic.exe workspace-name %monitor% %workspace% %value%, , Hide } @@ -320,6 +368,10 @@ WorkspaceRule(identifier, id, monitor, workspace) { RunWait, komorebic.exe workspace-rule %identifier% "%id%" %monitor% %workspace%, , Hide } +NamedWorkspaceRule(identifier, id, workspace) { + RunWait, komorebic.exe named-workspace-rule %identifier% "%id%" %workspace%, , Hide +} + IdentifyObjectNameChangeApplication(identifier, id) { RunWait, komorebic.exe identify-object-name-change-application %identifier% "%id%", , Hide } diff --git a/komorebic/src/main.rs b/komorebic/src/main.rs index 69ecec4f..4677f27d 100644 --- a/komorebic/src/main.rs +++ b/komorebic/src/main.rs @@ -1,7 +1,6 @@ #![warn(clippy::all, clippy::nursery, clippy::pedantic)] #![allow(clippy::missing_errors_doc)] -use std::fs; use std::fs::File; use std::fs::OpenOptions; use std::io::BufRead; @@ -151,6 +150,26 @@ gen_target_subcommand_args! { MoveWorkspaceToMonitor, } +macro_rules! gen_named_target_subcommand_args { + // SubCommand Pattern + ( $( $name:ident ),+ $(,)? ) => { + $( + #[derive(clap::Parser, derive_ahk::AhkFunction)] + pub struct $name { + /// Target workspace name + workspace: String, + } + )+ + }; +} + +gen_named_target_subcommand_args! { + MoveToNamedWorkspace, + SendToNamedWorkspace, + FocusNamedWorkspace, + ClearNamedWorkspaceLayoutRules +} + // Thanks to @danielhenrymantilla for showing me how to use cfg_attr with an optional argument like // this on the Rust Programming Language Community Discord Server macro_rules! gen_workspace_subcommand_args { @@ -185,6 +204,34 @@ gen_workspace_subcommand_args! { Tiling: #[enum] BooleanState, } +macro_rules! gen_named_workspace_subcommand_args { + // Workspace Property: #[enum] Value Enum (if the value is an Enum) + // Workspace Property: Value Type (if the value is anything else) + ( $( $name:ident: $(#[enum] $(@$value_enum:tt)?)? $value:ty ),+ $(,)? ) => ( + paste! { + $( + #[derive(clap::Parser, derive_ahk::AhkFunction)] + pub struct [] { + /// Target workspace name + workspace: String, + + $(#[clap(value_enum)] $($value_enum)?)? + #[cfg_attr( + all($(FALSE $($value_enum)?)?), + doc = ""$name " of the workspace as a "$value "" + )] + value: $value, + } + )+ + } + ) +} + +gen_named_workspace_subcommand_args! { + Layout: #[enum] DefaultLayout, + Tiling: #[enum] BooleanState, +} + #[derive(Parser, AhkFunction)] pub struct ClearWorkspaceLayoutRules { /// Monitor index (zero-indexed) @@ -206,6 +253,15 @@ pub struct WorkspaceCustomLayout { path: String, } +#[derive(Parser, AhkFunction)] +pub struct NamedWorkspaceCustomLayout { + /// Target workspace name + workspace: String, + + /// JSON or YAML file from which the custom layout definition should be loaded + path: String, +} + #[derive(Parser, AhkFunction)] pub struct WorkspaceLayoutRule { /// Monitor index (zero-indexed) @@ -221,6 +277,18 @@ pub struct WorkspaceLayoutRule { layout: DefaultLayout, } +#[derive(Parser, AhkFunction)] +pub struct NamedWorkspaceLayoutRule { + /// Target workspace name + workspace: String, + + /// The number of window containers on-screen required to trigger this layout rule + at_container_count: usize, + + #[clap(value_enum)] + layout: DefaultLayout, +} + #[derive(Parser, AhkFunction)] pub struct WorkspaceCustomLayoutRule { /// Monitor index (zero-indexed) @@ -236,6 +304,18 @@ pub struct WorkspaceCustomLayoutRule { path: String, } +#[derive(Parser, AhkFunction)] +pub struct NamedWorkspaceCustomLayoutRule { + /// Target workspace name + workspace: String, + + /// The number of window containers on-screen required to trigger this layout rule + at_container_count: usize, + + /// JSON or YAML file from which the custom layout definition should be loaded + path: String, +} + #[derive(Parser, AhkFunction)] struct Resize { #[clap(value_enum)] @@ -334,12 +414,6 @@ struct FocusMonitorWorkspace { target_workspace: usize, } -#[derive(Parser, AhkFunction)] -struct FocusNamedWorkspace { - /// Target workspace name - name: String, -} - #[derive(Parser, AhkFunction)] pub struct SendToMonitorWorkspace { /// Target monitor index (zero-indexed) @@ -370,6 +444,27 @@ gen_padding_subcommand_args! { WorkspacePadding, } +macro_rules! gen_named_padding_subcommand_args { + // SubCommand Pattern + ( $( $name:ident ),+ $(,)? ) => { + $( + #[derive(clap::Parser, derive_ahk::AhkFunction)] + pub struct $name { + /// Target workspace name + workspace: String, + + /// Pixels to pad with as an integer + size: i32, + } + )+ + }; +} + +gen_named_padding_subcommand_args! { + NamedWorkspaceContainerPadding, + NamedWorkspacePadding, +} + macro_rules! gen_padding_adjustment_subcommand_args { // SubCommand Pattern ( $( $name:ident ),+ $(,)? ) => { @@ -622,6 +717,9 @@ enum SubCommand { /// Move the focused window to the specified workspace #[clap(arg_required_else_help = true)] MoveToWorkspace(MoveToWorkspace), + /// Move the focused window to the specified workspace + #[clap(arg_required_else_help = true)] + MoveToNamedWorkspace(MoveToNamedWorkspace), /// Move the focused window to the workspace in the given cycle direction #[clap(arg_required_else_help = true)] CycleMoveToWorkspace(CycleMoveToWorkspace), @@ -631,6 +729,9 @@ enum SubCommand { /// Send the focused window to the specified workspace #[clap(arg_required_else_help = true)] SendToWorkspace(SendToWorkspace), + /// Send the focused window to the specified workspace + #[clap(arg_required_else_help = true)] + SendToNamedWorkspace(SendToNamedWorkspace), /// Send the focused window to the workspace in the given cycle direction #[clap(arg_required_else_help = true)] CycleSendToWorkspace(CycleSendToWorkspace), @@ -646,7 +747,7 @@ enum SubCommand { /// Focus the specified workspace on the target monitor #[clap(arg_required_else_help = true)] FocusMonitorWorkspace(FocusMonitorWorkspace), - /// Focus the specified workspace on the target monitor + /// Focus the specified workspace #[clap(arg_required_else_help = true)] FocusNamedWorkspace(FocusNamedWorkspace), /// Focus the monitor in the given cycle direction @@ -700,33 +801,57 @@ enum SubCommand { /// Create at least this many workspaces for the specified monitor #[clap(arg_required_else_help = true)] EnsureWorkspaces(EnsureWorkspaces), - /// Create at least this many workspaces for the specified monitor + /// Create these many named workspaces for the specified monitor #[clap(arg_required_else_help = true)] EnsureNamedWorkspaces(EnsureNamedWorkspaces), /// Set the container padding for the specified workspace #[clap(arg_required_else_help = true)] ContainerPadding(ContainerPadding), + /// Set the container padding for the specified workspace + #[clap(arg_required_else_help = true)] + NamedWorkspaceContainerPadding(NamedWorkspaceContainerPadding), /// Set the workspace padding for the specified workspace #[clap(arg_required_else_help = true)] WorkspacePadding(WorkspacePadding), + /// Set the workspace padding for the specified workspace + #[clap(arg_required_else_help = true)] + NamedWorkspacePadding(NamedWorkspacePadding), /// Set the layout for the specified workspace #[clap(arg_required_else_help = true)] WorkspaceLayout(WorkspaceLayout), + /// Set the layout for the specified workspace + #[clap(arg_required_else_help = true)] + NamedWorkspaceLayout(NamedWorkspaceLayout), /// Set a custom layout for the specified workspace #[clap(arg_required_else_help = true)] WorkspaceCustomLayout(WorkspaceCustomLayout), + /// Set a custom layout for the specified workspace + #[clap(arg_required_else_help = true)] + NamedWorkspaceCustomLayout(NamedWorkspaceCustomLayout), /// Add a dynamic layout rule for the specified workspace #[clap(arg_required_else_help = true)] WorkspaceLayoutRule(WorkspaceLayoutRule), + /// Add a dynamic layout rule for the specified workspace + #[clap(arg_required_else_help = true)] + NamedWorkspaceLayoutRule(NamedWorkspaceLayoutRule), /// Add a dynamic custom layout for the specified workspace #[clap(arg_required_else_help = true)] WorkspaceCustomLayoutRule(WorkspaceCustomLayoutRule), + /// Add a dynamic custom layout for the specified workspace + #[clap(arg_required_else_help = true)] + NamedWorkspaceCustomLayoutRule(NamedWorkspaceCustomLayoutRule), /// Clear all dynamic layout rules for the specified workspace #[clap(arg_required_else_help = true)] ClearWorkspaceLayoutRules(ClearWorkspaceLayoutRules), + /// Clear all dynamic layout rules for the specified workspace + #[clap(arg_required_else_help = true)] + ClearNamedWorkspaceLayoutRules(ClearNamedWorkspaceLayoutRules), /// Enable or disable window tiling for the specified workspace #[clap(arg_required_else_help = true)] WorkspaceTiling(WorkspaceTiling), + /// Enable or disable window tiling for the specified workspace + #[clap(arg_required_else_help = true)] + NamedWorkspaceTiling(NamedWorkspaceTiling), /// Set the workspace name for the specified workspace #[clap(arg_required_else_help = true)] WorkspaceName(WorkspaceName), @@ -920,6 +1045,9 @@ fn main() -> Result<()> { SubCommand::MoveToWorkspace(arg) => { send_message(&SocketMessage::MoveContainerToWorkspaceNumber(arg.target).as_bytes()?)?; } + SubCommand::MoveToNamedWorkspace(arg) => { + send_message(&SocketMessage::MoveContainerToNamedWorkspace(arg.workspace).as_bytes()?)?; + } SubCommand::CycleMoveToWorkspace(arg) => { send_message( &SocketMessage::CycleMoveContainerToWorkspace(arg.cycle_direction).as_bytes()?, @@ -931,6 +1059,9 @@ fn main() -> Result<()> { SubCommand::SendToWorkspace(arg) => { send_message(&SocketMessage::SendContainerToWorkspaceNumber(arg.target).as_bytes()?)?; } + SubCommand::SendToNamedWorkspace(arg) => { + send_message(&SocketMessage::SendContainerToNamedWorkspace(arg.workspace).as_bytes()?)?; + } SubCommand::CycleSendToWorkspace(arg) => { send_message( &SocketMessage::CycleSendContainerToWorkspace(arg.cycle_direction).as_bytes()?, @@ -990,12 +1121,23 @@ fn main() -> Result<()> { .as_bytes()?, )?; } + SubCommand::NamedWorkspaceContainerPadding(arg) => { + send_message( + &SocketMessage::NamedWorkspaceContainerPadding(arg.workspace, arg.size) + .as_bytes()?, + )?; + } SubCommand::WorkspacePadding(arg) => { send_message( &SocketMessage::WorkspacePadding(arg.monitor, arg.workspace, arg.size) .as_bytes()?, )?; } + SubCommand::NamedWorkspacePadding(arg) => { + send_message( + &SocketMessage::NamedWorkspacePadding(arg.workspace, arg.size).as_bytes()?, + )?; + } SubCommand::AdjustWorkspacePadding(arg) => { send_message( &SocketMessage::AdjustWorkspacePadding(arg.sizing, arg.adjustment).as_bytes()?, @@ -1027,6 +1169,11 @@ fn main() -> Result<()> { .as_bytes()?, )?; } + SubCommand::NamedWorkspaceLayout(arg) => { + send_message( + &SocketMessage::NamedWorkspaceLayout(arg.workspace, arg.value).as_bytes()?, + )?; + } SubCommand::WorkspaceCustomLayout(arg) => { send_message( &SocketMessage::WorkspaceLayoutCustom( @@ -1037,6 +1184,15 @@ fn main() -> Result<()> { .as_bytes()?, )?; } + SubCommand::NamedWorkspaceCustomLayout(arg) => { + send_message( + &SocketMessage::NamedWorkspaceLayoutCustom( + arg.workspace, + resolve_windows_path(&arg.path)?, + ) + .as_bytes()?, + )?; + } SubCommand::WorkspaceLayoutRule(arg) => { send_message( &SocketMessage::WorkspaceLayoutRule( @@ -1048,6 +1204,16 @@ fn main() -> Result<()> { .as_bytes()?, )?; } + SubCommand::NamedWorkspaceLayoutRule(arg) => { + send_message( + &SocketMessage::NamedWorkspaceLayoutRule( + arg.workspace, + arg.at_container_count, + arg.layout, + ) + .as_bytes()?, + )?; + } SubCommand::WorkspaceCustomLayoutRule(arg) => { send_message( &SocketMessage::WorkspaceLayoutCustomRule( @@ -1059,17 +1225,37 @@ fn main() -> Result<()> { .as_bytes()?, )?; } + SubCommand::NamedWorkspaceCustomLayoutRule(arg) => { + send_message( + &SocketMessage::NamedWorkspaceLayoutCustomRule( + arg.workspace, + arg.at_container_count, + resolve_windows_path(&arg.path)?, + ) + .as_bytes()?, + )?; + } SubCommand::ClearWorkspaceLayoutRules(arg) => { send_message( &SocketMessage::ClearWorkspaceLayoutRules(arg.monitor, arg.workspace).as_bytes()?, )?; } + SubCommand::ClearNamedWorkspaceLayoutRules(arg) => { + send_message( + &SocketMessage::ClearNamedWorkspaceLayoutRules(arg.workspace).as_bytes()?, + )?; + } SubCommand::WorkspaceTiling(arg) => { send_message( &SocketMessage::WorkspaceTiling(arg.monitor, arg.workspace, arg.value.into()) .as_bytes()?, )?; } + SubCommand::NamedWorkspaceTiling(arg) => { + send_message( + &SocketMessage::NamedWorkspaceTiling(arg.workspace, arg.value.into()).as_bytes()?, + )?; + } SubCommand::Start(arg) => { let mut buf: PathBuf; @@ -1233,7 +1419,7 @@ fn main() -> Result<()> { )?; } SubCommand::FocusNamedWorkspace(arg) => { - send_message(&SocketMessage::FocusNamedWorkspace(arg.name).as_bytes()?)?; + send_message(&SocketMessage::FocusNamedWorkspace(arg.workspace).as_bytes()?)?; } SubCommand::CycleMonitor(arg) => { send_message(&SocketMessage::CycleFocusMonitor(arg.cycle_direction).as_bytes()?)?; @@ -1470,9 +1656,10 @@ fn main() -> Result<()> { )?; } SubCommand::AhkAppSpecificConfiguration(arg) => { - let content = fs::read_to_string(resolve_windows_path(&arg.path)?)?; + let content = std::fs::read_to_string(resolve_windows_path(&arg.path)?)?; let lines = if let Some(override_path) = arg.override_path { - let override_content = fs::read_to_string(resolve_windows_path(&override_path)?)?; + let override_content = + std::fs::read_to_string(resolve_windows_path(&override_path)?)?; ApplicationConfigurationGenerator::generate_ahk( &content, @@ -1507,7 +1694,7 @@ fn main() -> Result<()> { } SubCommand::FormatAppSpecificConfiguration(arg) => { let file_path = resolve_windows_path(&arg.path)?; - let content = fs::read_to_string(&file_path)?; + let content = std::fs::read_to_string(&file_path)?; let formatted_content = ApplicationConfigurationGenerator::format(&content)?; let mut file = OpenOptions::new()