| /* |
| C non-blocking keyboard input |
| http://stackoverflow.com/questions/448944/c-non-blocking-keyboard-input |
| */ |
| |
| #include <stdlib.h> |
| #include <string.h> |
| #include <sys/select.h> |
| #include <termios.h> |
| #include <unistd.h> |
| #include "getch.h" |
| |
| struct termios orig_termios; |
| |
| void reset_terminal_mode() |
| { |
| tcsetattr(0, TCSANOW, &orig_termios); |
| } |
| |
| void set_conio_terminal_mode() |
| { |
| struct termios new_termios; |
| |
| /* take two copies - one for now, one for later */ |
| tcgetattr(0, &orig_termios); |
| memcpy(&new_termios, &orig_termios, sizeof(new_termios)); |
| |
| /* register cleanup handler, and set the new terminal mode */ |
| atexit(reset_terminal_mode); |
| cfmakeraw(&new_termios); |
| new_termios.c_oflag |= OPOST; |
| tcsetattr(0, TCSANOW, &new_termios); |
| } |
| |
| int kbhit() |
| { |
| struct timeval tv = { 0L, 0L }; |
| fd_set fds; |
| FD_ZERO(&fds); // not in original posting to stackoverflow |
| FD_SET(0, &fds); |
| return select(1, &fds, NULL, NULL, &tv); |
| } |
| |
| int getch() |
| { |
| int r; |
| unsigned char c; |
| if ((r = read(0, &c, sizeof(c))) < 0) { |
| return r; |
| } else { |
| return c; |
| } |
| } |
| |
| #if 0 |
| int main(int argc, char *argv[]) |
| { |
| set_conio_terminal_mode(); |
| |
| while (!kbhit()) { |
| /* do some work */ |
| } |
| (void)getch(); /* consume the character */ |
| } |
| #endif |