git.lucas.co / cce-compositor
Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git

commitea1901b09f1bbb7f6984dd42006d692d73b04900
parent3c2c7649d3
authorLucas Galante <[email protected]>
date2026-07-04 14:31
Support display output brightness_up, brightness_down, and brightness_interval configuration and tests

 src/server/config.rs | 98 +++++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 94 insertions(+), 4 deletions(-)

diff --git a/src/server/config.rs b/src/server/config.rs
index 6b3a042..4c4675b 100644
--- a/src/server/config.rs
+++ b/src/server/config.rs
@@ -1160,15 +1160,93 @@ fn parse_kdl_config(content: &str) -> Result<Config, String> {
         if let Some(children) = node.children() {
             for child in children.nodes() {
                 let name = child.name().value();
+                let mut parsed_scale = None;
+                if let Some(entry) = child.entries().iter().find(|e| e.name().map(|n| n.value()) == Some("scale")) {
+                    if let Some(num) = entry.value().as_f64() {
+                        parsed_scale = Some(num);
+                    }
+                }
+                let mut parsed_interval = None;
+                if let Some(entry) = child.entries().iter().find(|e| e.name().map(|n| n.value()) == Some("brightness_interval")) {
+                    if let Some(num) = entry.value().as_i64() {
+                        parsed_interval = Some(num);
+                    }
+                }
+                let mut parsed_up = None;
+                if let Some(entry) = child.entries().iter().find(|e| e.name().map(|n| n.value()) == Some("brightness_up")) {
+                    if let Some(key_val) = entry.value().as_string() {
+                        parsed_up = Some(key_val.to_string());
+                    }
+                }
+                let mut parsed_down = None;
+                if let Some(entry) = child.entries().iter().find(|e| e.name().map(|n| n.value()) == Some("brightness_down")) {
+                    if let Some(key_val) = entry.value().as_string() {
+                        parsed_down = Some(key_val.to_string());
+                    }
+                }
+
                 if let Some(display_children) = child.children() {
-                    if let Some(scale_node) = display_children.nodes().iter().find(|n| n.name().value() == "scale") {
-                        if let Some(entry) = scale_node.entries().first() {
-                            if let Some(num) = entry.value().as_f64() {
-                                display.insert(format!("scale_{}", name), num);
+                    if parsed_scale.is_none() {
+                        if let Some(scale_node) = display_children.nodes().iter().find(|n| n.name().value() == "scale") {
+                            if let Some(entry) = scale_node.entries().first() {
+                                if let Some(num) = entry.value().as_f64() {
+                                    parsed_scale = Some(num);
+                                }
+                            }
+                        }
+                    }
+                    if parsed_interval.is_none() {
+                        if let Some(interval_node) = display_children.nodes().iter().find(|n| n.name().value() == "brightness_interval") {
+                            if let Some(entry) = interval_node.entries().first() {
+                                if let Some(num) = entry.value().as_i64() {
+                                    parsed_interval = Some(num);
+                                }
+                            }
+                        }
+                    }
+                    if parsed_up.is_none() {
+                        if let Some(up_node) = display_children.nodes().iter().find(|n| n.name().value() == "brightness_up") {
+                            if let Some(entry) = up_node.entries().first() {
+                                if let Some(key_val) = entry.value().as_string() {
+                                    parsed_up = Some(key_val.to_string());
+                                }
+                            }
+                        }
+                    }
+                    if parsed_down.is_none() {
+                        if let Some(down_node) = display_children.nodes().iter().find(|n| n.name().value() == "brightness_down") {
+                            if let Some(entry) = down_node.entries().first() {
+                                if let Some(key_val) = entry.value().as_string() {
+                                    parsed_down = Some(key_val.to_string());
+                                }
                             }
                         }
                     }
                 }
+
+                if let Some(num) = parsed_scale {
+                    display.insert(format!("scale_{}", name), num);
+                }
+                let interval = parsed_interval.unwrap_or(10);
+                if parsed_interval.is_some() {
+                    display.insert(format!("brightness_interval_{}", name), interval as f64);
+                }
+                if let Some(key_val) = parsed_up {
+                    key_bindings.push(KeybindConfig {
+                        mods: "".to_string(),
+                        key: key_val,
+                        action: "spawn".to_string(),
+                        command: Some(format!("brightnessctl set {}%+", interval)),
+                    });
+                }
+                if let Some(key_val) = parsed_down {
+                    key_bindings.push(KeybindConfig {
+                        mods: "".to_string(),
+                        key: key_val,
+                        action: "spawn".to_string(),
+                        command: Some(format!("brightnessctl set {}%-", interval)),
+                    });
+                }
             }
         }
     }
@@ -1748,6 +1826,9 @@ mod tests {
             output {
                 eDP-1 {
                     scale (f64)2.0
+                    brightness_up (keybind)"XF86MonBrightnessUp"
+                    brightness_down (keybind)"XF86MonBrightnessDown"
+                    brightness_interval (i64)10
                 }
                 DP-1 {
                     scale (f64)1.5
@@ -1757,6 +1838,15 @@ mod tests {
         let config = parse_kdl_config(content).unwrap();
         assert_eq!(config.display.get("scale_eDP-1"), Some(&2.0));
         assert_eq!(config.display.get("scale_DP-1"), Some(&1.5));
+        assert_eq!(config.display.get("brightness_interval_eDP-1"), Some(&10.0));
+
+        let up_bind = config.key_bindings.iter().find(|kb| kb.key == "XF86MonBrightnessUp").unwrap();
+        assert_eq!(up_bind.action, "spawn");
+        assert_eq!(up_bind.command, Some("brightnessctl set 10%+".to_string()));
+
+        let down_bind = config.key_bindings.iter().find(|kb| kb.key == "XF86MonBrightnessDown").unwrap();
+        assert_eq!(down_bind.action, "spawn");
+        assert_eq!(down_bind.command, Some("brightnessctl set 10%-".to_string()));
     }
 
     #[test]