daily pastebin goal
71%
SHARE
TWEET

Untitled

a guest Jan 12th, 2018 50 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
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top