Init
This commit is contained in:
92
Source/include/slikenet/Kbhit.h
Normal file
92
Source/include/slikenet/Kbhit.h
Normal file
@ -0,0 +1,92 @@
|
||||
/*****************************************************************************
|
||||
_kbhit() and _getch() for Linux/UNIX
|
||||
Chris Giese <geezer@execpc.com> http://my.execpc.com/~geezer
|
||||
Release date: ?
|
||||
This code is public domain (no copyright).
|
||||
You can do whatever you want with it.
|
||||
*****************************************************************************/
|
||||
/*
|
||||
* Modified work: Copyright (c) 2016-2020, SLikeSoft UG (haftungsbeschränkt)
|
||||
*
|
||||
* This source code was modified by SLikeSoft. Modifications in this file are put under the public domain.
|
||||
* Alternatively you are permitted to license the modifications under the MIT license, if you so desire. The
|
||||
* license can be found in the license.txt file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
#if defined(_WIN32)
|
||||
#include <conio.h> /* _kbhit(), _getch() */
|
||||
|
||||
#else
|
||||
#include <sys/time.h> /* struct timeval, select() */
|
||||
/* ICANON, ECHO, TCSANOW, struct termios */
|
||||
#include <termios.h> /* tcgetattr(), tcsetattr() */
|
||||
#include <stdlib.h> /* atexit(), exit() */
|
||||
#include <unistd.h> /* read() */
|
||||
#include <stdio.h> /* printf() */
|
||||
#include <string.h> /* memcpy */
|
||||
|
||||
static struct termios g_old_kbd_mode;
|
||||
/*****************************************************************************
|
||||
*****************************************************************************/
|
||||
static void cooked(void)
|
||||
{
|
||||
tcsetattr(0, TCSANOW, &g_old_kbd_mode);
|
||||
}
|
||||
/*****************************************************************************
|
||||
*****************************************************************************/
|
||||
static void raw(void)
|
||||
{
|
||||
static char init;
|
||||
/**/
|
||||
struct termios new_kbd_mode;
|
||||
|
||||
if(init)
|
||||
return;
|
||||
/* put keyboard (stdin, actually) in raw, unbuffered mode */
|
||||
tcgetattr(0, &g_old_kbd_mode);
|
||||
memcpy(&new_kbd_mode, &g_old_kbd_mode, sizeof(struct termios));
|
||||
new_kbd_mode.c_lflag &= ~(ICANON /*| ECHO */ );
|
||||
new_kbd_mode.c_cc[VTIME] = 0;
|
||||
new_kbd_mode.c_cc[VMIN] = 1;
|
||||
tcsetattr(0, TCSANOW, &new_kbd_mode);
|
||||
/* when we exit, go back to normal, "cooked" mode */
|
||||
atexit(cooked);
|
||||
|
||||
init = 1;
|
||||
}
|
||||
/*****************************************************************************
|
||||
*****************************************************************************/
|
||||
static int _kbhit(void)
|
||||
{
|
||||
struct timeval timeout;
|
||||
fd_set read_handles;
|
||||
int status;
|
||||
|
||||
raw();
|
||||
/* check stdin (fd 0) for activity */
|
||||
FD_ZERO(&read_handles);
|
||||
FD_SET(0, &read_handles);
|
||||
timeout.tv_sec = timeout.tv_usec = 0;
|
||||
status = select(0 + 1, &read_handles, nullptr, nullptr, &timeout);
|
||||
if(status < 0)
|
||||
{
|
||||
printf("select() failed in _kbhit()\n");
|
||||
exit(1);
|
||||
}
|
||||
return status;
|
||||
}
|
||||
/*****************************************************************************
|
||||
*****************************************************************************/
|
||||
static int _getch(void)
|
||||
{
|
||||
unsigned char temp;
|
||||
|
||||
raw();
|
||||
/* stdin = fd 0 */
|
||||
if(read(0, &temp, 1) != 1)
|
||||
return 0;
|
||||
return temp;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user