I have a chat client that takes in input in raw terminal mode, but I don\'t know about handling input in this mode. I need to know 2 things:
In Windows there is a very useful function kbhit() but that is not there in linux unfortunately. There can be multiple methods for this. we'll make our own kbhit() method for linux. kbhit() will return non zero value when something is detected in the input buffer otherwise it will return 0 and pass on. In simple words it is non-blocking. Whenever the result is true then call getch() method to fetch that pressed key.
#include
#include
#include
#include
#include
void changemode(int);
int kbhit(void);
int main(void)
{
int ch;
changemode(1);
while ( !kbhit() ); // Waiting for some keyboard input.
// something has been detected. now get that.
ch = getchar();
printf("\nGot %c\n", ch);
changemode(0);
return 0;
}
void changemode(int dir)
{
static struct termios oldt, newt;
if ( dir == 1 )
{
tcgetattr( STDIN_FILENO, &oldt);
newt = oldt;
newt.c_lflag &= ~( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &newt);
}
else
tcsetattr( STDIN_FILENO, TCSANOW, &oldt);
}
int kbhit (void)
{
struct timeval tv;
fd_set rdfs;
tv.tv_sec = 0;
tv.tv_usec = 0;
FD_ZERO(&rdfs);
FD_SET (STDIN_FILENO, &rdfs);
select(STDIN_FILENO+1, &rdfs, NULL, NULL, &tv);
return FD_ISSET(STDIN_FILENO, &rdfs);
}