Pressionar tecla e não precisar pressionar ENTER

Publicado por Fabio Junior Sabai em 29/11/2004

[ Hits: 15.882 ]

 


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

Usando o friend em C++

Usando o realloc

Classes para vários tipos (templates)

Configurando Ctrl+Alt+[tecla] para desligar o computador

Sobrecarregamento de operadores

Leitura recomendada

Melhor Controle de Memória de Strings em C

O poder do #define

Error: C compiler cannot create executables (solucionado)

Getchar(); sendo ignorado? Não mais!

Como limpar a tela em C

  

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 [email protected]

Abraços,
Fiquem com Deus.

[3] Comentário enviado por jesusfreak 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
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts