きゅーりくん向け getch

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]に入力されたキーが入るっぽい。
テトリスできればよかったので、矢印キーだけをサポート対象にしたコードでした。


続かない