Pressionar tecla e não precisar pressionar ENTER

Publicado por Perfil removido em 29/11/2004

[ Hits: 17.846 ]

 


Pressionar tecla e não precisar pressionar ENTER



Essa função eu peguei do código do cdplayer de console workbone. O que ela faz é configurar o terminal onde o programa está sendo executado para fazer com que teclas pressionadas sejam lidas pela função getc sem a necessidade de se pressionar ENTER. Para ativar essa funcionalidade basta usar rl_ttyset(0), e para desativar rl_ttyset(1).

void
rl_ttyset (int reset)
{
     static struct termios old; // Armazena as configuracoes antigas
     struct termios new; // Recebe as novas configuracoes

     if (reset == 0)
     {
         (void) tcgetattr (0, &old);
         new = old; // Copia as configuracoes antigas
         new.c_lflag &= ~(ECHO | ICANON);
         new.c_iflag &= ~(ISTRIP | INPCK);
         void) tcsetattr (0, TCSANOW, &new); // Habilita as novas configuracoes
     }
     else
         (void) tcsetattr (0, TCSANOW, &old); // Restaura as configuracoes antigas
}
Outras dicas deste autor

Instalando HP Webcam Chicony no Debian Linux

XAMPP para Ubuntu 10

Não formate, arrume!

Centralizando uma janela em Java

Salvando jogos em flash para seu PC

Leitura recomendada

Exibindo código ASCII das teclas

Switch em C, e se a opção for inválida?

Sites recomendados para estudar linguagem C

Error: C compiler cannot create executables (solucionado)

Sobrecarregamento de operadores

  

Comentários
[1] Comentário enviado por duda_augusto em 29/11/2004 - 20:14h

Meio apagada, mas é interessante a dica.

Diferente vamos dizer.

[2] Comentário enviado por hunz em 04/12/2004 - 20:29h

Olha o erro que da aqui:

bash-2.05b$ gcc main.c -o teste
main.c: In function `rl_ttyset':
main.c:31: error: storage size of `old' isn't known
main.c:32: error: storage size of `new' isn't known
main.c:38: error: `ECHO' undeclared (first use in this function)
main.c:38: error: (Each undeclared identifier is reported only once
main.c:38: error: for each function it appears in.)
main.c:38: error: `ICANON' undeclared (first use in this function)
main.c:39: error: `ISTRIP' undeclared (first use in this function)
main.c:39: error: `INPCK' undeclared (first use in this function)
main.c:40: error: `TCSANOW' undeclared (first use in this function)
main.c:31: error: storage size of `old' isn't known
main.c: In function `main':
main.c:270: warning: passing arg 1 of `_IO_getc' makes pointer from integer without a cast

Não funcionou isso ai não :(

Se souber como arrumar: manda um e-mail pra mim tn_negri@hotmail.com

Abraços,
Fiquem com Deus.

[3] Comentário enviado por removido em 06/12/2004 - 07:42h

É fácil, apenas inclua os arquivos termios.h e unistd.h

#include <termios.h>
#include <unistd.h>

[4] Comentário enviado por jochan em 14/12/2005 - 14:48h

Muito legal, vai me ajudar bastente no meu projeto de C++ ... =)

[5] Comentário enviado por LittleLinuxMEN em 10/06/2007 - 13:29h

maravilha.... já consigo fazer um HelloWorld a ler a tecla sem o ENTER.

uma possivel adaptação do código acima, está em http://cboard.cprogramming.com/showthread.php?t=27714:

[6] Comentário enviado por joana.ccr em 14/02/2008 - 23:24h

como não funciona... da-me o seguinte erro

robot.c: In function 'rl_ttyset':
robot.c:20: error: expected identifier or '(' before ')' token

como resolvo isto???

[7] Comentário enviado por Lenny256 em 29/11/2010 - 09:11h

Você deve ter copiado o código e colado no seu editor de texto favorito,
pois num cast pra void do código, falta um (



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts