diff --git a/bin/omakub-theme-set b/bin/omakub-theme-set index acdc35776..24531a1e3 100755 --- a/bin/omakub-theme-set +++ b/bin/omakub-theme-set @@ -62,6 +62,7 @@ omakub-theme-set-gnome omakub-theme-set-gnome-extensions omakub-theme-set-vscode omakub-theme-set-obsidian +omakub-theme-set-browser # Call hook on theme set -omakub-hook theme-set "$THEME_NAME" >/dev/null \ No newline at end of file +omakub-hook theme-set "$THEME_NAME" >/dev/null diff --git a/bin/omakub-theme-set-browser b/bin/omakub-theme-set-browser new file mode 100755 index 000000000..85dc8b36c --- /dev/null +++ b/bin/omakub-theme-set-browser @@ -0,0 +1,120 @@ +#!/bin/bash + +# omakub:summary=Sync Omabuntu theme color to Chromium and Brave. +# omakub:hidden=true + +# No managed policies. Running browsers must relaunch; closed browsers get a +# prefs patch or a headless profile seed. Fixes #60. + +THEME_FILE="$HOME/.config/omakub/current/theme/chromium.theme" +RGB="28,32,39" +[[ -f $THEME_FILE ]] && RGB=$(tr -d '[:space:]' <"$THEME_FILE") +[[ $RGB =~ ^[0-9]+,[0-9]+,[0-9]+$ ]] || exit 0 + +patch_prefs() { + local prefs=$1 + [[ -f $prefs ]] || return 0 + python3 - "$prefs" "$RGB" <<'PY' +import ctypes, json, sys +path, rgb = sys.argv[1], sys.argv[2] +r, g, b = map(int, rgb.split(",")) +sk = ctypes.c_int32((0xFF << 24) | (r << 16) | (g << 8) | b).value +with open(path, encoding="utf-8") as f: + d = json.load(f) +d.setdefault("autogenerated", {})["theme"] = {"color": sk} +ext = d.setdefault("extensions", {}).setdefault("theme", {}) +ext["id"] = "autogenerated_theme_id" +ext["system_theme"] = 0 +ext.pop("use_system", None) +bt = d.setdefault("browser", {}).setdefault("theme", {}) +bt["user_color"] = sk +bt["color_scheme"] = bt.get("color_scheme", 2) +with open(path, "w", encoding="utf-8") as f: + json.dump(d, f, separators=(",", ":")) +PY +} + +patch_brave_local_state() { + local ls="$HOME/.config/BraveSoftware/Brave-Browser/Local State" + [[ -f $ls ]] || return 0 + python3 - "$ls" "$RGB" <<'PY' +import ctypes, json, sys +path, rgb = sys.argv[1], sys.argv[2] +r, g, b = map(int, rgb.split(",")) +sk = ctypes.c_int32((0xFF << 24) | (r << 16) | (g << 8) | b).value +with open(path, encoding="utf-8") as f: + d = json.load(f) +changed = False +for info in d.get("profile", {}).get("info_cache", {}).values(): + if not isinstance(info, dict): + continue + for key in ("default_avatar_fill_color", "profile_highlight_color"): + if key in info and info[key] != sk: + info[key] = sk + changed = True +if changed: + with open(path, "w", encoding="utf-8") as f: + json.dump(d, f, separators=(",", ":")) +PY +} + +quit_browser() { + local proc=$1 + pgrep -x "$proc" >/dev/null 2>&1 || return 0 + pkill -TERM -x "$proc" 2>/dev/null || true + local i + for i in $(seq 1 50); do + pgrep -x "$proc" >/dev/null 2>&1 || return 0 + sleep 0.1 + done + pkill -KILL -x "$proc" 2>/dev/null || true + sleep 0.2 +} + +seed_profile() { + local proc=$1 seed_cmd=$2 prefs=$3 + pgrep -x "$proc" >/dev/null 2>&1 && return 0 + nohup "$seed_cmd" --no-startup-window --install-autogenerated-theme="$RGB" >/dev/null 2>&1 & + disown || true + local i + for i in $(seq 1 150); do + if [[ -f $prefs ]]; then + patch_prefs "$prefs" + quit_browser "$proc" + return 0 + fi + sleep 0.2 + done + quit_browser "$proc" +} + +theme_one() { + local proc=$1 cmd=$2 seed_cmd=$3 prefs=$4 local_state=${5:-0} + omakub-cmd-present "$cmd" || return 0 + + if pgrep -x "$proc" >/dev/null 2>&1; then + quit_browser "$proc" + patch_prefs "$prefs" + [[ $local_state == 1 ]] && patch_brave_local_state + nohup "$cmd" --install-autogenerated-theme="$RGB" >/dev/null 2>&1 & + disown || true + elif [[ -f $prefs ]]; then + patch_prefs "$prefs" + [[ $local_state == 1 ]] && patch_brave_local_state + else + seed_profile "$proc" "$seed_cmd" "$prefs" + [[ $local_state == 1 ]] && patch_brave_local_state + fi +} + +theme_one chromium chromium chromium "$HOME/.config/chromium/Default/Preferences" 0 + +brave_cmd= +omakub-cmd-present brave-browser-stable && brave_cmd=brave-browser-stable +[[ -z $brave_cmd ]] && omakub-cmd-present brave-browser && brave_cmd=brave-browser + +if [[ -n $brave_cmd ]]; then + brave_seed=$brave_cmd + [[ -x /opt/brave.com/brave/brave ]] && brave_seed=/opt/brave.com/brave/brave + theme_one brave "$brave_cmd" "$brave_seed" "$HOME/.config/BraveSoftware/Brave-Browser/Default/Preferences" 1 +fi