From d24beb60b188ea72ff0a08db1257484ea1775372 Mon Sep 17 00:00:00 2001 From: LGUG2Z Date: Wed, 9 Apr 2025 09:42:44 -0700 Subject: [PATCH] feat(config): add per-monitor floating layer behaviour opt This commit adds an option to set the floating layer behaviour for all workspaces on a monitor. Overrides set on an individual workspace level will take precedence over the option set at the monitor level. --- komorebi/src/monitor.rs | 9 +++++++++ komorebi/src/monitor_reconciliator/mod.rs | 1 + komorebi/src/static_config.rs | 10 +++++++++- komorebi/src/window_manager.rs | 13 +++++++++---- komorebi/src/workspace.rs | 7 ++++--- 5 files changed, 32 insertions(+), 8 deletions(-) diff --git a/komorebi/src/monitor.rs b/komorebi/src/monitor.rs index a5824d70..6a11cd68 100644 --- a/komorebi/src/monitor.rs +++ b/komorebi/src/monitor.rs @@ -23,6 +23,7 @@ use crate::workspace::Workspace; use crate::workspace::WorkspaceGlobals; use crate::workspace::WorkspaceLayer; use crate::DefaultLayout; +use crate::FloatingLayerBehaviour; use crate::Layout; use crate::OperationDirection; use crate::Wallpaper; @@ -67,6 +68,8 @@ pub struct Monitor { pub workspace_padding: Option, #[getset(get = "pub", get_mut = "pub", set = "pub")] pub wallpaper: Option, + #[getset(get_copy = "pub", set = "pub")] + pub floating_layer_behaviour: Option, } impl_ring_elements!(Monitor, Workspace); @@ -123,6 +126,7 @@ pub fn new( container_padding: None, workspace_padding: None, wallpaper: None, + floating_layer_behaviour: None, } } @@ -165,6 +169,7 @@ impl Monitor { container_padding: None, workspace_padding: None, wallpaper: None, + floating_layer_behaviour: None, } } @@ -221,6 +226,7 @@ impl Monitor { let work_area_offset = self.work_area_offset.or(offset); let window_based_work_area_offset = self.window_based_work_area_offset(); let window_based_work_area_offset_limit = self.window_based_work_area_offset_limit(); + let floating_layer_behaviour = self.floating_layer_behaviour(); for workspace in self.workspaces_mut() { workspace.globals = WorkspaceGlobals { @@ -232,6 +238,7 @@ impl Monitor { work_area_offset, window_based_work_area_offset, window_based_work_area_offset_limit, + floating_layer_behaviour, } } } @@ -258,6 +265,7 @@ impl Monitor { let work_area_offset = self.work_area_offset.or(offset); let window_based_work_area_offset = self.window_based_work_area_offset(); let window_based_work_area_offset_limit = self.window_based_work_area_offset_limit(); + let floating_layer_behaviour = self.floating_layer_behaviour(); if let Some(workspace) = self.workspaces_mut().get_mut(workspace_idx) { workspace.globals = WorkspaceGlobals { @@ -269,6 +277,7 @@ impl Monitor { work_area_offset, window_based_work_area_offset, window_based_work_area_offset_limit, + floating_layer_behaviour, } } } diff --git a/komorebi/src/monitor_reconciliator/mod.rs b/komorebi/src/monitor_reconciliator/mod.rs index ec0f89fc..d0eb8026 100644 --- a/komorebi/src/monitor_reconciliator/mod.rs +++ b/komorebi/src/monitor_reconciliator/mod.rs @@ -554,6 +554,7 @@ where container_padding: cached.container_padding, workspace_padding: cached.workspace_padding, wallpaper: cached.wallpaper.clone(), + floating_layer_behaviour: cached.floating_layer_behaviour, }; let focused_workspace_idx = m.focused_workspace_idx(); diff --git a/komorebi/src/static_config.rs b/komorebi/src/static_config.rs index 06dca748..96fe0785 100644 --- a/komorebi/src/static_config.rs +++ b/komorebi/src/static_config.rs @@ -307,7 +307,7 @@ impl From<&Workspace> for WorkspaceConfig { window_container_behaviour_rules: Option::from(window_container_behaviour_rules), float_override: *value.float_override(), layout_flip: value.layout_flip(), - floating_layer_behaviour: Option::from(*value.floating_layer_behaviour()), + floating_layer_behaviour: value.floating_layer_behaviour(), wallpaper: None, } } @@ -336,6 +336,9 @@ pub struct MonitorConfig { /// Specify a wallpaper for this monitor #[serde(skip_serializing_if = "Option::is_none")] pub wallpaper: Option, + /// Determine what happens to a new window when the Floating workspace layer is active (default: Tile) + #[serde(skip_serializing_if = "Option::is_none")] + pub floating_layer_behaviour: Option, } impl From<&Monitor> for MonitorConfig { @@ -372,6 +375,7 @@ impl From<&Monitor> for MonitorConfig { container_padding, workspace_padding, wallpaper: value.wallpaper().clone(), + floating_layer_behaviour: value.floating_layer_behaviour(), } } } @@ -1332,6 +1336,7 @@ impl StaticConfig { monitor.set_container_padding(monitor_config.container_padding); monitor.set_workspace_padding(monitor_config.workspace_padding); monitor.set_wallpaper(monitor_config.wallpaper.clone()); + monitor.set_floating_layer_behaviour(monitor_config.floating_layer_behaviour); monitor.update_workspaces_globals(offset); for (j, ws) in monitor.workspaces_mut().iter_mut().enumerate() { @@ -1417,6 +1422,7 @@ impl StaticConfig { ); m.set_container_padding(monitor_config.container_padding); m.set_workspace_padding(monitor_config.workspace_padding); + m.set_floating_layer_behaviour(monitor_config.floating_layer_behaviour); m.update_workspaces_globals(offset); @@ -1503,6 +1509,7 @@ impl StaticConfig { ); monitor.set_container_padding(monitor_config.container_padding); monitor.set_workspace_padding(monitor_config.workspace_padding); + monitor.set_floating_layer_behaviour(monitor_config.floating_layer_behaviour); monitor.update_workspaces_globals(offset); @@ -1589,6 +1596,7 @@ impl StaticConfig { ); m.set_container_padding(monitor_config.container_padding); m.set_workspace_padding(monitor_config.workspace_padding); + m.set_floating_layer_behaviour(monitor_config.floating_layer_behaviour); m.update_workspaces_globals(offset); diff --git a/komorebi/src/window_manager.rs b/komorebi/src/window_manager.rs index 7b76a013..7a46f85a 100644 --- a/komorebi/src/window_manager.rs +++ b/komorebi/src/window_manager.rs @@ -360,6 +360,7 @@ impl From<&WindowManager> for State { container_padding: monitor.container_padding, workspace_padding: monitor.workspace_padding, wallpaper: monitor.wallpaper.clone(), + floating_layer_behaviour: monitor.floating_layer_behaviour, }) .collect::>(); stripped_monitors.focus(wm.monitors.focused_idx()); @@ -651,14 +652,18 @@ impl WindowManager { self.window_management_behaviour.float_override }; + let floating_layer_behaviour = + if let Some(behaviour) = workspace.floating_layer_behaviour() { + behaviour + } else { + monitor.floating_layer_behaviour().unwrap_or_default() + }; + // If the workspace layer is `Floating` and the floating layer behaviour is `Float`, // then consider it as if it had float override so that new windows spawn as floating float_override = float_override || (matches!(workspace.layer, WorkspaceLayer::Floating) - && matches!( - workspace.floating_layer_behaviour, - FloatingLayerBehaviour::Float - )); + && matches!(floating_layer_behaviour, FloatingLayerBehaviour::Float)); return WindowManagementBehaviour { current_behaviour, diff --git a/komorebi/src/workspace.rs b/komorebi/src/workspace.rs index 173dffed..bd3f737a 100644 --- a/komorebi/src/workspace.rs +++ b/komorebi/src/workspace.rs @@ -97,8 +97,8 @@ pub struct Workspace { pub globals: WorkspaceGlobals, #[getset(get = "pub", get_mut = "pub", set = "pub")] pub layer: WorkspaceLayer, - #[getset(get = "pub", get_mut = "pub", set = "pub")] - pub floating_layer_behaviour: FloatingLayerBehaviour, + #[getset(get_copy = "pub", get_mut = "pub", set = "pub")] + pub floating_layer_behaviour: Option, #[getset(get = "pub", get_mut = "pub", set = "pub")] pub locked_containers: BTreeSet, #[getset(get = "pub", get_mut = "pub", set = "pub")] @@ -192,6 +192,7 @@ pub struct WorkspaceGlobals { pub work_area_offset: Option, pub window_based_work_area_offset: Option, pub window_based_work_area_offset_limit: isize, + pub floating_layer_behaviour: Option, } impl Workspace { @@ -264,7 +265,7 @@ impl Workspace { self.set_float_override(config.float_override); self.set_layout_flip(config.layout_flip); - self.set_floating_layer_behaviour(config.floating_layer_behaviour.unwrap_or_default()); + self.set_floating_layer_behaviour(config.floating_layer_behaviour); self.set_wallpaper(config.wallpaper.clone()); self.set_workspace_config(Some(config.clone()));