#!/bin/bash # ABOUTME: Wrapper that merges system waybar config with per-machine userconfig. # ABOUTME: Handles array prepend/append that waybar's native include cannot do. SYSTEM_CONFIG="/etc/xdg/waybar/config" SYSTEM_STYLE="/etc/xdg/waybar/style.css" USER_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/waybar" USERCONFIG="$USER_DIR/userconfig" OUTPUT="$USER_DIR/config" USER_STYLE="$USER_DIR/style.css" merge_config() { mkdir -p "$USER_DIR" if ! jq -s ' .[0] as $sys | .[1] as $user | (($user.prepend // {}) | to_entries) as $prepends | (($user.append // {}) | to_entries) as $appends | $sys | reduce $prepends[] as $p (.; .[$p.key] = ($p.value + (.[$p.key] // [])) ) | reduce $appends[] as $a (.; .[$a.key] = ((.[$a.key] // []) + $a.value) ) | ($user | del(.prepend) | del(.append)) as $extras | . * $extras ' "$SYSTEM_CONFIG" "$USERCONFIG" > "${OUTPUT}.tmp" 2>&1; then local err err=$(cat "${OUTPUT}.tmp") rm -f "${OUTPUT}.tmp" logger -t moonarch-waybar "Config merge failed: $err" notify-send -u critical "moonarch-waybar" "Config merge failed — using system config.\n$err" return 1 fi mv "${OUTPUT}.tmp" "$OUTPUT" } bootstrap_style() { if [[ ! -f "$USER_STYLE" ]]; then mkdir -p "$USER_DIR" cat > "$USER_STYLE" << 'CSS' /* Generated by moonarch-waybar — add custom styles below */ @import url("/etc/xdg/waybar/style.css"); CSS fi } if [[ -f "$USERCONFIG" ]]; then if [[ ! -f "$OUTPUT" ]] || [[ "$USERCONFIG" -nt "$OUTPUT" ]] || [[ "$SYSTEM_CONFIG" -nt "$OUTPUT" ]]; then # On merge failure the previous $OUTPUT is stale — remove it so waybar # falls back to XDG's system config instead of running with stale merged data. merge_config || rm -f "$OUTPUT" fi bootstrap_style fi exec waybar "$@"