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