You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
1.3 KiB
65 lines
1.3 KiB
/* |
|
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
|
|
|