Skip to content

Commit 9ebf011

Browse files
committed
v0.0.10 - Mystical Tempo
1 parent f5bb6e6 commit 9ebf011

File tree

1 file changed

+58
-49
lines changed

1 file changed

+58
-49
lines changed

screensaver.sh

Lines changed: 58 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,27 @@
66
# Because who needs fancy graphics when you have ASCII?
77
#
88

9-
BASH_SCREENSAVERS_NAME="Bash Screensavers"
10-
BASH_SCREENSAVERS_VERSION="0.0.9"
11-
BASH_SCREENSAVERS_URL="https://github.com/attogram/bash-screensavers"
12-
BASH_SCREENSAVERS_DISCORD="https://discord.gg/BGQJCbYVBa"
13-
BASH_SCREENSAVERS_LICENSE="MIT"
14-
BASH_SCREENSAVERS_COPYRIGHT="Copyright (c) 2025 Attogram Project <https://github.com/attogram>"
9+
BASH_SCREENSAVERS_NAME='Bash Screensavers'
10+
BASH_SCREENSAVERS_VERSION='0.0.10'
11+
BASH_SCREENSAVERS_CODENAME='Mystical Tempo'
12+
BASH_SCREENSAVERS_URL='https://github.com/attogram/bash-screensavers'
13+
BASH_SCREENSAVERS_DISCORD='https://discord.gg/BGQJCbYVBa'
14+
BASH_SCREENSAVERS_LICENSE='MIT'
15+
BASH_SCREENSAVERS_COPYRIGHT='Copyright (c) 2025 Attogram Project <https://github.com/attogram>'
1516

1617
SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd)
1718
BASH_SCREENSAVERS_DIR="$SCRIPT_DIR/gallery"
1819

1920
chosen_screensaver='' # the chosen one
2021

