第48回
特殊な画面制御~GCCの画面制御ライブラリ

ncursesライブラリの関数

ncursesライブラリに収録されている関数群を紹介しましょう。多彩な機能が網羅されています。

基本的な画面表示関数

表1のような関数が用意されています。

カーソル位置を移動して任意の位置から文字列を表示したり、文字や行を挿入するなどの機能があります。

scrollok関数とwscrl関数について補足しておきます。

標準入出力を使ってprintf関数などで文字列を出力した場合、文字列が画面の最下行に達すると、それ以降は画面が上にスクロールしていきます。これは、標準入出力がディスプレイもファイルもプリンタも同じ形式で連続的なデータを扱う仕様となっているためです。

しかしncursesライブラリの関数群には、このような制約はありません。文字列データは、単純にカーソル位置から順に出力されていきます。そのため、画面のスクロールが必要なときには、明示的にスクロールを指定しなければなりません。

まず
scrollok(stdscr, TRUE);
としてスクロール可能な状態にし、その後
wscrl(stdscr, <行数>);
という形でスクロールさせます。

表1:基本的な画面表示関数
move 機能 カーソルを任意の位置(座標)に移動
宣言 int move(int new_y, int new_x);
説明 引数
 new_y:移動先y座標
 new_x:異動先x座標
座標は、左端をx=0、最上行をy=0とし、右方向にxが増加、下方向にyが増加する第四象限座標系で指定する。xの最大値は79、yの最大値は24
addch 機能 カーソル位置に1文字表示
宣言 int addch(chtype char_to_add);
説明 引数
 char_to_add:表示する文字
 chtype型は、Linuxではlong int型となる
printw 機能 カーソル位置から右方向に文字列を表示
宣言 int printw(char *format, ...);
説明 引数
 format:printf関数と同じ書式指定文字列。これに続いて、変数を列挙する
mvprintw 機能 指定した位置から右方向に文字列を表示
宣言 int printw(int x, int y, char *format, ...);
説明 引数
 x,y:出力を開始する座標
 format:printf関数と同じ書式指定文字列。これに続いて、変数を列挙する。
move関数とprintw関数を組み合わせた関数
insch 機能 カーソル位置に文字を挿入し、それより右の文字列を右に1文字分ずらす
宣言 int insch(int char_to_insert);
説明 引数
 char_to_insert:挿入する文字
 この場合の文字はint型
insertln 機能 カーソル位置に空行を挿入し、それより下の行を下方向に1行分スクロールする
宣言 int insertln(void);
delch 機能 カーソル位置の文字を削除し、それより右の文字列を左に1文字分ずらす
宣言 int delch(void);
deletln 機能 カーソル位置の行を削除し、それより下の行を上に1行分スクロールする
宣言 int deleteln(void);
clear 機能 画面全体を消去
宣言 int clear(void);
scrolllok
wscrl
機能 画面のスクロール
説明   scrolllok(stdscr, TRUE);
としてスクロール可能な状態にし、その後
  wscrl(stdscr, <行数>);
という形で<行数>を指定してスクロールさせる

yは絶対値

特殊な出力機能

表2のような関数が用意されています。

カーソル位置の文字や文字列を読み取ったり、文字の属性を設定したりできます。

文字属性に関しては表3を参照してください。

表2:特殊な出力機能
inch 機能 カーソル位置に表示されている文字を読み取る
宣言  chtype inch(void);
説明 戻り値:読み取った1文字
innstr 機能 カーソル位置から右の文字列を読み取る
宣言 int innstr(char *string, int num);
説明 引数
 string:読み取った文字列を保存する配列へのポインタ
 num:読み取る文字数
attron 機能 文字列の属性を変更する
宣言 int attron(chtype attribute);
説明 引数
 attribute:表3に示す記号定数で属性を指定
この関数を実行すると、それ以降の文字はすべて指定した属性となる
attroff 機能 attron関数で設定した文字属性を解除する
宣言 int attroff(chtype attribute);
機能 引数
 attribute:解除したい属性。表3の記号定数で指定する。
注意:通常のコンソールモードではすべての属性が有効だが、X Window System上のX Termなどでは、点滅属性(A_BLINK)が無効となる

