mirror of
https://github.com/LGUG2Z/komorebi.git
synced 2026-05-13 22:30:00 +02:00
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.
This commit is contained in:
@@ -23,6 +23,7 @@ use crate::workspace::Workspace;
|
|||||||
use crate::workspace::WorkspaceGlobals;
|
use crate::workspace::WorkspaceGlobals;
|
||||||
use crate::workspace::WorkspaceLayer;
|
use crate::workspace::WorkspaceLayer;
|
||||||
use crate::DefaultLayout;
|
use crate::DefaultLayout;
|
||||||
|
use crate::FloatingLayerBehaviour;
|
||||||
use crate::Layout;
|
use crate::Layout;
|
||||||
use crate::OperationDirection;
|
use crate::OperationDirection;
|
||||||
use crate::Wallpaper;
|
use crate::Wallpaper;
|
||||||
@@ -67,6 +68,8 @@ pub struct Monitor {
|
|||||||
pub workspace_padding: Option<i32>,
|
pub workspace_padding: Option<i32>,
|
||||||
#[getset(get = "pub", get_mut = "pub", set = "pub")]
|
#[getset(get = "pub", get_mut = "pub", set = "pub")]
|
||||||
pub wallpaper: Option<Wallpaper>,
|
pub wallpaper: Option<Wallpaper>,
|
||||||
|
#[getset(get_copy = "pub", set = "pub")]
|
||||||
|
pub floating_layer_behaviour: Option<FloatingLayerBehaviour>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl_ring_elements!(Monitor, Workspace);
|
impl_ring_elements!(Monitor, Workspace);
|
||||||
@@ -123,6 +126,7 @@ pub fn new(
|
|||||||
container_padding: None,
|
container_padding: None,
|
||||||
workspace_padding: None,
|
workspace_padding: None,
|
||||||
wallpaper: None,
|
wallpaper: None,
|
||||||
|
floating_layer_behaviour: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -165,6 +169,7 @@ impl Monitor {
|
|||||||
container_padding: None,
|
container_padding: None,
|
||||||
workspace_padding: None,
|
workspace_padding: None,
|
||||||
wallpaper: None,
|
wallpaper: None,
|
||||||
|
floating_layer_behaviour: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -221,6 +226,7 @@ impl Monitor {
|
|||||||
let work_area_offset = self.work_area_offset.or(offset);
|
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 = self.window_based_work_area_offset();
|
||||||
let window_based_work_area_offset_limit = self.window_based_work_area_offset_limit();
|
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() {
|
for workspace in self.workspaces_mut() {
|
||||||
workspace.globals = WorkspaceGlobals {
|
workspace.globals = WorkspaceGlobals {
|
||||||
@@ -232,6 +238,7 @@ impl Monitor {
|
|||||||
work_area_offset,
|
work_area_offset,
|
||||||
window_based_work_area_offset,
|
window_based_work_area_offset,
|
||||||
window_based_work_area_offset_limit,
|
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 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 = self.window_based_work_area_offset();
|
||||||
let window_based_work_area_offset_limit = self.window_based_work_area_offset_limit();
|
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) {
|
if let Some(workspace) = self.workspaces_mut().get_mut(workspace_idx) {
|
||||||
workspace.globals = WorkspaceGlobals {
|
workspace.globals = WorkspaceGlobals {
|
||||||
@@ -269,6 +277,7 @@ impl Monitor {
|
|||||||
work_area_offset,
|
work_area_offset,
|
||||||
window_based_work_area_offset,
|
window_based_work_area_offset,
|
||||||
window_based_work_area_offset_limit,
|
window_based_work_area_offset_limit,
|
||||||
|
floating_layer_behaviour,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -554,6 +554,7 @@ where
|
|||||||
container_padding: cached.container_padding,
|
container_padding: cached.container_padding,
|
||||||
workspace_padding: cached.workspace_padding,
|
workspace_padding: cached.workspace_padding,
|
||||||
wallpaper: cached.wallpaper.clone(),
|
wallpaper: cached.wallpaper.clone(),
|
||||||
|
floating_layer_behaviour: cached.floating_layer_behaviour,
|
||||||
};
|
};
|
||||||
|
|
||||||
let focused_workspace_idx = m.focused_workspace_idx();
|
let focused_workspace_idx = m.focused_workspace_idx();
|
||||||
|
|||||||
@@ -307,7 +307,7 @@ impl From<&Workspace> for WorkspaceConfig {
|
|||||||
window_container_behaviour_rules: Option::from(window_container_behaviour_rules),
|
window_container_behaviour_rules: Option::from(window_container_behaviour_rules),
|
||||||
float_override: *value.float_override(),
|
float_override: *value.float_override(),
|
||||||
layout_flip: value.layout_flip(),
|
layout_flip: value.layout_flip(),
|
||||||
floating_layer_behaviour: Option::from(*value.floating_layer_behaviour()),
|
floating_layer_behaviour: value.floating_layer_behaviour(),
|
||||||
wallpaper: None,
|
wallpaper: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -336,6 +336,9 @@ pub struct MonitorConfig {
|
|||||||
/// Specify a wallpaper for this monitor
|
/// Specify a wallpaper for this monitor
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub wallpaper: Option<Wallpaper>,
|
pub wallpaper: Option<Wallpaper>,
|
||||||
|
/// 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<FloatingLayerBehaviour>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<&Monitor> for MonitorConfig {
|
impl From<&Monitor> for MonitorConfig {
|
||||||
@@ -372,6 +375,7 @@ impl From<&Monitor> for MonitorConfig {
|
|||||||
container_padding,
|
container_padding,
|
||||||
workspace_padding,
|
workspace_padding,
|
||||||
wallpaper: value.wallpaper().clone(),
|
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_container_padding(monitor_config.container_padding);
|
||||||
monitor.set_workspace_padding(monitor_config.workspace_padding);
|
monitor.set_workspace_padding(monitor_config.workspace_padding);
|
||||||
monitor.set_wallpaper(monitor_config.wallpaper.clone());
|
monitor.set_wallpaper(monitor_config.wallpaper.clone());
|
||||||
|
monitor.set_floating_layer_behaviour(monitor_config.floating_layer_behaviour);
|
||||||
|
|
||||||
monitor.update_workspaces_globals(offset);
|
monitor.update_workspaces_globals(offset);
|
||||||
for (j, ws) in monitor.workspaces_mut().iter_mut().enumerate() {
|
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_container_padding(monitor_config.container_padding);
|
||||||
m.set_workspace_padding(monitor_config.workspace_padding);
|
m.set_workspace_padding(monitor_config.workspace_padding);
|
||||||
|
m.set_floating_layer_behaviour(monitor_config.floating_layer_behaviour);
|
||||||
|
|
||||||
m.update_workspaces_globals(offset);
|
m.update_workspaces_globals(offset);
|
||||||
|
|
||||||
@@ -1503,6 +1509,7 @@ impl StaticConfig {
|
|||||||
);
|
);
|
||||||
monitor.set_container_padding(monitor_config.container_padding);
|
monitor.set_container_padding(monitor_config.container_padding);
|
||||||
monitor.set_workspace_padding(monitor_config.workspace_padding);
|
monitor.set_workspace_padding(monitor_config.workspace_padding);
|
||||||
|
monitor.set_floating_layer_behaviour(monitor_config.floating_layer_behaviour);
|
||||||
|
|
||||||
monitor.update_workspaces_globals(offset);
|
monitor.update_workspaces_globals(offset);
|
||||||
|
|
||||||
@@ -1589,6 +1596,7 @@ impl StaticConfig {
|
|||||||
);
|
);
|
||||||
m.set_container_padding(monitor_config.container_padding);
|
m.set_container_padding(monitor_config.container_padding);
|
||||||
m.set_workspace_padding(monitor_config.workspace_padding);
|
m.set_workspace_padding(monitor_config.workspace_padding);
|
||||||
|
m.set_floating_layer_behaviour(monitor_config.floating_layer_behaviour);
|
||||||
|
|
||||||
m.update_workspaces_globals(offset);
|
m.update_workspaces_globals(offset);
|
||||||
|
|
||||||
|
|||||||
@@ -360,6 +360,7 @@ impl From<&WindowManager> for State {
|
|||||||
container_padding: monitor.container_padding,
|
container_padding: monitor.container_padding,
|
||||||
workspace_padding: monitor.workspace_padding,
|
workspace_padding: monitor.workspace_padding,
|
||||||
wallpaper: monitor.wallpaper.clone(),
|
wallpaper: monitor.wallpaper.clone(),
|
||||||
|
floating_layer_behaviour: monitor.floating_layer_behaviour,
|
||||||
})
|
})
|
||||||
.collect::<VecDeque<_>>();
|
.collect::<VecDeque<_>>();
|
||||||
stripped_monitors.focus(wm.monitors.focused_idx());
|
stripped_monitors.focus(wm.monitors.focused_idx());
|
||||||
@@ -651,14 +652,18 @@ impl WindowManager {
|
|||||||
self.window_management_behaviour.float_override
|
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`,
|
// 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
|
// then consider it as if it had float override so that new windows spawn as floating
|
||||||
float_override = float_override
|
float_override = float_override
|
||||||
|| (matches!(workspace.layer, WorkspaceLayer::Floating)
|
|| (matches!(workspace.layer, WorkspaceLayer::Floating)
|
||||||
&& matches!(
|
&& matches!(floating_layer_behaviour, FloatingLayerBehaviour::Float));
|
||||||
workspace.floating_layer_behaviour,
|
|
||||||
FloatingLayerBehaviour::Float
|
|
||||||
));
|
|
||||||
|
|
||||||
return WindowManagementBehaviour {
|
return WindowManagementBehaviour {
|
||||||
current_behaviour,
|
current_behaviour,
|
||||||
|
|||||||
@@ -97,8 +97,8 @@ pub struct Workspace {
|
|||||||
pub globals: WorkspaceGlobals,
|
pub globals: WorkspaceGlobals,
|
||||||
#[getset(get = "pub", get_mut = "pub", set = "pub")]
|
#[getset(get = "pub", get_mut = "pub", set = "pub")]
|
||||||
pub layer: WorkspaceLayer,
|
pub layer: WorkspaceLayer,
|
||||||
#[getset(get = "pub", get_mut = "pub", set = "pub")]
|
#[getset(get_copy = "pub", get_mut = "pub", set = "pub")]
|
||||||
pub floating_layer_behaviour: FloatingLayerBehaviour,
|
pub floating_layer_behaviour: Option<FloatingLayerBehaviour>,
|
||||||
#[getset(get = "pub", get_mut = "pub", set = "pub")]
|
#[getset(get = "pub", get_mut = "pub", set = "pub")]
|
||||||
pub locked_containers: BTreeSet<usize>,
|
pub locked_containers: BTreeSet<usize>,
|
||||||
#[getset(get = "pub", get_mut = "pub", set = "pub")]
|
#[getset(get = "pub", get_mut = "pub", set = "pub")]
|
||||||
@@ -192,6 +192,7 @@ pub struct WorkspaceGlobals {
|
|||||||
pub work_area_offset: Option<Rect>,
|
pub work_area_offset: Option<Rect>,
|
||||||
pub window_based_work_area_offset: Option<Rect>,
|
pub window_based_work_area_offset: Option<Rect>,
|
||||||
pub window_based_work_area_offset_limit: isize,
|
pub window_based_work_area_offset_limit: isize,
|
||||||
|
pub floating_layer_behaviour: Option<FloatingLayerBehaviour>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Workspace {
|
impl Workspace {
|
||||||
@@ -264,7 +265,7 @@ impl Workspace {
|
|||||||
|
|
||||||
self.set_float_override(config.float_override);
|
self.set_float_override(config.float_override);
|
||||||
self.set_layout_flip(config.layout_flip);
|
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_wallpaper(config.wallpaper.clone());
|
||||||
|
|
||||||
self.set_workspace_config(Some(config.clone()));
|
self.set_workspace_config(Some(config.clone()));
|
||||||
|
|||||||
Reference in New Issue
Block a user