Poesía Binaria

Obtener UNA tecla

Hace mucho tiempo, cuando empezaba con la programación, tenía la librería conio.h de Borland (en la que aún se siguen basando en muchos sitios), que nos permitía entre otras cosas borrar la pantalla, posicionarnos dentro de la pantalla, escribir con colores, y pedir una tecla al usuario.
Bien, vayámonos al último caso, pedir una tecla al usuario, se hacía con la función getch, y con sólo pulsar la tecla, salía de la función, es decir, no hacía falta pulsar enter.
Pero cuando nos vamos a linux, nos damos cuenta de que tenemos que utilizar getchar() y esa función estará pidiendo letras del teclado hasta que pulsemos enter.

Podemos optar por varias soluciones:

  1. Utilizar ncurses (que le da mil vueltas a conio.h)
  2. Si sólo queremos algo puntual, la que os propongo a continuación

La solución la encontré hace un tiempo y la tenía por aquí archivada, y la primera publicación del código que he encontrado ha sido esta por kermi3, la función original la publicó VvV.

La solución que propongo tiene un pequeño cambio en el que podemos elegir si queremos que se muestre dicha tecla pulsada o no (echo), y está comentada:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <stdio.h>
#include <termios.h>
#include <unistd.h>

int mygetch(int echo)
{
  struct termios oldt, newt;
  int ch;

  /* Obtenemos atributos del terminal */
  tcgetattr( STDIN_FILENO, &oldt );
  newt = oldt;
  /* Eliminamos el modo canónico: caracteres especiales */
  newt.c_lflag &= ~ICANON;
  /* Eliminamos el echo a voluntad */
    if (!echo)
      newt.c_lflag &= ~ECHO;
  /* Definimos los nuevos atributos al terminal */
  tcsetattr( STDIN_FILENO, TCSANOW, &newt );
  ch = getchar();
  /* Ponemos los atributos como estaban al principio */
  tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
  return ch;
}

int main()
{
  int tecla;
  printf("Pulsa una tecla (sin echo): ");
  tecla=mygetch(0);
  printf("\nHas pulsado la tecla %c (%c)\n", tecla, tecla);

  printf("Pulsa una tecla (con echo): ");
  tecla=mygetch(1);
  printf("\nHas pulsado la tecla %c (%c)", tecla, tecla);
}

La incluiré en la próxima revisión de strutils.

También podría interesarte....