oxwm

https://git.tonybtw.com/oxwm.git git://git.tonybtw.com/oxwm.git

battery detection function addded

Commit
661f3e4f40e64e91a4a0198e2b82c57f6f3e6a35
Parent
fdc348b
Author
Daniel Azevedo <49279228+dani-77@users.noreply.github.com>
Date
2026-01-06 01:57:43

Diff

diff --git a/src/bar/blocks/battery.rs b/src/bar/blocks/battery.rs
index ee647d8..c996c07 100644
--- a/src/bar/blocks/battery.rs
+++ b/src/bar/blocks/battery.rs
@@ -1,6 +1,7 @@
 use super::Block;
 use crate::errors::BlockError;
 use std::fs;
+use std::path::{Path, PathBuf};
 use std::time::Duration;
 
 pub struct Battery {
@@ -12,6 +13,35 @@ pub struct Battery {
     battery_path: String,
 }
 
+fn detect_battery_name() -> Option<String> {
+    let base = Path::new("/sys/class/power_supply");
+    let entries = fs::read_dir(base).ok()?;
+
+    for entry in entries.flatten() {
+        let path: PathBuf = entry.path();
+
+        let type_path = path.join("type");
+        let present_path = path.join("present");
+
+        let is_battery = fs::read_to_string(&type_path)
+            .map(|s| s.trim() == "Battery")
+            .unwrap_or(false);
+
+        // Some systems omit "present"; treat missing as present.
+        let is_present = fs::read_to_string(&present_path)
+            .map(|s| s.trim() == "1")
+            .unwrap_or(true);
+
+        if is_battery && is_present {
+            if let Some(name) = path.file_name().and_then(|n| n.to_str()) {
+                return Some(name.to_string());
+            }
+        }
+    }
+
+    None
+}
+
 impl Battery {
     pub fn new(
         format_charging: &str,
@@ -21,16 +51,17 @@ impl Battery {
         color: u32,
         battery_name: Option<String>,
     ) -> Self {
+        let name = battery_name
+            .or_else(detect_battery_name)
+            .unwrap_or_else(|| "BAT0".to_string());
+
         Self {
             format_charging: format_charging.to_string(),
             format_discharging: format_discharging.to_string(),
             format_full: format_full.to_string(),
             interval: Duration::from_secs(interval_secs),
             color,
-            battery_path: format!(
-                "/sys/class/power_supply/{}",
-                battery_name.unwrap_or_else(|| "BAT0".to_string())
-            ),
+            battery_path: format!("/sys/class/power_supply/{}", name),
         }
     }