1#! /usr/bin/env bash 2 3REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" 4SRC_DIR="${REPO_DIR}/src" 5 6ROOT_UID=0 7DEST_DIR= 8 9# Destination directory 10if [ "$UID" -eq "$ROOT_UID" ]; then 11 DEST_DIR="/usr/share/themes" 12else 13 DEST_DIR="$HOME/.themes" 14fi 15 16THEME_NAME=Mojave 17COLOR_VARIANTS=('-light' '-dark') 18 19if [[ "$(command -v gnome-shell)" ]]; then 20 SHELL_VERSION="$(gnome-shell --version | cut -d ' ' -f 3 | cut -d . -f -1)" 21 if [[ "${SHELL_VERSION:-}" -ge "40" ]]; then 22 GS_VERSION="new" 23 else 24 GS_VERSION="old" 25 fi 26 else 27 echo "'gnome-shell' not found, using styles for last gnome-shell version available." 28 GS_VERSION="new" 29fi 30 31usage() { 32 printf "%s\n" "Usage: $0 [OPTIONS...]" 33 printf "\n%s\n" "OPTIONS:" 34 printf " %-25s%s\n" "-d, --dest DIR" "Specify theme destination directory (Default: ${DEST_DIR})" 35 printf " %-25s%s\n" "-n, --name NAME" "Specify theme name (Default: ${THEME_NAME})" 36 printf " %-25s%s\n" "-c, --color VARIANTS" "Specify theme color variant(s) [light|dark] (Default: All variants)" 37 printf " %-25s%s\n" "-g, --gdm" "Install GDM theme, this option need root user authority! please run this with sudo" 38 printf " %-25s%s\n" "-r, --revert" "revert GDM theme, this option need root user authority! please run this with sudo" 39 printf " %-25s%s\n" "-h, --help" "Show this help" 40} 41 42install() { 43 local dest="${1}" 44 local name="${2}" 45 local color="${3}" 46 47 [[ "${color}" == '-light' ]] && local ELSE_LIGHT="${color}" 48 [[ "${color}" == '-dark' ]] && local ELSE_DARK="${color}" 49 50 local THEME_DIR="${1}/${2}${3}" 51 52 [[ -d "${THEME_DIR}" ]] && rm -rf "${THEME_DIR}" 53 54 echo "Installing '${THEME_DIR}'..." 55 56 mkdir -p "${THEME_DIR}" 57 cp -r "${REPO_DIR}/COPYING" "${THEME_DIR}" 58 59 echo "[Desktop Entry]" >> "${THEME_DIR}/index.theme" 60 echo "Type=X-GNOME-Metatheme" >> "${THEME_DIR}/index.theme" 61 echo "Name=${name}${color}" >> "${THEME_DIR}/index.theme" 62 echo "Comment=An Stylish Gtk+ theme based on Elegant Design" >> "${THEME_DIR}/index.theme" 63 echo "Encoding=UTF-8" >> "${THEME_DIR}/index.theme" 64 echo "" >> "${THEME_DIR}/index.theme" 65 echo "[X-GNOME-Metatheme]" >> "${THEME_DIR}/index.theme" 66 echo "GtkTheme=${name}${color}" >> "${THEME_DIR}/index.theme" 67 echo "MetacityTheme=${name}${color}" >> "${THEME_DIR}/index.theme" 68 echo "IconTheme=Adwaita" >> "${THEME_DIR}/index.theme" 69 echo "CursorTheme=Adwaita" >> "${THEME_DIR}/index.theme" 70 echo "ButtonLayout=close,minimize,maximize:menu" >> "${THEME_DIR}/index.theme" 71 72 mkdir -p "${THEME_DIR}/gnome-shell" 73 74 if [[ "${GS_VERSION:-}" == 'new' ]]; then 75 cp -r "${SRC_DIR}/main/gnome-shell/shell-40-0/gnome-shell${color}.css" "${THEME_DIR}/gnome-shell/gnome-shell.css" 76 else 77 cp -r "${SRC_DIR}/main/gnome-shell/shell-3-28/gnome-shell${color}.css" "${THEME_DIR}/gnome-shell/gnome-shell.css" 78 fi 79 80 cp -r "${SRC_DIR}/assets/gnome-shell/common-assets" "${THEME_DIR}/gnome-shell/assets" 81 cp -r "${SRC_DIR}/assets/gnome-shell/assets${color}/"*'.svg' "${THEME_DIR}/gnome-shell/assets" 82 cp -r "${SRC_DIR}/assets/gnome-shell/assets${color}/background.png" "${THEME_DIR}/gnome-shell/assets" 83 cp -r "${SRC_DIR}/assets/gnome-shell/activities${color}/activities.svg" "${THEME_DIR}/gnome-shell/assets/activities.svg" 84 cp -r "${SRC_DIR}/assets/gnome-shell/activities-dark/activities${icon}.svg" "${THEME_DIR}/gnome-shell/assets/activities-white.svg" 85 cd "${THEME_DIR}/gnome-shell" 86 mv -f assets/no-events.svg no-events.svg 87 mv -f assets/process-working.svg process-working.svg 88 mv -f assets/no-notifications.svg no-notifications.svg 89 90 mkdir -p "${THEME_DIR}/gtk-2.0" 91 cp -r "${SRC_DIR}/main/gtk-2.0/gtkrc${color}" "${THEME_DIR}/gtk-2.0/gtkrc" 92 cp -r "${SRC_DIR}/main/gtk-2.0/menubar-toolbar${color}.rc" "${THEME_DIR}/gtk-2.0/menubar-toolbar.rc" 93 cp -r "${SRC_DIR}/main/gtk-2.0/common/"*'.rc' "${THEME_DIR}/gtk-2.0" 94 cp -r "${SRC_DIR}/assets/gtk-2.0/assets${color}" "${THEME_DIR}/gtk-2.0/assets" 95 96 mkdir -p "${THEME_DIR}/gtk-3.0" 97 cp -r "${SRC_DIR}/assets/gtk/common-assets/assets" "${THEME_DIR}/gtk-3.0" 98 cp -r "${SRC_DIR}/assets/gtk/windows-assets/titlebutton" "${THEME_DIR}/gtk-3.0/windows-assets" 99 cp -r "${SRC_DIR}/assets/gtk/thumbnails/thumbnail${color}.png" "${THEME_DIR}/gtk-3.0/thumbnail.png" 100 cp -r "${SRC_DIR}/main/gtk-3.0/gtk-dark.css" "${THEME_DIR}/gtk-3.0/gtk-dark.css" 101 102 if [[ "${color}" == '-light' ]]; then 103 cp -r "${SRC_DIR}/main/gtk-3.0/gtk-light.css" "${THEME_DIR}/gtk-3.0/gtk.css" 104 else 105 cp -r "${SRC_DIR}/main/gtk-3.0/gtk-dark.css" "${THEME_DIR}/gtk-3.0/gtk.css" 106 fi 107 108 mkdir -p "${THEME_DIR}/gtk-4.0" 109 cp -r "${SRC_DIR}/assets/gtk/common-assets/assets" "${THEME_DIR}/gtk-4.0" 110 cp -r "${SRC_DIR}/assets/gtk/windows-assets/titlebutton" "${THEME_DIR}/gtk-4.0/windows-assets" 111 cp -r "${SRC_DIR}/assets/gtk/thumbnails/thumbnail${color}.png" "${THEME_DIR}/gtk-4.0/thumbnail.png" 112 cp -r "${SRC_DIR}/main/gtk-4.0/gtk-dark.css" "${THEME_DIR}/gtk-4.0/gtk-dark.css" 113 114 if [[ "${color}" == '-light' ]]; then 115 cp -r "${SRC_DIR}/main/gtk-4.0/gtk-light.css" "${THEME_DIR}/gtk-4.0/gtk.css" 116 else 117 cp -r "${SRC_DIR}/main/gtk-4.0/gtk-dark.css" "${THEME_DIR}/gtk-4.0/gtk.css" 118 fi 119 120 mkdir -p "${THEME_DIR}/metacity-1" 121 cp -r "${SRC_DIR}/main/metacity-1/metacity-theme${color}.xml" "${THEME_DIR}/metacity-1/metacity-theme-1.xml" 122 cp -r "${SRC_DIR}/main/metacity-1/metacity-theme-3.xml" "${THEME_DIR}/metacity-1" 123 cp -r "${SRC_DIR}/assets/metacity-1/assets/"*'.png' "${THEME_DIR}/metacity-1" 124 cp -r "${SRC_DIR}/assets/metacity-1/thumbnail${color}.png" "${THEME_DIR}/metacity-1/thumbnail.png" 125 cd "${THEME_DIR}/metacity-1" && ln -s metacity-theme-1.xml metacity-theme-2.xml 126 127 mkdir -p "${THEME_DIR}/xfwm4" 128 cp -r "${SRC_DIR}/assets/xfwm4/assets${color}/"*'.png' "${THEME_DIR}/xfwm4" 129 cp -r "${SRC_DIR}/main/xfwm4/themerc${color}" "${THEME_DIR}/xfwm4/themerc" 130 131 mkdir -p "${THEME_DIR}/cinnamon" 132 cp -r "${SRC_DIR}/main/cinnamon/cinnamon${color}.css" "${THEME_DIR}/cinnamon/cinnamon.css" 133 cp -r "${SRC_DIR}/assets/cinnamon/common-assets" "${THEME_DIR}/cinnamon/assets" 134 cp -r "${SRC_DIR}/assets/cinnamon/assets${color}/"*.'svg' "${THEME_DIR}/cinnamon/assets" 135 cp -r "${SRC_DIR}/assets/cinnamon/thumbnails/thumbnail${color}.png" "${THEME_DIR}/cinnamon/thumbnail.png" 136 137 mkdir -p "${THEME_DIR}/plank" 138 cp -r "${SRC_DIR}/other/plank/${name}${color}/"*'.theme' "${THEME_DIR}/plank" 139} 140 141# Backup and install files related to GDM theme 142 143GS_THEME_FILE="/usr/share/gnome-shell/gnome-shell-theme.gresource" 144SHELL_THEME_FOLDER="/usr/share/gnome-shell/theme" 145ETC_THEME_FOLDER="/etc/alternatives" 146ETC_THEME_FILE="/etc/alternatives/gdm3.css" 147UBUNTU_THEME_FILE="/usr/share/gnome-shell/theme/ubuntu.css" 148UBUNTU_NEW_THEME_FILE="/usr/share/gnome-shell/theme/gnome-shell.css" 149 150install_gdm() { 151 local GDM_THEME_DIR="${1}/${2}${3}" 152 153 echo 154 echo "Installing ${2}${3} gdm theme..." 155 156 if [[ -f "$GS_THEME_FILE" ]] && command -v glib-compile-resources >/dev/null ; then 157 echo "Installing '$GS_THEME_FILE'..." 158 cp -an "$GS_THEME_FILE" "$GS_THEME_FILE.bak" 159 glib-compile-resources \ 160 --sourcedir="$GDM_THEME_DIR/gnome-shell" \ 161 --target="$GS_THEME_FILE" \ 162 "${SRC_DIR}/main/gnome-shell/gnome-shell-theme.gresource.xml" 163 fi 164 165 if [[ -f "$UBUNTU_THEME_FILE" && -f "$GS_THEME_FILE.bak" ]]; then 166 echo "Installing '$UBUNTU_THEME_FILE'..." 167 cp -an "$UBUNTU_THEME_FILE" "$UBUNTU_THEME_FILE.bak" 168 # rm -rf "$GS_THEME_FILE" 169 # mv "$GS_THEME_FILE.bak" "$GS_THEME_FILE" 170 cp -af "$GDM_THEME_DIR/gnome-shell/gnome-shell.css" "$UBUNTU_THEME_FILE" 171 fi 172 173 if [[ -f "$UBUNTU_NEW_THEME_FILE" && -f "$GS_THEME_FILE.bak" ]]; then 174 echo "Installing '$UBUNTU_NEW_THEME_FILE'..." 175 cp -an "$UBUNTU_NEW_THEME_FILE" "$UBUNTU_NEW_THEME_FILE.bak" 176 cp -af "$GDM_THEME_DIR"/gnome-shell/* "$SHELL_THEME_FOLDER" 177 fi 178 179 if [[ -f "$ETC_THEME_FILE" && -f "$GS_THEME_FILE.bak" ]]; then 180 echo "Installing Ubuntu gnome-shell theme..." 181 cp -an "$ETC_THEME_FILE" "$ETC_THEME_FILE.bak" 182 # rm -rf "$ETC_THEME_FILE" "$GS_THEME_FILE" 183 # mv "$GS_THEME_FILE.bak" "$GS_THEME_FILE" 184 [[ -d "$SHELL_THEME_FOLDER/Mojave" ]] && rm -rf "$SHELL_THEME_FOLDER/Mojave" 185 cp -r "$GDM_THEME_DIR/gnome-shell" "$SHELL_THEME_FOLDER/Mojave" 186 cd "$ETC_THEME_FOLDER" 187 ln -s "$SHELL_THEME_FOLDER/Mojave/gnome-shell.css" gdm3.css 188 fi 189} 190 191revert_gdm() { 192 if [[ -f "$GS_THEME_FILE.bak" ]]; then 193 echo "reverting '$GS_THEME_FILE'..." 194 rm -rf "$GS_THEME_FILE" 195 mv "$GS_THEME_FILE.bak" "$GS_THEME_FILE" 196 fi 197 198 if [[ -f "$UBUNTU_THEME_FILE.bak" ]]; then 199 echo "reverting '$UBUNTU_THEME_FILE'..." 200 rm -rf "$UBUNTU_THEME_FILE" 201 mv "$UBUNTU_THEME_FILE.bak" "$UBUNTU_THEME_FILE" 202 fi 203 204 if [[ -f "$UBUNTU_NEW_THEME_FILE.bak" ]]; then 205 echo "reverting '$UBUNTU_NEW_THEME_FILE'..." 206 rm -rf "$UBUNTU_NEW_THEME_FILE" "$SHELL_THEME_FOLDER"/{assets,no-events.svg,process-working.svg,no-notifications.svg} 207 mv "$UBUNTU_NEW_THEME_FILE.bak" "$UBUNTU_NEW_THEME_FILE" 208 fi 209 210 if [[ -f "$ETC_THEME_FILE.bak" ]]; then 211 echo "reverting Ubuntu gnome-shell theme..." 212 rm -rf "$ETC_THEME_FILE" 213 mv "$ETC_THEME_FILE.bak" "$ETC_THEME_FILE" 214 [[ -d "$SHELL_THEME_FOLDER/Mojave" ]] && rm -rf "$SHELL_THEME_FOLDER/Mojave" 215 fi 216} 217 218while [[ $# -gt 0 ]]; do 219 case "${1}" in 220 -d|--dest) 221 dest="${2}" 222 if [[ ! -d "${dest}" ]]; then 223 echo "Destination directory does not exist. Let's make a new one..." 224 mkdir -p ${dest} 225 fi 226 shift 2 227 ;; 228 -n|--name) 229 name="${2}" 230 shift 2 231 ;; 232 -g|--gdm) 233 gdm='true' 234 shift 1 235 ;; 236 -r|--revert) 237 revert='true' 238 shift 1 239 ;; 240 -c|--color) 241 shift 242 for color in "${@}"; do 243 case "${color}" in 244 light) 245 colors+=("${COLOR_VARIANTS[0]}") 246 shift 247 ;; 248 dark) 249 colors+=("${COLOR_VARIANTS[1]}") 250 shift 251 ;; 252 -*|--*) 253 break 254 ;; 255 *) 256 echo "ERROR: Unrecognized color variant '$1'." 257 echo "Try '$0 --help' for more information." 258 exit 1 259 ;; 260 esac 261 done 262 ;; 263 -h|--help) 264 usage 265 exit 0 266 ;; 267 *) 268 echo "ERROR: Unrecognized installation option '$1'." 269 echo "Try '$0 --help' for more information." 270 exit 1 271 ;; 272 esac 273done 274 275# Parse scss to css 276for color in "${colors[@]-${COLOR_VARIANTS[@]}}"; do 277 sassc $SASSC_OPT src/main/gtk-3.0/gtk${color}.{scss,css} 278 echo "==> Generating the 3.0 gtk${color}.css..." 279 sassc $SASSC_OPT src/main/gtk-4.0/gtk${color}.{scss,css} 280 echo "==> Generating the 4.0 gtk${color}.css..." 281 sassc $SASSC_OPT src/main/cinnamon/cinnamon${color}.{scss,css} 282 echo "==> Generating the cinnamon${color}.css..." 283 sassc $SASSC_OPT src/main/gnome-shell/shell-3-28/gnome-shell${color}.{scss,css} 284 echo "==> Generating the 3.28 gnome-shell${color}.css..." 285 sassc $SASSC_OPT src/main/gnome-shell/shell-40-0/gnome-shell${color}.{scss,css} 286 echo "==> Generating the 40.0 gnome-shell${color}.css..." 287done 288 289sassc $SASSC_OPT src/other/dash-to-dock/stylesheet.{scss,css} 290echo "==> Generating dash-to-dock stylesheet.css..." 291sassc $SASSC_OPT src/other/dash-to-dock/stylesheet-dark.{scss,css} 292echo "==> Generating dash-to-dock stylesheet-dark.css..." 293 294install_theme() { 295 for color in "${colors[@]-${COLOR_VARIANTS[@]}}"; do 296 install "${dest:-${DEST_DIR}}" "${name:-${THEME_NAME}}" "${color}" 297 done 298} 299 300if [[ "${gdm:-}" != 'true' && "${revert:-}" != 'true' ]]; then 301 install_theme 302fi 303 304if [[ "${gdm:-}" == 'true' && "${revert:-}" != 'true' && "$UID" -eq "$ROOT_UID" ]]; then 305 install_theme && install_gdm "${dest:-${DEST_DIR}}" "${name:-${THEME_NAME}}" "${color}" 306fi 307 308if [[ "${gdm:-}" != 'true' && "${revert:-}" == 'true' && "$UID" -eq "$ROOT_UID" ]]; then 309 revert_gdm 310fi 311 312echo 313echo Done. 314