Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- # BASICS ***************************************************************
- # habilitar globbing extendido
- shopt -qs extglob
- # VARS *****************************************************************
- scriptName="${0##*/}"
- scriptDir=$(readlink -f "${0%/*}")
- scriptVersion=1.1
- scriptLock="$scriptDir/$scriptName.pid"
- scriptPipe="$scriptDir/$scriptName.fifo"
- # FUNCS ****************************************************************
- getScreenConfig() {
- local wmctrld=$(wmctrl -d | sed 's/\*//g')
- # geometria desktop
- dX=${wmctrld##*DG: } && dX=${dX%%x*}
- dY=${wmctrld#*x} && dY=${dY%% *}
- # geometria viewport
- vX=${wmctrld##*WA: } && vX=${vX#* } && vX=${vX%%x*}
- vY=${wmctrld##*x} && vY=${vY%% *}
- # config viewports
- (( vRows=dX/vX , vCols=dY/vY, vTotal=vRows*vCols ))
- # viewport actual
- cvX=${wmctrld##*VP: } && cvY=${cvX#*,}
- cvX=${cvX%%,*} && cvY=${cvY%% *}
- # verbosidad
- [[ "$1" == "-v" ]] && {
- echo "Geometria: escritorio $dX"x"$dY, viewport: $vX"x"$vY"
- echo "Viewports: $vRows"h \* "$vCols"v = "$vTotal total"
- echo "Viewport actual: "$(getV $cvX $cvY)" ($cvX,$cvY)"
- }
- }
- getX() {
- echo $(( (($1 - 1) % vRows) * vX ))
- }
- getY() {
- echo $(( (($1 - 1) / vRows) * (vY + 1) ))
- }
- getV() {
- echo $(( ($1 / vX) + (( $2 / (vY + 1) ) * vRows) + 1 ))
- }
- gotoViewport() {
- (( $1 > 0 && $1 <= vTotal )) && {
- echo "$FUNCNAME: cambiando a viewport $1 ("$(getX $1),$(getY $1)")"
- wmctrl -o $(getX $1),$(getY $1)
- return $?
- }
- echo "$FUNCNAME: el argumento puede ser un valor entre 1 y $vTotal, se indico $1"
- return 1
- }
- gotoWindow() {
- wmctrl -a "$1" && {
- echo "$FUNCNAME: cambiando a ventana \"$1\" - viewport "$(getV $cvX $cvY)" ($cvX,$cvY)"
- return $?
- }
- echo "$FUNCNAME: no se encontro la ventana \"$1\""
- return 1
- }
- cmdGoto() {
- ! (( $# )) && echo "$FUNCNAME: sin argumentos, se acepta \$1=viewport|(+|-)viewport|nombre-ventana" && return 1
- (( $# > 1 )) && echo "$FUNCNAME: argumentos extra, se acepta \$1=viewport|(+|-)viewport|nombre-ventana" && return 1
- case "$1" in
- # viewport
- +([[:digit:]])) gotoViewport "$1" ;;
- # viewport offset
- @(-|+)+([[:digit:]]))
- getScreenConfig
- local resto=$(( ($(getV $cvX $cvY) + ($1)) % vTotal ))
- gotoViewport $(( (resto ? 0 : vTotal) + resto ))
- ;;
- # ventana
- *) gotoWindow "$1" ;;
- esac
- return $?
- }
- cmdRotate() {
- ! (( $# )) && echo "$FUNCNAME: sin argumentos, se acepta \$1=retardo \$2=(+|-)paso" && return 1
- (( $# > 2 )) && echo "$FUNCNAME: argumentos extra, se acepta \$1=retardo \$2=(+|-)paso" && return 1
- [[ "${1//*([[:digit:]])}" ]] && echo "$FUNCNAME: \"$1\" no es un entero positivo" && return 1
- [[ "${2//@(-|+)*([[:digit:]])}" ]] && echo "$FUNCNAME: \"$2\" no es un paso entero" && return 1
- echo "$FUNCNAME: fijando intervalo de rotacion a $1 segundos"
- # si existe bucle de rotacion terminarlo
- [[ "${rotPID+defined}" ]] && cmdStop
- doRotate "$@" &
- rotPID=$!
- return $?
- }
- cmdStop() {
- [[ ! "${rotPID+defined}" ]] && echo "$FUNCNAME: no hay rotacion actual" && return 1
- (( $# > 1 )) && echo "$FUNCNAME: argumentos extra, se acepta \$1=viewport|(+|-)viewport|nombre-ventana" && return 1
- # si existe bucle de rotacion terminarlo
- echo "$FUNCNAME: terminando rotacion $rotPID"
- kill -15 $rotPID &
- unset rotPID
- # si pasaron un goto
- [[ $1 ]] && cmdGoto "$1"
- return $?
- }
- doRotate() {
- echo "$FUNCNAME ($BASHPID): comenzando rotacion..."
- trap "trap - TERM && echo $FUNCNAME \($BASHPID\): saliendo... && exit 0" TERM
- while sleep $1; do cmdGoto ${2-+1}; done
- }
- doInit() {
- echo "$FUNCNAME: inicializando..."
- # lock
- (set -o noclobber; echo "$$" > "$scriptLock") &>/dev/null || {
- # ya existe lock
- echo "$FUNCNAME: se encontró lockfile, verificando si el proceso esta vivo..."
- # aca poner check via "cmd pid"
- kill -0 $(cat "$scriptLock") &>/dev/null && \
- echo "$FUNCNAME: se encontró proceso con ID" $(cat "$scriptLock")", saliendo..." && exit 0
- # dead pid: limpiar
- rm -f $scriptPipe &>/dev/null
- echo "$$" >| "$scriptLock"
- }
- # pipa (conectarle stdin)
- mknod "$scriptPipe" p
- # traps
- trap "doExit" INT TERM EXIT
- }
- doExit() {
- echo "$FUNCNAME: saliendo..."
- # si hay rotacion terminarla
- [[ "${rotPID+defined}" ]] && cmdStop
- # borrar lock/FIFO y salir con errlevel
- rm -fv "$scriptLock" "$scriptPipe"
- exit $?
- }
- getInput() {
- echo "$FUNCNAME: esperando comandos"
- # while read -ep"-> " line; do
- while true; do
- read line < "$scriptPipe"
- case "$line" in
- @(goto|rotate|stop)*(+([[:space:]])*)) cmd${line^} ;;
- quit) doExit ;;
- pid) echo $$ ;;
- *) echo "$FUNCNAME: comando desconocido: $line" ;;
- esac
- done
- }
- # MAIN *****************************************************************
- doInit
- getScreenConfig -v
- getInput
Add Comment
Please, Sign In to add comment