2. C言語 - ncurses - 端末の設定・オープンクローズ

 
2.1 初期化・終了
2.2 入力制御
2.3 ウィンドウ描画
2.4 例 端末の設定
2.5 例 ウィンドウのオープン・クローズ

2.1 初期化・終了

 わたしの使う主な関数を羅列しておきます。

WINDOW *initscr(void);
WINDOW *newwin(int nlines, int ncols, int begin_y, int begin_x);
int delwin(WINDOW *win);
int endwin(void);
 initscr は、現在の端末の画面を初期化してウィンドウとして使用します。  endwin でウィンドウの使用を終了します。  以降の関数はすべて initscr ~ endwin の内に記述する必要があります。  newwin は、nlines 行、ncols 列のウィンドウを、左上の位置 begin_y、begin_x から開始します。  delwin は、引数のウィンドウを削除します。

2.2 入力制御


int echo(void);
int nocbreak(void);
int noecho(void);
int keypad(WINDOW *win, bool bf);
int nodelay(WINDOW *win, bool bf);
int halfdelay(int tenths);
 echo はキー入力をエコーバックするようにします。  noecho はキー入力をエコーバックされないようにします。  keypad は bf に true を指定すると win の wgetch 等でファンクションキーを入力したとき、ファンクションキーのコードを返すようになります。  bf に false を指定するとキーがエスケープシーケンスとして返されます。(ファンクションキーの体裁でなくなる)  nodelay で bf に true を指定した場合,wgetch などの呼び出しが,非ブロッキングモードになります。  非ブロッキングモードでは、入力待ちとならず、バッファにデータがない場合は、エラーが返されます。  halfdelay は thnths × 10 m秒 待って入力が無かった場合エラーとなります。  このモードを抜けるときは、nocbreak をコールします。

2.3 ウィンドウ描画


int mvwprintw(WINDOW *win, int y, int x, const char *fmt, ...);
int werase(WINDOW *win);
int wrefresh(WINDOW *win);
 mvwprintw は win のウィンドウ位置、y 行、x 列へ移動し、fmt 文字列を表示します。  werase は win のウィンドウを消去します。  wrefresh は win のウィンドウを現在の表示内容で再描画します。

2.4 例 端末の設定

 できれば、日本語を使いたいので、最初に端末を日本語表示可能な端末に設定して、終了時に元の状態に戻すようにします。  21行目までが、端末の設定。  23行目で元に戻しています。

#include <errno.h>
#include <locale.h>
#include <ncurses.h>
#include <stdlib.h>
#include <stdio.h>

#define	SETTERM	"xterm"

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;
	}

	setenv("TERM", aterm, 1);

	return 0;
}

2.5 例 ウィンドウのオープン・クローズ

 上記に、ウィンドウのオープンとクローズを加えます。  ウィンドウのカラム数を 80 行数を 24 としています。  28行目で、ウィンドウの初期化を行っています。  30行目で、新しいウィンドウの作成、32行目でウィンドウの終了を行っています。

#include <errno.h>
#include <locale.h>
#include <ncurses.h>
#include <stdlib.h>
#include <stdio.h>

#define	SETTERM	"xterm"

#define	COLUMN	80								//	カラム数
#define	LINES	24								//	行数

WINDOW	*win;

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);

	endwin();

	setenv("TERM", aterm, 1);

	return 0;
}
 ここまでの処理で、make して実行しても、ほとんど変化はありません。