ファイヤープロジェクト
キーボード入力
2003-07-20T15:13+09:00   matsu
termiosやterminfoでやったことと同様のキーボード入力制御ができる.
キーボードから入力された文字入力を読みとるには以下の関数がある.
int getch(void);
入力文字を(1文字)取得.
int getstr(char *str);
入力文字列を取得.
int getnstr(char *str, int n);
入力文字列(n文字まで)を取得.
int scanw(char *fmt [, arg] ...);
curses版scanf.
例によってそれぞれにmv(カーソルを移動),w(ウィンドウを指定)が付加された版がある.fあとgetstr,scanwはバッファオーバーフロー対策のために使用しない方が無難だろうか.
カノニカルモードと非カノニカルモードに対応するものがcursesにもあって,それがcooked modeとcbreak modeである.cooked modeだと入力はリターンを押すまでプログラムには渡されない.そしてcbreak modeだとキーを押すと即座にプログラムから利用できる.cbreak modeと非カノニカルモードとの違いは,非カノニカルモードはリターンを押すまで入力を編集できるが,cbreakでは編集できないという点だろうか.cooked modeにするには,
int nocbreak(void);
を呼び出す.逆にcbreak modeにするには
int cbreak(void);
を呼び出す.関数名的にはcookedが標準でcbreakであるか否かを設定するような雰囲気だが,実際にはデフォルトがcooked modeかどうかは保証されないので,どちらかを明示的に呼び出す必要がある.
ここではgetch,getnstrを使用してcbreakモードとnocbreakモードの違いを見てみるサンプルを2つ作成してみた.まずgetchを使用するサンプル.
そしてgetnstrを使用するサンプル.
シグナルなどを生成する特殊文字を扱えなくするには
int raw(void);
を呼ぶ.逆に扱えるようにするには
int noraw(void);
を呼び出す.
入力をエコーしないようにするには
int noecho(void);
逆にエコーするようにするには
int echo(void);
を呼び出す.
以上にあげた以外にもhalf-delayモードにしたり,タイムアウト時間を設定したりする関数があるようだが,キリがない(というかちょっと飽きた)ので,man参照.
matsu(C)
Since 2002
Mail to matsu