From 150a70bbad7a6038c81145bd1673c2c1cefe7eb1 Mon Sep 17 00:00:00 2001 From: xero Date: Sun, 9 Mar 2014 19:11:14 -0400 Subject: update fun pipes scripts --- code/fun/pipes | 76 ++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 45 insertions(+), 31 deletions(-) (limited to 'code/fun/pipes') diff --git a/code/fun/pipes b/code/fun/pipes index 5cc366e..43e7046 100755 --- a/code/fun/pipes +++ b/code/fun/pipes @@ -1,29 +1,19 @@ -#!/bin/bash -# The author of the original script is unknown to me. The first entry I can -# find was posted at 2010-03-21 09:50:09 on Arch Linux Forums (doesn't mean the -# poster is the author at all): +#!/usr/bin/env bash +# pipes.sh: Animated pipes terminal screensaver. # -# https://bbs.archlinux.org/viewtopic.php?pid=728932#p728932 +# This modified version is maintained at: # -# I, Yu-Jie Lin, made a few changes and additions: -# -# -p, -t, -R, and -C -# -# Screenshot: http://flic.kr/p/dRnLVj -# Screencast: http://youtu.be/5XnGSFg_gTk -# -# And push the commits to Gist: -# -# https://gist.github.com/4689307 -# -# I, Devin Samarin, made a few changes and additions: -# -# -r can be 0 to mean "no limit". -# Reset cursor visibility after done. -# Cleanup for those people who want to quit with ^C -# -# Pushed the changes to https://gist.github.com/4725048 +# https://github.com/livibetter/pipes.sh + +# options: +# s = straight [5-15] +# f = rate [20-100] +# t = style [0-5] +# r = ttl + +VERSION=0.1.0 +M=32768 p=1 f=75 s=13 r=2000 t=0 w=$(tput cols) h=$(tput lines) @@ -36,16 +26,18 @@ sets=( "│╭ ╮╯─╮ ╰│╯╰ ╭─" "│┌ ┐┘─┐ └│┘└ ┌─" "║╔ ╗╝═╗ ╚║╝╚ ╔═" + "|+ ++-+ +|++ +-" + "|/ \/-\ \|/\ /-" ) -v="${sets[0]}" +v=() RNDSTART=0 NOCOLOR=0 OPTIND=1 -while getopts "p:t:f:s:r:RCh" arg; do +while getopts "p:t:f:s:r:RChv" arg; do case $arg in p) ((p=(OPTARG>0)?OPTARG:p));; - t) ((OPTARG>=0 && OPTARG<${#sets[@]})) && v="${sets[OPTARG]}";; + t) ((OPTARG>=0 && OPTARG<${#sets[@]})) && V+=($OPTARG);; f) ((f=(OPTARG>19 && OPTARG<101)?OPTARG:f));; s) ((s=(OPTARG>4 && OPTARG<16 )?OPTARG:s));; r) ((r=(OPTARG>=0)?OPTARG:r));; @@ -54,20 +46,39 @@ case $arg in h) echo -e "Usage: $(basename $0) [OPTION]..." echo -e "Animated pipes terminal screensaver.\n" echo -e " -p [1-]\tnumber of pipes (D=1)." - echo -e " -t [0-$((${#sets[@]} - 1))]\ttype of pipes (D=0)." + echo -e " -t [0-$((${#sets[@]} - 1))]\ttype of pipes, can be used more than once (D=0)." echo -e " -f [20-100]\tframerate (D=75)." echo -e " -s [5-15]\tprobability of a straight fitting (D=13)." echo -e " -r LIMIT\treset after x characters, 0 if no limit (D=2000)." echo -e " -R \t\trandom starting point." echo -e " -C \t\tno color." - echo -e " -h\t\thelp (this screen).\n" + echo -e " -h\t\thelp (this screen)." + echo -e " -v\t\tprint version number.\n" exit 0;; + v) echo "$(basename -- "$0") $VERSION" + exit 0 esac done +# set default values if not by options +((${#V[@]})) || V=(0) + +# Attempt to workaround for Bash versions < 4, such as 3.2 on Mac: +# https://gist.github.com/livibetter/4689307/#comment-892368 +# Untested--in conduction of using shebang `env bash`--should fall back to +# `sleep` +printf -v SLEEP "read -t0.0$((1000/f)) -n 1" +if $SLEEP &>/dev/null; (($? != 142)); then + printf -v SLEEP "sleep 0.0$((1000/f))" +fi + cleanup() { + # clear up standard input + read -t 0 && cat /dev/null + tput rmcup tput cnorm + stty echo exit 0 } trap cleanup SIGHUP SIGINT SIGTERM @@ -76,18 +87,21 @@ for (( i=1; i<=p; i++ )); do c[i]=$((i%8)) n[i]=0 l[i]=0 ((x[i]=RNDSTART==1?RANDOM*w/32768:w/2)) ((y[i]=RNDSTART==1?RANDOM*h/32768:h/2)) + v[i]=${V[${#V[@]} * RANDOM / M]} done +stty -echo tput smcup tput reset tput civis -while ! read -t0.0$((1000/f)) -n1; do +# any key press exits the loop and this script +while $SLEEP; (($? > 128)) || [[ $SLEEP = sleep* ]] && (($? == 0)); do for (( i=1; i<=p; i++ )); do # New position: ((${l[i]}%2)) && ((x[i]+=-${l[i]}+2,1)) || ((y[i]+=${l[i]}-1)) # Loop on edges (change color on loop): - ((${x[i]}>w||${x[i]}<0||${y[i]}>h||${y[i]}<0)) && ((c[i]=RANDOM%8)) + ((${x[i]}>w||${x[i]}<0||${y[i]}>h||${y[i]}<0)) && ((c[i]=RANDOM%8, v[i]=V[${#V[@]}*RANDOM/M])) ((x[i]=(x[i]+w)%w)) ((y[i]=(y[i]+h)%h)) @@ -99,7 +113,7 @@ while ! read -t0.0$((1000/f)) -n1; do # Print: tput cup ${y[i]} ${x[i]} [[ $NOCOLOR == 0 ]] && echo -ne "\033[1;3${c[i]}m" - echo -n "${v:l[i]*4+n[i]:1}" + echo -n "${sets[v[i]]:l[i]*4+n[i]:1}" l[i]=${n[i]} done ((r>0 && t*p>=r)) && tput reset && tput civis && t=0 || ((t++)) -- cgit v1.2.1