diff --git a/install.sh b/install.sh new file mode 100644 index 0000000..fd625ab --- /dev/null +++ b/install.sh @@ -0,0 +1,277 @@ +#!/bin/bash +#set -ueo pipefail +#set -x + +REPO_DIR=$(cd $(dirname $0) && pwd) +SRC_DIR=${REPO_DIR}/src + +DEST_DIR=/usr/share/themes +THEME_NAME=Sierra +COMPACT_VARIANTS=('' '-compact') +TRANS_VARIANTS=('' '-solid') +COLOR_VARIANTS=( '-light' '-dark') +THIN_VARIANTS=( '' '-thin') + + +usage() { + printf "%s\n" "Usage: $0 [OPTIONS...]" + printf "\n%s\n" "OPTIONS:" + printf " %-25s%s\n" "-d, --dest DIR" "Specify theme destination directory (Default: ${DEST_DIR})" + printf " %-25s%s\n" "-n, --name NAME" "Specify theme name (Default: ${THEME_NAME})" + printf " %-25s%s\n" "-t, --trans VARIANTS..." "Specify theme trans variant(s) [solid] (Default: All variants)" + printf " %-25s%s\n" "-c, --color VARIANTS..." "Specify theme color variant(s) [light|dark] (Default: All variants)" + printf " %-25s%s\n" "-i, --thin VARIANTS..." "Specify theme trans variant(s) [thin] (Default: All variants)" + printf " %-25s%s\n" "-s, --compact VARIANT" "Specify theme compact variant [compact] (Default: All variants)" + printf " %-25s%s\n" "-g, --gdm" "Install GDM theme" + printf " %-25s%s\n" "-h, --help" "Show this help" + printf "\n%s\n" "INSTALLATION EXAMPLES:" + printf "%s\n" "Install all theme variants into ~/.themes" + printf " %s\n" "$0 --dest ~/.themes" + printf "%s\n" "Install all theme variants into ~/.themes including GDM theme" + printf " %s\n" "$0 --dest ~/.themes --gdm" + printf "%s\n" "Install standard theme variant only" + printf " %s\n" "$0 --color standard --size standard" + printf "%s\n" "Install specific theme variants with different name into ~/.themes" + printf " %s\n" "$0 --dest ~/.themes --name MyTheme --color light dark --size compact" +} + +install() { + local dest=${1} + local name=${2} + local compact=${3} + local color=${4} + local trans=${5} + local thin=${6} + + [[ ${color} == '-light' ]] && local ELSE_LIGHT=${color} + [[ ${color} == '-dark' ]] && local ELSE_DARK=${color} + + local THEME_DIR=${dest}/${name}${compact}${color}${trans}${thin} + + [[ -d ${THEME_DIR} ]] && rm -rf ${THEME_DIR} + + echo "Installing '${THEME_DIR}'..." + + mkdir -p ${THEME_DIR} + cp -r ${REPO_DIR}/COPYING ${THEME_DIR} + # Install index.theme + echo "[Desktop Entry]" >> ${THEME_DIR}/index.theme + echo "Type=X-GNOME-Metatheme" >> ${THEME_DIR}/index.theme + echo "Name=Sierra${compact}${color}${trans}${thin}" >> ${THEME_DIR}/index.theme + echo "Comment=An Stylish Gtk+ theme based on Elegant Design" >> ${THEME_DIR}/index.theme + echo "Encoding=UTF-8" >> ${THEME_DIR}/index.theme + echo "" >> ${THEME_DIR}/index.theme + echo "[X-GNOME-Metatheme]" >> ${THEME_DIR}/index.theme + echo "GtkTheme=Sierra${compact}${color}${trans}${thin}" >> ${THEME_DIR}/index.theme + echo "MetacityTheme=Sierra${compact}${color}${trans}${thin}" >> ${THEME_DIR}/index.theme + echo "IconTheme=Adwaita" >> ${THEME_DIR}/index.theme + echo "CursorTheme=Adwaita" >> ${THEME_DIR}/index.theme + echo "ButtonLayout=close,minimize,maximize:menu" >> ${THEME_DIR}/index.theme + + mkdir -p ${THEME_DIR}/gnome-shell + cd ${SRC_DIR}/gnome-shell + cp -r ${SRC_DIR}/gnome-shell/gnome-shell${color}${trans}.css ${THEME_DIR}/gnome-shell/gnome-shell.css + cp -r ${SRC_DIR}/gnome-shell/{extensions,message-indicator-symbolic.svg,pad-osd.css} ${THEME_DIR}/gnome-shell + cp -r ${SRC_DIR}/gnome-shell/gnome-shell-theme.gresource.xml ${THEME_DIR}/gnome-shell + mkdir -p ${THEME_DIR}/gnome-shell/assets + cd ${SRC_DIR}/gnome-shell/assets + cp -r ${SRC_DIR}/gnome-shell/assets/{dash,dash-placeholder.svg,noise-texture.svg,startup.png,process-working.svg,window-close.svg,window-close-active.svg,toggle-on.svg,more-results.svg,checkbox.svg,key-enter.svg,key-shift-latched-uppercase.svg,key-shift-uppercase.svg} ${THEME_DIR}/gnome-shell/assets + cp -r ${SRC_DIR}/gnome-shell/assets/activities${color}.svg ${THEME_DIR}/gnome-shell/assets/activities.svg + cp -r ${SRC_DIR}/gnome-shell/assets/no-events${color}.svg ${THEME_DIR}/gnome-shell/assets/no-events.svg + cp -r ${SRC_DIR}/gnome-shell/assets/no-notifications${color}.svg ${THEME_DIR}/gnome-shell/assets/no-notifications.svg + cp -r ${SRC_DIR}/gnome-shell/assets/calendar-arrow-left${color}.svg ${THEME_DIR}/gnome-shell/assets/calendar-arrow-left.svg + cp -r ${SRC_DIR}/gnome-shell/assets/calendar-arrow-right${color}.svg ${THEME_DIR}/gnome-shell/assets/calendar-arrow-right.svg + cp -r ${SRC_DIR}/gnome-shell/assets/checkbox-off${color}.svg ${THEME_DIR}/gnome-shell/assets/checkbox-off.svg + cp -r ${SRC_DIR}/gnome-shell/assets/close${color}.svg ${THEME_DIR}/gnome-shell/assets/close.svg + cp -r ${SRC_DIR}/gnome-shell/assets/toggle-off${color}.svg ${THEME_DIR}/gnome-shell/assets/toggle-off.svg + cp -r ${SRC_DIR}/gnome-shell/assets/key-hide${color}.svg ${THEME_DIR}/gnome-shell/assets/key-hide.svg + cp -r ${SRC_DIR}/gnome-shell/assets/key-layout${color}.svg ${THEME_DIR}/gnome-shell/assets/key-layout.svg + cp -r ${SRC_DIR}/gnome-shell/assets/key-shift${color}.svg ${THEME_DIR}/gnome-shell/assets/key-shift.svg + cd ${THEME_DIR}/gnome-shell + ln -s assets/no-events.svg no-events.svg + ln -s assets/process-working.svg process-working.svg + ln -s assets/no-notifications.svg no-notifications.svg + + mkdir -p ${THEME_DIR}/gtk-2.0 + cd ${SRC_DIR}/gtk-2.0 + cp -r ${SRC_DIR}/gtk-2.0/gtkrc${color} ${THEME_DIR}/gtk-2.0/gtkrc + cp -r ${SRC_DIR}/gtk-2.0/assets${color} ${THEME_DIR}/gtk-2.0/assets + cp -r ${SRC_DIR}/gtk-2.0/{apps.rc,main.rc,panel.rc,xfce-notify.rc} ${THEME_DIR}/gtk-2.0 + cp -r ${SRC_DIR}/gtk-2.0/menubar-toolbar${color}.rc ${THEME_DIR}/gtk-2.0/menubar-toolbar.rc + + mkdir -p ${THEME_DIR}/gtk-3.0 + cd ${SRC_DIR}/gtk-3.0 + cp -r ${SRC_DIR}/gtk-3.0/assets ${THEME_DIR}/gtk-3.0 + cp -r ${SRC_DIR}/gtk-3.0/thumbnail${compact}${color}.png ${THEME_DIR}/gtk-3.0/thumbnail.png + cp -r ${SRC_DIR}/gtk-3.0/gtk${compact}${color}${trans}${thin}.css ${THEME_DIR}/gtk-3.0/gtk.css + cp -r ${SRC_DIR}/gtk-3.0/gtk${compact}-dark${trans}${thin}.css ${THEME_DIR}/gtk-3.0/gtk-dark.css + + mkdir -p ${THEME_DIR}/metacity-1 + cd ${SRC_DIR}/metacity-1 + cp -r ${SRC_DIR}/metacity-1/metacity-theme${color}.xml ${THEME_DIR}/metacity-1/metacity-theme.xml + cp -r ${SRC_DIR}/metacity-1/{*.png,*.svg} ${THEME_DIR}/metacity-1 + cd ${THEME_DIR}/metacity-1 + ln -s metacity-theme.xml metacity-theme-1.xml + ln -s metacity-theme.xml metacity-theme-2.xml + ln -s metacity-theme.xml metacity-theme-3.xml + + mkdir -p ${THEME_DIR}/unity + cd ${SRC_DIR} + cp -r ${SRC_DIR}/unity ${THEME_DIR} + + mkdir -p ${THEME_DIR}/xfwm4 + cd ${SRC_DIR}/xfwm4 + cp -r ${SRC_DIR}/xfwm4/assets${color}/*.png ${THEME_DIR}/xfwm4 + cp -r ${SRC_DIR}/xfwm4/themerc${color} ${THEME_DIR}/xfwm4/themerc +} +install_gdm() { + local THEME_DIR=${1}/${2}${3}${4}${5}${6} + # bakup and install files related to gdm theme + if [[ ! -f /usr/share/gnome-shell/gnome-shell-theme.gresource.bak ]]; then + mv -f /usr/share/gnome-shell/gnome-shell-theme.gresource \ + /usr/share/gnome-shell/gnome-shell-theme.gresource.bak + fi + if [[ -f /usr/share/gnome-shell/theme/ubuntu.css ]]; then + if [[ ! -f /usr/share/gnome-shell/theme/ubuntu.css.bak ]]; then + mv -f /usr/share/gnome-shell/theme/ubuntu.css \ + /usr/share/gnome-shell/theme/ubuntu.css.bak + fi + cp -af ${THEME_DIR}/gnome-shell/gnome-shell.css \ + /usr/share/gnome-shell/theme/ubuntu.css + fi + glib-compile-resources \ + --sourcedir=${THEME_DIR}/gnome-shell \ + --target=/usr/share/gnome-shell/gnome-shell-theme.gresource \ + ${THEME_DIR}/gnome-shell/gnome-shell-theme.gresource.xml + echo "Installing 'gnome-shell-theme.gresource'..." +} +while [[ $# -gt 0 ]]; do + case "${1}" in + -d|--dest) + dest="${2}" + if [[ ! -d "${dest}" ]]; then + echo "ERROR: Destination directory does not exist." + exit 1 + fi + shift 2 + ;; + -n|--name) + name="${2}" + shift 2 + ;; + -g|--gdm) + gdm=true + shift 1 + ;; + -t|--trans) + shift + for variant in "${@}"; do + case "${variant}" in + solid) + transs+=("${TRANS_VARIANTS[1]}") + shift + ;; + -*|--*) + break + ;; + *) + echo "ERROR: Unrecognized trans variant '$1'." + echo "Try '$0 --help' for more information." + exit 1 + ;; + esac + done + ;; + -c|--color) + shift + for variant in "${@}"; do + case "${variant}" in + light) + colors+=("${COLOR_VARIANTS[1]}") + shift + ;; + dark) + colors+=("${COLOR_VARIANTS[2]}") + shift + ;; + -*|--*) + break + ;; + *) + echo "ERROR: Unrecognized color variant '$1'." + echo "Try '$0 --help' for more information." + exit 1 + ;; + esac + done + ;; + -t|--thin) + shift + for variant in "${@}"; do + case "${variant}" in + thin) + thins+=("${THIN_VARIANTS[1]}") + shift + ;; + -*|--*) + break + ;; + *) + echo "ERROR: Unrecognized thin variant '$1'." + echo "Try '$0 --help' for more information." + exit 1 + ;; + esac + done + ;; + -s|--size) + shift + for variant in "${@}"; do + case "${variant}" in + compact) + transs+=("${SIZE_VARIANTS[1]}") + shift + ;; + -*|--*) + break + ;; + *) + echo "ERROR: Unrecognized size variant '$1'." + echo "Try '$0 --help' for more information." + exit 1 + ;; + esac + done + ;; + -h|--help) + usage + exit 0 + ;; + *) + echo "ERROR: Unrecognized installation option '$1'." + echo "Try '$0 --help' for more information." + exit 1 + ;; + esac +done + +if [[ ! -w "${dest:-${DEST_DIR}}" ]]; then + echo "Please run as root." + exit 1 +fi + +for compact in "${compacts[@]:-${COMPACT_VARIANTS[@]}}"; do + for trans in "${transs[@]:-${TRANS_VARIANTS[@]}}"; do + for color in "${colors[@]:-${COLOR_VARIANTS[@]}}"; do + for thin in "${thins[@]:-${THIN_VARIANTS[@]}}"; do + install "${dest:-${DEST_DIR}}" "${name:-${THEME_NAME}}" "${compact}" "${color}" "${trans}" "${thin}" + done + done + done +done + if [[ $gdm == true ]]; then + install_gdm "${dest:-${DEST_DIR}}" "${name:-${THEME_NAME}}" "${compact}" "${color}" "${trans}" "${thin}" + fi + +echo +echo Done.