daily pastebin goal
86%
SHARE
TWEET

Untitled

a guest Jan 12th, 2018 49 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #!/bin/bash
  2.  
  3. # BASICS ***************************************************************
  4. # habilitar globbing extendido
  5. shopt -qs extglob
  6.  
  7. # VARS *****************************************************************
  8. scriptName="${0##*/}"
  9. scriptDir=$(readlink -f "${0%/*}")
  10. scriptVersion=1.1
  11. scriptLock="$scriptDir/$scriptName.pid"
  12. scriptPipe="$scriptDir/$scriptName.fifo"
  13.  
  14. # FUNCS ****************************************************************
  15. getScreenConfig() {
  16.     local wmctrld=$(wmctrl -d | sed 's/\*//g')
  17.  
  18.     # geometria desktop
  19.     dX=${wmctrld##*DG: } && dX=${dX%%x*}
  20.     dY=${wmctrld#*x} && dY=${dY%% *}
  21.  
  22.     # geometria viewport
  23.     vX=${wmctrld##*WA: } && vX=${vX#* } && vX=${vX%%x*}
  24.     vY=${wmctrld##*x} && vY=${vY%% *}
  25.  
  26.     # config viewports
  27.     (( vRows=dX/vX , vCols=dY/vY, vTotal=vRows*vCols ))
  28.  
  29.     # viewport actual
  30.     cvX=${wmctrld##*VP: } && cvY=${cvX#*,}
  31.     cvX=${cvX%%,*} && cvY=${cvY%% *}
  32.  
  33.     # verbosidad
  34.     [[ "$1" == "-v" ]] && {
  35.         echo "Geometria: escritorio $dX"x"$dY, viewport: $vX"x"$vY"
  36.         echo "Viewports: $vRows"h \* "$vCols"v = "$vTotal total"
  37.         echo "Viewport actual: "$(getV $cvX $cvY)" ($cvX,$cvY)"
  38.     }
  39. }
  40.  
  41. getX() {
  42.     echo $(( (($1 - 1) % vRows) * vX ))
  43. }
  44.  
  45. getY() {
  46.     echo $(( (($1 - 1) / vRows) * (vY + 1) ))
  47. }
  48.  
  49. getV() {
  50.     echo $(( ($1 / vX) + (( $2 / (vY + 1) ) * vRows) + 1 ))
  51. }
  52.  
  53. gotoViewport() {
  54.     (( $1 > 0 && $1 <= vTotal )) && {
  55.         echo "$FUNCNAME: cambiando a viewport $1 ("$(getX $1),$(getY $1)")"
  56.         wmctrl -o $(getX $1),$(getY $1)
  57.         return $?
  58.     }
  59.     echo "$FUNCNAME: el argumento puede ser un valor entre 1 y $vTotal, se indico $1"
  60.     return 1
  61. }
  62.  
  63. gotoWindow() {
  64.     wmctrl -a "$1" && {
  65.         echo "$FUNCNAME: cambiando a ventana \"$1\" - viewport "$(getV $cvX $cvY)" ($cvX,$cvY)"
  66.         return $?
  67.     }
  68.     echo "$FUNCNAME: no se encontro la ventana \"$1\""
  69.     return 1
  70. }
  71.  
  72. cmdGoto() {
  73.     ! (( $# )) && echo "$FUNCNAME: sin argumentos, se acepta \$1=viewport|(+|-)viewport|nombre-ventana" && return 1
  74.     (( $# > 1 )) && echo "$FUNCNAME: argumentos extra, se acepta \$1=viewport|(+|-)viewport|nombre-ventana" && return 1
  75.  
  76.     case "$1" in
  77.         # viewport
  78.         +([[:digit:]])) gotoViewport "$1" ;;
  79.         # viewport offset
  80.         @(-|+)+([[:digit:]]))
  81.             getScreenConfig
  82.             local resto=$(( ($(getV $cvX $cvY) + ($1)) % vTotal ))
  83.             gotoViewport $(( (resto ? 0 : vTotal) + resto ))
  84.         ;;
  85.         # ventana
  86.         *) gotoWindow "$1" ;;
  87.     esac
  88.     return $?
  89. }
  90.  
  91. cmdRotate() {
  92.     ! (( $# )) && echo "$FUNCNAME: sin argumentos, se acepta \$1=retardo \$2=(+|-)paso" && return 1
  93.     (( $# > 2 )) && echo "$FUNCNAME: argumentos extra, se acepta \$1=retardo \$2=(+|-)paso" && return 1
  94.     [[ "${1//*([[:digit:]])}" ]] && echo "$FUNCNAME: \"$1\" no es un entero positivo" && return 1
  95.     [[ "${2//@(-|+)*([[:digit:]])}" ]] && echo "$FUNCNAME: \"$2\" no es un paso entero" && return 1
  96.  
  97.     echo "$FUNCNAME: fijando intervalo de rotacion a $1 segundos"
  98.     # si existe bucle de rotacion terminarlo
  99.     [[ "${rotPID+defined}" ]] && cmdStop
  100.     doRotate "$@" &
  101.     rotPID=$!
  102.     return $?
  103. }
  104.  
  105. cmdStop() {
  106.     [[ ! "${rotPID+defined}" ]] && echo "$FUNCNAME: no hay rotacion actual" && return 1
  107.     (( $# > 1 )) && echo "$FUNCNAME: argumentos extra, se acepta \$1=viewport|(+|-)viewport|nombre-ventana" && return 1
  108.  
  109.     # si existe bucle de rotacion terminarlo
  110.     echo "$FUNCNAME: terminando rotacion $rotPID"
  111.     kill -15 $rotPID &
  112.     unset rotPID
  113.  
  114.     # si pasaron un goto
  115.     [[ $1 ]] && cmdGoto "$1"
  116.  
  117.     return $?
  118. }
  119.  
  120. doRotate() {
  121.     echo "$FUNCNAME ($BASHPID): comenzando rotacion..."
  122.     trap "trap - TERM && echo $FUNCNAME \($BASHPID\): saliendo... && exit 0" TERM
  123.     while sleep $1; do cmdGoto ${2-+1}; done
  124. }
  125.  
  126. doInit() {
  127.     echo "$FUNCNAME: inicializando..."
  128.  
  129.     # lock
  130.     (set -o noclobber; echo "$$" > "$scriptLock") &>/dev/null || {
  131.         # ya existe lock
  132.         echo "$FUNCNAME: se encontrĂ³ lockfile, verificando si el proceso esta vivo..."
  133.         # aca poner check via "cmd pid"
  134.         kill -0 $(cat "$scriptLock") &>/dev/null && \
  135.         echo "$FUNCNAME: se encontrĂ³ proceso con ID" $(cat "$scriptLock")", saliendo..." && exit 0
  136.  
  137.         # dead pid: limpiar
  138.         rm -f $scriptPipe &>/dev/null
  139.         echo "$$" >| "$scriptLock"
  140.     }
  141.  
  142.     # pipa (conectarle stdin)
  143.     mknod "$scriptPipe" p
  144.  
  145.     # traps
  146.     trap "doExit" INT TERM EXIT
  147. }
  148.  
  149. doExit() {
  150.     echo "$FUNCNAME: saliendo..."
  151.  
  152.     # si hay rotacion terminarla
  153.     [[ "${rotPID+defined}" ]] && cmdStop
  154.  
  155.     # borrar lock/FIFO y salir con errlevel
  156.     rm -fv "$scriptLock" "$scriptPipe"
  157.     exit $?
  158. }
  159.  
  160. getInput() {
  161.     echo "$FUNCNAME: esperando comandos"
  162. #    while read -ep"-> " line; do
  163.     while true; do
  164.         read line < "$scriptPipe"
  165.         case "$line" in
  166.             @(goto|rotate|stop)*(+([[:space:]])*)) cmd${line^} ;;
  167.             quit) doExit ;;
  168.             pid) echo $$ ;;
  169.             *) echo "$FUNCNAME: comando desconocido: $line" ;;
  170.         esac
  171.     done
  172. }
  173.  
  174. # MAIN *****************************************************************
  175. doInit
  176. getScreenConfig -v
  177. getInput
RAW Paste Data
Top