getchをlinuxでそこはかとなくやりたい向け
ネットワークでテトリス(未公開)をWindows/Linuxで動くようにするために作ったtetorisu_kbdhit関数.
動作は多分、FedoraCore10とCentOS 5.2で確認した気がする。
#include <unistd.h> #include <termios.h> #include <stdlib.h> #define TETORISU_KEY_ARROW 27 // 矢印キー入力値 /* 中略 */ // kbhitとgetchを同時にやっちゃう // 参考: http://www-cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/CCGI/function.html#getch int tetorisu_kbdhit( void ) { static struct termios t, orig_t; static unsigned char c[8]={0}; // buffer tcgetattr( 0, &t ); orig_t = t; t.c_lflag &= ~(ICANON|ECHO); t.c_cc[VMIN] = 0; tcsetattr( 0, TCSADRAIN, &t ); int status = read( 0, c, sizeof(unsigned char)*8 ); tcsetattr( 0, TCSADRAIN, &orig_t ); // 特殊キーを入力すると実際のキーと特殊情報が最初に2byte入るので読み捨てる。 // 矢印が正しくとれればいいので、他の制御文字はしらん。 return status ? (int)(c[0]==TETORISU_KEY_ARROW ? c[2] : c[0]) : -1; }
ソースコードをまんまコピー。
特別なキーを入力すると、そのフラグっぽいのが2byte分つくので、そこを判断する。
普通のキーなら、(入力バッファがcとすると)c[0]で取得でき、
c[0]が特別な情報の時はc[0],c[1]に色々はいって、c[2]に入力されたキーが入るっぽい。
テトリスできればよかったので、矢印キーだけをサポート対象にしたコードでした。
続かない