style: refactor the whole build script

This commit is contained in:
nullishamy
2024-05-18 21:30:42 +01:00
parent c935fdec51
commit 41858b3d68

600
build.py
View File

@@ -1,92 +1,110 @@
#! /usr/bin/env python3 #! /usr/bin/env python3
import os import os, re, shutil, subprocess, argparse, glob, logging
import re
import shutil from dataclasses import dataclass
import subprocess from typing import Literal, List
import argparse
import glob
import logging
from catppuccin import PALETTE from catppuccin import PALETTE
from catppuccin.models import Flavor from catppuccin.models import Flavor, Color
THIS_DIR = os.path.dirname(os.path.realpath(__file__)) THIS_DIR = os.path.dirname(os.path.realpath(__file__))
SRC_DIR = f"{THIS_DIR}/colloid/src" SRC_DIR = f"{THIS_DIR}/colloid/src"
SASSC_OPT = ["-M", "-t", "expanded"] SASSC_OPT = ["-M", "-t", "expanded"]
logger = logging.getLogger('catppuccin-gtk') logger = logging.getLogger("catppuccin-gtk")
logger.setLevel(logging.DEBUG) logger.setLevel(logging.DEBUG)
ch = logging.StreamHandler() ch = logging.StreamHandler()
formatter = logging.Formatter('[%(name)s] [%(levelname)s] - %(message)s') formatter = logging.Formatter("[%(name)s] [%(levelname)s] - %(message)s")
ch.setFormatter(formatter) ch.setFormatter(formatter)
logger.addHandler(ch) logger.addHandler(ch)
def make_theme_dir(dest, name, flavor, accent, size):
return f"{dest}/{name}-{flavor}-{accent}-{size}"
def install(dest, name, flavor, accent, size, window): @dataclass
class Tweaks:
tweaks: List[str]
def has(self, tweak: str) -> bool:
return tweak in self.tweaks
def id(self) -> str:
return ','.join(self.tweaks)
@dataclass
class BuildContext:
build_root: str
theme_name: str
flavor: Flavor
accent: Color
size: Literal["standard"] | Literal["compact"]
tweaks: Tweaks
def output_dir(self) -> str:
return f"{self.build_root}/{self.theme_name}-{self.flavor.identifier}-{self.accent.identifier}-{self.size}+{self.tweaks.id()}"
def build_id(self) -> str:
return f"{self.theme_name}-{self.flavor.identifier}-{self.accent.identifier}-{self.size}"
def build(ctx: BuildContext):
dark_suffix = "" dark_suffix = ""
light_suffix = "" light_suffix = ""
window_suffix = "" window_suffix = ""
scheme_suffix = "-Catppuccin" scheme_suffix = "-Catppuccin"
if window == "normal": if ctx.tweaks.has("normal"):
window_suffix = "-Normal" window_suffix = "-Normal"
if flavor == "latte": if ctx.flavor == "latte":
light_suffix = "-Light" light_suffix = "-Light"
suffix = "-Light" suffix = "-Light"
if flavor != "": if ctx.flavor != "":
dark_suffix = "-Dark" dark_suffix = "-Dark"
suffix = "-Dark" suffix = "-Dark"
theme_dir = make_theme_dir(dest, name, flavor, accent, size) output_dir = ctx.output_dir()
# [[ -d "${THEME_DIR}" ]] && rm -rf "${THEME_DIR}" # [[ -d "${THEME_DIR}" ]] && rm -rf "${THEME_DIR}"
logger.info(f"Building into '{theme_dir}'...") logger.info(f"Building into '{output_dir}'...")
theme_tweaks() apply_tweaks(ctx)
os.makedirs(theme_dir, exist_ok=True) os.makedirs(output_dir, exist_ok=True)
with open(f"{output_dir}/index.theme", "w") as file:
with open(f"{theme_dir}/index.theme", "w") as file:
file.write("[Desktop Entry]\n") file.write("[Desktop Entry]\n")
file.write("Type=X-GNOME-Metatheme\n") file.write("Type=X-GNOME-Metatheme\n")
file.write(f"Name={name}-{flavor}-{accent}-{size}\n") file.write(f"Name={ctx.build_id()}\n")
file.write("Comment=An Flat Gtk+ theme based on Elegant Design\n") file.write("Comment=An Flat Gtk+ theme based on Elegant Design\n")
file.write("Encoding=UTF-8\n") file.write("Encoding=UTF-8\n")
file.write("\n") file.write("\n")
file.write("[X-GNOME-Metatheme]\n") file.write("[X-GNOME-Metatheme]\n")
file.write(f"GtkTheme={name}-{flavor}-{accent}-{size}\n") file.write(f"GtkTheme={ctx.build_id()}\n")
file.write(f"MetacityTheme={name}-{flavor}-{accent}-{size}\n") file.write(f"MetacityTheme={ctx.build_id()}\n")
file.write(f"IconTheme=Tela-circle{dark_suffix}\n") file.write(f"IconTheme=Tela-circle{dark_suffix}\n")
file.write(f"CursorTheme={flavor}-cursors\n") file.write(f"CursorTheme={ctx.flavor.name}-cursors\n")
file.write("ButtonLayout=close,minimize,maximize:menu\n") file.write("ButtonLayout=close,minimize,maximize:menu\n")
os.makedirs(f"{theme_dir}/gnome-shell", exist_ok=True) os.makedirs(f"{output_dir}/gnome-shell", exist_ok=True)
shutil.copyfile( shutil.copyfile(
f"{SRC_DIR}/main/gnome-shell/pad-osd.css", f"{SRC_DIR}/main/gnome-shell/pad-osd.css",
f"{theme_dir}/gnome-shell/pad-osd.css", f"{output_dir}/gnome-shell/pad-osd.css",
) )
subprocess.check_call( subprocess.check_call(
[ [
"sassc", "sassc",
*SASSC_OPT, *SASSC_OPT,
f"{SRC_DIR}/main/gnome-shell/gnome-shell{suffix}.scss", f"{SRC_DIR}/main/gnome-shell/gnome-shell{suffix}.scss",
f"{theme_dir}/gnome-shell/gnome-shell.css", f"{output_dir}/gnome-shell/gnome-shell.css",
] ]
) )
# Commented out upstream: os.makedirs(f"{output_dir}/gtk-3.0", exist_ok=True)
# cp -r "${SRC_DIR}/main/gtk-2.0/gtkrc${theme}${ELSE_DARK:-}${scheme}" "${THEME_DIR}/gtk-2.0/gtkrc"
os.makedirs(f"{theme_dir}/gtk-3.0", exist_ok=True)
subprocess.check_call( subprocess.check_call(
[ [
"sassc", "sassc",
*SASSC_OPT, *SASSC_OPT,
f"{SRC_DIR}/main/gtk-3.0/gtk{suffix}.scss", f"{SRC_DIR}/main/gtk-3.0/gtk{suffix}.scss",
f"{theme_dir}/gtk-3.0/gtk.css", f"{output_dir}/gtk-3.0/gtk.css",
] ]
) )
subprocess.check_call( subprocess.check_call(
@@ -94,17 +112,17 @@ def install(dest, name, flavor, accent, size, window):
"sassc", "sassc",
*SASSC_OPT, *SASSC_OPT,
f"{SRC_DIR}/main/gtk-3.0/gtk-Dark.scss", f"{SRC_DIR}/main/gtk-3.0/gtk-Dark.scss",
f"{theme_dir}/gtk-3.0/gtk-dark.css", f"{output_dir}/gtk-3.0/gtk-dark.css",
] ]
) )
os.makedirs(f"{theme_dir}/gtk-4.0", exist_ok=True) os.makedirs(f"{output_dir}/gtk-4.0", exist_ok=True)
subprocess.check_call( subprocess.check_call(
[ [
"sassc", "sassc",
*SASSC_OPT, *SASSC_OPT,
f"{SRC_DIR}/main/gtk-4.0/gtk{suffix}.scss", f"{SRC_DIR}/main/gtk-4.0/gtk{suffix}.scss",
f"{theme_dir}/gtk-4.0/gtk.css", f"{output_dir}/gtk-4.0/gtk.css",
] ]
) )
subprocess.check_call( subprocess.check_call(
@@ -112,17 +130,17 @@ def install(dest, name, flavor, accent, size, window):
"sassc", "sassc",
*SASSC_OPT, *SASSC_OPT,
f"{SRC_DIR}/main/gtk-4.0/gtk-Dark.scss", f"{SRC_DIR}/main/gtk-4.0/gtk-Dark.scss",
f"{theme_dir}/gtk-4.0/gtk-dark.css", f"{output_dir}/gtk-4.0/gtk-dark.css",
] ]
) )
os.makedirs(f"{theme_dir}/cinnamon", exist_ok=True) os.makedirs(f"{output_dir}/cinnamon", exist_ok=True)
subprocess.check_call( subprocess.check_call(
[ [
"sassc", "sassc",
*SASSC_OPT, *SASSC_OPT,
f"{SRC_DIR}/main/cinnamon/cinnamon{suffix}.scss", f"{SRC_DIR}/main/cinnamon/cinnamon{suffix}.scss",
f"{theme_dir}/cinnamon/cinnamon.css", f"{output_dir}/cinnamon/cinnamon.css",
] ]
) )
subprocess.check_call( subprocess.check_call(
@@ -130,51 +148,54 @@ def install(dest, name, flavor, accent, size, window):
"sassc", "sassc",
*SASSC_OPT, *SASSC_OPT,
f"{SRC_DIR}/main/gtk-4.0/gtk-Dark.scss", f"{SRC_DIR}/main/gtk-4.0/gtk-Dark.scss",
f"{theme_dir}/gtk-4.0/gtk-dark.css", f"{output_dir}/gtk-4.0/gtk-dark.css",
] ]
) )
os.makedirs(f"{theme_dir}/metacity-1", exist_ok=True) os.makedirs(f"{output_dir}/metacity-1", exist_ok=True)
shutil.copyfile( shutil.copyfile(
f"{SRC_DIR}/main/metacity-1/metacity-theme-3{window_suffix}.xml", f"{SRC_DIR}/main/metacity-1/metacity-theme-3{window_suffix}.xml",
f"{theme_dir}/metacity-1/metacity-theme-3.xml", f"{output_dir}/metacity-1/metacity-theme-3.xml",
)
os.symlink(
f"{theme_dir}/metacity-1/metacity-theme-3.xml",
f"{theme_dir}/metacity-1/metacity-theme-2.xml",
)
os.symlink(
f"{theme_dir}/metacity-1/metacity-theme-3.xml",
f"{theme_dir}/metacity-1/metacity-theme-1.xml",
) )
# FIXME: Symlinks aren't working as intended
# os.symlink(
# f"{output_dir}/metacity-1/metacity-theme-3.xml",
# f"{output_dir}/metacity-1/metacity-theme-2.xml",
# )
# os.symlink(
# f"{output_dir}/metacity-1/metacity-theme-3.xml",
# f"{output_dir}/metacity-1/metacity-theme-1.xml",
# )
os.makedirs(f"{theme_dir}/xfwm4", exist_ok=True) os.makedirs(f"{output_dir}/xfwm4", exist_ok=True)
shutil.copyfile( shutil.copyfile(
f"{SRC_DIR}/main/xfwm4/themerc{light_suffix}", f"{SRC_DIR}/main/xfwm4/themerc{light_suffix}",
f"{theme_dir}/xfwm4/themerc", f"{output_dir}/xfwm4/themerc",
) )
os.makedirs(f"{theme_dir}-hdpi/xfwm4", exist_ok=True) os.makedirs(f"{output_dir}-hdpi/xfwm4", exist_ok=True)
shutil.copyfile( shutil.copyfile(
f"{SRC_DIR}/main/xfwm4/themerc{light_suffix}", f"{SRC_DIR}/main/xfwm4/themerc{light_suffix}",
f"{theme_dir}-hdpi/xfwm4/themerc", f"{output_dir}-hdpi/xfwm4/themerc",
) )
subst_text(f'{theme_dir}-hdpi/xfwm4/themerc', 'button_offset=6', 'button_offset=9') subst_text(f"{output_dir}-hdpi/xfwm4/themerc", "button_offset=6", "button_offset=9")
os.makedirs(f"{theme_dir}-xhdpi/xfwm4", exist_ok=True) os.makedirs(f"{output_dir}-xhdpi/xfwm4", exist_ok=True)
shutil.copyfile( shutil.copyfile(
f"{SRC_DIR}/main/xfwm4/themerc{light_suffix or ''}", f"{SRC_DIR}/main/xfwm4/themerc{light_suffix or ''}",
f"{theme_dir}-xhdpi/xfwm4/themerc", f"{output_dir}-xhdpi/xfwm4/themerc",
)
subst_text(
f"{output_dir}-xhdpi/xfwm4/themerc", "button_offset=6", "button_offset=12"
) )
subst_text(f'{theme_dir}-xhdpi/xfwm4/themerc', 'button_offset=6', 'button_offset=12')
if flavor == 'latte': if not ctx.flavor.dark:
shutil.copytree( shutil.copytree(
f"{SRC_DIR}/main/plank/theme-Light{scheme_suffix}/", f"{theme_dir}/plank" f"{SRC_DIR}/main/plank/theme-Light{scheme_suffix}/", f"{output_dir}/plank"
) )
else: else:
shutil.copytree( shutil.copytree(
f"{SRC_DIR}/main/plank/theme-Dark{scheme_suffix}/", f"{theme_dir}/plank" f"{SRC_DIR}/main/plank/theme-Dark{scheme_suffix}/", f"{output_dir}/plank"
) )
@@ -190,62 +211,7 @@ def subst_text(path, _from, to):
f.write(re.sub(_from, to, content)) f.write(re.sub(_from, to, content))
def write_tweak(key, default, value):
subst_text(
f"{SRC_DIR}/sass/_tweaks-temp.scss", f"\\${key}: {default}", f"${key}: {value}"
)
def compact_size():
write_tweak("compact", "'false'", "'true'")
def blackness_color():
write_tweak("blackness", "'false'", "'true'")
def border_rimless():
write_tweak("rimless", "'false'", "'true'")
def normal_winbutton():
write_tweak("window_button", "'mac'", "'normal'")
def float_panel():
write_tweak("float", "'false'", "'true'")
def color_schemes():
subst_text(
f"{SRC_DIR}/sass/_tweaks-temp.scss",
"@import 'color-palette-default';",
"@import 'color-palette-catppuccin';",
)
write_tweak("colorscheme", "'default'", "'catppuccin'")
GS_VERSION = "46-0" GS_VERSION = "46-0"
"""
if [[ "$(command -v gnome-shell)" ]]; then
gnome-shell --version
SHELL_VERSION="$(gnome-shell --version | cut -d ' ' -f 3 | cut -d . -f -1)"
if [[ "${SHELL_VERSION:-}" -ge "46" ]]; then
GS_VERSION="46-0"
elif [[ "${SHELL_VERSION:-}" -ge "44" ]]; then
GS_VERSION="44-0"
elif [[ "${SHELL_VERSION:-}" -ge "42" ]]; then
GS_VERSION="42-0"
elif [[ "${SHELL_VERSION:-}" -ge "40" ]]; then
GS_VERSION="40-0"
else
GS_VERSION="3-28"
fi
else
echo "'gnome-shell' not found, using styles for last gnome-shell version available."
GS_VERSION="46-0"
fi
"""
def gnome_shell_version(): def gnome_shell_version():
@@ -267,7 +233,7 @@ def gnome_shell_version():
) )
# Accent settings # Accent translation
ctp_to_colloid = { ctp_to_colloid = {
"rosewater": "pink", "rosewater": "pink",
"flamingo": "pink", "flamingo": "pink",
@@ -286,85 +252,96 @@ ctp_to_colloid = {
} }
def translate_accent(ctp_accent): def translate_accent(ctp_accent: Color):
return ctp_to_colloid[ctp_accent] return ctp_to_colloid[ctp_accent.identifier]
def theme_color(): def write_tweak(key, default, value):
write_tweak("theme", "'default'", translate_accent(args.accent)) subst_text(
f"{SRC_DIR}/sass/_tweaks-temp.scss", f"\\${key}: {default}", f"${key}: {value}"
)
def apply_tweaks(ctx: BuildContext):
write_tweak("theme", "'default'", translate_accent(ctx.accent))
if ctx.size == "compact":
write_tweak("compact", "'false'", "'true'")
subst_text(
f"{SRC_DIR}/sass/_tweaks-temp.scss",
"@import 'color-palette-default';",
"@import 'color-palette-catppuccin';",
)
write_tweak("colorscheme", "'default'", "'catppuccin'")
if ctx.tweaks.has("black"):
write_tweak("blackness", "'false'", "'true'")
if ctx.tweaks.has("rimless"):
write_tweak("rimless", "'false'", "'true'")
if ctx.tweaks.has("normal"):
write_tweak("window_button", "'mac'", "'normal'")
if ctx.tweaks.has("float"):
write_tweak("float", "'false'", "'true'")
def theme_tweaks(): def make_assets(ctx: BuildContext):
if args.accent:
theme_color()
if args.size == "compact":
compact_size()
# We always set up our scheme
color_schemes()
if "black" in args.tweaks:
blackness_color()
if "rimless" in args.tweaks:
border_rimless()
if "normal" in args.tweaks:
normal_winbutton()
if "float" in args.tweaks:
float_panel()
def make_assets(dest, name, flavor, accent, size):
color_suffix = "" color_suffix = ""
if flavor == "latte": if not ctx.flavor.dark:
color_suffix = "-Light" color_suffix = "-Light"
else: else:
color_suffix = '-Dark' color_suffix = "-Dark"
dark_suffix = "" dark_suffix = ""
if flavor != 'latte': if ctx.flavor.dark:
dark_suffix = "-Dark" dark_suffix = "-Dark"
light_suffix = "" light_suffix = ""
if flavor != 'latte': if not ctx.flavor.dark:
light_suffix = "-Light" light_suffix = "-Light"
window_suffix = "" window_suffix = ""
if 'normal' in args.tweaks: if ctx.tweaks.has("normal"):
window_suffix = "-Normal" window_suffix = "-Normal"
theme_dir = make_theme_dir(dest, name, flavor, accent, size) output_dir = ctx.output_dir()
os.makedirs(f"{theme_dir}/cinnamon/assets", exist_ok=True) os.makedirs(f"{output_dir}/cinnamon/assets", exist_ok=True)
for file in glob.glob(f"{SRC_DIR}/assets/cinnamon/theme/*.svg"): for file in glob.glob(f"{SRC_DIR}/assets/cinnamon/theme/*.svg"):
shutil.copy(file, f"{theme_dir}/cinnamon/assets") shutil.copy(file, f"{output_dir}/cinnamon/assets")
shutil.copy( shutil.copy(
f"{SRC_DIR}/assets/cinnamon/thumbnail{color_suffix}.svg", f"{SRC_DIR}/assets/cinnamon/thumbnail{color_suffix}.svg",
f"{theme_dir}/cinnamon/thumbnail.png", f"{output_dir}/cinnamon/thumbnail.png",
) )
os.makedirs(f"{theme_dir}/gnome-shell/assets", exist_ok=True) os.makedirs(f"{output_dir}/gnome-shell/assets", exist_ok=True)
for file in glob.glob(f"{SRC_DIR}/assets/gnome-shell/theme/*.svg"): for file in glob.glob(f"{SRC_DIR}/assets/gnome-shell/theme/*.svg"):
shutil.copy(file, f"{theme_dir}/gnome-shell/assets") shutil.copy(file, f"{output_dir}/gnome-shell/assets")
shutil.copytree(f"{SRC_DIR}/assets/gtk/assets", f"{theme_dir}/gtk-3.0/assets", dirs_exist_ok=True) shutil.copytree(
shutil.copytree(f"{SRC_DIR}/assets/gtk/assets", f"{theme_dir}/gtk-4.0/assets", dirs_exist_ok=True) f"{SRC_DIR}/assets/gtk/assets",
shutil.copyfile( f"{output_dir}/gtk-3.0/assets",
f"{SRC_DIR}/assets/gtk/thumbnail{dark_suffix}.svg", dirs_exist_ok=True,
f"{theme_dir}/gtk-3.0/thumbnail.png", )
shutil.copytree(
f"{SRC_DIR}/assets/gtk/assets",
f"{output_dir}/gtk-4.0/assets",
dirs_exist_ok=True,
) )
shutil.copyfile( shutil.copyfile(
f"{SRC_DIR}/assets/gtk/thumbnail{dark_suffix}.svg", f"{SRC_DIR}/assets/gtk/thumbnail{dark_suffix}.svg",
f"{theme_dir}/gtk-4.0/thumbnail.png", f"{output_dir}/gtk-3.0/thumbnail.png",
)
shutil.copyfile(
f"{SRC_DIR}/assets/gtk/thumbnail{dark_suffix}.svg",
f"{output_dir}/gtk-4.0/thumbnail.png",
) )
palette = getattr(PALETTE, args.flavor) theme_color = ctx.accent.hex
theme_color = getattr(palette.colors, args.accent).hex
if "black" in args.tweaks: if ctx.tweaks.has("black"):
background_light = "#FFFFFF" background_light = "#FFFFFF"
background_dark = "#0F0F0F" background_dark = "#0F0F0F"
background_darker = "#121212" background_darker = "#121212"
@@ -379,73 +356,69 @@ def make_assets(dest, name, flavor, accent, size):
titlebar_light = "#F2F2F2" titlebar_light = "#F2F2F2"
titlebar_dark = "#242424" titlebar_dark = "#242424"
for file in glob.glob(f"{theme_dir}/cinnamon/assets/*.svg"): for file in glob.glob(f"{output_dir}/cinnamon/assets/*.svg"):
subst_text(file, "#5b9bf8", theme_color) subst_text(file, "#5b9bf8", theme_color)
subst_text(file, "#3c84f7", theme_color) subst_text(file, "#3c84f7", theme_color)
for file in glob.glob(f"{theme_dir}/gnome-shell/assets/*.svg"): for file in glob.glob(f"{output_dir}/gnome-shell/assets/*.svg"):
subst_text(file, "#5b9bf8", theme_color) subst_text(file, "#5b9bf8", theme_color)
subst_text(file, "#3c84f7", theme_color) subst_text(file, "#3c84f7", theme_color)
for file in glob.glob(f"{theme_dir}/gtk-3.0/assets/*.svg"): for file in glob.glob(f"{output_dir}/gtk-3.0/assets/*.svg"):
subst_text(file, "#5b9bf8", theme_color) subst_text(file, "#5b9bf8", theme_color)
subst_text(file, "#3c84f7", theme_color) subst_text(file, "#3c84f7", theme_color)
subst_text(file, "#ffffff", background_light) subst_text(file, "#ffffff", background_light)
subst_text(file, "#2c2c2c", background_dark) subst_text(file, "#2c2c2c", background_dark)
subst_text(file, "#3c3c3c", background_alt) subst_text(file, "#3c3c3c", background_alt)
for file in glob.glob(f"{theme_dir}/gtk-4.0/assets/*.svg"): for file in glob.glob(f"{output_dir}/gtk-4.0/assets/*.svg"):
subst_text(file, "#5b9bf8", theme_color) subst_text(file, "#5b9bf8", theme_color)
subst_text(file, "#3c84f7", theme_color) subst_text(file, "#3c84f7", theme_color)
subst_text(file, "#ffffff", background_light) subst_text(file, "#ffffff", background_light)
subst_text(file, "#2c2c2c", background_dark) subst_text(file, "#2c2c2c", background_dark)
subst_text(file, "#3c3c3c", background_alt) subst_text(file, "#3c3c3c", background_alt)
if accent == "dark": if ctx.flavor.dark:
subst_text( subst_text(f"{output_dir}/cinnamon/thumbnail.png", "#2c2c2c", background_dark)
f"{theme_dir}/cinnamon/thumbnail.png", "#2c2c2c", background_dark subst_text(f"{output_dir}/cinnamon/thumbnail.png", "#5b9bf8", theme_color)
)
subst_text(f"{theme_dir}/cinnamon/thumbnail.png", "#5b9bf8", theme_color)
subst_text(f"{theme_dir}/gtk-3.0/thumbnail.png", "#2c2c2c", background_dark) subst_text(f"{output_dir}/gtk-3.0/thumbnail.png", "#2c2c2c", background_dark)
subst_text(f"{theme_dir}/gtk-4.0/thumbnail.png", "#2c2c2c", background_dark) subst_text(f"{output_dir}/gtk-4.0/thumbnail.png", "#2c2c2c", background_dark)
subst_text(f"{theme_dir}/gtk-3.0/thumbnail.png", "#5b9bf8", theme_color) subst_text(f"{output_dir}/gtk-3.0/thumbnail.png", "#5b9bf8", theme_color)
subst_text(f"{theme_dir}/gtk-4.0/thumbnail.png", "#5b9bf8", theme_color) subst_text(f"{output_dir}/gtk-4.0/thumbnail.png", "#5b9bf8", theme_color)
else: else:
subst_text( subst_text(f"{output_dir}/cinnamon/thumbnail.png", "#ffffff", background_light)
f"{theme_dir}/cinnamon/thumbnail.png", "#ffffff", background_light subst_text(f"{output_dir}/cinnamon/thumbnail.png", "#f2f2f2", titlebar_light)
) subst_text(f"{output_dir}/cinnamon/thumbnail.png", "#3c84f7", theme_color)
subst_text(f"{theme_dir}/cinnamon/thumbnail.png", "#f2f2f2", titlebar_light)
subst_text(f"{theme_dir}/cinnamon/thumbnail.png", "#3c84f7", theme_color)
subst_text(f"{theme_dir}/gtk-3.0/thumbnail.png", "#f2f2f2", titlebar_light) subst_text(f"{output_dir}/gtk-3.0/thumbnail.png", "#f2f2f2", titlebar_light)
subst_text(f"{theme_dir}/gtk-3.0/thumbnail.png", "#3c84f7", theme_color) subst_text(f"{output_dir}/gtk-3.0/thumbnail.png", "#3c84f7", theme_color)
subst_text(f"{theme_dir}/gtk-4.0/thumbnail.png", "#f2f2f2", titlebar_light) subst_text(f"{output_dir}/gtk-4.0/thumbnail.png", "#f2f2f2", titlebar_light)
subst_text(f"{theme_dir}/gtk-4.0/thumbnail.png", "#3c84f7", theme_color) subst_text(f"{output_dir}/gtk-4.0/thumbnail.png", "#3c84f7", theme_color)
for file in glob.glob(f"{SRC_DIR}/assets/cinnamon/common-assets/*.svg"): for file in glob.glob(f"{SRC_DIR}/assets/cinnamon/common-assets/*.svg"):
shutil.copy(file, f"{theme_dir}/cinnamon/assets") shutil.copy(file, f"{output_dir}/cinnamon/assets")
for file in glob.glob(f"{SRC_DIR}/assets/cinnamon/assets-{dark_suffix}/*.svg"): for file in glob.glob(f"{SRC_DIR}/assets/cinnamon/assets-{dark_suffix}/*.svg"):
shutil.copy(file, f"{theme_dir}/cinnamon/assets") shutil.copy(file, f"{output_dir}/cinnamon/assets")
for file in glob.glob(f"{SRC_DIR}/assets/gnome-shell/common-assets/*.svg"): for file in glob.glob(f"{SRC_DIR}/assets/gnome-shell/common-assets/*.svg"):
shutil.copy(file, f"{theme_dir}/gnome-shell/assets") shutil.copy(file, f"{output_dir}/gnome-shell/assets")
for file in glob.glob(f"{SRC_DIR}/assets/gnome-shell/assets-{dark_suffix}/*.svg"): for file in glob.glob(f"{SRC_DIR}/assets/gnome-shell/assets-{dark_suffix}/*.svg"):
shutil.copy(file, f"{theme_dir}/gnome-shell/assets") shutil.copy(file, f"{output_dir}/gnome-shell/assets")
for file in glob.glob(f"{SRC_DIR}/assets/gtk/symbolics/*.svg"): for file in glob.glob(f"{SRC_DIR}/assets/gtk/symbolics/*.svg"):
shutil.copy(file, f"{theme_dir}/gtk-3.0/assets") shutil.copy(file, f"{output_dir}/gtk-3.0/assets")
shutil.copy(file, f"{theme_dir}/gtk-4.0/assets") shutil.copy(file, f"{output_dir}/gtk-4.0/assets")
for file in glob.glob(f"{SRC_DIR}/assets/metacity-1/assets-{window_suffix}/*.svg"): for file in glob.glob(f"{SRC_DIR}/assets/metacity-1/assets-{window_suffix}/*.svg"):
shutil.copy(file, f"{theme_dir}/metacity-1/assets") shutil.copy(file, f"{output_dir}/metacity-1/assets")
shutil.copy( shutil.copy(
f'{SRC_DIR}/assets/metacity-1/thumbnail{dark_suffix}.png', f"{SRC_DIR}/assets/metacity-1/thumbnail{dark_suffix}.png",
f'{theme_dir}/metacity-1/thumbnail.png' f"{output_dir}/metacity-1/thumbnail.png",
) )
# TODO: Make our own assets for this and patch them in with the patch system, then code it to be # TODO: Make our own assets for this and patch them in with the patch system, then code it to be
@@ -453,40 +426,30 @@ def make_assets(dest, name, flavor, accent, size):
# where assets-Light-Catppuccin will have latte # where assets-Light-Catppuccin will have latte
# nad assets-Catppuccin will have mocha or something # nad assets-Catppuccin will have mocha or something
for file in glob.glob(f"{SRC_DIR}/assets/xfwm4/assets{light_suffix}/*.png"): for file in glob.glob(f"{SRC_DIR}/assets/xfwm4/assets{light_suffix}/*.png"):
shutil.copy(file, f"{theme_dir}/xfwm4") shutil.copy(file, f"{output_dir}/xfwm4")
for file in glob.glob(f"{SRC_DIR}/assets/xfwm4/assets{light_suffix}-hdpi/*.png"): for file in glob.glob(f"{SRC_DIR}/assets/xfwm4/assets{light_suffix}-hdpi/*.png"):
shutil.copy(file, f"{theme_dir}-hdpi/xfwm4") shutil.copy(file, f"{output_dir}-hdpi/xfwm4")
for file in glob.glob(f"{SRC_DIR}/assets/xfwm4/assets{light_suffix}-xhdpi/*.png"): for file in glob.glob(f"{SRC_DIR}/assets/xfwm4/assets{light_suffix}-xhdpi/*.png"):
shutil.copy(file, f"{theme_dir}-xhdpi/xfwm4") shutil.copy(file, f"{output_dir}-xhdpi/xfwm4")
def install_theme():
if "normal" in args.tweaks:
window = "normal"
else:
window = ""
logger.info(f'Building with args={args}') def build_theme(ctx: BuildContext):
build_info = f"""Build info:
build_root: {ctx.build_root}
theme_name: {ctx.theme_name}
flavor: {ctx.flavor.identifier}
accent: {ctx.accent.identifier}
size: {ctx.size}
tweaks: {ctx.tweaks}"""
logger.info(build_info)
build(ctx)
logger.info(f"Main build complete")
install( logger.info("Bundling assets...")
dest=args.dest, make_assets(ctx)
name=args.name, logger.info("Asset bundling done")
flavor=args.flavor,
accent=args.accent,
size=args.size,
window=window,
)
logger.info('Bundling assets...')
make_assets(
dest=args.dest,
name=args.name,
flavor=args.flavor,
accent=args.accent,
size=args.size,
)
logger.info('Asset bundling done')
""" """
if (command -v xfce4-popup-whiskermenu &> /dev/null) && $(sed -i "s|.*menu-opacity=.*|menu-opacity=95|" "$HOME/.config/xfce4/panel/whiskermenu"*".rc" &> /dev/null); then if (command -v xfce4-popup-whiskermenu &> /dev/null) && $(sed -i "s|.*menu-opacity=.*|menu-opacity=95|" "$HOME/.config/xfce4/panel/whiskermenu"*".rc" &> /dev/null); then
@@ -499,7 +462,7 @@ def install_theme():
""" """
def apply_patches(): def apply_colloid_patches():
if os.path.isfile("colloid/.patched"): if os.path.isfile("colloid/.patched"):
logger.info( logger.info(
'Patches seem to be applied, remove "colloid/.patched" to force application (this may fail)' 'Patches seem to be applied, remove "colloid/.patched" to force application (this may fail)'
@@ -523,115 +486,7 @@ def apply_patches():
logger.info("Patching finished.") logger.info("Patching finished.")
def parse_args():
def uninstall(dest, name, theme, color, size, scheme, window):
theme_dir = make_theme_dir(dest, name, theme, color, size, scheme)
logger.info("Would remove", f"'{theme_dir}'")
"""
if [[ -d "${THEME_DIR}" ]]; then
echo -e "Uninstall ${THEME_DIR}... "
rm -rf "${THEME_DIR}"
fi
"""
def uninstall_theme():
if args.flavor == "latte":
color = "light"
else:
color = "dark"
if "normal" in args.tweaks:
window = "normal"
else:
window = ""
uninstall(
dest=args.dest,
name=args.name,
theme=translate_accent(args.accent),
color=color,
size=args.size,
scheme="catppuccin",
window=window,
)
"""
uninstall_link() {
rm -rf "${HOME}/.config/gtk-4.0/"{assets,windows-assets,gtk.css,gtk-dark.css}
}
link_libadwaita() {
local dest="${1}"
local name="${2}"
local theme="${3}"
local color="${4}"
local size="${5}"
local scheme="${6}"
local THEME_DIR="${1}/${2}${3}${4}${5}${6}"
rm -rf "${HOME}/.config/gtk-4.0/"{assets,gtk.css,gtk-dark.css}
echo -e "\nLink '$THEME_DIR/gtk-4.0' to '${HOME}/.config/gtk-4.0' for libadwaita..."
mkdir -p "${HOME}/.config/gtk-4.0"
ln -sf "${THEME_DIR}/gtk-4.0/assets" "${HOME}/.config/gtk-4.0/assets"
ln -sf "${THEME_DIR}/gtk-4.0/gtk.css" "${HOME}/.config/gtk-4.0/gtk.css"
ln -sf "${THEME_DIR}/gtk-4.0/gtk-dark.css" "${HOME}/.config/gtk-4.0/gtk-dark.css"
}
link_theme() {
for theme in "${themes[@]}"; do
for color in "${lcolors[@]}"; do
for size in "${sizes[@]}"; do
for scheme in "${schemes[@]}"; do
link_libadwaita "${dest:-$DEST_DIR}" "${name:-$THEME_NAME}" "$theme" "$color" "$size" "$scheme"
done
done
done
done
}
"""
"""
clean() {
local dest="${1}"
local name="${2}"
local theme="${3}"
local color="${4}"
local size="${5}"
local scheme="${6}"
local screen="${7}"
local THEME_DIR="${1}/${2}${3}${4}${5}${6}${7}"
if [[ ${theme} == '' && ${color} == '' && ${size} == '' && ${scheme} == '' ]]; then
cleantheme='none'
elif [[ -d ${THEME_DIR} ]]; then
rm -rf ${THEME_DIR}
echo -e "Find: ${THEME_DIR} ! removing it ..."
fi
}
"""
"""
clean_theme() {
for theme in '' '-purple' '-pink' '-red' '-orange' '-yellow' '-green' '-teal' '-grey'; do
for color in '' '-light' '-dark'; do
for size in '' '-compact'; do
for scheme in '' '-nord' '-dracula' '-gruvbox' '-everforest'; do
for screen in '' '-hdpi' '-xhdpi'; do
clean "${dest:-${DEST_DIR}}" "${name:-${THEME_NAME}}" "${theme}" "${color}" "${size}" "${scheme}" "${screen}"
done
done
done
done
done
}
"""
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument( parser.add_argument(
"flavor", "flavor",
@@ -703,67 +558,34 @@ parser.add_argument(
help="Tweaks to apply to the build.", help="Tweaks to apply to the build.",
) )
parser.add_argument( return parser.parse_args()
"-l",
"--link",
help="Link advaita themes to our catppuccin theme",
type=bool,
default=False,
action=argparse.BooleanOptionalAction,
dest="link",
)
parser.add_argument(
"--zip",
help="Zip catppuccin theme",
type=bool,
default=False,
action=argparse.BooleanOptionalAction,
dest="zip",
)
parser.add_argument(
"--recreate-asset",
help="Recreate assets for xfwm4 and such",
type=bool,
default=False,
action=argparse.BooleanOptionalAction,
dest="rec_asset",
)
parser.add_argument(
"--uninstall",
help="Uninstall the theme",
type=bool,
default=False,
action=argparse.BooleanOptionalAction,
dest="uninstall",
)
args = parser.parse_args()
def main(): def main():
apply_patches() args = parse_args()
if args.uninstall: apply_colloid_patches()
"""
if [[ "$libadwaita" == 'true' ]]; then palette = getattr(PALETTE, args.flavor)
echo -e "\nUninstall ${HOME}/.config/gtk-4.0 links ..." accent = getattr(palette.colors, args.accent)
uninstall_link tweaks = Tweaks(tweaks=args.tweaks)
else
echo && uninstall_theme && uninstall_link ctx = BuildContext(
fi build_root=args.dest,
""" theme_name=args.name,
uninstall_theme() flavor=palette,
else: accent=accent,
logger.info('Building temp tweaks file') size=args.size,
tweaks=tweaks,
)
logger.info("Building temp tweaks file")
tweaks_temp() tweaks_temp()
logger.info('Inserting gnome-shell imports') logger.info("Inserting gnome-shell imports")
gnome_shell_version() gnome_shell_version()
logger.info('Building main theme') logger.info("Building main theme")
install_theme() build_theme(ctx)
logger.info('Done!') logger.info("Done!")
try: try:
main() main()