mirror of
https://github.com/LGUG2Z/komorebi.git
synced 2026-07-10 15:12:52 +02:00
feat(wm): add dynamic work area offsets
This commit adds a config setting to let you set custom work_area_offset_rules for a workspace, following the same schema as layout_rules.
This commit is contained in:
@@ -253,6 +253,7 @@ impl From<&WindowManager> for State {
|
|||||||
layout: workspace.layout.clone(),
|
layout: workspace.layout.clone(),
|
||||||
layout_options: workspace.layout_options,
|
layout_options: workspace.layout_options,
|
||||||
layout_rules: workspace.layout_rules.clone(),
|
layout_rules: workspace.layout_rules.clone(),
|
||||||
|
work_area_offset_rules: workspace.work_area_offset_rules.clone(),
|
||||||
layout_flip: workspace.layout_flip,
|
layout_flip: workspace.layout_flip,
|
||||||
workspace_padding: workspace.workspace_padding,
|
workspace_padding: workspace.workspace_padding,
|
||||||
container_padding: workspace.container_padding,
|
container_padding: workspace.container_padding,
|
||||||
|
|||||||
@@ -223,6 +223,9 @@ pub struct WorkspaceConfig {
|
|||||||
/// Layout rules in the format of threshold => layout
|
/// Layout rules in the format of threshold => layout
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub layout_rules: Option<HashMap<usize, DefaultLayout>>,
|
pub layout_rules: Option<HashMap<usize, DefaultLayout>>,
|
||||||
|
/// Work area offset rules in the format of threshold => Rect (default: None)
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub work_area_offset_rules: Option<HashMap<usize, Rect>>,
|
||||||
/// END OF LIFE FEATURE: Custom layout rules
|
/// END OF LIFE FEATURE: Custom layout rules
|
||||||
#[deprecated(note = "End of life feature")]
|
#[deprecated(note = "End of life feature")]
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
@@ -287,6 +290,13 @@ impl From<&Workspace> for WorkspaceConfig {
|
|||||||
}
|
}
|
||||||
let layout_rules = (!layout_rules.is_empty()).then_some(layout_rules);
|
let layout_rules = (!layout_rules.is_empty()).then_some(layout_rules);
|
||||||
|
|
||||||
|
let mut work_area_offset_rules = HashMap::new();
|
||||||
|
for (threshold, offset) in &value.work_area_offset_rules {
|
||||||
|
work_area_offset_rules.insert(*threshold, *offset);
|
||||||
|
}
|
||||||
|
let work_area_offset_rules =
|
||||||
|
(!work_area_offset_rules.is_empty()).then_some(work_area_offset_rules);
|
||||||
|
|
||||||
let mut window_container_behaviour_rules = HashMap::new();
|
let mut window_container_behaviour_rules = HashMap::new();
|
||||||
for (threshold, behaviour) in value.window_container_behaviour_rules.iter().flatten() {
|
for (threshold, behaviour) in value.window_container_behaviour_rules.iter().flatten() {
|
||||||
window_container_behaviour_rules.insert(*threshold, *behaviour);
|
window_container_behaviour_rules.insert(*threshold, *behaviour);
|
||||||
@@ -353,6 +363,7 @@ impl From<&Workspace> for WorkspaceConfig {
|
|||||||
.workspace_config
|
.workspace_config
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.and_then(|c| c.workspace_rules.clone()),
|
.and_then(|c| c.workspace_rules.clone()),
|
||||||
|
work_area_offset_rules,
|
||||||
work_area_offset: value.work_area_offset,
|
work_area_offset: value.work_area_offset,
|
||||||
apply_window_based_work_area_offset: Some(value.apply_window_based_work_area_offset),
|
apply_window_based_work_area_offset: Some(value.apply_window_based_work_area_offset),
|
||||||
window_container_behaviour: value.window_container_behaviour,
|
window_container_behaviour: value.window_container_behaviour,
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ pub struct Workspace {
|
|||||||
pub layout: Layout,
|
pub layout: Layout,
|
||||||
pub layout_options: Option<LayoutOptions>,
|
pub layout_options: Option<LayoutOptions>,
|
||||||
pub layout_rules: Vec<(usize, Layout)>,
|
pub layout_rules: Vec<(usize, Layout)>,
|
||||||
|
pub work_area_offset_rules: Vec<(usize, Rect)>,
|
||||||
pub layout_flip: Option<Axis>,
|
pub layout_flip: Option<Axis>,
|
||||||
pub workspace_padding: Option<i32>,
|
pub workspace_padding: Option<i32>,
|
||||||
pub container_padding: Option<i32>,
|
pub container_padding: Option<i32>,
|
||||||
@@ -118,6 +119,7 @@ impl Default for Workspace {
|
|||||||
layout: Layout::Default(DefaultLayout::BSP),
|
layout: Layout::Default(DefaultLayout::BSP),
|
||||||
layout_options: None,
|
layout_options: None,
|
||||||
layout_rules: vec![],
|
layout_rules: vec![],
|
||||||
|
work_area_offset_rules: vec![],
|
||||||
layout_flip: None,
|
layout_flip: None,
|
||||||
workspace_padding: Option::from(DEFAULT_WORKSPACE_PADDING.load(Ordering::SeqCst)),
|
workspace_padding: Option::from(DEFAULT_WORKSPACE_PADDING.load(Ordering::SeqCst)),
|
||||||
container_padding: Option::from(DEFAULT_CONTAINER_PADDING.load(Ordering::SeqCst)),
|
container_padding: Option::from(DEFAULT_CONTAINER_PADDING.load(Ordering::SeqCst)),
|
||||||
@@ -213,6 +215,15 @@ impl Workspace {
|
|||||||
self.layout_rules = all_layout_rules;
|
self.layout_rules = all_layout_rules;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let mut all_work_area_offset_rules = vec![];
|
||||||
|
if let Some(work_area_offset_rules) = &config.work_area_offset_rules {
|
||||||
|
for (count, rect) in work_area_offset_rules {
|
||||||
|
all_work_area_offset_rules.push((*count, *rect));
|
||||||
|
}
|
||||||
|
all_work_area_offset_rules.sort_by_key(|(i, _)| *i);
|
||||||
|
self.work_area_offset_rules = all_work_area_offset_rules;
|
||||||
|
}
|
||||||
|
|
||||||
self.work_area_offset = config.work_area_offset;
|
self.work_area_offset = config.work_area_offset;
|
||||||
|
|
||||||
self.apply_window_based_work_area_offset =
|
self.apply_window_based_work_area_offset =
|
||||||
@@ -479,9 +490,26 @@ impl Workspace {
|
|||||||
let border_width = self.globals.border_width;
|
let border_width = self.globals.border_width;
|
||||||
let border_offset = self.globals.border_offset;
|
let border_offset = self.globals.border_offset;
|
||||||
let work_area = self.globals.work_area;
|
let work_area = self.globals.work_area;
|
||||||
let work_area_offset = self.work_area_offset.or(self.globals.work_area_offset);
|
|
||||||
let window_based_work_area_offset = self.globals.window_based_work_area_offset;
|
let window_based_work_area_offset = self.globals.window_based_work_area_offset;
|
||||||
let window_based_work_area_offset_limit = self.globals.window_based_work_area_offset_limit;
|
let window_based_work_area_offset_limit = self.globals.window_based_work_area_offset_limit;
|
||||||
|
let mut rules_work_area_offset = None;
|
||||||
|
if !self.work_area_offset_rules.is_empty() && self.monocle_container.is_none() {
|
||||||
|
for (threshold, work_area_offset_rule) in &self.work_area_offset_rules {
|
||||||
|
if self.containers().len() >= *threshold {
|
||||||
|
rules_work_area_offset = Some(*work_area_offset_rule);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// if self.monocle_container.is_some() {
|
||||||
|
// for (threshold, work_area_offset) in &self.work_area_offset_rules {
|
||||||
|
// if 1 >= *threshold {
|
||||||
|
// updated_work_area_offset = Option::from(work_area_offset);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
};
|
||||||
|
let work_area_offset = rules_work_area_offset
|
||||||
|
.or(self.work_area_offset)
|
||||||
|
.or(self.globals.work_area_offset);
|
||||||
|
|
||||||
let mut adjusted_work_area = work_area_offset.map_or_else(
|
let mut adjusted_work_area = work_area_offset.map_or_else(
|
||||||
|| work_area,
|
|| work_area,
|
||||||
@@ -495,7 +523,6 @@ impl Workspace {
|
|||||||
with_offset
|
with_offset
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
if (self.containers().len() <= window_based_work_area_offset_limit as usize
|
if (self.containers().len() <= window_based_work_area_offset_limit as usize
|
||||||
|| self.monocle_container.is_some() && window_based_work_area_offset_limit > 0)
|
|| self.monocle_container.is_some() && window_based_work_area_offset_limit > 0)
|
||||||
&& self.apply_window_based_work_area_offset
|
&& self.apply_window_based_work_area_offset
|
||||||
|
|||||||
Reference in New Issue
Block a user