feat: add battery conservation mode with Waybar toggle

Laptops with charge_control_end_threshold support get a click-to-toggle
on the battery module (80% ↔ 100%). A ♥ icon appears when conservation
is active, hidden when inactive. State persists across reboots via
systemd oneshot service. udev rule grants wheel group write access
so no sudo is needed for toggling.
This commit is contained in:
nevaforget committed 2026-04-08 09:55:46 +02:00
1 parent 2d2d3ca92f
commit 1ebe0fac2b
8 files changed
+113 -8

No files matched your search

+28
View File
@@ -0,0 +1,28 @@
#!/usr/bin/bash
# ABOUTME: Toggles battery conservation mode between 80% and 100% charge limit.
# ABOUTME: Writes to sysfs (immediate) and state file (persistence across reboots).
THRESHOLD_FILE="/sys/class/power_supply/BAT0/charge_control_end_threshold"
STATE_DIR="/var/lib/moonarch"
STATE_FILE="${STATE_DIR}/batsaver-threshold"
CONSERVATION_LIMIT=80
[[ -f "$THRESHOLD_FILE" ]] || exit 1
CURRENT=$(cat "$THRESHOLD_FILE")
if [[ "$CURRENT" -le "$CONSERVATION_LIMIT" ]]; then
NEW=100
else
NEW="$CONSERVATION_LIMIT"
fi
# Apply immediately
echo "$NEW" > "$THRESHOLD_FILE" || exit 1
# Persist for next boot
mkdir -p "$STATE_DIR"
echo "$NEW" > "$STATE_FILE"
# Signal Waybar to refresh the batsaver module (SIGRTMIN+9)
pkill -RTMIN+9 waybar
+19
View File
@@ -0,0 +1,19 @@
#!/usr/bin/bash
# ABOUTME: Waybar module showing battery conservation mode status.
# ABOUTME: Outputs heart icon when active (threshold ≤80), empty when inactive.
THRESHOLD_FILE="/sys/class/power_supply/BAT0/charge_control_end_threshold"
# No battery threshold support → no output → Waybar hides module
[[ -f "$THRESHOLD_FILE" ]] || exit 0
THRESHOLD=$(cat "$THRESHOLD_FILE")
if [[ "$THRESHOLD" -le 80 ]]; then
jq --compact-output -n \
--arg text "♥" \
--arg tooltip "Battery Conservation: ON (limit ${THRESHOLD}%)" \
--arg class "on" \
'{text: $text, tooltip: $tooltip, class: $class}'
fi
# Threshold > 80 → no output → Waybar hides module