aboutsummaryrefslogtreecommitdiffstats
path: root/install.sh
diff options
context:
space:
mode:
Diffstat (limited to 'install.sh')
-rwxr-xr-xinstall.sh130
1 files changed, 130 insertions, 0 deletions
diff --git a/install.sh b/install.sh
new file mode 100755
index 0000000..2561bcc
--- /dev/null
+++ b/install.sh
@@ -0,0 +1,130 @@
+#!/bin/bash
+# Install waybar-theme-udt by symlink, so the repo stays canonical.
+# Copyright (C) 2026 Danilo M. <danix@danix.xyz>
+# Licensed under the GNU General Public License v2 only.
+#
+# This installs a SECOND bar, at ~/.config/waybar-udt/. The existing bar at
+# ~/.config/waybar/ is left alone, so DP-1 keeps working while this one is
+# tried on DP-3. Nothing is started: the command to run it is printed at the
+# end.
+set -euo pipefail
+
+repo="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+target="$HOME/.config/waybar-udt"
+udt="$(cd "$repo/../unified-desktop-theme" 2>/dev/null && pwd || true)"
+icons="$HOME/.local/share/icons/Material-Black-Plum-Suru"
+
+mkdir -p "$target/modules/hyprland" "$target/modules/custom" \
+ "$target/modules/extras" "$target/modules/image" \
+ "$target/styles" "$HOME/bin"
+
+# ---------------------------------------------------------------- colours --
+# The palette is udt's, not this repo's. Generating it needs the sibling
+# checkout, so a missing one is a clear failure rather than a bar with no
+# colours: every stylesheet below names @main-bg and friends.
+if [ -z "$udt" ]; then
+ echo "error: unified-desktop-theme not found next to this repo" >&2
+ echo " expected at $repo/../unified-desktop-theme" >&2
+ exit 1
+fi
+"$udt/bin/udt-palette"
+install -Dm644 "$udt/templates/waybar/theme.css" "$target/styles/theme.css"
+
+# The dot scripts are bash, not CSS, so they cannot read @define-color. Write
+# the handful of colours they need as a shell fragment they source.
+#
+# The values are read back out of the stylesheet udt-palette just generated,
+# because that is the only place they exist in a form this script can see:
+# udt-palette renders files, it does not answer queries about single roles.
+#
+# Pango wants a colour it can parse, and the generated file mixes #rrggbb with
+# rgb()/rgba() spellings, so each is normalised to hex on the way out.
+scheme="$(sed -n 's/^scheme *= *//p' "$HOME/.config/udt/roles.conf")"
+
+css_color() {
+ # Last definition wins, matching how GTK resolves a redefined colour.
+ sed -n "s/^@define-color $1 *\(.*\);\$/\1/p" "$target/styles/theme.css" | tail -1
+}
+
+to_hex() {
+ python3 -c '
+import re, sys
+v = sys.argv[1].strip()
+m = re.match(r"rgba?\(([^)]*)\)", v)
+if m:
+ p = [x.strip() for x in m.group(1).split(",")]
+ print("#%02x%02x%02x" % tuple(int(float(c)) for c in p[:3]))
+else:
+ print(v)
+' "$2"
+}
+
+{
+ echo "# Generated by waybar-theme-udt/install.sh from the $scheme scheme."
+ echo "# Sourced by vms_dots.sh and privacy_dots.sh. Do not edit."
+ # The generated stylesheet carries no success/info roles, so the dots use
+ # the palette names it does define. green/teal/mauve are role-resolved by
+ # udt-palette, so they still follow the scheme.
+ for pair in "SUCCESS:green" "WARNING:warning" "CRITICAL:critical" \
+ "INFO:teal" "ACCENT:mauve" "FAINT:overlay0"; do
+ var="${pair%%:*}"
+ raw="$(css_color "${pair##*:}")"
+ [ -n "$raw" ] && printf 'DOT_%s="%s"\n' "$var" "$(to_hex "$var" "$raw")"
+ done
+} > "$target/dots.colors"
+
+# ------------------------------------------------------------------ files --
+# Config and modules are symlinked: this repo owns them outright, so linking
+# means the installed bar cannot drift from what is committed.
+ln -sfn "$repo/config.jsonc" "$target/config.jsonc"
+for f in modules/clock.jsonc \
+ modules/hyprland/workspaces.jsonc \
+ modules/custom/launcher.jsonc modules/custom/vmdot.jsonc \
+ modules/custom/privacy_dots.jsonc \
+ modules/extras/taskbar.jsonc modules/extras/tray.jsonc \
+ modules/image/volume.jsonc modules/image/idle_inhibitor.jsonc \
+ modules/image/language.jsonc; do
+ ln -sfn "$repo/$f" "$target/$f"
+done
+
+for f in style.css fonts.css global.css pills.css; do
+ ln -sfn "$repo/styles/$f" "$target/styles/$f"
+done
+
+# modules.css is generated rather than linked: it carries the icon theme's
+# absolute path, which cannot be committed, and the accent-tinted launcher.
+sed -e "s|@ICONS@|$icons|g" -e "s|@CONFIG@|$target|g" \
+ "$repo/styles/modules.css" > "$target/styles/modules.css"
+
+# The flags ship as they are; the Slackware mark is monochrome, so it takes
+# the accent. Read from the generated palette rather than restated here.
+accent="$(sed -n 's/^@define-color accent *\(.*\);$/\1/p' "$target/styles/theme.css" | head -1)"
+accent="${accent:-#b7bdf8}"
+sed "s|@ACCENT@|$accent|" "$repo/icons/slackware.svg" > "$target/slackware.svg"
+install -Dm644 "$repo/icons/flag-it.svg" "$target/flag-it.svg"
+install -Dm644 "$repo/icons/flag-gb.svg" "$target/flag-gb.svg"
+
+# ---------------------------------------------------------------- scripts --
+# The two dot scripts used to live only in ~/bin, in no repository at all.
+# They are this repo's now, and ~/bin gets links. Any real file found there is
+# kept: it is the only copy of whatever was running before.
+for s in vms_dots.sh privacy_dots.sh; do
+ if [ -f "$HOME/bin/$s" ] && [ ! -L "$HOME/bin/$s" ]; then
+ mv "$HOME/bin/$s" "$HOME/bin/$s.pre-udt"
+ echo "kept your $s as ~/bin/$s.pre-udt"
+ fi
+ ln -sfn "$repo/bin/$s" "$HOME/bin/$s"
+done
+ln -sfn "$repo/bin/wb-icon" "$HOME/bin/wb-icon"
+ln -sfn "$repo/bin/wb-idle" "$HOME/bin/wb-idle"
+ln -sfn "$repo/bin/wb-lang" "$HOME/bin/wb-lang"
+
+# ----------------------------------------------------------------- checks --
+# A missing icon renders as an empty pill and nothing says why, so the names
+# are checked here, while someone is watching.
+"$repo/bin/wb-icon" --selftest
+
+echo
+echo "installed to $target"
+echo "run it with: waybar -c $target/config.jsonc -s $target/styles/style.css"
+echo "your existing bar on DP-1 is untouched."