Shadowrun: Awakened 29 September 2011 - Build 871
Kbhit.h
Go to the documentation of this file.
00001 /*****************************************************************************
00002 kbhit() and getch() for Linux/UNIX
00003 Chris Giese <geezer@execpc.com> http://my.execpc.com/~geezer
00004 Release date: ?
00005 This code is public domain (no copyright).
00006 You can do whatever you want with it.
00007 *****************************************************************************/
00008 #if defined(_WIN32)
00009 #include <conio.h> /* kbhit(), getch() */
00010 
00011 #else
00012 #include <sys/time.h> /* struct timeval, select() */
00013 /* ICANON, ECHO, TCSANOW, struct termios */
00014 #include <termios.h> /* tcgetattr(), tcsetattr() */
00015 #include <stdlib.h> /* atexit(), exit() */
00016 #include <unistd.h> /* read() */
00017 #include <stdio.h> /* printf() */
00018 #include <string.h> /* memcpy */
00019 
00020 static struct termios g_old_kbd_mode;
00021 /*****************************************************************************
00022 *****************************************************************************/
00023 static void cooked(void)
00024 {
00025     tcsetattr(0, TCSANOW, &g_old_kbd_mode);
00026 }
00027 /*****************************************************************************
00028 *****************************************************************************/
00029 static void raw(void)
00030 {
00031     static char init;
00032 
00033     struct termios new_kbd_mode;
00034 
00035     if(init)
00036         return;
00037 /* put keyboard (stdin, actually) in raw, unbuffered mode */
00038     tcgetattr(0, &g_old_kbd_mode);
00039     memcpy(&new_kbd_mode, &g_old_kbd_mode, sizeof(struct termios));
00040     new_kbd_mode.c_lflag &= ~(ICANON | ECHO);
00041     new_kbd_mode.c_cc[VTIME] = 0;
00042     new_kbd_mode.c_cc[VMIN] = 1;
00043     tcsetattr(0, TCSANOW, &new_kbd_mode);
00044 /* when we exit, go back to normal, "cooked" mode */
00045     atexit(cooked);
00046 
00047     init = 1;
00048 }
00049 /*****************************************************************************
00050 *****************************************************************************/
00051 static int kbhit(void)
00052 {
00053     struct timeval timeout;
00054     fd_set read_handles;
00055     int status;
00056 
00057     raw();
00058 /* check stdin (fd 0) for activity */
00059     FD_ZERO(&read_handles);
00060     FD_SET(0, &read_handles);
00061     timeout.tv_sec = timeout.tv_usec = 0;
00062     status = select(0 + 1, &read_handles, NULL, NULL, &timeout);
00063     if(status < 0)
00064     {
00065         printf("select() failed in kbhit()\n");
00066         exit(1);
00067     }
00068     return status;
00069 }
00070 /*****************************************************************************
00071 *****************************************************************************/
00072 static int getch(void)
00073 {
00074     unsigned char temp;
00075 
00076     raw();
00077 /* stdin = fd 0 */
00078     if(read(0, &temp, 1) != 1)
00079         return 0;
00080     return temp;
00081 }
00082 #endif
00083 
00084 

Copyright © 2007-2010 by The Shadowrun: Awakened Team. This work is licensed under the GNU Lesser General Public License 3.

GNU Lesser General Public License 3 Sourceforge.net