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