#include // ---------------------------------------------------------- // getch // // liest eine Taste von der Tastatur ein. // // WICHTIG: es wird auf einen Tastendruck gewartet, die // zuletzt gedrueckte Tastewird zurueck gegeben. // ---------------------------------------------------------- int getch(void) { static int ch = -1, fd = 0; struct termios neu, alt; fd = fileno(stdin); tcgetattr(fd, &alt); neu = alt; neu.c_lflag &= ~(ICANON|ECHO); tcsetattr(fd, TCSANOW, &neu); ch = getchar(); tcsetattr(fd, TCSANOW, &alt); ch &= 0xff; return ch; } // ---------------------------------------------------------- // keypressed // // Testet, ob eine Taste gedrueckt ist // // WICHTIG: es wird NICHT auf einen Tastendruck gewartet. // ---------------------------------------------------------- int keypressed(void) { struct termios alt, neu; int ch; int altf; tcgetattr(STDIN_FILENO, &alt); neu = alt; neu.c_lflag &= ~(ICANON | ECHO); tcsetattr(STDIN_FILENO, TCSANOW, &neu); altf = fcntl(STDIN_FILENO, F_GETFL, 0); fcntl(STDIN_FILENO, F_SETFL, altf | O_NONBLOCK); ch = getchar(); tcsetattr(STDIN_FILENO, TCSANOW, &alt); fcntl(STDIN_FILENO, F_SETFL, altf); if(ch != EOF) { ungetc(ch, stdin); return 1; } return 0; } // ---------------------------------------------------------- // readkey // // Liest Tastatur ein und unterscheidet auch zwischen // Cursor(Pfeil)-Tasten und Funktionstasten F1 .. F12 // Rueckgabewert ist ein 32-Bit unsigned int, der bspw. // bei F6 bis F12 auch in ALLEN 32 Bits benoetigt wird // ---------------------------------------------------------- unsigned int readkey(void) { int n; unsigned int ch,ch2; ch= getch(); if (keypressed()) { ch= 0; while(keypressed()) { ch= (ch << 8) | getch(); } } return ch; }