表3:attron、attrof関数で文字属性を示す記号定数
記号定数 属性
A_BOLD 太字
A_BLINK 点滅
A_DIM 薄字
A_REVERSE 反転
A_UNDERLINE 下線

カラー表示機能

表4のような関数が用意されています。

文字の色は前景色と背景色のペアを設定し、そのペア番号を使って指定します。

表4:カラー表示機能の関数
has_colors 機能 端末がカラー表示可能かどうかを調べる
宣言 bool has_colors(void);
説明 戻り値
 可能:TRUE
 不可能:FALSE
start_color 機能 文字をカラー表示できるようにする
宣言 int start_color(void);
init_pair 機能 カラーペア番号の定義
宣言 int init_pair(short pair_number, int foreground, int background);
説明 引数
 pair_number:ペア番号
 foreground:前景色
 background:背景色
表示する色を前景色(文字の色)と背景色との組み合わせ(カラーペア)で指定し、そのペアに番号を付けて利用する。
前景色と背景色は、表5に示す記号定数で指定する
COLOR_PAIR 機能 表示する文字の色をカラーペアで指定する
宣言 int COLOR_PAIR(int pair_number);
説明 引数
 pair_number:init_pair関数で設定したカラーペア番号
この関数でカラーペアを指定した後、実際の色表示はattron関数で行う。
たとえばカラーペア番号3のペアを使いたいなら、以下のようにする
attron(COLOR_NUMBER(3));

表5:色を示す記号定数
記号定数
COLOR_BLACK
COLOR_RED
COLOR_BLUE
COLOR_GREEN
COLOR_CYAN 水色
COLOR_YELLOW
COLOR_MAGENTA
COLOR_WHITE

基本的な入力関数

1文字や文字列の入力を行うための関数群です。カーソルキーや[Insert][Delete]などの特殊なキーの入力も行えます。

表6のような関数が用意されています。特殊なキーの判別に用いる記号定数については、表7を参照してください。

表6:基本入力関数
echo
noecho
機能 入力された文字を画面に表示(エコーバック)するかどうか設定する
宣言 int echo(void);
int noecho(void);
説明 echo関数を呼び出すと画面表示を行い、noecho関数を呼び出すと画面表示を行わなくなる。
標準では画面表示を行う状態となっている。
カーソルキーなどの入力を受け取る場合にnoecho関数を使用する
scanw 機能 書式に従って複数のデータを変数に受け取る
宣言 int scanw(char *format, ...);
説明 引数
 format:scaf関数と同じ書式指定文字列。
これに続けて、入力されたデータを保存する変数を列挙する
getstr
getnstr
機能 複数の文字列を受け取り、変数に格納する
宣言 int getstr(char *buf);
int getnstr(char *buf, int maxlen);
説明 引数
 buf:文字列を保存するchar型配列へのポインタ
 maxlen:入力する文字列の最大文字数
getch 機能 押されたキーの1文字を返す
宣言 int getch(void);
説明 戻り値:入力された文字。
 通常はエコー(画面への反映)が有効となっているため[Enter]キーは不要で、キーを押すとその文字が即座に戻り値となって返ってくる。
 noecho関数を呼び出してエコーを無効にした場合は、キーを押した後に[Enter]キーを押す必要がある
noecho
cbreak
keypad
機能 特殊キーの入力
説明  カーソルキーやファンクションキーなど文字を持たない特殊キーの入力を受け取るには、まず以下のようにする。
noecho();
cbreak();
keypad(stdscr, TRUE);
 これ以降、getch関数で特殊キーを受け取れるようになる。
 特殊キーは、表7に示す記号定数で判別する。
 この設定を行った後、元の通常の入力に戻すには、
echo();
nocbreak();
とする

表7:特殊キーを示す記号定数
記号定数 キー
KEY_UP
KEY_DOWN
KEY_LEFT
KEY_RIGHT
KEY_BACKSPACE Back Space
KEY_IC Insert
KEY_DC Delete
KEY_HOME Home
KEY_END End
KEY_NPAGE Page Down
KEY_PPAGE Page Up
KEY_F(1)~KEY_F(12) F1~F12