5. C言語 - ncurses - 簡単なプログラム

 
5.1 ソース
5.2 Makefile
5.3 実行

5.1 ソース

/home/hogehoge/lang/cpp/ncurses/ncurses.c
 というソースを作成して、以下のように記述しました。

#include <limits.h>
#include <locale.h>
#include <ncurses.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char *argv[])
{
	char *term;

	int cols, lines;

	WINDOW *win;

	setlocale(LC_ALL, "ja_JP.UTF-8");
	term = getenv("TERM");

	if (setenv("TERM", "vt100", true) != 0)
	{
		printf("\n端末の設定に失敗しました。\n\n");
		return 0;
	}

	initscr();

	win = newwin(LINES, COLS, 0, 0);
	keypad(win, 4);
	noecho();
	nodelay(win, true);
	halfdelay(10);

	while(true)
	{
		bool bbreak = false;

		char  atime[LINE_MAX] = {};

		int y = LINES / 2;
		int x = COLS / 4;

		time_t t = time(NULL);

		struct tm stm = {};

		localtime_r(&t, &stm);
		strftime(atime, sizeof(atime), "%Y年%m月%d日 %H:%M:%S", &stm);

		werase(win);

		mvwprintw(win, y-1, x, atime);
		mvwprintw(win, y++, x, "何かキーを入力してください ");
		mvwprintw(win, y++, x, "終了するには e を入力します ");

		wrefresh(win);

		int n = wgetch(win);

		switch (n)
		{
		case 'e':
		case 'E':
			bbreak = true;
			break;

		default:
			break;
		}

		if (bbreak != false)
		{
			break;
		}
	}

	werase(win);
	wrefresh(win);
	delwin(win);
	endwin();

	setenv("TERM", term, true);

	return 0;
}

5.2 Makefile

 Makefile は以下のように作成しました。

CC	= clang

target	: ncurses.o Makefile
	$(CC) -O0 -g -o ncurses ncurses.o -lncursesw

.c.o	: Makefile
	$(CC) -O0 -g -c $< -o $@

5.3 実行

 make して実行するとこんな感じ

> make
clang -O0 -g -c ncurses.c -o ncurses.o
clang -O0 -g -o ncurses ncurses.o -lncursesw
> ./ncurses

 もともとの端末の画面サイズの影響を受けますが・・・。
 ほぼ中央に、メッセージが表示され、上段の日時は刻々と変化していくのがわかるかと思います。

 キーボードで e ないし E を入力すると画面を消去して終了します。