change_color.sh
Bourne-Again shell script, ASCII text executable
1#!/usr/bin/env bash 2# shellcheck disable=SC1090 3#set -x 4set -ueo pipefail 5 6SRC_PATH="$(readlink -f "$(dirname "$0")")" 7 8darker() { 9"$SRC_PATH/scripts/darker.sh" "$@" 10} 11mix() { 12"$SRC_PATH/scripts/mix.sh" "$@" 13} 14is_dark() { 15hexinput="$(tr '[:lower:]' '[:upper:]' <<< "$1")" 16half_darker="$(darker "$hexinput" 88)" 17[[ "$half_darker" == "000000" ]] 18} 19 20 21print_usage() { 22echo "usage: $0 [-t TARGET_DIR] [-o OUTPUT_THEME_NAME] [-p PATH_LIST] PATH_TO_PRESET" 23echo "examples:" 24# shellcheck disable=SC2028 # This is meant to be usage text. 25echo " $0 -o my-theme-name <(echo -e \"ROUNDNESS=0\\nBG=d8d8d8\\nFG=101010\\nHDR_BG=3c3c3c\\nHDR_FG=e6e6e6\\nSEL_BG=ad7fa8\\nMATERIA_VIEW=ffffff\\nMATERIA_SURFACE=f5f5f5\\nMATERIA_STYLE_COMPACT=True\\n\")" 26echo " $0 -t ~/.themes ../colors/retro/twg" 27echo " $0 --hidpi True ../colors/retro/clearlooks" 28exit 1 29} 30 31 32while [[ "$#" -gt 0 ]]; do 33case "$1" in 34-p|--path-list) 35CUSTOM_PATHLIST="$2" 36shift 37;; 38-t|--target) 39TARGET_DIR="$2" 40shift 41;; 42-o|--output) 43OUTPUT_THEME_NAME="$2" 44shift 45;; 46-d|--hidpi) 47OPTION_GTK2_HIDPI="$2" 48shift 49;; 50-i|--inkscape) 51OPTION_FORCE_INKSCAPE="$2" 52shift 53;; 54*) 55if [[ "$1" == -* ]] || [[ "${THEME-}" ]]; then 56echo "unknown option $1" 57print_usage 58exit 2 59fi 60THEME="$1" 61;; 62esac 63shift 64done 65 66if [[ -z "${THEME:-}" ]]; then 67print_usage 68fi 69 70PATHLIST=( 71'./src/_theme-color.scss' 72'./src/chrome' 73'./src/cinnamon' 74'./src/cinnamon/assets' 75'./src/gnome-shell' 76'./src/gtk-2.0/assets.svg' 77'./src/gtk-2.0/assets-dark.svg' 78'./src/gtk-2.0/gtkrc' 79'./src/gtk-2.0/gtkrc-dark' 80'./src/gtk-2.0/gtkrc-light' 81'./src/gtk-3.0/assets.svg' 82'./src/metacity-1' 83'./src/unity' 84'./src/xfwm4' 85) 86if [[ -n "${CUSTOM_PATHLIST:-}" ]]; then 87IFS=', ' read -r -a PATHLIST <<< "${CUSTOM_PATHLIST:-}" 88fi 89 90EXPORT_QT5CT=0 91for FILEPATH in "${PATHLIST[@]}"; do 92if [[ "$FILEPATH" == *qt5ct* ]]; then 93EXPORT_QT5CT=1 94fi 95done 96 97OPTION_GTK2_HIDPI=$(tr '[:upper:]' '[:lower:]' <<< "${OPTION_GTK2_HIDPI-False}") 98OPTION_FORCE_INKSCAPE=$(tr '[:upper:]' '[:lower:]' <<< "${OPTION_FORCE_INKSCAPE-True}") 99 100 101if [[ "$THEME" == */* ]] || [[ "$THEME" == *.* ]]; then 102source "$THEME" 103THEME=$(basename "$THEME") 104else 105if [[ -f "$SRC_PATH/../colors/$THEME" ]]; then 106source "$SRC_PATH/../colors/$THEME" 107else 108echo "Theme '$THEME' not found" 109exit 1 110fi 111fi 112if [[ $(date +"%m%d") = "0401" ]] && grep -q "no-jokes" <<< "$*"; then 113echo -e "\\n\\nError patching uxtheme.dll\\n\\n" 114BG=C0C0C0 MATERIA_SURFACE=C0C0C0 FG=000000 MATERIA_PANEL_OPACITY=1 115HDR_BG=C0C0C0 HDR_FG=000000 SEL_BG=000080 MATERIA_VIEW=FFFFFF 116fi 117 118# Migration: 119HDR_BG=${HDR_BG-$MENU_BG} 120HDR_FG=${HDR_FG-$MENU_FG} 121MATERIA_VIEW=${MATERIA_VIEW-$TXT_BG} 122MATERIA_SURFACE=${MATERIA_SURFACE-$BTN_BG} 123GNOME_SHELL_PANEL_OPACITY=${GNOME_SHELL_PANEL_OPACITY-0.6} 124MATERIA_PANEL_OPACITY=${MATERIA_PANEL_OPACITY-$GNOME_SHELL_PANEL_OPACITY} 125 126MATERIA_STYLE_COMPACT=$(tr '[:upper:]' '[:lower:]' <<< "${MATERIA_STYLE_COMPACT-False}") 127MATERIA_COLOR_VARIANT=$(tr '[:upper:]' '[:lower:]' <<< "${MATERIA_COLOR_VARIANT:-}") 128 129SPACING=${SPACING-3} 130ROUNDNESS=${ROUNDNESS-4} 131# shellcheck disable=SC2034 # will this be used in the future? 132ROUNDNESS_GTK2_HIDPI=$(( ROUNDNESS * 2 )) 133MATERIA_PANEL_OPACITY=${MATERIA_PANEL_OPACITY-0.6} 134MATERIA_SELECTION_OPACITY=${MATERIA_SELECTION_OPACITY-0.32} 135 136INACTIVE_FG=$(mix "$FG" "$BG" 0.75) 137INACTIVE_MATERIA_VIEW=$(mix "$MATERIA_VIEW" "$BG" 0.60) 138 139TERMINAL_COLOR4=${TERMINAL_COLOR4:-1E88E5} 140TERMINAL_COLOR5=${TERMINAL_COLOR5:-E040FB} 141TERMINAL_COLOR9=${TERMINAL_COLOR9:-DD2C00} 142TERMINAL_COLOR10=${TERMINAL_COLOR10:-00C853} 143TERMINAL_COLOR11=${TERMINAL_COLOR11:-FF6D00} 144TERMINAL_COLOR12=${TERMINAL_COLOR12:-66BB6A} 145 146TARGET_DIR=${TARGET_DIR-$HOME/.themes} 147OUTPUT_THEME_NAME=${OUTPUT_THEME_NAME-oomox-$THEME} 148DEST_PATH="$TARGET_DIR/${OUTPUT_THEME_NAME/\//-}" 149 150if [[ "$SRC_PATH" == "$DEST_PATH" ]]; then 151echo "can't do that" 152exit 1 153fi 154 155 156tempdir=$(mktemp -d) 157post_clean_up() { 158rm -r "$tempdir" || : 159} 160trap post_clean_up EXIT SIGHUP SIGINT SIGTERM 161cp -r "$SRC_PATH/"* "$tempdir/" 162cd "$tempdir" 163 164 165# autodetection which color variant to use 166if [[ -z "$MATERIA_COLOR_VARIANT" ]]; then 167if is_dark "$BG"; then 168echo "== Dark background color detected. Setting color variant to dark." 169MATERIA_COLOR_VARIANT="dark" 170elif is_dark "$HDR_BG"; then 171echo "== Dark headerbar background color detected. Setting color variant to default." 172MATERIA_COLOR_VARIANT="default" 173else 174echo "== Light background color detected. Setting color variant to light." 175MATERIA_COLOR_VARIANT="light" 176fi 177fi 178 179 180echo "== Converting theme into template..." 181 182for FILEPATH in "${PATHLIST[@]}"; do 183if [[ "$MATERIA_COLOR_VARIANT" != "dark" ]]; then 184find "$FILEPATH" -type f -not -name '_color-palette.scss' -exec sed -i'' \ 185-e '/color-surface/{n;s/#ffffff/%MATERIA_SURFACE%/g}' \ 186-e '/color-base/{n;s/#ffffff/%MATERIA_VIEW%/g}' \ 187-e 's/#8ab4f8/%SEL_BG%/g' \ 188-e 's/#1967d2/%SEL_BG%/g' \ 189-e 's/#000000/%FG%/g' \ 190-e 's/#212121/%FG%/g' \ 191-e 's/#f9f9f9/%BG%/g' \ 192-e 's/#ffffff/%MATERIA_SURFACE%/g' \ 193-e 's/#ffffff/%MATERIA_VIEW%/g' \ 194-e 's/#424242/%HDR_BG%/g' \ 195-e 's/#303030/%HDR_BG2%/g' \ 196-e 's/#ffffff/%HDR_FG%/g' \ 197-e 's/#c1c1c1/%INACTIVE_FG%/g' \ 198-e 's/#f0f0f0/%HDR_BG%/g' \ 199-e 's/#ebebeb/%HDR_BG2%/g' \ 200-e 's/#1d1d1d/%HDR_FG%/g' \ 201-e 's/#565656/%INACTIVE_FG%/g' \ 202-e 's/Materia/%OUTPUT_THEME_NAME%/g' \ 203{} \; ; 204else 205find "$FILEPATH" -type f -not -name '_color-palette.scss' -exec sed -i'' \ 206-e 's/#8ab4f8/%SEL_BG%/g' \ 207-e 's/#ffffff/%FG%/g' \ 208-e 's/#eeeeee/%FG%/g' \ 209-e 's/#121212/%BG%/g' \ 210-e 's/#2e2e2e/%MATERIA_SURFACE%/g' \ 211-e 's/#1e1e1e/%MATERIA_VIEW%/g' \ 212-e 's/#272727/%HDR_BG%/g' \ 213-e 's/#1e1e1e/%HDR_BG2%/g' \ 214-e 's/#e4e4e4/%HDR_FG%/g' \ 215-e 's/#a7a7a7/%INACTIVE_FG%/g' \ 216-e 's/Materia/%OUTPUT_THEME_NAME%/g' \ 217{} \; ; 218fi 219done 220 221#Not implemented yet: 222#-e 's/%SPACING%/'"$SPACING"'/g' \ 223 224# shellcheck disable=SC2016 225sed -i -e 's/^$corner-radius: .px/$corner-radius: '"$ROUNDNESS"'px/g' ./src/_theme.scss 226 227if [[ "${DEBUG:-}" ]]; then 228echo "You can debug TEMP DIR: $tempdir, press [Enter] when finished"; read -r 229fi 230 231mv ./src/_theme-color.template.scss ./src/_theme-color.scss 232 233echo "== Filling the template with the new colorscheme..." 234for FILEPATH in "${PATHLIST[@]}"; do 235find "$FILEPATH" -type f -exec sed -i'' \ 236-e 's/%BG%/#'"$BG"'/g' \ 237-e 's/%BG2%/#'"$(darker $BG)"'/g' \ 238-e 's/%FG%/#'"$FG"'/g' \ 239-e 's/%SEL_BG%/#'"$SEL_BG"'/g' \ 240-e 's/%SEL_BG2%/#'"$(darker $SEL_BG -20)"'/g' \ 241-e 's/%MATERIA_VIEW%/#'"$MATERIA_VIEW"'/g' \ 242-e 's/%HDR_BG%/#'"$HDR_BG"'/g' \ 243-e 's/%HDR_BG2%/#'"$(darker $HDR_BG 10)"'/g' \ 244-e 's/%HDR_BG3%/#'"$(darker $HDR_BG 20)"'/g' \ 245-e 's/%HDR_FG%/#'"$HDR_FG"'/g' \ 246-e 's/%MATERIA_SURFACE%/#'"$MATERIA_SURFACE"'/g' \ 247-e 's/%SPACING%/'"$SPACING"'/g' \ 248-e 's/%INACTIVE_FG%/#'"$INACTIVE_FG"'/g' \ 249-e 's/%INACTIVE_MATERIA_VIEW%/#'"$INACTIVE_MATERIA_VIEW"'/g' \ 250-e 's/%TERMINAL_COLOR4%/#'"$TERMINAL_COLOR4"'/g' \ 251-e 's/%TERMINAL_COLOR5%/#'"$TERMINAL_COLOR5"'/g' \ 252-e 's/%TERMINAL_COLOR9%/#'"$TERMINAL_COLOR9"'/g' \ 253-e 's/%TERMINAL_COLOR10%/#'"$TERMINAL_COLOR10"'/g' \ 254-e 's/%TERMINAL_COLOR11%/#'"$TERMINAL_COLOR11"'/g' \ 255-e 's/%TERMINAL_COLOR12%/#'"$TERMINAL_COLOR12"'/g' \ 256-e 's/%MATERIA_SELECTION_OPACITY%/'"$MATERIA_SELECTION_OPACITY"'/g' \ 257-e 's/%MATERIA_PANEL_OPACITY%/'"$MATERIA_PANEL_OPACITY"'/g' \ 258-e 's/%OUTPUT_THEME_NAME%/'"$OUTPUT_THEME_NAME"'/g' \ 259{} \; ; 260done 261 262if [[ "$MATERIA_COLOR_VARIANT" == "default" ]]; then 263COLOR_VARIANT="default" 264COLOR_SUFFIX="" 265fi 266if [[ "$MATERIA_COLOR_VARIANT" == "light" ]]; then 267COLOR_VARIANT="light" 268COLOR_SUFFIX="-light" 269fi 270if [[ "$MATERIA_COLOR_VARIANT" == "dark" ]]; then 271COLOR_VARIANT="dark" 272COLOR_SUFFIX="-dark" 273fi 274if [[ "$OPTION_GTK2_HIDPI" == "true" ]]; then 275mv ./src/gtk-2.0/main.rc.hidpi ./src/gtk-2.0/main.rc 276fi 277if [[ "$EXPORT_QT5CT" = 1 ]]; then 278config_home=${XDG_CONFIG_HOME:-"$HOME/.config"} 279qt5ct_colors_dir="$config_home/qt5ct/colors/" 280test -d "$qt5ct_colors_dir" || mkdir -p "$qt5ct_colors_dir" 281mv ./src/qt5ct_palette.conf "$qt5ct_colors_dir/$OUTPUT_THEME_NAME.conf" 282fi 283 284if [[ "$MATERIA_STYLE_COMPACT" == "true" ]]; then 285SIZE_VARIANT="compact" 286SIZE_SUFFIX="-compact" 287else 288SIZE_VARIANT="default" 289SIZE_SUFFIX="" 290fi 291 292# NOTE we use the functions we already have in render-assets.sh 293echo "== Rendering GTK 2 assets..." 294if [[ "$MATERIA_COLOR_VARIANT" != "dark" ]]; then 295FORCE_INKSCAPE="$OPTION_FORCE_INKSCAPE" GTK2_HIDPI="$OPTION_GTK2_HIDPI" ./render-assets.sh gtk2-light 296else 297FORCE_INKSCAPE="$OPTION_FORCE_INKSCAPE" GTK2_HIDPI="$OPTION_GTK2_HIDPI" ./render-assets.sh gtk2-dark 298fi 299 300echo "== Rendering GTK 3 assets..." 301FORCE_INKSCAPE="$OPTION_FORCE_INKSCAPE" ./render-assets.sh gtk 302 303meson _build -Dprefix="$tempdir" -Dcolors="$COLOR_VARIANT" -Dsizes="$SIZE_VARIANT" 304meson install -C _build 305GENERATED_PATH="$tempdir/share/themes/Materia$COLOR_SUFFIX$SIZE_SUFFIX" 306if [[ -d "$DEST_PATH" ]]; then 307rm -r "$DEST_PATH" 308elif [[ ! -d "$(dirname "$DEST_PATH")" ]]; then 309mkdir -p "$(readlink -f "$(dirname "$DEST_PATH")")" 310fi 311mv "$GENERATED_PATH" "$DEST_PATH" 312 313 314echo 315echo "== SUCCESS" 316echo "== The theme was installed to '$DEST_PATH'" 317exit 0 318