M
Man braucht nicht direkt ncurses, sondern kann auch die Tastatur so umstellen, dass Input sofort verfügbar ist (ICANON aus) und nicht erst nach Eingabe von Newline. Man kann dann mit select() schauen, ob überhaupt was Neues reingekommen ist und dann ggf. lesen.
Allerdings muss man die Einstellungen am Ende des Programms wiederherstellen (muss man auch bei ncurses entsprechend).
Unter der Haube macht ncurses wohl auch nix anderes, nur bietet es noch weit mehr Möglichkeiten. Spätestens wenn es um Farben geht ist es nahezu Pflicht, um die Unterschiede der unter Linux verwendeten Consolen wegzuwrappen.
Zu Beginn des Programms:
struct termios oldSettings; // brauchen wir am Ende wieder
tcgetattr( fileno(stdin), &oldSettings );
struct termios newSettings( oldSettings );
newSettings.c_lflag &= (~ICANON & ~ECHO);
tcsetattr( fileno(stdin), TCSANOW, &newSettings );
Am Ende des Programms:
tcsetattr( fileno(stdin), TCSANOW, &oldSettings );
Abfrage eines Zeichens:
char getKey()
{
struct timeval timeOut;
timeOut.tv_sec = 0;
timeOut.tv_usec = 0;
fd_set set;
FD_ZERO( &set );
FD_SET( fileno(stdin), &set );
if( select( fileno(stdin)+1, &set, NULL, NULL, &timeOut ) > 0 )
{
char c;
if( 1 == read( fileno(stdin), static_cast<void*>(&c), sizeof(char) ))
{
return c;
}
}
// Timeout, select- oder read-Error
return '\0';
}