[Rio-pm] Tecla pressionada

breno breno em rio.pm.org
Terça Fevereiro 19 06:40:09 PST 2008


Em Mac, seria assim:

-----------------8<--------------------
use Mac::Events qw(@Event $CurrentEvent);

$Event[keyDown] = \&trata_tecla_apertada;
$Event[keyUp]     = \&trata_tecla_solta;
-----------------8<--------------------

E no Windows dá pra fazer assim:
-----------------8<--------------------
use Win32::Console;

$CONSOLE = new Win32::Console->new(STD_INPUT_HANDLE);

do {
   @event = $CONSOLE->Input();
   # [0] : tipo de evento (1 para teclado)
   # [1] : keydown (TRUE == tecla apertada, FALSE == tecla foi solta)
   # [2] : número de vezes que o Input retornou a tecla como ainda apertada
   # [3] : virtual key code da tecla
   # [4] : virtual scan code da tecla
   # [5] : código ASCII do caractere apertado (ou 0 se nao for caractere)
   # [6] : estado das teclas de controle (CTRL ALT SHIFT)

   # processa tecla enquanto está apertada
   ...

} while ($event[0] == 1 and $event[1]);
-----------------8<--------------------

E em SDL:
-----------------8<--------------------
use SDL::Event;

my $event = new SDL::Event;
$event->pump;
$event->poll;

if ( $event->type == SDL::KEYDOWN ) {
    # tecla pressionada. Pra saber qual tecla, basta adicionar aqui:
    if ( $event->key_sym == SDLK_ESCAPE ) {  # ou qq outra, brincando
com key_sym
        ...
    }
}
if ( $event->type == SDL::KEYDOWN ) {
    # idem
}
-----------------8<--------------------

Mas direto num terminal linux.... não sei =P

Provavelmente a obtenção de eventos tipo keydown/keyup esteja
disponível amarrada a algum loop de eventos (já que a shell em si é,
por padrão, orientada a stream de caracteres e não a eventos). Dentro
do X é muito fácil (pois é um ambiente baseado em eventos), e qq
biblioteca como Tk, GTK, Wx, ou mesmo acesso X "rawzão" resolve o seu
problema. Pra terminal, loops de eventos pré-prontos podem te ajudar
em sua saga. Nunca usei POE, mas ele é um que pode ter o que vc quer.
E, se não me falha a memória, o Curses também tem (resta saber se a
implementação do Curses.pm está completa em relação à bilbioteca, já
que a documentação deles foi bem preguiçosa).

Não deixe de nos avisar sobre sua solução :-)

[]s

-b

2008/2/19 Marcos Machado <listas em istf.com.br>:
> Caros monges,
>
> Estou procurando uma forma de identificar uma tecla pressionada. O
> exemplo abaixo me diz, tecla a tecla, o que foi digitado, sem precisar
> esperar o <Enter>.
>
> <code>
> use Term::ReadKey;
> open(TTY, "</dev/tty");
> ReadMode "raw";
> while (ord $key != 10) # 10 = return/enter
> {
>      $key = ReadKey 0, *TTY;
>      print "Voce pressionou a tecla $key (",ord $key,")", $/;
> }
> ReadMode "normal"; # restaura modo normal de leitura
> </code>
>
> Agora gostaria de descobrir por QUANTO TEMPO uma tecla se manteve
> pressionada. Este método me tira da linha 6 assim que eu pressiono a
> tecla. Preciso de um evento quando a tecla é pressionada e outro quando
> ela é solta.
>
> Alguma dica?
>
> Não precisa ser portável. Funcionando em Linux já tá bom demais.
>
> Obrigado pela atenção.
>
> []s, MM
> _______________________________________________
> Rio-pm mailing list
> Rio-pm em pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
>


Mais detalhes sobre a lista de discussão Rio-pm