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
1617SCRIPT_DIR=$( cd -- " $( dirname -- " ${BASH_SOURCE[0]} " ) " & > /dev/null && pwd)
1718BASH_SCREENSAVERS_DIR=" $SCRIPT_DIR /gallery"
1819
1920chosen_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}
156166trap _cleanup_and_exit SIGINT # Catch Ctrl-C
@@ -183,37 +193,36 @@ name="$name"
183193tagline=""
184194EOL
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
190203main_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+
217226if [ " $1 " == " -n" ] || [ " $1 " == " --new" ]; then
218227 if [ -z " $2 " ]; then
219228 echo " Error: missing screensaver name for $1 option." >&2
0 commit comments