21-
# Lists all available screensavers.
22-
list_screensavers() {
23-
local screensaver name run list
22+
# Peak into the gallery
23+
#
24+
# Output: list of screensaver run scripts, 1 per line
25+
peak_into_the_gallery() {
26+
local screensaver name run
2427
for screensaver in "$BASH_SCREENSAVERS_DIR"/*/; do
2528
if [[ -d "${screensaver}" ]]; then
26-
name=$(basename "${screensaver}")
29+
name="$(basename "${screensaver}")"
2730
run="${screensaver}${name}.sh"
2831
if [[ -f "${run}" ]]; then
2932
printf '%s\n' "$run"
@@ -32,33 +35,40 @@ list_screensavers() {
3235
done
3336
}
3437

35-
# Runs the selected screensaver.
36-
run_screensaver() {
37-
local screensaver_path="$1"
38-
if [[ ! -f "$screensaver_path" ]]; then
39-
echo "Hmm, something went wrong. Cannot find the screensaver at '$screensaver_path'."
38+
# Enjoy a screensaver
39+
#
40+
# Input: 1 - full path to the screensaver run script
41+
# Output: The visual goodness of the screensaver
42+
enjoy_a_screensaver() {
43+
local visual_goodness="$1"
44+
if [[ ! -f "$visual_goodness" ]]; then
45+
echo "404 Screensaver Not Found: $visual_goodness"
4046
return 1
4147
fi
42-
if [[ ! -x "$screensaver_path" ]]; then
48+
if [[ ! -x "$visual_goodness" ]]; then
4349
tput setaf 1 # red foreground
4450
printf "\nWoah there, partner! This screensaver ain't ready for the big show yet.\n"
4551
printf "Give it some execute permissions and we'll be in business:\n\n"
46-
printf " chmod +x %s\n\n" "$screensaver_path"
47-
printf "(Press ^C to go back to the menu, or to ponder the meaning of file permissions.)\n"
52+
printf "chmod +x %s\n\n" "$visual_goodness"
53+
printf "(Press ^C to exit and fix, or to ponder the meaning of file permissions)\n"
4854
tput setaf 2 # back to green
4955
return 2
5056
fi
51-
( "$screensaver_path" ) # Execute the saver in a sub‑shell – isolates its `exit` from the menu script.
57+
( "$visual_goodness" ) # Execute the saver in a sub‑shell – isolates its `exit` from the menu script
5258
return $?
5359
}
5460

55-
choose_screensaver() {
56-
echo
57-
echo "$BASH_SCREENSAVERS_NAME v$BASH_SCREENSAVERS_VERSION"
58-
echo
61+
intro() {
62+
local emptiness=' '
63+
echo "$emptiness"
64+
echo "$BASH_SCREENSAVERS_NAME v$BASH_SCREENSAVERS_VERSION ($BASH_SCREENSAVERS_CODENAME)" ' '
65+
echo "$emptiness"
66+
}
5967

68+
choose_screensaver() {
69+
intro
6070
local screensavers
61-
mapfile -t screensavers < <(list_screensavers)
71+
mapfile -t screensavers < <(peak_into_the_gallery)
6272
if [[ ${#screensavers[@]} -eq 0 ]]; then
6373
echo "Whoops! No screensavers found. Add some to the '$BASH_SCREENSAVERS_DIR' directory."
6474
echo
@@ -70,23 +80,23 @@ choose_screensaver() {
7080
local i=1
7181
for saver in "${screensavers[@]}"; do
7282
local name
73-
name=$(basename "$saver" .sh)
83+
name="$(basename "$saver" .sh)"
7484
names+=("$name")
7585
local tagline
7686
# Source config in a subshell to prevent it from breaking the main script
77-
tagline=$( (
87+
tagline="$( (
7888
local config_file
7989
config_file="$(dirname "$saver")/config.sh"
8090
if [[ -f "$config_file" ]]; then
8191
# shellcheck source=/dev/null
8292
source "$config_file"
8393
echo "$tagline"
8494
fi
85-
) 2>/dev/null )
95+
) 2>/dev/null )"
8696
if [[ -z "$tagline" ]]; then
87-
printf " %-2s. %s\n" "$i" "$name"
97+
printf ' %-2s. %s \n' "$i" "$name"
8898
else
89-
printf " %-2s. %-12s - %s\n" "$i" "$name" "$tagline"
99+
printf ' %-2s. %-12s - %s \n' "$i" "$name" "$tagline"
90100
fi
91101
i=$((i+1))
92102
done
@@ -103,7 +113,8 @@ choose_screensaver() {
103113

104114
local choice
105115
echo
106-
read -e -p "Choose your screensaver: " choice
116+
echo 'Choose your screensaver:'
117+
read -e choice
107118

108119
if [[ "$choice" =~ ^[0-9]+$ ]]; then # Check if choice is a number
109120
if [ "$choice" -ge 1 ] && [ "$choice" -le "${#screensavers[@]}" ]; then
@@ -121,9 +132,8 @@ choose_screensaver() {
121132
done
122133
fi
123134

124-
# If we get here, the choice was invalid
125135
echo
126-
echo "Invalid choice. Please enter a number or name from the list."
136+
echo 'Oops, invalid input! Please enter a number or name from the list. '
127137
echo
128138
return 1
129139
}
@@ -150,7 +160,7 @@ create_new_screensaver() {
150160
_cleanup_and_exit() {
151161
tput cnorm # show the cursor again
152162
tput sgr0 # reset all attributes
153-
clear
163+
echo
154164
exit 0
155165
}
156166
trap _cleanup_and_exit SIGINT # Catch Ctrl-C
@@ -183,37 +193,36 @@ name="$name"
183193
tagline=""
184194
EOL
185195

196+
echo
186197
echo "Successfully created new screensaver '$name' in $dir"
187-
echo "To make it runnable, execute: chmod +x $script_path"
198+
echo 'To make it runnable, execute:'
199+
echo "chmod +x $script_path"
200+
echo
188201
}
189202

190203
main_menu() {
191204
while true; do
192205
tput setab 0 # black background
193206
tput setaf 2 # green foreground
194207
echo
195-
choose_screensaver
196-
if [ $? -ne 0 ]; then
208+
209+
if ! choose_screensaver; then
197210
continue # Invalid choice, re-show menu
198211
fi
199-
run_screensaver "$chosen_screensaver" # run until user presses ^C
212+
213+
enjoy_a_screensaver "$chosen_screensaver" # run until user presses ^C
200214
screensaver_return=$?
201-
if [ $screensaver_return -ne 0 ]; then
202-
if [ $screensaver_return -eq 2 ]; then
203-
# Specific error for non-executable file, message already printed
204-
sleep 0.1
205-
else
206-
# Generic error for other return codes
207-
tput setab 0; tput setaf 1 # red foreground
208-
printf '\n\nOh no! Screensaver had trouble and returned %d\n\n' "$screensaver_return"
209-
tput sgr0
210-
sleep 0.1
215+
if (( screensaver_return )); then
216+
tput setab 0 # black background
217+
tput setaf 1 # red foreground
218+
printf '\n\nOh no! Screensaver had trouble! Error code: %d\n\n' "$screensaver_return"
219+
tput sgr0 # reset
211220
fi
212-
fi
213221
done
214222
}
215223

216-
# Main script execution
224+
# TODO: better arg handling, add: -version, -help, -verbose and whatever
225+
217226
if [ "$1" == "-n" ] || [ "$1" == "--new" ]; then
218227
if [ -z "$2" ]; then
219228
echo "Error: missing screensaver name for $1 option." >&2

0 commit comments

Comments
 (0)