feat(waybar): modules cpu-temp et disks portables par scripts

Remplace les modules natifs temperature (thermal-zone codé en dur) et
disk (chemin fixe /) par des custom scripts auto-détectés.
- cpu-temp.sh : détecte x86_pkg_temp / k10temp / coretemp via thermal_zone
  et hwmon, émet warning à 65° et critical à 80°
- disks.sh : liste tous les FS montés réels, exclut snap/tmpfs/efi,
  affiche icône selon le point de montage, tooltip détaillé
CSS : styles warning + hover ajoutés pour les deux modules
This commit is contained in:
Tetardtek
2026-02-23 22:16:05 +01:00
parent 1690ec5eb4
commit 0ba6bbd181
4 changed files with 129 additions and 18 deletions

View File

@@ -20,10 +20,10 @@
"custom/launcher", "custom/launcher",
"custom/sep", "custom/sep",
"cpu", "cpu",
"temperature", "custom/cpu-temp",
"custom/gpu", "custom/gpu",
"memory", "memory",
"disk", "custom/disks",
"custom/sep", "custom/sep",
"custom/network" "custom/network"
], ],
@@ -77,15 +77,13 @@
"interval": 2 "interval": 2
}, },
// ── Température ───────────────────────────────────────────────────────── // ── Température CPU (auto-détection) ────────────────────────────────────
"temperature": { "custom/cpu-temp": {
"thermal-zone": 9, "exec": "~/.config/waybar/scripts/cpu-temp.sh",
"format": " {temperatureC}°", "return-type": "json",
"format-critical": " {temperatureC}°", "interval": 2,
"critical-threshold": 80, "format": "{}"
"tooltip": false,
"interval": 2
}, },
// ── GPU ───────────────────────────────────────────────────────────────── // ── GPU ─────────────────────────────────────────────────────────────────
@@ -109,12 +107,13 @@
"interval": 2 "interval": 2
}, },
// ── Disque ────────────────────────────────────────────────────────────── // ── Disques (auto-détection) ─────────────────────────────────────────────
"disk": { "custom/disks": {
"format": "󰋊 {used}", "exec": "~/.config/waybar/scripts/disks.sh",
"tooltip-format": "󰋊 Disque /\n{used} / {total}\n{percentage_used}% utilisé", "return-type": "json",
"interval": 30 "interval": 30,
"format": "{}"
}, },
// ── Réseau ────────────────────────────────────────────────────────────── // ── Réseau ──────────────────────────────────────────────────────────────

View File

@@ -0,0 +1,43 @@
#!/usr/bin/env bash
# cpu-temp.sh — température CPU auto-détection → JSON waybar
# Priorité 1 : thermal zone x86_pkg_temp (Intel) ou k10temp (AMD)
# Priorité 2 : hwmon coretemp / k10temp / zenpower
# Retourne vide si aucune source trouvée
emit() {
local temp=$1
local cls="normal"
(( temp >= 80 )) && cls="critical"
(( temp >= 65 && temp < 80 )) && cls="warning"
printf '{"text":" %d°","tooltip":"CPU %d°C","class":"%s","percentage":%d}\n' \
"$temp" "$temp" "$cls" "$temp"
exit 0
}
# Priorité 1 — thermal_zone x86_pkg_temp (Intel) / TCPU / k10temp (AMD)
for zone in /sys/class/thermal/thermal_zone*/; do
zone_type=$(cat "${zone}type" 2>/dev/null) || continue
case "$zone_type" in
x86_pkg_temp|k10temp|TCPU|cpu_thermal)
temp_raw=$(cat "${zone}temp" 2>/dev/null) || continue
emit $(( temp_raw / 1000 ))
;;
esac
done
# Priorité 2 — hwmon coretemp (Intel desktop) ou k10temp (AMD)
for hw in /sys/class/hwmon/hwmon*/; do
hw_name=$(cat "${hw}name" 2>/dev/null) || continue
case "$hw_name" in
coretemp|k10temp|zenpower|amd_energy)
for f in "${hw}temp1_input" "${hw}temp2_input"; do
[[ -r "$f" ]] || continue
temp_raw=$(cat "$f" 2>/dev/null) || continue
emit $(( temp_raw / 1000 ))
done
;;
esac
done
# Aucune source — module masqué
printf '{"text":"","class":"unavailable"}\n'

View File

