#include "pikbdlistener.h" bool PIKbdListener::exiting; PIKbdListener::PIKbdListener(KBFunc slot, void * data_): PIThread() { #ifdef __WIN32__ hIn = GetStdHandle(STD_INPUT_HANDLE); GetConsoleMode(hIn, &smode); #else struct termios term; tcgetattr(0, &term); sterm = term; #endif is_active = true; ret_func = slot; data = data_; PIKbdListener::exiting = exit_enabled = false; start(); } void PIKbdListener::begin() { //cout << "list begin" << endl; #ifdef __WIN32__ hIn = GetStdHandle(STD_INPUT_HANDLE); GetConsoleMode(hIn, &smode); SetConsoleMode(hIn, ENABLE_PROCESSED_INPUT); #else struct termios term; tcgetattr(0, &term); term.c_lflag &= ~(ECHO | ICANON) | NOFLSH; tcsetattr(0, TCSAFLUSH, &term); #endif } void PIKbdListener::run() { #ifdef __WIN32__ ReadConsole(hIn, &rc, 1, &ret, 0); #else ret = read(0, &rc, 1); #endif if (exit_enabled && rc == exit_key) PIKbdListener::exiting = true; if (ret_func != 0 && ret > 0 && is_active) ret_func(rc, data); } void PIKbdListener::end() { //cout << "list end" << endl; #ifdef __WIN32__ SetConsoleMode(hIn, smode); #else tcsetattr(0, TCSANOW, &sterm); #endif }