[Rio-pm] Tecla pressionada

Marcos Machado listas em istf.com.br
Terça Fevereiro 19 13:06:14 PST 2008


Hmmmm... Obrigado pela luz!

Vou experimentar estas idéias.

O fato de precisar mapear uma tecla específica com um evento é ruim, 
pois não sei o que será pressionado e, em qualquer tecla, a rotina 
executada é a mesma.

Outra coisa que me preocupa é o processamento intrínseco destas 
bibliotecas ou do próprio ambiente. O tempo que a tecla vai ficar 
pressionada é muito, muito pequeno (imagina o tempo que cada tecla fica 
pressionada enquanto você digita um texto) e vai complicar se ficarmos 
muito dependente do processamento da máquina para me dar esse valor.

Mas vou fazer uns testes e volto com o resultado.

[]s, MM


breno escreveu:
> 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
>>
> _______________________________________________
> 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