diff --git a/modules/SystemStats.qml b/modules/SystemStats.qml index cb7a0ad..13c99a8 100644 --- a/modules/SystemStats.qml +++ b/modules/SystemStats.qml @@ -14,6 +14,9 @@ QtObject { property var cpuCoreMaxFreq: [] property var cpuCoreTypes: [] + // ── Temperature ────────────────────────────────────────────────────── + property int tempCelsius: 0 + // ── Memory ─────────────────────────────────────────────────────────── property int memPercent: 0 property real memUsedGb: 0 @@ -52,6 +55,8 @@ QtObject { history: hist.length > histLen ? hist.slice(hist.length - histLen) : hist }; }); + } else if (ev.type === "temp") { + root.tempCelsius = ev.celsius; } else if (ev.type === "mem") { root.memPercent = ev.percent; root.memUsedGb = ev.used_gb; diff --git a/modules/Temperature.qml b/modules/Temperature.qml index ec2983c..d6f9ade 100644 --- a/modules/Temperature.qml +++ b/modules/Temperature.qml @@ -1,39 +1,25 @@ import QtQuick -import Quickshell.Io import "." as M M.BarSection { id: root spacing: Math.max(1, M.Theme.moduleSpacing - 2) - tooltip: "Temperature: " + root.celsius + "\u00B0C" + tooltip: "Temperature: " + M.SystemStats.tempCelsius + "\u00B0C" - property int celsius: 0 - property color _stateColor: celsius > (M.Modules.temperature.hot || 80) ? M.Theme.base09 : celsius > (M.Modules.temperature.warm || 60) ? M.Theme.base0A : root.accentColor + property color _stateColor: M.SystemStats.tempCelsius > (M.Modules.temperature.hot || 80) ? M.Theme.base09 : M.SystemStats.tempCelsius > (M.Modules.temperature.warm || 60) ? M.Theme.base0A : root.accentColor Behavior on _stateColor { ColorAnimation { duration: 300 } } - FileView { - id: thermal - path: "/sys/class/thermal/thermal_zone0/temp" - onLoaded: root.celsius = Math.round(parseInt(text()) / 1000) - } - Timer { - interval: M.Modules.temperature.interval || 2000 - running: true - repeat: true - onTriggered: thermal.reload() - } - M.BarIcon { icon: "\uF2C9" color: root._stateColor anchors.verticalCenter: parent.verticalCenter } M.BarLabel { - label: root.celsius + "\u00B0C" + label: M.SystemStats.tempCelsius + "\u00B0C" minText: "100\u00B0C" color: root._stateColor anchors.verticalCenter: parent.verticalCenter diff --git a/stats-daemon/src/main.rs b/stats-daemon/src/main.rs index c66ab5a..b206397 100644 --- a/stats-daemon/src/main.rs +++ b/stats-daemon/src/main.rs @@ -93,6 +93,23 @@ fn read_stat() -> Vec { parse_stat(&fs::read_to_string("/proc/stat").unwrap_or_default()) } +fn read_temp_celsius() -> Option { + let mut max: Option = None; + for i in 0.. { + let path = format!("/sys/class/thermal/thermal_zone{i}/temp"); + match fs::read_to_string(&path) { + Ok(s) => { + if let Ok(millic) = s.trim().parse::() { + let c = millic / 1000; + max = Some(max.map_or(c, |m: i32| m.max(c))); + } + } + Err(_) => break, + } + } + max +} + fn read_core_freqs() -> Vec { let mut freqs = Vec::new(); for i in 0.. { @@ -148,6 +165,12 @@ fn emit_cpu(out: &mut impl Write, prev: &[Sample], curr: &[Sample], freqs: &[f64 let _ = writeln!(out, "]}}"); } +fn emit_temp(out: &mut impl Write) { + if let Some(c) = read_temp_celsius() { + let _ = writeln!(out, "{{\"type\":\"temp\",\"celsius\":{c}}}"); + } +} + fn emit_mem(out: &mut impl Write) { let content = fs::read_to_string("/proc/meminfo").unwrap_or_default(); if let Some(m) = parse_meminfo(&content) { @@ -190,6 +213,7 @@ fn main() { if tick.is_multiple_of(2) { emit_mem(&mut out); + emit_temp(&mut out); } let _ = out.flush();