Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion bin/omakub-theme-set
Original file line number Diff line number Diff line change
Expand Up @@ -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
omakub-hook theme-set "$THEME_NAME" >/dev/null
120 changes: 120 additions & 0 deletions bin/omakub-theme-set-browser
Original file line number Diff line number Diff line change
@@ -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