3. C言語 - curses - 10msec 周期でキーボードの入力を待つ

 
3.1 入力関数
3.2 10msec 周期でキーボードの入力を待つ

3.1 入力関数

 入力用の関数はいくつかあるのですが、わたしが使用しているのは wgetch と wgetstr くらいです。

int wgetch(WINDOW *win);
int wgetstr(WINDOW *win, char *str);
 wgetch は入力時のモードによりますが、基本はキー一回の押下でキーの値を返します。  wgetstr は Enter が入力されるまでに入力した文字列を引数に返します。

3.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 して実行すると・・・、いったん端末がクリアされます。  スペースを入力すると、プログラムが終了して、前の画面が戻ります。