- 1. 入力関数
- 2. 10msec 周期でキーボードの入力を待つ
1. 入力関数
入力用の関数はいくつかあるのですが、わたしが使用しているのは wgetch と wgetstr くらいです。
int wgetch(WINDOW *win);
int wgetstr(WINDOW *win, char *str);
wgetch は入力時のモードによりますが、基本はキー一回の押下でキーの値を返します。
wgetstr は Enter が入力されるまでに入力した文字列を引数に返します。
2. 10msec 周期でキーボードの入力を待つ
10msec 周期でキーボードの入力を待つようにします。
36行目、keypad、このウィンドウでファンクションキーが入力されたときにそのコードを返すようにします。
これを指定していない場合は、エスケープシーケンスとして入力され、1回のキー入力で2文字が返ってきます。
37行目、noecho、キーボードの入力をエコーバックしないようにします。
38行目、nodelay、getch 等のキー入力を非ブロッキングモードにします。
非ブロッキングモード時は、入力バッファにデータがない場合は、エラーが返されます。
39行目、halfdelay、引数の数値×10分の1秒待って入力がない場合、エラーとします。
#include <errno.h>
#include <locale.h>
#include <ncurses.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define SETTERM "xterm"
#define COLUMN 80 // カラム数
#define LINES 24 // 行数
WINDOW *win;
int nend = 0;
void sub01(void);
int main(int argc , char* argv[])
{
char *aterm; // 端末設定ワーク
setlocale(LC_ALL, "C");
aterm = getenv("TERM");
if (setenv("TERM", SETTERM, 1) != 0)
{
perror("setenv");
return errno;
}
initscr();
win = newwin(LINES, COLUMN, 0, 0);
keypad(win, true);
noecho();
nodelay(win, true);
halfdelay(10);
while (nend == 0)
{
sub01();
}
endwin();
setenv("TERM", aterm, 1);
return 0;
}
void sub01(void)
{
int ninput = 0;
werase(win);
wrefresh(win);
ninput = wgetch(win);
switch (ninput)
{
case ' ':
case 'q':
case 'Q':
case 'x':
case 'X':
nend = 1;
break;
default:
break;
}
}
これを、make して実行すると・・・、いったん端末がクリアされます。
スペースを入力すると、プログラムが終了して、前の画面が戻ります。
|
   |