Files
arch-i3/dotfiles/config/polybar/launch.sh
T
2026-09-14 15:31:20 -05:00

86 lines
3.2 KiB
Bash
Executable File

#!/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"