será q vc não pode fazer algo parecido com isso?:<br><code><br>use Term::ReadKey;<br><br>ReadMode 4;<br>while (($key = ReadKey(-1)) ne "q") {for(keys %time){delete $time{$_} if time - $time{$_} > $vezes}next unless defined $key;$time{$key}=time,$vezes=1 unless defined $time{$key};delete @time{grep {$_ ne $key} keys %time}; $vezes++ if time - $time{$key} <= $valor;delete $time{$key}, undef $vezes, print "$key foi pressionado por 5 segundos$/" if time - $time{$key} == 5}END{ReadMode 0;}<br>
</code><br><br><div><span class="gmail_quote">Em 19/02/08, <b class="gmail_sendername">Marcos Machado</b> <<a href="mailto:listas@istf.com.br">listas@istf.com.br</a>> escreveu:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hmmmm... Obrigado pela luz!<br><br>Vou experimentar estas idéias.<br><br>O fato de precisar mapear uma tecla específica com um evento é ruim,<br>pois não sei o que será pressionado e, em qualquer tecla, a rotina<br>executada é a mesma.<br>
<br>Outra coisa que me preocupa é o processamento intrínseco destas<br>bibliotecas ou do próprio ambiente. O tempo que a tecla vai ficar<br>pressionada é muito, muito pequeno (imagina o tempo que cada tecla fica<br>pressionada enquanto você digita um texto) e vai complicar se ficarmos<br>
muito dependente do processamento da máquina para me dar esse valor.<br><br>Mas vou fazer uns testes e volto com o resultado.<br><br>[]s, MM<br><br><br>breno escreveu:<br>> Em Mac, seria assim:<br>><br>> -----------------8<--------------------<br>
> use Mac::Events qw(@Event $CurrentEvent);<br>><br>> $Event[keyDown] = \&trata_tecla_apertada;<br>> $Event[keyUp] = \&trata_tecla_solta;<br>> -----------------8<--------------------<br>><br>
> E no Windows dá pra fazer assim:<br>> -----------------8<--------------------<br>> use Win32::Console;<br>><br>> $CONSOLE = new Win32::Console->new(STD_INPUT_HANDLE);<br>><br>> do {<br>> @event = $CONSOLE->Input();<br>
> # [0] : tipo de evento (1 para teclado)<br>> # [1] : keydown (TRUE == tecla apertada, FALSE == tecla foi solta)<br>> # [2] : número de vezes que o Input retornou a tecla como ainda apertada<br>> # [3] : virtual key code da tecla<br>
> # [4] : virtual scan code da tecla<br>> # [5] : código ASCII do caractere apertado (ou 0 se nao for caractere)<br>> # [6] : estado das teclas de controle (CTRL ALT SHIFT)<br>><br>> # processa tecla enquanto está apertada<br>
> ...<br>><br>> } while ($event[0] == 1 and $event[1]);<br>> -----------------8<--------------------<br>><br>> E em SDL:<br>> -----------------8<--------------------<br>> use SDL::Event;<br>
><br>> my $event = new SDL::Event;<br>> $event->pump;<br>> $event->poll;<br>><br>> if ( $event->type == SDL::KEYDOWN ) {<br>> # tecla pressionada. Pra saber qual tecla, basta adicionar aqui:<br>
> if ( $event->key_sym == SDLK_ESCAPE ) { # ou qq outra, brincando<br>> com key_sym<br>> ...<br>> }<br>> }<br>> if ( $event->type == SDL::KEYDOWN ) {<br>> # idem<br>> }<br>
> -----------------8<--------------------<br>><br>> Mas direto num terminal linux.... não sei =P<br>><br>> Provavelmente a obtenção de eventos tipo keydown/keyup esteja<br>> disponível amarrada a algum loop de eventos (já que a shell em si é,<br>
> por padrão, orientada a stream de caracteres e não a eventos). Dentro<br>> do X é muito fácil (pois é um ambiente baseado em eventos), e qq<br>> biblioteca como Tk, GTK, Wx, ou mesmo acesso X "rawzão" resolve o seu<br>
> problema. Pra terminal, loops de eventos pré-prontos podem te ajudar<br>> em sua saga. Nunca usei POE, mas ele é um que pode ter o que vc quer.<br>> E, se não me falha a memória, o Curses também tem (resta saber se a<br>
> implementação do <a href="http://Curses.pm">Curses.pm</a> está completa em relação à bilbioteca, já<br>> que a documentação deles foi bem preguiçosa).<br>><br>> Não deixe de nos avisar sobre sua solução :-)<br>
><br>> []s<br>><br>> -b<br>><br>> 2008/2/19 Marcos Machado <<a href="mailto:listas@istf.com.br">listas@istf.com.br</a>>:<br>>> Caros monges,<br>>><br>>> Estou procurando uma forma de identificar uma tecla pressionada. O<br>
>> exemplo abaixo me diz, tecla a tecla, o que foi digitado, sem precisar<br>>> esperar o <Enter>.<br>>><br>>> <code><br>>> use Term::ReadKey;<br>>> open(TTY, "</dev/tty");<br>
>> ReadMode "raw";<br>>> while (ord $key != 10) # 10 = return/enter<br>>> {<br>>> $key = ReadKey 0, *TTY;<br>>> print "Voce pressionou a tecla $key (",ord $key,")", $/;<br>
>> }<br>>> ReadMode "normal"; # restaura modo normal de leitura<br>>> </code><br>>><br>>> Agora gostaria de descobrir por QUANTO TEMPO uma tecla se manteve<br>>> pressionada. Este método me tira da linha 6 assim que eu pressiono a<br>
>> tecla. Preciso de um evento quando a tecla é pressionada e outro quando<br>>> ela é solta.<br>>><br>>> Alguma dica?<br>>><br>>> Não precisa ser portável. Funcionando em Linux já tá bom demais.<br>
>><br>>> Obrigado pela atenção.<br>>><br>>> []s, MM<br>>> _______________________________________________<br>>> Rio-pm mailing list<br>>> <a href="mailto:Rio-pm@pm.org">Rio-pm@pm.org</a><br>
>> <a href="http://mail.pm.org/mailman/listinfo/rio-pm">http://mail.pm.org/mailman/listinfo/rio-pm</a><br>>><br>> _______________________________________________<br>> Rio-pm mailing list<br>> <a href="mailto:Rio-pm@pm.org">Rio-pm@pm.org</a><br>
> <a href="http://mail.pm.org/mailman/listinfo/rio-pm">http://mail.pm.org/mailman/listinfo/rio-pm</a><br>><br><br>_______________________________________________<br>Rio-pm mailing list<br><a href="mailto:Rio-pm@pm.org">Rio-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/rio-pm">http://mail.pm.org/mailman/listinfo/rio-pm</a><br></blockquote></div><br><br clear="all"><br>-- <br>[]'s Fernando