1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- /*
- 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
|