@@ -0,0 +1,58 @@
#!/usr/bin/env bash
# disks.sh — liste les vrais systèmes de fichiers montés → JSON waybar
# Exclut tmpfs, devtmpfs, squashfs (snap), overlay, efi, etc.
TEXT=""
TOOLTIP="󰋊 Disques\n"
while IFS= read -r line; do
fs=$(awk '{print $1}' <<< "$line")
size=$(awk '{print $2}' <<< "$line")
used=$(awk '{print $3}' <<< "$line")
avail=$(awk '{print $4}' <<< "$line")
pct=$(awk '{print $5}' <<< "$line")
mnt=$(awk '{print $6}' <<< "$line")
# Exclure mounts sans intérêt
[[ "$mnt" == /snap/* ]] && continue
[[ "$mnt" == /boot/efi ]] && continue
[[ "$mnt" == /boot ]] && continue
[[ "$mnt" == /recovery ]] && continue
[[ "$mnt" == /run* ]] && continue
[[ "$mnt" == /sys* ]] && continue
[[ "$mnt" == /proc* ]] && continue
[[ "$mnt" == /dev* ]] && continue
# Icône selon le point de montage
case "$mnt" in
/) icon="󰋊" ;;
/home) icon="󱂵" ;;
/data*) icon="󱦡" ;;
/media*) icon="󰆼" ;;
/mnt*) icon="󱛟" ;;
*) icon="󰋊" ;;
esac
# Texte compact : icône + montage court + espace utilisé
label=$(basename "$mnt")
[[ "$mnt" == "/" ]] && label="/"
[[ -n "$TEXT" ]] && TEXT+=" "
TEXT+="${icon} ${label}: ${used}"
TOOLTIP+="${icon} ${mnt}\n Utilisé : ${used} / ${size} (${pct})\n Libre : ${avail}\n"
done < <(df -hP --exclude-type=tmpfs \
--exclude-type=devtmpfs \
--exclude-type=squashfs \
--exclude-type=overlay \
--exclude-type=fuse.portal \
--exclude-type=efivarfs \
2>/dev/null | tail -n +2 | sort -k6)
if [[ -z "$TEXT" ]]; then
printf '{"text":"󰋊 N/A","tooltip":"Aucun disque détecté","class":"unavailable"}\n'
else
# Échapper uniquement les guillemets pour JSON (\n reste tel quel = saut de ligne)
TOOLTIP_JSON=$(printf '%s' "$TOOLTIP" | sed 's/"/\\"/g')
printf '{"text":"%s","tooltip":"%s"}\n' "$TEXT" "$TOOLTIP_JSON"
fi

View File

@@ -102,9 +102,11 @@ window#waybar {
#cpu, #cpu,
#temperature, #temperature,
#custom-cpu-temp,
#custom-gpu, #custom-gpu,
#memory, #memory,
#disk, #disk,
#custom-disks,
#custom-network, #custom-network,
#clock, #clock,
#custom-date, #custom-date,
@@ -140,7 +142,8 @@ window#waybar {
/* ── Température ──────────────────────────────────────────────────────────── */ /* ── Température ──────────────────────────────────────────────────────────── */
#temperature { #temperature,
#custom-cpu-temp {
color: rgba(139, 233, 253, 0.60); color: rgba(139, 233, 253, 0.60);
font-size: 11px; font-size: 11px;
font-weight: normal; font-weight: normal;
@@ -148,12 +151,17 @@ window#waybar {
padding-right: 10px; padding-right: 10px;
} }
#temperature.critical { #temperature.critical,
#custom-cpu-temp.critical {
color: #f38ba8; color: #f38ba8;
font-weight: bold; font-weight: bold;
animation: pulse-critical 0.8s linear infinite; animation: pulse-critical 0.8s linear infinite;
} }
#custom-cpu-temp.warning {
color: #f9e2af;
}
/* ── GPU ──────────────────────────────────────────────────────────────────── */ /* ── GPU ──────────────────────────────────────────────────────────────────── */
#custom-gpu { #custom-gpu {
@@ -186,7 +194,8 @@ window#waybar {
/* ── Disque ───────────────────────────────────────────────────────────────── */ /* ── Disque ───────────────────────────────────────────────────────────────── */
#disk { #disk,
#custom-disks {
color: rgba(255, 121, 198, 0.70); color: rgba(255, 121, 198, 0.70);
font-size: 11px; font-size: 11px;
font-weight: normal; font-weight: normal;
@@ -405,6 +414,8 @@ tooltip label {
#cpu:hover, #cpu:hover,
#memory:hover, #memory:hover,
#disk:hover, #disk:hover,
#custom-disks:hover,
#custom-cpu-temp:hover,
#custom-network:hover, #custom-network:hover,
#wireplumber:hover, #wireplumber:hover,
#backlight:hover, #backlight:hover,