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