1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-08-02 03:28:28 -04:00
Files
DankMaterialShell/quickshell/scripts/gtk.sh
T
euletheia 99f452c999 feat(Themes): add support for GTK3 dynamic theming (#2523)
* feat(Themes): add support for GTK3 dynamic theming

Instead of overriding named colors of all GTK3 themes via the config
directory file, only override named colors for each variant of the
adw-gtk3 theme (light and dark), and let GTK3 apps change themes
depending on the value of org.gnome.desktop.interface color-scheme.

* fix(Themes): apply requested changes

- remove gtk3 override if it's a symlink
- remove call to gtk.sh with old arg 'assets-only'
- append key to dconf path to respect dconf write signature

* refactor(Themes): separate 'include'/'apply' logic for GTK3 dynamic theming

* revert(Themes): reset timer between color-scheme refresh

- rename DMS_ENABLE_GTK4_REFRESH to DMS_ENABLE_GTK_REFRESH
- revert a3fba8

* feat(Themes): add 'remove' mode to gtk.sh

Allow to remove all inclusions and overrides for GTK.

* fix(Themes): backup adw-gtk3 original css in 'apply' (not 'include')

* style(Themes): rename argument 'include' to 'patch' for clarity
2026-07-23 13:31:39 -04:00

252 lines
6.5 KiB
Bash
Executable File

#!/usr/bin/env bash
CONFIG_DIR="$1"
# apply: setup symlinks and config dirs
# patch: refresh overrides in adw-gtk3
# remove: remove all overrides
MODE="${2:-apply}"
IS_LIGHT="${3:-light}"
if [ -z "$CONFIG_DIR" ]; then
echo "Usage: $0 <config_dir> [apply|patch|remove] [is_light] [shell_dir]" >&2
exit 1
fi
get_adw_gtk3_dir() {
local variant="$1"
local name=""
[ "$variant" == "dark" ] && name="-$variant"
local candidates=(
"$HOME/.local/share/themes/adw-gtk3${name}/gtk-3.0"
"$HOME/.themes/adw-gtk3${name}/gtk-3.0"
"/usr/share/themes/adw-gtk3${name}/gtk-3.0"
"/usr/local/share/themes/adw-gtk3${name}/gtk-3.0"
)
local target=""
for c in "${candidates[@]}"; do
if [ -d "$c" ]; then
target="$c"
break
fi
done
echo "$target"
}
remove_gtk3_patch() {
local theme_dir="$1"
local css_variant="$2"
[ "$css_variant" != "-dark" ] && css_variant=""
sed -i '/\/\* BEGIN DMS OVERRIDE \*\//,/\/\* END DMS OVERRIDE \*\//d' "${theme_dir}/gtk${css_variant}.css"
return $?
}
remove_gtk3_colors() {
local config_dir="$1"
local gtk3_dir="$config_dir/gtk-3.0"
# remove global override
if [ ! -f "${gtk3_dir}/dank-colors.css" ]; then
echo "Nothing to remove at '${gtk3_dir}'"
else
if rm "${gtk3_dir}/dank-colors.css"; then
echo "Removed GTK3 override form '${gtk3_dir}'"
else
echo "Failed to removed GTK3 override from '${gtk3_dir}'"
fi
fi
# remove adw-gtk3 inclusions
for variant in light dark; do
local adw_gtk3_dir && adw_gtk3_dir=$(get_adw_gtk3_dir "$variant")
if [ -z "$adw_gtk3_dir" ]; then
echo "Error: No version of adw-gtk3 ${variant} was found" >&2
exit 1
fi
for css_variant in light dark; do
if remove_gtk3_patch "$adw_gtk3_dir" "$css_variant"; then
echo "Removed GTK colors patch from '${adw_gtk3_dir}' in '$css_variant' stylesheet"
else
echo "Failed to remove GTK colors patch from '${adw_gtk3_dir}' in '$css_variant' stylesheet" >&2
fi
done
done
}
do_patch() {
local theme_dir="$1"
local variant="$2"
local css_variant=""
[ "$variant" = "dark" ] && css_variant="-${variant}"
if {
remove_gtk3_patch "$theme_dir" "$css_variant"
cat "${gtk3_dir}/dank-colors.css" >>"${theme_dir}/gtk${css_variant}.css"
}; then
echo "Successfully patched '$theme_dir/gtk${css_variant}.css' with GTK '$variant' colors"
else
echo "Error: failed to patch '$theme_dir/gtk${css_variant}.css' with GTK '$variant' colors" >&2
exit 1
fi
}
patch_gtk3_colors() {
local config_dir="$1"
local is_light="$2"
# Include generated colors for current variant
local gtk3_dir="$config_dir/gtk-3.0"
local variant="light"
[ "$is_light" = "false" ] && variant="dark"
local adw_gtk3_dir && adw_gtk3_dir=$(get_adw_gtk3_dir "$variant")
if [ -z "$adw_gtk3_dir" ]; then
echo "Warning: No version of adw-gtk3 ${variant} was found" >&2
exit 1
fi
if [[ "$adw_gtk3_dir" =~ ^/usr ]]; then
echo "Warning: No user version of adw-gtk3 ${variant} was found." >&2
exit 1
fi
if [ ! -f "${gtk3_dir}/dank-colors.css" ]; then
echo "Error: GTK3 dank-colors.css not found at '${gtk3_dir}'" >&2
echo "Run matugen first to generate theme files" >&2
exit 1
fi
# NOTE : for adw-gtk3-dark gtk.css and gtk-dark.css are the same file
if [ "$variant" = "dark" ]; then
do_patch "$adw_gtk3_dir" "dark"
do_patch "$adw_gtk3_dir" "light"
do_patch "$(get_adw_gtk3_dir "light")" "dark"
else
do_patch "$adw_gtk3_dir" "light"
fi
}
apply_gtk3_colors() {
local config_dir="$1"
local gtk3_dir="$config_dir/gtk-3.0"
local gtk3_override="$gtk3_dir/gtk.css"
# If no adw-gtk3 or only system wide, use global override
local adw_gtk3 && adw_gtk3="$(get_adw_gtk3_dir)"
if [[ "$adw_gtk3" =~ ^/usr ]] || [[ -z "$adw_gtk3" ]]; then
echo "Warning: No user version of adw-gtk3 found" >&2
echo "Falling back on global css override" >&2
local dank_colors="$gtk3_dir/dank-colors.css"
if [ ! -f "$dank_colors" ]; then
echo "Error: dank-colors.css not found at $dank_colors" >&2
echo "Run matugen first to generate theme files" >&2
exit 1
fi
if [ -L "$gtk3_override" ]; then
rm "$gtk3_override"
elif [ -f "$gtk3_override" ]; then
mv "$gtk3_override" "$gtk3_override.backup.$(date +%s)"
echo "Backed up existing gtk.css"
fi
ln -s "dank-colors.css" "$gtk3_override"
echo "Created symlink: $gtk3_override -> dank-colors.css"
link_gtk3_assets "$gtk3_dir"
return
fi
# Else ensure there's no global override
if [ -L "$gtk3_override" ]; then
rm "$gtk3_override"
elif [ -f "$gtk3_override" ]; then
mv "$gtk3_override" "$gtk3_override.backup.$(date +%s)"
echo "Backed up and removed existing gtk.css"
fi
# Backup adw-gtk3 stylesheets
for variant in light dark; do
local adw_gtk3_dir && adw_gtk3_dir="$(get_adw_gtk3_dir "$variant")"
cp "$adw_gtk3_dir/gtk-3.0/gtk.css" "$adw_gtk3_dir/gtk-3.0/gtk.css.backup.$(date +%s)"
cp "$adw_gtk3_dir/gtk-3.0/gtk-dark.css" "$adw_gtk3_dir/gtk-3.0/gtk-dark.css.backup.$(date +%s)"
done
}
remove_gtk4_colors() {
local config_dir="$1"
local gtk4_dir="$config_dir/gtk-4.0"
local dank_colors="$gtk4_dir/dank-colors.css"
local gtk_css="$gtk4_dir/gtk.css"
if [ ! -f "$dank_colors" ]; then
echo "Nothing to remove in '$gtk4_dir'"
return
fi
rm "$dank_colors"
echo "Removed 'dank-colors.css' from '$gtk4_dir'"
local gtk4_import="@import url(\"dank-colors.css\");"
if [ -f "$gtk_css" ] && grep -q '^@import url.*dank-colors\.css.*);$' "$gtk_css"; then
sed -i "/$gtk4_import/d" "$gtk_css"
echo "Removed gtk4 import in '$gtk_css'"
fi
}
apply_gtk4_colors() {
local config_dir="$1"
local gtk4_dir="$config_dir/gtk-4.0"
local dank_colors="$gtk4_dir/dank-colors.css"
local gtk_css="$gtk4_dir/gtk.css"
local gtk4_import="@import url(\"dank-colors.css\");"
if [ ! -f "$dank_colors" ]; then
echo "Error: GTK4 dank-colors.css not found at $dank_colors" >&2
echo "Run matugen first to generate theme files" >&2
exit 1
fi
if [ -f "$gtk_css" ] && grep -q '^@import url.*dank-colors\.css.*);$' "$gtk_css"; then
echo "GTK4 import already exists"
return
fi
if [ -f "$gtk_css" ] && [ -s "$gtk_css" ]; then
sed -i "1i\\$gtk4_import" "$gtk_css"
else
echo "$gtk4_import" >"$gtk_css"
fi
echo "Updated GTK4 CSS import"
}
case "$MODE" in
patch)
patch_gtk3_colors "$CONFIG_DIR" "$IS_LIGHT"
echo "GTK3 colors patched successfully"
;;
remove)
remove_gtk3_colors "$CONFIG_DIR"
remove_gtk4_colors "$CONFIG_DIR"
;;
apply)
mkdir -p "$CONFIG_DIR/gtk-3.0" "$CONFIG_DIR/gtk-4.0"
apply_gtk3_colors "$CONFIG_DIR"
apply_gtk4_colors "$CONFIG_DIR"
echo "GTK colors applied successfully"
;;
*)
echo "Usage: $0 <config_dir> [apply|patch|remove] [is_light] [shell_dir]" >&2
exit 1
;;
esac