shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Script simulando screensaver


From: Arkanon
Subject: Script simulando screensaver
Date: Tue, 15 Sep 2009 17:35:00 -0300

Boa tarde.

Em 1993, no CESUP (Centro de Super Computacao) da UFRGS havia uma sala
com alguns computadores (Mac e 486 com DOS) a disposicao de eventuais
usuarios. Havia tambem um terminal preto e branco sempre rodando um
screensaver em modo texto que era (pelo que lembro) um conjunto de
caracteres cuja tonalidade ficava variando aleatoriamente.

Muitas vezes ja procurei um screensaver para terminal equivalente, mas
como nunca soube o nome do original, nem a linguagem em que foi feito
ou mesmo o SO em que rodava, todas as minhas buscas foram em vao.

Hoje, pensando novamente no assunto, resolvi tentar produzir algo
semelhante em shell script, supondo que a complexidade nao deva ser
muito grande.

O mais perto que consegui chegar foi o resultado abaixo.

Se eu executar o algoritmo para UM UNICO caracter (quant=1), funciona
satisfatoriamente. O problema aparece quando tento por mais de um
simultaneamente na tela, que eh o que realmente deve acontecer.

Como as variacoes de tonalidade dos varios caracteres deve ser
independente, aparentemente acontece em alguns momentos de 2 ou mais
caracteres tentarem ser reescritos ao mesmo tempo e o cursor "se
perder" na tentativa e um deles acabar sendo reescrito ao lado do
outro caracter, e nao na posicao original. Isso acaba com a sequencia
de variacao de tom daquele caracter, e, ao fim do loop, ele acaba
"sobrando" na tela, ao inves de ser escrito em preto (= apagado).

Alguem tem alguma ideia de procedimento para lancar varios processos
independentes de escrita em tempos aleatorios que possam sofrer esse
tipo de concorrencia (escrita na tela em posicoes diferentes ao mesmo
tempo)?

Eu poderia fazer um loop onde eu fosse controlando em arrays
aleatoriamente os caracteres e sequencialmente suas tonalidades, mas
isso so se nao houver uma forma mais magica (tipo com named pipes ;-p)

Valeu.

[BOT]
#!/bin/bash

clear
tput civis              # torna o cursor invisivel
set -o noglo            # desabilita o caracter coringa *


  quant=3               # quantidade de caracteres simultaneamente na tela
maxwait=1.25            # maximo tempo de espera entre as variacoes de
tonalidade da cor do texto
charset=(* O o + - : .) # caracteres a serem pegos aleatoriamente

  black=0
  white=7
      L=`tput lines`    # numero de linhas do terminal
      C=`tput cols`     # numero de colunas do terminal


write()
{
  tput sgr0             # restaura os atributos do texto
  tput $5               # estilo do texto        \ variacao da tonalidade
  tput setf $4          # cor de frente do texto / da cor do texto
  tput cup $2 $3        # move cursor para (linha,coluna)
  echo -n "$1"          # escreve o caracter
  sleep `echo "$RANDOM%$maxwait" | bc`          # espera uma quantidade
aleatoria de tempo entre 0 e maxwait
}


seq $quant | while read
do
  (
    s=${charset[$[$RANDOM%${#charset[*]}]]}     # escolhe aletoriamente um
caracter de charset
    l=$[$RANDOM%$L]                             # escolhe uma linha  aleatoria 
entre 0 e a
altura  do terminal
    c=$[$RANDOM%$C]                             # escolhe uma coluna aleatoria 
entre 0 e a
largura do terminal
    write $s $l $c $white bold
    write $s $l $c $white dim
    write $s $l $c $black bold
    write $s $l $c $black dim
  ) &
done


read            # espera um enter para restaurar as condicoes originais do 
terminal


set +o noglob   # habilita o caracter coringa *
tput cnorm      # torna o cursor visivel
tput sgr0
[EOT]

-- 
(o_   ------------------     __o
//\   address@hidden   _`\<,
V_/_  --- www.lsd.org.br  (_)/(_)
---------------------------------


reply via email to

[Prev in Thread] Current Thread [Next in Thread]