-
-
Save whyrusleeping/3983293 to your computer and use it in GitHub Desktop.
| #include <termios.h> | |
| #include <stdlib.h> | |
| void RestoreKeyboardBlocking(struct termios *initial_settings) | |
| { | |
| tcsetattr(0, TCSANOW, initial_settings); | |
| } | |
| void SetKeyboardNonBlock(struct termios *initial_settings) | |
| { | |
| struct termios new_settings; | |
| tcgetattr(0,initial_settings); | |
| new_settings = initial_settings; | |
| new_settings.c_lflag &= ~ICANON; | |
| new_settings.c_lflag &= ~ECHO; | |
| new_settings.c_lflag &= ~ISIG; | |
| new_settings.c_cc[VMIN] = 0; | |
| new_settings.c_cc[VTIME] = 0; | |
| tcsetattr(0, TCSANOW, &new_settings); | |
| } | |
| int main() | |
| { | |
| struct termios term_settings; | |
| char c = 0; | |
| SetKeyboardNonBlock(&term_settings); | |
| while(c != 'Q') | |
| { | |
| c = getchar(); | |
| if(c > 0) | |
| printf("Read: %c\n", c); | |
| } | |
| //Not restoring the keyboard settings causes the input from the terminal to not work right | |
| RestoreKeyboardBlocking(&term_settings); | |
| return 0; | |
| } |
Thanks for this. I was struggling to get non blocking getchar going until I found this which got me reading the c_cc[VMIN] and c_cc[VTIME] in the termios docs. Here are the extra steps I had to take to get a working solution:
Line 15, change to
new_settings = *initial_settings;
to avoid compiler error
error: no match for 'operator=' (operand types are 'termios' and 'termios*')
That got it to compile and I notice getchar isn't blocking now, which is good, but with just two small problems. getchar always returns EOF and doesn't pull any characters from the input buffer :-)
The termios documentation doesn't mention getchar, it talks about its affect on read() so I replaced getchar with
char getcharAlt() {
char buff[2];
int l = read(STDIN_FILENO,buff,1);
if (l>0) return buff[0];
return ( EOF);
}
and have a solution for my Raspberry Pi running Raspbian Buster.
can you let everyone know why? or what exactly does not work in your case?