Jump to content

The un*x to OS/2-EMX Porting FAQ:Sample Code

From EDM2

This page shows the content of key.c sample file from the The un*x to OS/2-EMX Porting FAQ.

/*
  $Id$
  Some code to query for a single keypress within an xterm on
  XFree86OS/2 
*/

#include <stdio.h>
#include <termios.h>

int kbhit (void)
/* check whether a key was pressed */
{
 struct termios term, oterm;
 int fd = 0;
 int c = 0;

 /* get the terminal settings */
 tcgetattr (fd, &oterm);

 /* get a copy of the settings, which we modify */
 memcpy (&term, &oterm, sizeof (term));

 /* put the terminal in non-canonical mode, any 
    reads timeout after 0.1 seconds or when a 
    single character is read */
 term.c_lflag = term.c_lflag & (!ICANON);
 term.c_cc[VMIN] = 0;
 term.c_cc[VTIME] = 1;
 tcsetattr (fd, TCSANOW, &term);

 /* get input - timeout after 0.1 seconds or 
    when one character is read. If timed out
    getchar() returns -1, otherwise it returns
    the character */
 c = getchar ();

 /* reset the terminal to original state */
 tcsetattr (fd, TCSANOW, &oterm);

 /* if we retrieved a character, put it back on
    the input stream */
 if (c != -1)
   ungetc (c, stdin);

 /* return 1 if the keyboard was hit, or 0 if it
    was not hit */
 return ((c != -1) ? 1 : 0);
} 

/********************************************************/

int getch (void)
/* get pressed key */

{
 int c, fd = 0;
 struct termios term, oterm;

 /* get the terminal settings */
 tcgetattr (fd, &oterm);

 /* get a copy of the settings, which we modify */
 memcpy (&term, &oterm, sizeof (term));

 /* put the terminal in non-canonical mode, any 
    reads will wait until a character has been
    pressed. This function will not time out */
 term.c_lflag = term.c_lflag & (!ICANON);
 term.c_cc[VMIN] = 1;
 term.c_cc[VTIME] = 0;
 tcsetattr (fd, TCSANOW, &term);

 /* get a character. c is the character */
 c = getchar ();

 /* reset the terminal to its original state */
 tcsetattr (fd, TCSANOW, &oterm);

 /* return the character */
 return c;
}

/********************************************************/

int  getkey (void)
 /* merge kbhit() and getch() into a useful one :-) */

{

 if (kbhit())
   return getch();
 else
   return (char) 0;
}