diff --git a/config/waybar/config.jsonc b/config/waybar/config.jsonc index e99cf24..34cae51 100644 --- a/config/waybar/config.jsonc +++ b/config/waybar/config.jsonc @@ -5,7 +5,7 @@ "spacing": 6, "modules-left": ["sway/workspaces", "sway/mode"], "modules-center": ["clock"], - "modules-right": ["cpu", "memory", "custom/network", "pulseaudio", "backlight", "battery", "tray", "custom/power"], + "modules-right": ["cpu", "memory", "custom/network", "pulseaudio", "backlight", "custom/battery", "tray", "custom/power"], "sway/workspaces": { "disable-scroll": false, "all-outputs": false, @@ -17,7 +17,7 @@ "custom/network": { "exec": "~/.config/waybar/scripts/network-cycle.sh", "return-type": "json", "interval": 300, "signal": 8, "on-click": "~/.config/waybar/scripts/network-cycle.sh next", "on-click-right": "~/.config/waybar/scripts/network-cycle.sh copy" }, "pulseaudio": { "format": "{icon} {volume}%", "format-muted": "󰝟 muted", "format-icons": ["󰕿", "󰖀", "󰕾"], "tooltip-format": "{desc}", "on-click": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle", "on-click-right": "~/.config/waybar/scripts/audio-output-cycle.sh" }, "backlight": { "format": "󰃠 {percent}%" }, - "battery": { "states": { "warning": 30, "critical": 15 }, "format": "{icon} {capacity}%", "format-charging": "󰂄 {capacity}%", "format-icons": ["󰁺", "󰁼", "󰁾", "󰂀", "󰁹"] }, + "custom/battery": { "exec": "~/.config/waybar/scripts/battery-power.sh", "return-type": "json", "interval": 10, "tooltip": true }, "tray": { "spacing": 8 }, "custom/power": { "format": "󰐥", diff --git a/config/waybar/scripts/battery-power.sh b/config/waybar/scripts/battery-power.sh new file mode 100755 index 0000000..f0c5e35 --- /dev/null +++ b/config/waybar/scripts/battery-power.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +set -Eeuo pipefail + +bat_dir="/sys/class/power_supply/BAT0" +capacity=$(<"$bat_dir/capacity") +status=$(<"$bat_dir/status") + +power=$(sensors -j 2>/dev/null | python3 -c ' +import json, sys +data = json.load(sys.stdin) +for chip, fields in data.items(): + if not chip.startswith("BAT"): + continue + power1 = fields.get("power1") + if power1: + print(round(next(iter(power1.values())), 1)) + break +') + +text="${capacity}%" +[[ -n "$power" ]] && text+=" (${power}W)" + +icons=("󰁺" "󰁼" "󰁾" "󰂀" "󰁹") +if [[ "$status" == "Charging" ]]; then + icon="󰂄" +else + idx=$((capacity * ${#icons[@]} / 101)) + icon="${icons[$idx]}" +fi + +class="normal" +if [[ "$status" != "Charging" ]]; then + if ((capacity <= 15)); then + class="critical" + elif ((capacity <= 30)); then + class="warning" + fi +fi + +printf '{"text": "%s %s", "class": "%s", "tooltip": "%s, %s"}\n' \ + "$icon" "$text" "$class" "$status" "${power:+${power}W}" diff --git a/config/waybar/style.css b/config/waybar/style.css index 272dceb..ba8d3e9 100644 --- a/config/waybar/style.css +++ b/config/waybar/style.css @@ -12,9 +12,9 @@ window#waybar { background: @bg; color: @text; } #workspaces button.focused { color: @bg; background: @blue; } #workspaces button.focused:hover { background: @blue; color: @bg; } #workspaces button.urgent { background: @blue-dark; color: @text; } -#mode, #clock, #cpu, #memory, #custom-network, #pulseaudio, #backlight, #battery, #tray, #custom-power { padding: 0 10px; margin: 4px 2px; background: transparent; border-radius: 6px; } -#mode:hover, #clock:hover, #cpu:hover, #memory:hover, #custom-network:hover, #pulseaudio:hover, #backlight:hover, #battery:hover, #tray:hover, #custom-power:hover { background: @surface; } +#mode, #clock, #cpu, #memory, #custom-network, #pulseaudio, #backlight, #custom-battery, #tray, #custom-power { padding: 0 10px; margin: 4px 2px; background: transparent; border-radius: 6px; } +#mode:hover, #clock:hover, #cpu:hover, #memory:hover, #custom-network:hover, #pulseaudio:hover, #backlight:hover, #custom-battery:hover, #tray:hover, #custom-power:hover { background: @surface; } #clock { color: @blue; font-weight: bold; background: transparent; } #cpu, #memory { color: @text; } #custom-power { color: @blue; font-size: 16px; } -#battery.warning, #battery.critical { color: @blue; } +#custom-battery.warning, #custom-battery.critical { color: @blue; }