名前 | 形式 | 機能説明 | 戻り値 | 属性 | 関連項目 | 注意事項
cc [ flag... ] file...– lcurses [ library... ] #include <curses.h>
curses ライブラリ中の各ルーチンは、一定の最適化を行いながら文字画面を更新するための、端末に依存しない方法を提供しています。
curses パッケージを利用すると次のことが可能になります。画面全体のウィンドウ、およびパッドの操作。ウィンドウおよびパッドへの出力。端末の制御と curses 入力/出力オプションの制御。環境問い合わせルーチン。カラー処理。ソフトラベルキーの使用。terminfo のアクセス。低レベル curses ルーチンのアクセス。
curses ライブラリルーチンを初期化するには、ウィンドウや画面を扱うルーチンを使用する前に initscr() または newterm() のルーチンを呼び出さなければなりません。また処理を終了する前に endwin() ルーチンを呼び出さなければなりません。会話型かつ画面指向のプログラムは、エコーなしの「一度に 1 文字」入力を求めるものが大多数ですが、これには次のシーケンスが必要です。
initscr,cbreak,noecho;
また、多くのプログラムはさらに次のシーケンスを使用します。
nonl,intrflush(stdscr,FALSE),keypad(stdscr,TRUE);
curses のプログラムを実行する前に、端末のタブ位置を設定し、さらに初期化文字列群 (もし定義されていれば) を出力する必要があります。これを行うには、シェルの環境変数 TERM をエクスポートした後で tput init コマンドを実行してください。(詳しくは terminfo(4) の説明を参照してください)。
curses ライブラリは、「ウィンドウ」と呼ばれるデータ構造体を扱うことを可能にします。ウィンドウは、CRT 画面の全部分または一部分を表示している、二次元の文字配列と考えられます。デフォルトのウィンドウとして、端末画面と同一サイズの stdscr が提供されています。他のウィンドウは newwin(3CURSES) を使って作成できます。
WINDOW * と宣言された変数を使ってウィンドウを参照することができます。ウィンドウの操作は、セクション 3CURSES で説明されている curs_ で始まる名前を持つルーチンを使って行います。そのうち move(3CURSES) と addch(3CURSES) が最も基本的なルーチンです。その他にも、ユーザーがウィンドウを指定できるよう、w で始まる名前の汎用的な各種ルーチンが用意されています。w で始まらないルーチンは、stdscr に影響を与えます。
ウィンドウ操作用のルーチンを使用した後、ユーザーの CRT 画面を stdscr のように表示する旨を curses に指示する目的で、refresh(3CURSES) が呼び出されます。ウィンドウ内の文字の実際のタイプは chtype つまり文字プラス属性であり、各文字とともにその文字に関する情報が記録されています。
「パッド」と呼ばれる特殊なウィンドウも操作することができます。パッドとは、画面のサイズに依存しないウィンドウで、その内容は、すべてが一度に表示されるという必要はないものです。詳しくは curs_pad(3CURSES) の説明を参照してください。
画面上に文字を描くだけでなく、ビデオ属性やカラーも定義することができます。つまりアンダーラインなどの拡張機能や、リバース表示やカラーを端末がサポートしていれば、文字をそのようなモードで表示することも可能です。また線引き文字、すなわち線を描くための文字を出力するよう指定することもできます。入力時には、curses は矢印キーやファンクションキーを解釈して変換することもできます。これらのキーは、エスケープシーケンスを単一の値に転送するものです。ビデオ属性、線引きモード、および入力値は、A_REVERSE、ACS_HLINE、KEY_LEFT などの名前 (いずれも <curses.h> 中に定義されている) を使用します。
LINES、COLUMNS 環境変数が設定されている場合、およびプログラムがウィンドウ環境で実行中の場合、行とカラムに関する環境変数の情報が terminfo が読み込んだ情報に優先して用いられます。その結果、たとえば画面サイズが可変の AT&T 630 レイヤ内で実行中のプログラムは影響を受けます。
環境変数 TERMINFO が定義されているとき、curses を使うプログラムはまず標準ディレクトリを捜す前に、この TERMINFO で与えられたディレクトリをチェックします。たとえば TERM が att4424 に設定されていれば、コンパイルされた端末定義は中に見つかります。(この名前のうちの a は att4424 の先頭文字を流用したもので、ディレクトリが大きくなりすぎるのを防ぐための手段です。)
/usr/share/lib/terminfo/a/att4424
なお TERMINFO が $HOME/myterms に設定されていれば、curses は次の順序でチェックします。
$HOME/myterms/a/att4424,
/usr/share/lib/terminfo/a/att4424.
この機能は、テスト的に定義体を開発する場合や /usr/share/lib/terminfo に対する書き込み権を持っていない場合に使用すると便利です。
<curses.h> 中に定義されている整数変数 LINES と COLS には、initscr によって画面のサイズの値が代入されます。TRUE と FALSE の両定数の値はそれぞれ 1 と 0 です。
curses ルーチンは WINDOW * curscr 変数も定義します。この変数は、たとえばガーベッジを含んでいる画面をクリアして 再表示させるような低レベルの操作に用いられます。この curscr を使用できるのは少数のルーチンに限られています。
補助文字セットの文字 1 個を保持するのに要するバイト数とカラム数はロケール固有の値であり (ロケールカテゴリは LC_CTYPE)、文字クラステーブル中に指定することができます。
編集に関しては文字レベルでの操作が適しています。画面のフォーマットに関しては、画面上で任意に文字を移動させることは好ましくありません。
文字の上書きを行うルーチン (たとえば addch) は画面レベルで動作します。既存の文字と上書きする文字とでカラム数が異なる場合、「オーファン (孤児) カラム」が発生する可能性があります。オーファンカラムはバックグラウンド文字で埋められます。
文字の挿入を行うルーチン (たとえば insch) は、文字レベルで (すなわち文字境界で) 動作します。指定された文字はカーソルが指す文字の直前に挿入されます。カーソルが現文字のどのカラムを指していても同じです。挿入に先立ち、カーソルは現文字の先頭カラムを指すよう調整されます。
文字削除用のルーチン (たとえば delch) も、やはり文字レベル (文字境界) で動作します。つまりどのカラムを指していても、カーソルが現在指している文字が削除されます。削除に先立ち、カーソルは現文字の先頭カラムを指すよう調整されます。
複数カラム文字を行の最終カラムに置くことはできません。そのような配置を試みると、そのカラムには代わりにバックグラウンド文字が置かれます。またこのような動作によりオーファンカラムが発生した場合、そのオーファンカラムはバックグラウンド文字で埋められます。
ウィンドウに対するオーバラップおよび上書き処理を実行すると、それに先立ってそのウィンドウの辺上にある文字が上書きされます。その際、オーファンカラムは (もしあれば) 文字の操作時と同様に処理されます。
カーソルはウィンドウ内のどの位置にも置くことが可能です。カーソルが複数カラム文字の 2 番目以降のカラムを指している時の挿入もしくは削除処理は、カーソルをその文字の先頭カラムに移動してから実行されます。
多くの curses ライブラリルーチンは複数個のバージョンを持っています。w という接頭辞を持つルーチンはウィンドウ引数を必要とし、p という接頭辞を持つルーチンはパッド引数を必要とします。これらの接頭辞がないルーチンは、stdscr を使うのが一般的です。
mv という接頭辞を持つルーチンは、指定された動作を開始する前に移動を行いますが、その移動先を示す x と y の座標値を必要とします。mv ルーチンは他のルーチンを呼び出す前に move(3CURSES) を呼び出します。なお座標値 y は常に (ウィンドウの) 行位置を、座標値 x は常にカラム位置を表します。左上角の座標値は (1,1) ではなく (0,0) です。
接頭辞が mvw のルーチンは、ウィンドウ引数と x および y 座標値の両方を使用します。必ずウィンドウ引数の方が先に指定されます。
いずれの場合も、win は対象となるウィンドウを、pad は対象となるパッドを表します。win も pad も常にタイプ WINDOW へのポインタです。
オプションを設定するルーチンは、値として TRUE または FALSE を持つブール型のフラグ bf を必要とします。このフラグのタイプは常に bool です。変数 ch および attrs のタイプは常に chtype です。WINDOW、SCREEN、bool、chtype の各タイプは <curses.h> 内に定義されています。またタイプ TERMINAL は <term.h> 内に定義されています。その他の引数はいずれも整数です。
以下にリストするのは全 curses ルーチンの名前と、それぞれが説明されているマニュアルページの名前です。
マニュアル上のルーチン名
上記ルーチンはすべて、エラーが発生すれば整数 ERR を返し、正常に終了すれば ERR 以外の整数値を返します (それ以外の動作が本項内で記述されている場合を除く)。
setscrreg()、wsetscrreg()、getyx()、getbegyx()、および getmaxyx() を除くすべてのルーチンは、w バージョンの値を返します。setscrreg()、wsetscrreg()、getyx()、getbegyx()、および getmaxyx() が返す値は未定義です。したがって、これらを代入文の右辺に用いるべきではありません。
ポインタを返すルーチンは、エラーが発生した場合には NULL を返します。
次の属性については attributes(5) のマニュアルページを参照してください。
属性タイプ | 属性値 |
---|---|
MT レベル | Unsafe |
個々のルーチンに関する詳細は、3CURSES セクションの curs_ で始まる名前を持つ関数の説明および terminfo(4)、attributes(5) の説明を参照してください。
ヘッダー <curses.h> は自動的に <stdio.h> および <unctrl.h> ヘッダーを含みます。