Files
operation-bin/install_terminal_profiles
lemke_h 15e603c743
Autodeploy / autodeploy (push) Successful in 10s
fixes
2026-08-21 16:19:21 +02:00

107 lines
3.9 KiB
Python
Executable File

#!/usr/bin/env python3
"""Install missing GNOME Terminal color profiles -- Solarized Dark,
Solarized Light, Spacedust -- plus a "1-Spacedust" duplicate that sorts to
the top of the profile list/menu (GNOME Terminal sorts profiles by
visible-name, not list order) -- via dconf, and set Spacedust as the
default profile.
Color values from Gogh (https://github.com/Gogh-Co/Gogh, data/themes.json).
Not using bin/gogh itself for this: its BASE_URL points at the old
Mayccoll/Gogh repo, which now 301-redirects to Gogh-Co/Gogh with a
completely different data layout (JSON-based, no more per-theme shell
scripts to download) -- so bin/gogh's download step is broken upstream.
Idempotent: skips any profile whose visible-name already exists, safe to
run every login.
"""
import ast
import subprocess
import uuid as uuidlib
PROFILES = "/org/gnome/terminal/legacy/profiles:"
THEMES = {
"Solarized Dark": {
"background": "#002B36", "foreground": "#839496", "cursor": "#839496",
"palette": ["#073642", "#DC322F", "#859900", "#CF9A6B", "#268BD2", "#D33682",
"#2AA198", "#EEE8D5", "#657B83", "#CB4B16", "#859900", "#CF9A6B",
"#6c71c4", "#D33682", "#2AA198", "#FDF6E3"],
},
"Solarized Light": {
"background": "#FDF6E3", "foreground": "#657B83", "cursor": "#657B83",
"palette": ["#EEE8D5", "#DC322F", "#859900", "#B58900", "#268BD2", "#D33682",
"#2AA198", "#002B36", "#657b83", "#CB4B16", "#859900", "#B58900",
"#6C71C4", "#D33682", "#2AA198", "#073642"],
},
"Spacedust": {
"background": "#0A1E24", "foreground": "#ECF0C1", "cursor": "#ECF0C1",
"palette": ["#6E5346", "#E35B00", "#5CAB96", "#E3CD7B", "#0F548B", "#E35B00",
"#06AFC7", "#F0F1CE", "#684C31", "#FF8A3A", "#AECAB8", "#FFC878",
"#67A0CE", "#FF8A3A", "#83A7B4", "#FEFFF1"],
},
}
THEMES["1-Spacedust"] = THEMES["Spacedust"]
def dconf_read(path):
return subprocess.run(
["dconf", "read", path], capture_output=True, text=True
).stdout.strip()
def dconf_write(path, value):
subprocess.run(["dconf", "write", path, value], check=True)
def existing_profiles():
"""{visible_name: uuid} for every profile currently in the list."""
raw = dconf_read(f"{PROFILES}/list")
uuids = ast.literal_eval(raw) if raw else []
result = {}
for u in uuids:
name = dconf_read(f"{PROFILES}/:{u}/visible-name")
if name:
result[ast.literal_eval(name)] = u
return result
def add_to_list(new_uuid):
raw = dconf_read(f"{PROFILES}/list")
uuids = ast.literal_eval(raw) if raw else []
uuids.append(new_uuid)
dconf_write(f"{PROFILES}/list", repr(uuids))
def create_profile(name, colors):
new_uuid = str(uuidlib.uuid4())
add_to_list(new_uuid)
base = f"{PROFILES}/:{new_uuid}"
dconf_write(f"{base}/visible-name", repr(name))
dconf_write(f"{base}/use-theme-colors", "false")
dconf_write(f"{base}/background-color", repr(colors["background"]))
dconf_write(f"{base}/foreground-color", repr(colors["foreground"]))
dconf_write(f"{base}/cursor-colors-set", "true")
dconf_write(f"{base}/cursor-background-color", repr(colors["cursor"]))
dconf_write(f"{base}/cursor-foreground-color", repr(colors["background"]))
dconf_write(f"{base}/palette", repr(colors["palette"]))
return new_uuid
def main():
current = existing_profiles()
for name, colors in THEMES.items():
if name in current:
print(f"install_terminal_profiles: '{name}' already exists, skipping")
continue
new_uuid = create_profile(name, colors)
print(f"install_terminal_profiles: created '{name}' ({new_uuid})")
current[name] = new_uuid
default_uuid = current["Spacedust"]
dconf_write(f"{PROFILES}/default", repr(default_uuid))
print(f"install_terminal_profiles: default profile set to Spacedust ({default_uuid})")
if __name__ == "__main__":
main()