Dotfiles/desktopenvs/hyprlua/scripts/regen-audio-panel.sh

122 lines
4.6 KiB
Bash
Executable File

#!/usr/bin/env bash
# Regenerates hyprlua's audio-panel from hyprdrive's supersonic-booster — the
# same PipeWire mixer panel (Applications / Output Devices / Input Devices /
# General Settings tabs), plain-themed instead of hologram-styled.
#
# Run BY HAND whenever hyprdrive's supersonic-booster changes and you want
# those changes reflected here. Never wired into sysupdate.sh. Modeled
# directly on regen-beacon.sh — see that script for the full rationale; the
# short version:
#
# 1. rm -rf + cp -r the hyprdrive source tree in fresh (not an incremental
# patch), dropping style/ and any __pycache__.
# 2. Copies in the hand-maintained plain stylesheet from
# desktopenvs/hyprlua/audio-panel-theme/ (never written to by this
# script — edit that by hand for a different plain look).
# 3. Flips the copied config.py's hologram default to False (the real
# hyprdrive supersonic-booster defaults to True and is never touched by
# this script).
# 4. Runs one ordered rename table over every file's content AND over
# filenames: supersonic-booster -> audio-panel, plus the CamelCase
# class-name and UI-label variants actually present in the source
# (checked empirically, not guessed — see the grep in the commit that
# introduced this script). Also rewrites the literal "hyprdrive" ->
# "hyprlua" (docstrings, and critically anything that still points at
# desktopenvs/hyprdrive/scripts/ after the rename).
#
# The rename table intentionally does NOT touch the `.sb-*` CSS class names
# supersonic-booster/audio-panel use — that prefix doesn't contain
# "supersonic-booster"/"supersonicbooster" as a substring, so the audio-panel
# plain stylesheet targets them unchanged.
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
HL="$(cd "$SCRIPT_DIR/.." && pwd)"
HD="$(cd "$HL/../hyprdrive" && pwd)"
# -- the rename table ---------------------------------------------------------
# Order matters: longest/most-specific compounds first, so e.g.
# "SupersonicBoosterApp" resolves via its own rule before the bare
# "supersonic-booster" rule would otherwise mangle it mid-word.
rename_stream() {
sed \
-e 's/SupersonicBoosterApp/AudioPanelApp/g' \
-e 's/SupersonicWindow/AudioPanelWindow/g' \
-e 's/Supersonic Booster/Audio Panel/g' \
-e 's/supersonic-window/audio-panel-window/g' \
-e 's/supersonicbooster/audiopanel/g' \
-e 's/supersonic-booster/audio-panel/g' \
-e 's/hyprdrive/hyprlua/g'
}
rename_file_in_place() {
local f="$1" tmp
tmp="$(mktemp)"
rename_stream < "$f" > "$tmp"
mv "$tmp" "$f"
}
rename_tree_contents() {
local dir="$1" f
while IFS= read -r -d '' f; do
rename_file_in_place "$f"
done < <(find "$dir" -type f -print0)
}
flip_default() {
# Flip `"<key>": True` -> `"<key>": False` in a copied config.py's
# _DEFAULTS dict. No-op (silently) if the key isn't present.
local config_py="$1" key="$2"
sed -i "s/\"${key}\": *True/\"${key}\": False/" "$config_py"
}
# -- per-component regeneration ------------------------------------------------
regen_component() {
local src="$1" dst="$2" theme_dir="$3"
shift 3
local flip_keys=("$@")
rm -rf "$dst"
cp -r "$src" "$dst"
rm -rf "$dst/style" "$dst/__pycache__" "$dst/lib/__pycache__" "$dst/backend/__pycache__" "$dst/ui/__pycache__"
mkdir -p "$dst/style"
cp "$theme_dir/_colors.css" "$theme_dir/style.css" "$dst/style/"
local key
for key in "${flip_keys[@]}"; do
flip_default "$dst/config.py" "$key"
done
rename_tree_contents "$dst"
# rename any files/dirs whose *name* itself needs the substitution
# (deepest paths first, so renaming a parent dir doesn't orphan a path
# to a file inside it that find already queued)
local p renamed
while IFS= read -r -d '' p; do
renamed="$(dirname "$p")/$(basename "$p" | rename_stream)"
if [[ "$p" != "$renamed" ]]; then
mv "$p" "$renamed"
fi
done < <(find "$dst" -depth -print0)
return 0
}
regen_component "$HD/supersonic-booster" "$HL/audio-panel" "$HL/audio-panel-theme" hologram
# -- launcher / toggle scripts -------------------------------------------------
regen_script() {
local src="$1" dst
dst="$SCRIPT_DIR/$(basename "$src" | rename_stream)"
rename_stream < "$src" > "$dst"
chmod +x "$dst"
}
regen_script "$HD/scripts/supersonic-booster-start.sh"
regen_script "$HD/scripts/supersonic-booster.sh"
echo "Regenerated:"
echo " $HL/audio-panel/"
echo " $SCRIPT_DIR/audio-panel-start.sh, audio-panel.sh"