change_color.sh
Bourne-Again shell script, ASCII text executable
1
#!/usr/bin/env bash
2
# shellcheck disable=SC1090
3
#set -x
4
set -ueo pipefail
5
6
SRC_PATH="$(readlink -f "$(dirname "$0")")"
7
8
darker() {
9
"$SRC_PATH/scripts/darker.sh" "$@"
10
}
11
mix() {
12
"$SRC_PATH/scripts/mix.sh" "$@"
13
}
14
is_dark() {
15
hexinput="$(tr '[:lower:]' '[:upper:]' <<< "$1")"
16
half_darker="$(darker "$hexinput" 88)"
17
[[ "$half_darker" == "000000" ]]
18
}
19
20
21
print_usage() {
22
echo "usage: $0 [-t TARGET_DIR] [-o OUTPUT_THEME_NAME] [-p PATH_LIST] PATH_TO_PRESET"
23
echo "examples:"
24
# shellcheck disable=SC2028 # This is meant to be usage text.
25
echo " $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\")"
26
echo " $0 -t ~/.themes ../colors/retro/twg"
27
echo " $0 --hidpi True ../colors/retro/clearlooks"
28
exit 1
29
}
30
31
32
while [[ "$#" -gt 0 ]]; do
33
case "$1" in
34
-p|--path-list)
35
CUSTOM_PATHLIST="$2"
36
shift
37
;;
38
-t|--target)
39
TARGET_DIR="$2"
40
shift
41
;;
42
-o|--output)
43
OUTPUT_THEME_NAME="$2"
44
shift
45
;;
46
-d|--hidpi)
47
OPTION_GTK2_HIDPI="$2"
48
shift
49
;;
50
-i|--inkscape)
51
OPTION_FORCE_INKSCAPE="$2"
52
shift
53
;;
54
*)
55
if [[ "$1" == -* ]] || [[ "${THEME-}" ]]; then
56
echo "unknown option $1"
57
print_usage
58
exit 2
59
fi
60
THEME="$1"
61
;;
62
esac
63
shift
64
done
65
66
if [[ -z "${THEME:-}" ]]; then
67
print_usage
68
fi
69
70
PATHLIST=(
71
'./src/_colors.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
)
86
if [[ -n "${CUSTOM_PATHLIST:-}" ]]; then
87
IFS=', ' read -r -a PATHLIST <<< "${CUSTOM_PATHLIST:-}"
88
fi
89
90
EXPORT_QT5CT=0
91
for FILEPATH in "${PATHLIST[@]}"; do
92
if [[ "$FILEPATH" == *qt5ct* ]]; then
93
EXPORT_QT5CT=1
94
fi
95
done
96
97
OPTION_GTK2_HIDPI=$(tr '[:upper:]' '[:lower:]' <<< "${OPTION_GTK2_HIDPI-False}")
98
OPTION_FORCE_INKSCAPE=$(tr '[:upper:]' '[:lower:]' <<< "${OPTION_FORCE_INKSCAPE-True}")
99
100
101
if [[ "$THEME" == */* ]] || [[ "$THEME" == *.* ]]; then
102
source "$THEME"
103
THEME=$(basename "$THEME")
104
else
105
if [[ -f "$SRC_PATH/../colors/$THEME" ]]; then
106
source "$SRC_PATH/../colors/$THEME"
107
else
108
echo "Theme '$THEME' not found"
109
exit 1
110
fi
111
fi
112
if [[ $(date +"%m%d") = "0401" ]] && grep -q "no-jokes" <<< "$*"; then
113
echo -e "\\n\\nError patching uxtheme.dll\\n\\n"
114
BG=C0C0C0 MATERIA_SURFACE=C0C0C0 FG=000000 MATERIA_PANEL_OPACITY=1
115
HDR_BG=C0C0C0 HDR_FG=000000 SEL_BG=000080 MATERIA_VIEW=FFFFFF
116
fi
117
118
# Migration:
119
HDR_BG=${HDR_BG-$MENU_BG}
120
HDR_FG=${HDR_FG-$MENU_FG}
121
MATERIA_VIEW=${MATERIA_VIEW-$TXT_BG}
122
MATERIA_SURFACE=${MATERIA_SURFACE-$BTN_BG}
123
GNOME_SHELL_PANEL_OPACITY=${GNOME_SHELL_PANEL_OPACITY-0.6}
124
MATERIA_PANEL_OPACITY=${MATERIA_PANEL_OPACITY-$GNOME_SHELL_PANEL_OPACITY}
125
126
MATERIA_STYLE_COMPACT=$(tr '[:upper:]' '[:lower:]' <<< "${MATERIA_STYLE_COMPACT-False}")
127
MATERIA_COLOR_VARIANT=$(tr '[:upper:]' '[:lower:]' <<< "${MATERIA_COLOR_VARIANT:-}")
128
129
SPACING=${SPACING-3}
130
ROUNDNESS=${ROUNDNESS-4}
131
# shellcheck disable=SC2034 # will this be used in the future?
132
ROUNDNESS_GTK2_HIDPI=$(( ROUNDNESS * 2 ))
133
MATERIA_PANEL_OPACITY=${MATERIA_PANEL_OPACITY-0.6}
134
MATERIA_SELECTION_OPACITY=${MATERIA_SELECTION_OPACITY-0.32}
135
136
INACTIVE_FG=$(mix "$FG" "$BG" 0.75)
137
INACTIVE_MATERIA_VIEW=$(mix "$MATERIA_VIEW" "$BG" 0.60)
138
139
TERMINAL_COLOR4=${TERMINAL_COLOR4:-1E88E5}
140
TERMINAL_COLOR5=${TERMINAL_COLOR5:-E040FB}
141
TERMINAL_COLOR9=${TERMINAL_COLOR9:-DD2C00}
142
TERMINAL_COLOR10=${TERMINAL_COLOR10:-00C853}
143
TERMINAL_COLOR11=${TERMINAL_COLOR11:-FF6D00}
144
TERMINAL_COLOR12=${TERMINAL_COLOR12:-66BB6A}
145
146
TARGET_DIR=${TARGET_DIR-$HOME/.themes}
147
OUTPUT_THEME_NAME=${OUTPUT_THEME_NAME-oomox-$THEME}
148
DEST_PATH="$TARGET_DIR/${OUTPUT_THEME_NAME/\//-}"
149
150
if [[ "$SRC_PATH" == "$DEST_PATH" ]]; then
151
echo "can't do that"
152
exit 1
153
fi
154
155
156
tempdir=$(mktemp -d)
157
post_clean_up() {
158
rm -r "$tempdir" || :
159
}
160
trap post_clean_up EXIT SIGHUP SIGINT SIGTERM
161
cp -r "$SRC_PATH/"* "$tempdir/"
162
cd "$tempdir"
163
164
165
# autodetection which color variant to use
166
if [[ -z "$MATERIA_COLOR_VARIANT" ]]; then
167
if is_dark "$BG"; then
168
echo "== Dark background color detected. Setting color variant to dark."
169
MATERIA_COLOR_VARIANT="dark"
170
elif is_dark "$HDR_BG"; then
171
echo "== Dark headerbar background color detected. Setting color variant to default."
172
MATERIA_COLOR_VARIANT="default"
173
else
174
echo "== Light background color detected. Setting color variant to light."
175
MATERIA_COLOR_VARIANT="light"
176
fi
177
fi
178
179
180
echo "== Converting theme into template..."
181
182
for FILEPATH in "${PATHLIST[@]}"; do
183
if [[ "$MATERIA_COLOR_VARIANT" != "dark" ]]; then
184
find "$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
{} \; ;
204
else
205
find "$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
{} \; ;
218
fi
219
done
220
221
#Not implemented yet:
222
#-e 's/%SPACING%/'"$SPACING"'/g' \
223
224
# shellcheck disable=SC2016
225
sed -i -e 's/^$corner-radius: .px/$corner-radius: '"$ROUNDNESS"'px/g' ./src/_variables.scss
226
227
if [[ "${DEBUG:-}" ]]; then
228
echo "You can debug TEMP DIR: $tempdir, press [Enter] when finished"; read -r
229
fi
230
231
mv ./src/_colors.scss.template ./src/_colors.scss
232
233
echo "== Filling the template with the new colorscheme..."
234
for FILEPATH in "${PATHLIST[@]}"; do
235
find "$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
{} \; ;
260
done
261
262
if [[ "$MATERIA_COLOR_VARIANT" == "default" ]]; then
263
COLOR_VARIANTS=","
264
COLOR_VARIANT="default"
265
fi
266
if [[ "$MATERIA_COLOR_VARIANT" == "light" ]]; then
267
COLOR_VARIANTS="-light"
268
COLOR_VARIANT="light"
269
fi
270
if [[ "$MATERIA_COLOR_VARIANT" == "dark" ]]; then
271
COLOR_VARIANTS="-dark"
272
COLOR_VARIANT="dark"
273
fi
274
if [[ "$OPTION_GTK2_HIDPI" == "true" ]]; then
275
mv ./src/gtk-2.0/main.rc.hidpi ./src/gtk-2.0/main.rc
276
fi
277
if [[ "$EXPORT_QT5CT" = 1 ]]; then
278
config_home=${XDG_CONFIG_HOME:-"$HOME/.config"}
279
qt5ct_colors_dir="$config_home/qt5ct/colors/"
280
test -d "$qt5ct_colors_dir" || mkdir -p "$qt5ct_colors_dir"
281
mv ./src/qt5ct_palette.conf "$qt5ct_colors_dir/$OUTPUT_THEME_NAME.conf"
282
fi
283
284
if [[ "$MATERIA_STYLE_COMPACT" == "true" ]]; then
285
SIZE_VARIANTS="-compact"
286
SIZE_VARIANT="compact"
287
else
288
SIZE_VARIANTS=","
289
SIZE_VARIANT="default"
290
fi
291
292
# NOTE we use the functions we already have in render-assets.sh
293
echo "== Rendering GTK 2 assets..."
294
if [[ "$MATERIA_COLOR_VARIANT" != "dark" ]]; then
295
FORCE_INKSCAPE="$OPTION_FORCE_INKSCAPE" GTK2_HIDPI="$OPTION_GTK2_HIDPI" ./render-assets.sh gtk2-light
296
else
297
FORCE_INKSCAPE="$OPTION_FORCE_INKSCAPE" GTK2_HIDPI="$OPTION_GTK2_HIDPI" ./render-assets.sh gtk2-dark
298
fi
299
300
echo "== Rendering GTK 3 assets..."
301
FORCE_INKSCAPE="$OPTION_FORCE_INKSCAPE" ./render-assets.sh gtk
302
303
meson _build -Dprefix="$tempdir/change_color_build" -Dtheme_name="${OUTPUT_THEME_NAME/\//-}" -Dcolors="$COLOR_VARIANT" -Dsizes="$SIZE_VARIANT"
304
meson install -C _build
305
GENERATED_PATH="$tempdir/change_color_build/share/themes/$OUTPUT_THEME_NAME$(tr -d ',' <<< "$COLOR_VARIANTS")$(tr -d ',' <<< "$SIZE_VARIANTS")"
306
if [[ -d "$DEST_PATH" ]]; then
307
rm -r "$DEST_PATH"
308
fi
309
mv "$GENERATED_PATH" "$DEST_PATH"
310
311
312
echo
313
echo "== SUCCESS"
314
echo "== The theme was installed to '$DEST_PATH'"
315
exit 0
316