cursesライブラリの超てきとー解説
端末制御ライブラリ curses を利用すれば,
文字端末内で動くフルスクリーンアプリを
C言語でもお手軽に作成できる.
基本的な curses関数
最低限,これらだけ理解すれば,
大抵のフルスクリーンアプリは作成できるだろう.
(完成度を問わなければ...)
- ヘッダファイル:
- #include <ncurses.h>:
ncurses(curses の改良版)を使うために必要.
- #include <locale.h>:
ncurses で日本語文字列を使う場合に必要.
(curses とは直接的には無関係.)
- 初期設定関連の処理:
- 出力関連の処理:
- getmaxyx(stdscr, 変数1, 変数2):
スクリーンのサイズを取得.
変数1 に高さ,変数2 に幅が代入される.
変数をポインタにする必要はない.
参照呼出なのに & は不要?
実はこれ,関数ではなく,引数付きマクロとして実装されている.
- clear():
スクリーンをクリアし,リフレッシュ.
- erase():
スクリーンをクリア.リフレッシュなし.
- refresh():
スクリーンをリフレッシュ(再表示).
実際の端末画面上の表示内容は,
リフレッシュされるまで変化しない.
- move(縦位置, 横位置):
カーソルを移動.
- addch(文字):
文字を表示.
- addstr(文字列):
文字列を表示.
- printw(書式, データ, データ, ...):
curses 版の printf().
なお,移動と表示を一括実行する関数
mvaddch(...) や mvprintw(...)
等も用意されている.
- flash():
画面を点滅.
- beep():
ベルを鳴動.
(端末の機能/設定によっては鳴らない場合もある.)
- 入力関連の処理:
- timeout(ミリ秒):
キー入力の待ち時間(普通は 1 ms 以上)を設定.
- 待ち時間が長過ぎると,キー入力の有無によってメインループの
進行速度の変動が大きいかもしれない.
- 待ち時間はゼロでもよいが,
キー長押し等の場合に入力を取り逃すかもしれない.
キーボードのオートリピートの設定次第だが,
長押し(on の継続のつもり)が
連打(一瞬の on と一定時間の off との繰り返し)に変換されるので...
- 負値を設定するとキーが押されるまで永久に待つことになる.
(初期状態では timeout(-1).)
- getch():
キーボードから文字を入力.
入力された文字を int 型として返す.
curses版の fgetc().
- getstr(文字列ポインタ):
キーボードから文字列を入力.
curses版の fgets().
- scanw(書式, ポインタ, ポインタ, ...):
curses 版の scanf().
なお,移動と入力を一括実行する関数
mvgetstr(...) や mvscanw(...)
等も用意されている.
- inch():
スクリーン(カーソル位置の表示内容)から文字を入力.
入力された文字を int 型として返す.
- instr(文字配列へのポインタ):
スクリーン(カーソル位置の表示内容)から文字列を入力.
- flushinp():
キー入力バッファをクリア.
- タイプされたキーは自動的にバッファに蓄積されてゆき,
バッファの先頭(最古)のものだけが
getch() によって取り出される.
- バッファに多くのキーシーケンスが残っていると,
その分だけ古いキー入力を遅れて拾うことになる.
- キー入力の遅延が気になる場合,
この関数を getch() の直後などに呼び出し,
蓄積されすぎたキーシーケンスを捨て去るとよい.
あるいはクリアせず,getch() の呼出を反復し,
バッファの末尾(最新)のものだけを拾うようにしてもよいだろう.
カラフルにするための cursesライブラリ関数
端末画面は標準状態では古めかしい白黒表示だが,
現代の端末ではカラー表示も可能となっている.
(しかし,カラーの利用は,面倒くさく,わかりづらい...)
- 初期設定関連の処理:
- start_color():
カラー表示機能を有効化.(カラー関連処理の最初に呼び出せ.)
- init_color(色番号, R値, G値, B値):
色を作成.
色番号は(端末依存だが多分)0〜255.
標準の色番号 0〜7 については準備済み.
(マクロ名 COLOR_BLACK,COLOR_RED,
...,COLOR_WHITEも利用可能.)
色のマクロ名については,
/usr/include/ncurses.h 内を検索せよ.
RGB値はそれぞれ 0〜1000.
- init_pair(ペア番号, 文字色番号, 背景色番号):
カラーペア(文字色と背景色の組)を作成.
ペア番号は(端末依存だが多分)1〜255.
(ペア番号 0 は端末のデフォルトの配色.)
- use_default_colors():
端末のデフォルトの配色を利用可能化.
init_pair() で文字色・背景色の番号-1
がデフォルトの配色を意味するようになる.
- 表示属性関連の処理:
なお,start_color() や init_pair() 等は,
プログラムの初期設定として一度実行するだけでよい.
属性変更の際には,attr*(...) だけを実行する.
よく一緒に利用する他のライブラリ関数
ビデオゲーム的なプログラムの作成にも curses を利用できる.
しかし,端末制御以外の処理には,他のライブラリも必要となる.
乱数関連の処理:
- srand(time(NULL)):
再現性のない整数乱数列を生成.
(#include <stdlib.h>,
#include <time.h>,
初期設定として一度だけ実行せよ.)
- rand():
整数乱数を返す.
(#include <stdlib.h>)
例:rand()%10 は乱数 0〜9 となる.
オンラインマニュアル
全般的な解説は,次のマニュアルページに記載されている.
$ man ncurses
多分,英語だけど...
必要な部分だけ拾い読みすればよいだけなので何とかしよう.
そこには,curses ライブラリに含まれているすべての関数について,
関数名とマニュアルページ名の対応表も記載されている.
...
curses Routine Name Manual Page Name
___________________________________________
addch curs_addch(3X)
addchnstr curs_addchstr(3X)
...
たとえば,関数 addch() について調べたければ,
マニュアル curs_addch を読めばよい.
$ man curs_addch
または,関数によっては素直に,
man addch 等でも OK な場合もある.
コンパイル方法
$ cc ソース.c -lncurses -o プログラム
# または,日本語文字列を利用している場合...
$ cc ソース.c -lncursesw -ltinfo -o プログラム
日本語版について,-ltinfo は Ubuntu 等で必要,CentOS 等では不要.
(c) 2020, yanagawa@kushiro-ct.ac.jp