86 lines
3.2 KiB
Bash
86 lines
3.2 KiB
Bash
#!/usr/bin/env bash
|
|||
|
|
# ---------------------------------------------------------------------------
|
||
|
|
# Launch one polybar instance per connected monitor.
|
||
|
|
# Hardware-specific values are detected here and passed to polybar as
|
||
|
|
# environment variables, so config.ini stays machine-independent.
|
||
|
|
# ---------------------------------------------------------------------------
|
||
|
|
set -uo pipefail
|
||
|
|
|
||
|
|
CONFIG="$HOME/.config/polybar/config.ini"
|
||
|
|
LOG="${XDG_CACHE_HOME:-$HOME/.cache}/polybar.log"
|
||
|
|
|
||
|
|
mkdir -p "$(dirname "$LOG")"
|
||
|
|
|
||
|
|
# --- stop any running instances and wait for them to die -------------------
|
||
|
|
pkill -x polybar >/dev/null 2>&1 || true
|
||
|
|
for _ in {1..20}; do
|
||
|
|
pgrep -x polybar >/dev/null || break
|
||
|
|
sleep 0.1
|
||
|
|
done
|
||
|
|
# Anything still alive gets the hammer.
|
||
|
|
pgrep -x polybar >/dev/null && pkill -9 -x polybar
|
||
|
|
|
||
|
|
# --- hardware detection ----------------------------------------------------
|
||
|
|
# Battery + AC adapter
|
||
|
|
BATTERY="$(ls -1 /sys/class/power_supply 2>/dev/null | grep -m1 '^BAT' || true)"
|
||
|
|
ADAPTER="$(ls -1 /sys/class/power_supply 2>/dev/null | grep -m1 -E '^(AC|ADP|ACAD)' || true)"
|
||
|
|
export BATTERY="${BATTERY:-BAT0}"
|
||
|
|
export ADAPTER="${ADAPTER:-AC}"
|
||
|
|
|
||
|
|
# Backlight device (intel_backlight, amdgpu_bl0, nvidia_0, …)
|
||
|
|
BACKLIGHT="$(ls -1 /sys/class/backlight 2>/dev/null | head -n1 || true)"
|
||
|
|
export BACKLIGHT="${BACKLIGHT:-intel_backlight}"
|
||
|
|
|
||
|
|
# Network interfaces: wireless ones have a /sys/class/net/*/wireless dir
|
||
|
|
WLAN_IFACE=""
|
||
|
|
ETH_IFACE=""
|
||
|
|
for iface in /sys/class/net/*; do
|
||
|
|
name="$(basename "$iface")"
|
||
|
|
[[ "$name" == "lo" ]] && continue
|
||
|
|
if [[ -d "$iface/wireless" ]]; then
|
||
|
|
[[ -z "$WLAN_IFACE" ]] && WLAN_IFACE="$name"
|
||
|
|
else
|
||
|
|
[[ -z "$ETH_IFACE" ]] && ETH_IFACE="$name"
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
export WLAN_IFACE ETH_IFACE
|
||
|
|
|
||
|
|
# --- module pruning --------------------------------------------------------
|
||
|
|
# Desktops have no battery/backlight; leaving those modules enabled makes
|
||
|
|
# polybar spam the log, so build the right-hand module list dynamically.
|
||
|
|
MODULES_RIGHT="filesystem memory cpu temperature"
|
||
|
|
[[ -d "/sys/class/backlight/$BACKLIGHT" ]] && MODULES_RIGHT+=" backlight"
|
||
|
|
MODULES_RIGHT+=" pulseaudio"
|
||
|
|
[[ -n "$WLAN_IFACE" ]] && MODULES_RIGHT+=" wlan"
|
||
|
|
[[ -n "$ETH_IFACE" ]] && MODULES_RIGHT+=" eth"
|
||
|
|
[[ -d "/sys/class/power_supply/$BATTERY" ]] && MODULES_RIGHT+=" battery"
|
||
|
|
MODULES_RIGHT+=" systray"
|
||
|
|
export MODULES_RIGHT
|
||
|
|
|
||
|
|
# --- launch ----------------------------------------------------------------
|
||
|
|
{
|
||
|
|
echo
|
||
|
|
echo "=== polybar launch $(date -Is) ==="
|
||
|
|
echo "battery=$BATTERY adapter=$ADAPTER backlight=$BACKLIGHT wlan=${WLAN_IFACE:-none} eth=${ETH_IFACE:-none}"
|
||
|
|
echo "modules-right=$MODULES_RIGHT"
|
||
|
|
} >>"$LOG"
|
||
|
|
|
||
|
|
if command -v polybar >/dev/null && polybar --list-monitors >/dev/null 2>&1; then
|
||
|
|
# The tray can only live on one bar; give it to the primary monitor.
|
||
|
|
primary="$(polybar --list-monitors | grep -m1 '(primary)' | cut -d: -f1)"
|
||
|
|
while IFS= read -r line; do
|
||
|
|
m="${line%%:*}"
|
||
|
|
[[ -z "$m" ]] && continue
|
||
|
|
if [[ -n "$primary" && "$m" != "$primary" ]]; then
|
||
|
|
MONITOR="$m" MODULES_RIGHT="${MODULES_RIGHT/ systray/}" \
|
||
|
|
polybar --reload main --config="$CONFIG" >>"$LOG" 2>&1 &
|
||
|
|
else
|
||
|
|
MONITOR="$m" polybar --reload main --config="$CONFIG" >>"$LOG" 2>&1 &
|
||
|
|
fi
|
||
|
|
done < <(polybar --list-monitors)
|
||
|
|
else
|
||
|
|
polybar --reload main --config="$CONFIG" >>"$LOG" 2>&1 &
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo "polybar launched" >>"$LOG"
|