feat: assets

This commit is contained in:
nullishamy
2024-05-18 19:32:40 +01:00
parent 3501174789
commit 2eca1a605f

231
build.py
View File

@@ -4,6 +4,8 @@ import re
import shutil import shutil
import subprocess import subprocess
import argparse import argparse
import glob
import logging
from catppuccin import PALETTE from catppuccin import PALETTE
from catppuccin.models import Flavor from catppuccin.models import Flavor
@@ -12,36 +14,42 @@ 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.setLevel(logging.DEBUG)
ch = logging.StreamHandler()
formatter = logging.Formatter('[%(name)s] [%(levelname)s] - %(message)s')
ch.setFormatter(formatter)
logger.addHandler(ch)
def make_theme_dir(dest, name, theme, color, size, scheme): def make_theme_dir(dest, name, theme, color, size, scheme):
return f"{dest}/{name}-{theme}-{color}-{size}-{scheme}" return f"{dest}/{name}-{theme}-{color}-{size}-{scheme}"
def install(dest, name, theme, color, size, scheme, window): def install(dest, name, theme, color, size, scheme, window):
dark_suffix = '' dark_suffix = ""
light_suffix = '' light_suffix = ""
window_suffix = '' window_suffix = ""
scheme_suffix = '-Catppuccin' scheme_suffix = "-Catppuccin"
if window == 'normal': if window == "normal":
window_suffix = '-Normal' window_suffix = "-Normal"
if color == "light": if color == "light":
light_suffix = "-Light" light_suffix = "-Light"
suffix = '-Light' suffix = "-Light"
if color == "dark": if color == "dark":
dark_suffix = "-Dark" dark_suffix = "-Dark"
suffix = '-Dark' suffix = "-Dark"
theme_dir = make_theme_dir(dest, name, theme, color, size, scheme) theme_dir = make_theme_dir(dest, name, theme, color, size, scheme)
# [[ -d "${THEME_DIR}" ]] && rm -rf "${THEME_DIR}" # [[ -d "${THEME_DIR}" ]] && rm -rf "${THEME_DIR}"
print(f"Building into '{theme_dir}'...") logger.info(f"Building into '{theme_dir}'...")
theme_tweaks() theme_tweaks()
os.makedirs(theme_dir, exist_ok=True) os.makedirs(theme_dir, exist_ok=True)
with open(f"{theme_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}-{theme}-{color}-{size}-{scheme}\n") file.write(f"Name={name}-{theme}-{color}-{size}-{scheme}\n")
@@ -57,7 +65,8 @@ def install(dest, name, theme, color, size, scheme, window):
os.makedirs(f"{theme_dir}/gnome-shell", exist_ok=True) os.makedirs(f"{theme_dir}/gnome-shell", exist_ok=True)
shutil.copyfile( shutil.copyfile(
f"{SRC_DIR}/main/gnome-shell/pad-osd.css", f"{theme_dir}/gnome-shell/pad-osd.css" f"{SRC_DIR}/main/gnome-shell/pad-osd.css",
f"{theme_dir}/gnome-shell/pad-osd.css",
) )
subprocess.check_call( subprocess.check_call(
[ [
@@ -181,6 +190,7 @@ def install(dest, name, theme, color, size, scheme, window):
def tweaks_temp(): def tweaks_temp():
shutil.copyfile(f"{SRC_DIR}/sass/_tweaks.scss", f"{SRC_DIR}/sass/_tweaks-temp.scss") shutil.copyfile(f"{SRC_DIR}/sass/_tweaks.scss", f"{SRC_DIR}/sass/_tweaks-temp.scss")
def subst_text(path, _from, to): def subst_text(path, _from, to):
with open(path, "r+") as f: with open(path, "r+") as f:
content = f.read() content = f.read()
@@ -288,9 +298,11 @@ ctp_to_colloid = {
def translate_accent(ctp_accent): def translate_accent(ctp_accent):
return ctp_to_colloid[ctp_accent] return ctp_to_colloid[ctp_accent]
def theme_color(): def theme_color():
write_tweak("theme", "'default'", translate_accent(args.accent)) write_tweak("theme", "'default'", translate_accent(args.accent))
def theme_tweaks(): def theme_tweaks():
if args.accent: if args.accent:
theme_color() theme_color()
@@ -317,7 +329,7 @@ def theme_tweaks():
def make_gtkrc(dest, name, theme, color, size, scheme): def make_gtkrc(dest, name, theme, color, size, scheme):
gtkrc_dir = f"{SRC_DIR}/main/gtk-2.0" gtkrc_dir = f"{SRC_DIR}/main/gtk-2.0"
dark_suffix = '' dark_suffix = ""
if color == "dark": if color == "dark":
dark_suffix = "-Dark" dark_suffix = "-Dark"
@@ -350,19 +362,154 @@ def make_gtkrc(dest, name, theme, color, size, scheme):
if color == "-Dark": if color == "-Dark":
subst_text(f"{theme_dir}/gtk-2.0/gtkrc", "#5b9bf8", theme_color) subst_text(f"{theme_dir}/gtk-2.0/gtkrc", "#5b9bf8", theme_color)
subst_text(f"{theme_dir}/gtk-2.0/gtkrc", "#3C3C3C", background_darker) subst_text(f"{theme_dir}/gtk-2.0/gtkrc", "#3C3C3C", background_darker)
subst_text(f"{theme_dir}/gtk-2.0/gtkrc", "#242424", titlebar_dark) subst_text(f"{theme_dir}/gtk-2.0/gtkrc", "#242424", titlebar_dark)
else: else:
subst_text(f"{theme_dir}/gtk-2.0/gtkrc", "#3c84f7", theme_color) subst_text(f"{theme_dir}/gtk-2.0/gtkrc", "#3c84f7", theme_color)
subst_text(f"{theme_dir}/gtk-2.0/gtkrc", "#F2F2F2", titlebar_light) subst_text(f"{theme_dir}/gtk-2.0/gtkrc", "#F2F2F2", titlebar_light)
def make_assets(**_): def make_assets(dest, name, theme, color, size, scheme):
print("FIXME: Implement asset generation") color_suffix = ""
if color == "light":
color_suffix = "-Light"
else:
color_suffix = '-Dark'
dark_suffix = ""
if color == "dark":
dark_suffix = "-Dark"
window_suffix = ""
if 'normal' in args.tweaks:
window_suffix = "-Normal"
theme_dir = make_theme_dir(dest, name, theme, color, size, scheme)
os.makedirs(f"{theme_dir}/cinnamon/assets", exist_ok=True)
for file in glob.glob(f"{SRC_DIR}/assets/cinnamon/theme/*.svg"):
shutil.copy(file, f"{theme_dir}/cinnamon/assets")
shutil.copy(
f"{SRC_DIR}/assets/cinnamon/thumbnail{color_suffix}.svg",
f"{theme_dir}/cinnamon/thumbnail.png",
)
os.makedirs(f"{theme_dir}/gnome-shell/assets", exist_ok=True)
for file in glob.glob(f"{SRC_DIR}/assets/gnome-shell/theme/*.svg"):
shutil.copy(file, f"{theme_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(f"{SRC_DIR}/assets/gtk/assets", f"{theme_dir}/gtk-4.0/assets", dirs_exist_ok=True)
shutil.copyfile(
f"{SRC_DIR}/assets/gtk/thumbnail{dark_suffix}.svg",
f"{theme_dir}/gtk-3.0/thumbnail.png",
)
shutil.copyfile(
f"{SRC_DIR}/assets/gtk/thumbnail{dark_suffix}.svg",
f"{theme_dir}/gtk-4.0/thumbnail.png",
)
palette = getattr(PALETTE, args.flavor)
theme_color = getattr(palette.colors, args.accent).hex
if "black" in args.tweaks:
background_light = "#FFFFFF"
background_dark = "#0F0F0F"
background_darker = "#121212"
background_alt = "#212121"
titlebar_light = "#F2F2F2"
titlebar_dark = "#030303"
else:
background_light = "#FFFFFF"
background_dark = "#2C2C2C"
background_darker = "#3C3C3C"
background_alt = "#464646"
titlebar_light = "#F2F2F2"
titlebar_dark = "#242424"
# TODO: Do we need to replace both? Upstream has 2 hexes for light / dark
# but ctp only operates with 1 [accent at atime]
for file in glob.glob(f"{theme_dir}/cinnamon/assets/*.svg"):
subst_text(file, "#5b9bf8", theme_color)
subst_text(file, "#3c84f7", theme_color)
for file in glob.glob(f"{theme_dir}/gnome-shell/assets/*.svg"):
subst_text(file, "#5b9bf8", theme_color)
subst_text(file, "#3c84f7", theme_color)
for file in glob.glob(f"{theme_dir}/gtk-3.0/assets/*.svg"):
subst_text(file, "#5b9bf8", theme_color)
subst_text(file, "#3c84f7", theme_color)
subst_text(file, "#ffffff", background_light)
subst_text(file, "#2c2c2c", background_dark)
subst_text(file, "#3c3c3c", background_alt)
for file in glob.glob(f"{theme_dir}/gtk-4.0/assets/*.svg"):
subst_text(file, "#5b9bf8", theme_color)
subst_text(file, "#3c84f7", theme_color)
subst_text(file, "#ffffff", background_light)
subst_text(file, "#2c2c2c", background_dark)
subst_text(file, "#3c3c3c", background_alt)
if color == "dark":
subst_text(
f"{theme_dir}/cinnamon/thumbnail.png", "#2c2c2c", background_dark
)
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"{theme_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"{theme_dir}/gtk-4.0/thumbnail.png", "#5b9bf8", theme_color)
else:
subst_text(
f"{theme_dir}/cinnamon/thumbnail.png", "#ffffff", background_light
)
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"{theme_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"{theme_dir}/gtk-4.0/thumbnail.png", "#3c84f7", theme_color)
for file in glob.glob(f"{SRC_DIR}/assets/cinnamon/common-assets/*.svg"):
shutil.copy(file, f"{theme_dir}/cinnamon/assets")
for file in glob.glob(f"{SRC_DIR}/assets/cinnamon/assets-{dark_suffix}/*.svg"):
shutil.copy(file, f"{theme_dir}/cinnamon/assets")
for file in glob.glob(f"{SRC_DIR}/assets/gnome-shell/common-assets/*.svg"):
shutil.copy(file, f"{theme_dir}/gnome-shell/assets")
for file in glob.glob(f"{SRC_DIR}/assets/gnome-shell/assets-{dark_suffix}/*.svg"):
shutil.copy(file, f"{theme_dir}/gnome-shell/assets")
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"{theme_dir}/gtk-4.0/assets")
# TODO: GTK 2.0 support
"""
cp -r "${SRC_DIR}/assets/gtk-2.0/assets-common${ELSE_DARK:-}" "${THEME_DIR}/gtk-2.0/assets"
cp -r "${SRC_DIR}/assets/gtk-2.0/assets${theme}${ELSE_DARK:-}${scheme}/"*"png" "${THEME_DIR}/gtk-2.0/assets"
"""
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(
f'{SRC_DIR}/assets/metacity-1/thumbnail{dark_suffix}.png',
f'{theme_dir}/metacity-1/thumbnail.png'
)
# TODO: xfwm4 support
"""
cp -r "${SRC_DIR}/assets/xfwm4/assets${ELSE_LIGHT:-}${scheme}${window}/"*.png "${THEME_DIR}/xfwm4"
cp -r "${SRC_DIR}/assets/xfwm4/assets${ELSE_LIGHT:-}${scheme}${window}-hdpi/"*.png "${THEME_DIR}-hdpi/xfwm4"
cp -r "${SRC_DIR}/assets/xfwm4/assets${ELSE_LIGHT:-}${scheme}${window}-xhdpi/"*.png "${THEME_DIR}-xhdpi/xfwm4"
"""
def install_theme(): def install_theme():
if args.flavor == "latte": if args.flavor == "latte":
@@ -373,7 +520,9 @@ def install_theme():
if "normal" in args.tweaks: if "normal" in args.tweaks:
window = "normal" window = "normal"
else: else:
window = '' window = ""
logger.info(f'Building with args={args}')
install( install(
dest=args.dest, dest=args.dest,
@@ -413,28 +562,35 @@ def install_theme():
fi fi
""" """
def apply_patches(): def apply_patches():
if os.path.isfile('colloid/.patched'): if os.path.isfile("colloid/.patched"):
print('Patches seem to be applied, remove "colloid/.patched" to force application (this may fail)') logger.info(
'Patches seem to be applied, remove "colloid/.patched" to force application (this may fail)'
)
return return
logger.info("Applying patches...")
# Change into colloid # Change into colloid
for patch in [ for patch in [
'plank-dark.patch', "plank-dark.patch",
'plank-light.patch', "plank-light.patch",
'sass-colors.patch', "sass-colors.patch",
'sass-palette.patch', "sass-palette.patch",
]: ]:
path = f'./patches/colloid/{patch}' path = f"./patches/colloid/{patch}"
print(f"Applying patch '{patch}', located at '{path}'") logger.info(f"Applying patch '{patch}', located at '{path}'")
subprocess.check_call(['git', 'apply', path, '--directory', f'colloid']) subprocess.check_call(["git", "apply", path, "--directory", f"colloid"])
with open('colloid/.patched', 'w') as f: with open("colloid/.patched", "w") as f:
f.write('true') f.write("true")
logger.info("Patching finished.")
def uninstall(dest, name, theme, color, size, scheme, window): def uninstall(dest, name, theme, color, size, scheme, window):
theme_dir = make_theme_dir(dest, name, theme, color, size, scheme) theme_dir = make_theme_dir(dest, name, theme, color, size, scheme)
print("Would remove", f"'{theme_dir}'") logger.info("Would remove", f"'{theme_dir}'")
""" """
if [[ -d "${THEME_DIR}" ]]; then if [[ -d "${THEME_DIR}" ]]; then
echo -e "Uninstall ${THEME_DIR}... " echo -e "Uninstall ${THEME_DIR}... "
@@ -452,7 +608,7 @@ def uninstall_theme():
if "normal" in args.tweaks: if "normal" in args.tweaks:
window = "normal" window = "normal"
else: else:
window = '' window = ""
uninstall( uninstall(
dest=args.dest, dest=args.dest,
@@ -464,6 +620,7 @@ def uninstall_theme():
window=window, window=window,
) )
""" """
uninstall_link() { uninstall_link() {
rm -rf "${HOME}/.config/gtk-4.0/"{assets,windows-assets,gtk.css,gtk-dark.css} rm -rf "${HOME}/.config/gtk-4.0/"{assets,windows-assets,gtk.css,gtk-dark.css}
@@ -649,6 +806,7 @@ parser.add_argument(
args = parser.parse_args() args = parser.parse_args()
def main(): def main():
apply_patches() apply_patches()
@@ -663,12 +821,15 @@ def main():
""" """
uninstall_theme() uninstall_theme()
else: else:
logger.info('Building temp tweaks file')
tweaks_temp() tweaks_temp()
logger.info('Inserting gnome-shell imports')
gnome_shell_version() gnome_shell_version()
logger.info('Building main theme')
install_theme() install_theme()
logger.info('Done!')
try: try:
main() main()
except Exception as e: except Exception as e:
print("Something went wrong when installing the theme:") logger.error("Something went wrong when installing the theme:", exc_info=e)
raise e