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

 クラウディア
1. 初期化・終了
2. 入力制御
3. ウィンドウ描画
4. 例 端末の設定
5. 例 ウィンドウのオープン・クローズ

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. 入力制御


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」をコールします。

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」のウィンドウを現在の表示内容で再描画します。

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

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」して実行しても、ほとんど変化はありません。
ハイスピードプランネットオークションの相場、統計、価格比較といえばオークファン