Guest User

Untitled

a guest
Jan 12th, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.15 KB | None | 0 0
  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
Add Comment
Please, Sign In to add comment