/*********************** * * KbdInput.cc - KbdInput class code * ***********************/ #include "KbdInput.hh" #include #include // #include #include #include #include #include void dopexit(int); struct termios KbdInput::raw; struct termios KbdInput::hold; KbdInput::KbdInput() { rawInputIsOn = 0; signal(SIGINT, dopexit); fcntl(0, F_SETFL, O_NONBLOCK); tcgetattr(0,&raw); tcgetattr(0,&hold); cfmakeraw(&raw); tcsetattr(0,TCSANOW,&KbdInput::raw); rawInputIsOn = 1; } KbdInput::~KbdInput() { fcntl(0, F_SETFL, 0); tcsetattr(0,TCSANOW,&KbdInput::hold); rawInputIsOn = 0; } char KbdInput::nextChar() { if (!rawInputIsOn) On(); char thechar = getchar(); return ( (thechar == -1) ? 0 : thechar ); } void KbdInput::Off() { fcntl(0, F_SETFL, 0); tcsetattr(0,TCSANOW,&KbdInput::hold); rawInputIsOn = 0; } void KbdInput::On() { fcntl(0, F_SETFL, O_NONBLOCK); tcsetattr(0,TCSANOW,&KbdInput::raw); rawInputIsOn = 1; } void dopexit(int signal) { fcntl(0, F_SETFL, 0); tcsetattr(0,TCSANOW,&KbdInput::hold); exit(signal); }