¿Cómo hacer que las teclas de flecha y la barra espaciadora funcionen correctamente cuando se solicita información del usuario en el programa C usando termios.h?
Así que tengo el siguiente código que básicamente solo lee las entradas de usuario de caracteres y las imprime hasta que se ingresa 'q'.
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<termios.h>
int main(void) {
char c;
static struct termios oldtio, newtio;
tcgetattr(0, &oldtio);
newtio = oldtio;
newtio.c_lflag &= ~ICANON;
newtio.c_lflag &= ~ECHO;
tcsetattr(0, TCSANOW, &newtio);
printf("Give text: ");
fflush(stdout);
while (1) {
read(0, &c, 1);
printf("%c", c);
fflush(stdout);
if (c == 'q') { break; }
}
printf("\n");
tcsetattr(0, TCSANOW, &oldtio);
return 0;
}
Al comienzo de la función principal, apago el modo canónico para que el usuario pueda ver su entrada cuando la está dando. También apago el eco para que cosas como "^ [[A" no aparezcan al presionar la tecla de flecha hacia arriba, por ejemplo. Esto funciona, pero también puedo mover el cursor a las filas superiores de una ventana de terminal y eso no es bueno. ¿Hay alguna forma de solucionar esto para que el usuario solo pueda moverse dentro de la fila actual?
Otro problema es el retroceso. Cuando lo presiono, el programa imprime un símbolo extraño (que supongo es 0x7f) en lugar de borrar el carácter dejado en la ubicación actual del cursor. Probablemente debería manejar la salida de la tecla de retroceso en el programa de alguna manera, pero no sé cómo hacerlo, ya que es este número hexadecimal extraño. ¿Algún consejo para esto?
Una opción que también he pensado para hacer que esto funcione es usar el modo canónico para que las teclas de flecha y las funciones de retroceso se usen automáticamente. Sin embargo, el modo canónico funciona línea por línea y, por lo tanto, el texto no aparece hasta que el usuario presiona "Enter". Hasta ahora, no he descubierto ninguna forma de hacer que el usuario vea su entrada mientras escribe. ¿Es esto posible?
Y por favor, no hay errores ni sugerencias de readline. Quiero hacer esto usando termios.h.