#!/usr/bin/env bash # shellcheck disable=SC1090 set -ue SRC_PATH=$(readlink -f "$(dirname "$0")") darker () { "${SRC_PATH}/scripts/darker.sh" "$@" } mix () { "${SRC_PATH}/scripts/mix.sh" "$@" } print_usage() { echo "Usage: $0 PATH_TO_PRESET" echo " [--output OUTPUT_THEME_NAME] [--hidpi (True|False)]" echo " [--make-opts (all|gtk3|gtk320)] [--path-list 'PATH PATH...']" echo echo "Options:" echo " PATH_TO_PRESET path to Oomox theme file" echo " -o NAME, --output NAME output theme name" echo " -t DESTINATION_PATH, --target-dir DESTINATION_PATH" echo " where the theme will be built" echo " -d (true|false), --hidpi (true|false) generate GTK+2 assets with 2x scaling" echo " -m (all|gtk3|gtk320), --make-opts (all|gtk3|gtk320)" echo " which variant of GTK+3 theme to build" echo " -p 'PATH PATH...', --path-list 'PATH PATH'" echo " custom paths to theme files" echo echo "Examples:" echo " $0 -o my-theme-name ../colors/retro/twg" echo " $0 -o my-theme-name --hidpi True ../colors/retro/clearlooks" echo " $0 -o my-theme-name -t ~/my_themes ../colors/retro/clearlooks" echo " $0 -p \"./gtk-2.0 ./gtk-3.0 ./gtk-3.20 ./Makefile\" ../colors/gnome-colors/shiki-noble" echo " $0 -p \"./gtk-2.0 ./gtk-3.0 ./gtk-3.20 ./Makefile\" -m gtk320 ../colors/monovedek/monovedek" exit 1 } while [[ $# -gt 0 ]] do case ${1} in -p|--path-list) CUSTOM_PATHLIST="${2}" shift ;; -o|--output) OUTPUT_THEME_NAME="${2}" shift ;; -t|--target-dir) DEST_PATH_ROOT="${2}" shift ;; -m|--make-opts) MAKE_OPTS="${2}" shift ;; -d|--hidpi) OPTION_GTK2_HIDPI="${2}" shift ;; *) if [[ "${1}" == -* ]] || [[ ${THEME-} ]]; then echo "unknown option ${1}" print_usage fi THEME="${1}" ;; esac shift done if [[ -z "${THEME:-}" ]] ; then print_usage fi PATHLIST=( './src/openbox-3' './src/assets' './src/gtk-2.0' './src/gtk-3.0' './src/gtk-3.20' './src/xfwm4' './src/metacity-1' './src/unity' 'Makefile' './src/index.theme' './src/qt5ct_palette.conf' './src/qt6ct_palette.conf' './src/cinnamon' ) if [ -n "${CUSTOM_PATHLIST:-}" ] ; then IFS=', ' read -r -a PATHLIST <<< "${CUSTOM_PATHLIST:-}" fi SVG_PREVIEWS=( './gtk-3.0/thumbnail.svg' './gtk-3.20/thumbnail.svg' './metacity-1/thumbnail.svg' ) MAKE_GTK3=0 EXPORT_QT5CT=0 for FILEPATH in "${PATHLIST[@]}"; do if [[ ${FILEPATH} == *Makefile* ]] ;then MAKE_GTK3=1 elif [[ ${FILEPATH} == *qt5ct* ]] ;then EXPORT_QT5CT=1 elif [[ ${FILEPATH} == *qt6ct* ]] ;then EXPORT_QT6CT=1 fi done MAKE_OPTS="${MAKE_OPTS-all}" OPTION_GTK2_HIDPI=$(echo "${OPTION_GTK2_HIDPI-False}" | tr '[:upper:]' '[:lower:]') if [[ ${THEME} == */* ]] || [[ ${THEME} == *.* ]] ; then source "$THEME" THEME=$(basename "${THEME}") else if [[ -f "$SRC_PATH/../colors/$THEME" ]] ; then source "$SRC_PATH/../colors/$THEME" else echo "Theme '${THEME}' not found" exit 1 fi fi if [[ $(date +"%m%d") = "0401" ]] && [[ -z "${no_jokes:-}" ]] ; then echo -e "\n\nError patching uxtheme.dll\n\n" ACCENT_BG=30a55c BG=ECE9D8 BTN_BG=f8f8f8 BTN_FG=000000 BTN_OUTLINE_OFFSET=-3 BTN_OUTLINE_WIDTH=1 FG=000000 GRADIENT=0.08 GTK3_GENERATE_DARK=False HDR_BTN_BG=f8f8f8 HDR_BTN_FG=000000 HDR_BG=ECE9D8 HDR_FG=000000 OUTLINE_WIDTH=1 ROUNDNESS=3 SEL_BG=3169C6 SEL_FG=FFFFFF SPACING=3 TXT_BG=FFFFFF TXT_FG=000000 WM_BORDER_FOCUS=3169C6 WM_BORDER_UNFOCUS=ECE9D8 fi # Migration: HDR_BG=${HDR_BG-$MENU_BG} HDR_FG=${HDR_FG-$MENU_FG} ACCENT_BG=${ACCENT_BG-$SEL_BG} HDR_BTN_BG=${HDR_BTN_BG-$BTN_BG} HDR_BTN_FG=${HDR_BTN_FG-$BTN_FG} WM_BORDER_FOCUS=${WM_BORDER_FOCUS-$SEL_BG} WM_BORDER_UNFOCUS=${WM_BORDER_UNFOCUS-$HDR_BG} GTK3_GENERATE_DARK=$(echo "${GTK3_GENERATE_DARK-True}" | tr '[:upper:]' '[:lower:]') UNITY_DEFAULT_LAUNCHER_STYLE=$(echo "${UNITY_DEFAULT_LAUNCHER_STYLE-False}" | tr '[:upper:]' '[:lower:]') SPACING=${SPACING-3} GRADIENT=${GRADIENT-0} ROUNDNESS=${ROUNDNESS-2} CINNAMON_OPACITY=${CINNAMON_OPACITY-1} ROUNDNESS_GTK2_HIDPI=$(( ROUNDNESS * 2 )) if [ "$(echo "$GRADIENT < 2" | bc)" ]; then GTK2_GRAD=$(echo "scale=2; $GRADIENT/2" | bc) else GTK2_GRAD=1 fi GTK2_GRAD_1=$(echo "1+$GTK2_GRAD" | bc) GTK2_GRAD_2=$(echo "1-$GTK2_GRAD" | bc) if expr "$GTK2_GRAD_1" : '-\?[0-9]\+$' >/dev/null; then GTK2_GRAD_TOP="$GTK2_GRAD_1".0 GTK2_GRAD_BOTTOM="$GTK2_GRAD_2".0 else GTK2_GRAD_TOP=$GTK2_GRAD_1 GTK2_GRAD_BOTTOM=$GTK2_GRAD_2 fi OUTLINE_WIDTH=${OUTLINE_WIDTH-1} BTN_OUTLINE_WIDTH=${BTN_OUTLINE_WIDTH-1} BTN_OUTLINE_OFFSET=${BTN_OUTLINE_OFFSET--3} INACTIVE_FG=$(mix "$FG" "$BG" 0.75) INACTIVE_HDR_FG=$(mix "$HDR_FG" "$HDR_BG" 0.75) INACTIVE_TXT_FG=$(mix "$TXT_FG" "$TXT_BG" 0.75) light_folder_base_fallback="$(darker "$SEL_BG" -10)" medium_base_fallback="$(darker "$SEL_BG" 37)" dark_stroke_fallback="$(darker "$SEL_BG" 50)" ICONS_LIGHT_FOLDER="${ICONS_LIGHT_FOLDER-$light_folder_base_fallback}" ICONS_LIGHT="${ICONS_LIGHT-$SEL_BG}" ICONS_MEDIUM="${ICONS_MEDIUM-$medium_base_fallback}" ICONS_DARK="${ICONS_DARK-$dark_stroke_fallback}" CARET1_FG="${CARET1_FG-$TXT_FG}" CARET2_FG="${CARET2_FG-$TXT_FG}" CARET_SIZE="${CARET_SIZE-0.04}" TERMINAL_BACKGROUND=${TERMINAL_BACKGROUND:-$SEL_FG} TERMINAL_COLOR4=${TERMINAL_COLOR4:-3f51b5} TERMINAL_COLOR9=${TERMINAL_COLOR9:-f44336} TERMINAL_COLOR10=${TERMINAL_COLOR10:-4caf50} TERMINAL_COLOR11=${TERMINAL_COLOR11:-ef6c00} TERMINAL_COLOR12=${TERMINAL_COLOR12:-03a9f4} OUTPUT_THEME_NAME="${OUTPUT_THEME_NAME-oomox-$THEME}" DEST_PATH_ROOT="${DEST_PATH_ROOT-$HOME/.themes}" DEST_PATH="$DEST_PATH_ROOT/${OUTPUT_THEME_NAME/\//-}" test "$SRC_PATH" = "$DEST_PATH" && echo "can't do that" && exit 1 rm -fr "$DEST_PATH" mkdir -p "$DEST_PATH" echo -e "\nBuilding theme at $DEST_PATH\n" cp -r "$SRC_PATH/src/index.theme" "$DEST_PATH" for FILEPATH in "${PATHLIST[@]}"; do cp -r "$SRC_PATH/$FILEPATH" "$DEST_PATH" done cd "$DEST_PATH" for FILEPATH in "${PATHLIST[@]}"; do find "$(echo "${FILEPATH}" | sed -e 's/src\///g' )" -type f -exec sed -i'' \ -e 's/%BG%/'"$BG"'/g' \ -e 's/%FG%/'"$FG"'/g' \ -e 's/%SEL_BG%/'"$SEL_BG"'/g' \ -e 's/%SEL_FG%/'"$SEL_FG"'/g' \ -e 's/%ACCENT_BG%/'"$ACCENT_BG"'/g' \ -e 's/%TXT_BG%/'"$TXT_BG"'/g' \ -e 's/%TXT_FG%/'"$TXT_FG"'/g' \ -e 's/%HDR_BG%/'"$HDR_BG"'/g' \ -e 's/%HDR_FG%/'"$HDR_FG"'/g' \ -e 's/%BTN_BG%/'"$BTN_BG"'/g' \ -e 's/%BTN_FG%/'"$BTN_FG"'/g' \ -e 's/%HDR_BTN_BG%/'"$HDR_BTN_BG"'/g' \ -e 's/%HDR_BTN_FG%/'"$HDR_BTN_FG"'/g' \ -e 's/%WM_BORDER_FOCUS%/'"$WM_BORDER_FOCUS"'/g' \ -e 's/%WM_BORDER_UNFOCUS%/'"$WM_BORDER_UNFOCUS"'/g' \ -e 's/%ROUNDNESS%/'"$ROUNDNESS"'/g' \ -e 's/%ROUNDNESS_GTK2_HIDPI%/'"$ROUNDNESS_GTK2_HIDPI"'/g' \ -e 's/%OUTLINE_WIDTH%/'"$OUTLINE_WIDTH"'/g' \ -e 's/%BTN_OUTLINE_WIDTH%/'"$BTN_OUTLINE_WIDTH"'/g' \ -e 's/%BTN_OUTLINE_OFFSET%/'"$BTN_OUTLINE_OFFSET"'/g' \ -e 's/%SPACING%/'"$SPACING"'/g' \ -e 's/%GRADIENT%/'"$GRADIENT"'/g' \ -e 's/%GTK2_GRAD_TOP%/'"$GTK2_GRAD_TOP"'/g' \ -e 's/%GTK2_GRAD_BOTTOM%/'"$GTK2_GRAD_BOTTOM"'/g' \ -e 's/%CINNAMON_OPACITY%/'"$CINNAMON_OPACITY"'/g' \ -e 's/%INACTIVE_FG%/'"$INACTIVE_FG"'/g' \ -e 's/%INACTIVE_TXT_FG%/'"$INACTIVE_TXT_FG"'/g' \ -e 's/%INACTIVE_HDR_FG%/'"$INACTIVE_HDR_FG"'/g' \ -e 's/%ICONS_DARK%/'"$ICONS_DARK"'/g' \ -e 's/%ICONS_MEDIUM%/'"$ICONS_MEDIUM"'/g' \ -e 's/%ICONS_LIGHT%/'"$ICONS_LIGHT"'/g' \ -e 's/%ICONS_LIGHT_FOLDER%/'"$ICONS_LIGHT_FOLDER"'/g' \ -e 's/%OUTPUT_THEME_NAME%/'"$OUTPUT_THEME_NAME"'/g' \ -e 's/%CARET1_FG%/'"$CARET1_FG"'/g' \ -e 's/%CARET2_FG%/'"$CARET2_FG"'/g' \ -e 's/%CARET_SIZE%/'"$CARET_SIZE"'/g' \ -e 's/%TERMINAL_BACKGROUND%/'"$TERMINAL_BACKGROUND"'/g' \ -e 's/%TERMINAL_COLOR4%/'"$TERMINAL_COLOR4"'/g' \ -e 's/%TERMINAL_COLOR9%/'"$TERMINAL_COLOR9"'/g' \ -e 's/%TERMINAL_COLOR10%/'"$TERMINAL_COLOR10"'/g' \ -e 's/%TERMINAL_COLOR11%/'"$TERMINAL_COLOR11"'/g' \ -e 's/%TERMINAL_COLOR12%/'"$TERMINAL_COLOR12"'/g' \ {} \; ; done if [[ ${GTK3_GENERATE_DARK} != "true" ]] ; then if [[ -f ./gtk-3.0/scss/gtk-dark.scss ]] ; then rm ./gtk-3.0/scss/gtk-dark.scss fi if [[ -f ./gtk-3.20/scss/gtk-dark.scss ]] ; then rm ./gtk-3.20/scss/gtk-dark.scss fi fi if [[ ${OPTION_GTK2_HIDPI} == "true" ]] ; then mv ./gtk-2.0/gtkrc.hidpi ./gtk-2.0/gtkrc fi if [[ ${UNITY_DEFAULT_LAUNCHER_STYLE} == "true" ]] ; then rm ./unity/launcher*.svg fi if [[ ${MAKE_GTK3} = 1 ]]; then # shellcheck disable=SC2086 env MAKEFLAGS= make --jobs="$(nproc)" ${MAKE_OPTS} fi config_home=${XDG_CONFIG_HOME:-} if [[ -z "${config_home}" ]] ; then config_home="${HOME}/.config" fi if [[ ${EXPORT_QT5CT} = 1 ]] ; then qt5ct_colors_dir="${config_home}/qt5ct/colors/" test -d "${qt5ct_colors_dir}" || mkdir -p "${qt5ct_colors_dir}" mv ./qt5ct_palette.conf "${qt5ct_colors_dir}/${OUTPUT_THEME_NAME}.conf" fi if [[ ${EXPORT_QT6CT} = 1 ]] ; then qt6ct_colors_dir="${config_home}/qt6ct/colors/" test -d "${qt6ct_colors_dir}" || mkdir -p "${qt6ct_colors_dir}" mv ./qt6ct_palette.conf "${qt6ct_colors_dir}/${OUTPUT_THEME_NAME}.conf" fi rm -fr ./Makefile gtk-3.*/scss for FILEPATH in "${SVG_PREVIEWS[@]}"; do # shellcheck disable=SC2001 rsvg-convert --format=png -o "$(sed -e 's/svg$/png/' <<< "${FILEPATH}")" "${FILEPATH}" rm "${FILEPATH}" done exit 0