Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git
feat: status segment spacing from the bar's own config file
module { spacing } in ~/.config/cce/cce-status-interface/config.kdl now
sets the gap the arrange pass leaves between status segments, overriding
the shared style { status module_spacing } key (which becomes the DE-wide
fallback; default stays the policy crate's 12). The bar's app file is
re-read on every config (re)load, so edits apply on ccectl reload —
consistent with every other compositor-side setting.
Co-Authored-By: Claude Fable 5 <[email protected]>
src/server/config.rs | 46 ++++++++++++++++++++++++++++++++++++++++++++
src/server/window_manager.rs | 1 +
2 files changed, 47 insertions(+)
diff --git a/src/server/config.rs b/src/server/config.rs
index 7a40ddf..40e4b0e 100644
--- a/src/server/config.rs
+++ b/src/server/config.rs
@@ -87,6 +87,10 @@ pub struct Layout {
pub status_backdrop_blur_ignore_transparent: bool,
pub window_backdrop_blur_ignore_transparent: bool,
pub status_module_hide_mode_preview: i64,
+ /// Gap between adjacent status segments; the bar's own config file
+ /// (`~/.config/cce/cce-status-interface/config.kdl`, `module { spacing }`)
+ /// overrides the shared `style { status module_spacing }`.
+ pub status_module_spacing: i64,
pub cloud_position_default: Option<[i32; 2]>,
}
@@ -180,6 +184,7 @@ impl Default for Layout {
status_backdrop_blur_ignore_transparent: true,
window_backdrop_blur_ignore_transparent: true,
status_module_hide_mode_preview: 4,
+ status_module_spacing: 12,
cloud_position_default: None,
}
}
@@ -642,6 +647,8 @@ pub struct LayoutConfig {
pub window_backdrop_blur_ignore_transparent: bool,
#[serde(default = "default_status_module_hide_mode_preview")]
pub status_module_hide_mode_preview: i64,
+ #[serde(default = "default_status_module_spacing")]
+ pub status_module_spacing: i64,
}
impl Default for LayoutConfig {
@@ -667,6 +674,7 @@ impl Default for LayoutConfig {
status_backdrop_blur_ignore_transparent: default_status_backdrop_blur_ignore_transparent(),
window_backdrop_blur_ignore_transparent: default_window_backdrop_blur_ignore_transparent(),
status_module_hide_mode_preview: default_status_module_hide_mode_preview(),
+ status_module_spacing: default_status_module_spacing(),
}
}
}
@@ -691,6 +699,9 @@ fn default_window_opacity() -> bool { true }
fn default_status_backdrop_blur_ignore_transparent() -> bool { true }
fn default_status_module_hide_mode_preview() -> i64 { 4 }
+fn default_status_module_spacing() -> i64 {
+ crate::policy::arrange::DEFAULT_STATUS_MODULE_SPACING as i64
+}
fn default_window_backdrop_blur_ignore_transparent() -> bool { true }
#[derive(Debug, Deserialize)]
@@ -1252,6 +1263,40 @@ fn parse_kdl_config(content: &str) -> Result<Config, String> {
layout.status_background_blur = get_nested_prop_f64(node, "status", "background_blur", default_status_background_blur());
layout.status_backdrop_blur_ignore_transparent = get_nested_prop_bool(node, "status", "backdrop_blur_ignore_transparent", default_status_backdrop_blur_ignore_transparent());
layout.status_module_hide_mode_preview = get_nested_prop_i64(node, "status", "module_hide_mode_preview", default_status_module_hide_mode_preview());
+ layout.status_module_spacing = get_nested_prop_i64(node, "status", "module_spacing", default_status_module_spacing());
+ }
+
+ // The status bar's own config file wins over the shared status keys:
+ // ~/.config/cce/cce-status-interface/config.kdl, `module { spacing }`.
+ // Re-read on every config (re)load, so `ccectl reload` picks up edits.
+ {
+ let app_cfg = cce_ui::config::get_app_config_path("cce-status-interface");
+ if let Ok(content) = std::fs::read_to_string(&app_cfg) {
+ if let Ok(app_doc) = content.parse::<kdl::KdlDocument>() {
+ if let Some(module) = app_doc.nodes().iter().find(|n| n.name().value() == "module") {
+ let spacing = module
+ .entries()
+ .iter()
+ .find(|e| e.name().map(|id| id.value()) == Some("spacing"))
+ .map(|e| e.value())
+ .or_else(|| {
+ module.children().and_then(|c| {
+ c.nodes()
+ .iter()
+ .find(|n| n.name().value() == "spacing")
+ .and_then(|n| n.entries().first().map(|e| e.value()))
+ })
+ });
+ if let Some(v) = spacing {
+ if let Some(i) = v.as_i64() {
+ layout.status_module_spacing = i;
+ } else if let Some(f) = v.as_f64() {
+ layout.status_module_spacing = f.round() as i64;
+ }
+ }
+ }
+ }
+ }
}
// 2. env
@@ -1975,6 +2020,7 @@ pub fn parse_config(path: &str, state: &mut crate::window_manager::WindowManager
state.layout.status_backdrop_blur_ignore_transparent = config.layout.status_backdrop_blur_ignore_transparent;
state.layout.window_backdrop_blur_ignore_transparent = config.layout.window_backdrop_blur_ignore_transparent;
state.layout.status_module_hide_mode_preview = config.layout.status_module_hide_mode_preview;
+ state.layout.status_module_spacing = config.layout.status_module_spacing;
state.layout.cloud_position_default = config.surface.cloud_position_default;
state.layout.shadow_enabled = config.surface.shadow_enabled;
state.layout.shadow_sigma = config.surface.shadow_sigma.max(0.0) as f32;
diff --git a/src/server/window_manager.rs b/src/server/window_manager.rs
index f81d88f..18374d5 100644
--- a/src/server/window_manager.rs
+++ b/src/server/window_manager.rs
@@ -1752,6 +1752,7 @@ impl WindowManager {
bar_height: self.layout.bar_height,
status_hide_mode: self.status_hide_mode,
hide_mode_preview: self.layout.status_module_hide_mode_preview as i32,
+ status_module_spacing: self.layout.status_module_spacing as i32,
status_blur: self.layout.status_background_blur > 0.001,
window_blur: self.layout.window_blur,
opacity_enabled: self.layout.window_opacity,