[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 (_)/(_)
---------------------------------
- Script simulando screensaver,
Arkanon <=
Re: [shell-script] Script simulando screensaver, Guilherme Gall, 2009/09/16