Como fazer com que as teclas de seta e o backspace funcionem corretamente ao solicitar informações do usuário no programa C usando termios.h?
Então, eu tenho o código a seguir, que basicamente lê apenas as entradas de caracteres e as imprime até que 'q' seja inserido.
#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;
}
No início da função principal, desligo o modo canônico para tornar o usuário capaz de ver sua entrada quando está dando. Também desativo o eco para que coisas como "^ [[A" não apareçam ao pressionar a tecla de seta para cima, por exemplo. Isso funciona, mas também sou capaz de mover o cursor para as linhas superiores de uma janela de terminal e isso não é bom. Existe uma maneira de corrigir isso para que o usuário possa se mover apenas dentro da linha atual?
Outro problema é o backspace. Quando pressiono, o programa imprime um símbolo estranho (que suponho ser 0x7f) em vez de apagar o caractere deixado no local atual do cursor. Eu deveria lidar com a saída da tecla backspace no programa de alguma forma, mas não sei como fazê-lo, pois é esse número hexadecimal estranho. Alguma dica para isso?
Uma opção em que eu também estava pensando em fazer esse trabalho é usar o modo canônico para que as teclas de seta e as funcionalidades de backspace sejam automaticamente usadas. No entanto, o modo canônico funciona linha por linha e, portanto, o texto não aparece até que "Enter" seja pressionado pelo usuário. Até agora, eu não descobri nenhuma maneira de fazer o usuário ver sua entrada enquanto digitava. Isso é possível?
E, por favor, não ncurses ou sugestões readline. Eu quero fazer isso usando termios.h.