curses によるウィンドウ・データの操作
curses を初期化すると、stdscr が自動的に提供されます。 curses サブルーチン・ライブラリーを使用して stdscr を操作することも、
ユーザー定義ウィンドウを作成することもできます。
ウィンドウを作成する
newwin サブルーチンを使用して、独自のウィンドウを作成することができます。
newwin サブルーチンを呼び出すたびに、curses はメモリーに新規ウィンドウ構造体を割り当てます。 この構造体には、新規ウィンドウに関連するすべての情報が入っています。 ユーザーが作成できるウィンドウの数は、curses によって制限されません。 ネストするサブウィンドウの数は、 使用可能なメモリーの量によって制限され、/usr/include/limits.h ファイルに定義済みの SHRT_MAX の値以下でなければなりません。
ウィンドウは作成した順序に関係なく、変更することができます。 端末のディスプレイを更新するには、 wrefresh サブルーチンを呼び出します。
サブウィンドウ
端末のディスプレイを基準としたサブウィンドウの座標を提供する必要があります。 subwin サブルーチンを使用して作成されたサブウィンドウは、親ウィンドウの境界内に収まらなければなりません。 そうでない場合は、null 値が戻されます。
パッド
| サブルーチン | 説明 |
|---|---|
| ニューパッド (newpad) | パッド・データ構造体を作成します。 |
| サブパッド | パッド内のサブパッドを指すポインターを作成し、戻します。 |
ウィンドウ、パッド、およびサブウィンドウの除去
新規サブパッドは親パッドを基準として配置されます。
ウィンドウ、パッド、またはサブウィンドウを除去するには、delwin サブルーチンを使用します。 ウィンドウまたはパッドを削除するには、その前にその子を削除しておく必要があります。 子を削除していない場合、delwin サブルーチンはエラーを戻します。
スクリーンまたはウィンドウのイメージの変更
curses サブルーチンがウィンドウの外観を変更すると、 ウィンドウの内部表現は更新されますが、wrefresh サブルーチンに対する次のコールまでは、 ディスプレイは変更されません。 wrefresh サブルーチンは、ウィンドウ構造体内の情報を使用してディスプレイを更新します。
ウィンドウのリフレッシュ
ウィンドウまたはパッドの構造体に出力を書き出す場合は常に、 端末のディスプレイをリフレッシュして、内部表現に一致させる必要があります。 リフレッシュでは以下のことを行います。
- curscr の内容とユーザー定義スクリーンまたは stdscr の内容を比較します。
- curscr 構造体を更新して、ユーザー定義スクリーンまたは stdscr に一致させます。
- 変更された物理的なディスプレイの部分を再描画します。
ウィンドウをリフレッシュするには、 以下のサブルーチンを使用してください。
| サブルーチン | 説明 |
|---|---|
| refresh、または wrefresh | 端末および curscr を更新して、ウィンドウに対する変更を反映します。 |
| wnoutrefresh または Doupdate | 指定されたウィンドウを更新し、一度に端末に出力します。 これらのサブルーチンは、 複数の更新を行う場合の迅速な応答に役立ちます。 |
refresh および wrefresh サブルーチンは、まず wnoutrefresh サブルーチンを呼び出して、最新表示されているウィンドウを現行画面にコピーします。 次に、 double pdate サブルーチンを呼び出して、表示を更新します。
同時に複数のウィンドウをリフレッシュする必要がある場合には、 以下の 2 つの方法のいずれかを使用します。 wnoutrefresh および doupdate サブルーチンに対するコールの代替となる、wrefresh サブルーチンに対する一連のコールを使用することができます。 あるいは、ウィンドウごとに wnoutrefresh サブルーチンを 1 回呼び出してから、 doupdate サブルーチンを 1 回呼び出すこともできます。 2 番目の方法を使用した場合、1 回だけの大量の出力がディスプレイに送信されます。
パッドのリフレッシュに使用するサブルーチン
preresh および pnoutrefresh サブルーチンは、 wrefresh および wnoutrefresh サブルーチンに似ています。
新鮮な サブルーチンは、現行画面と物理画面の両方を更新します。一方、 pnoutrefresh サブルーチンは、ユーザー定義のパッドに加えられた変更を反映するために curscr を更新します。 ウィンドウの代わりにパッドが関与するので、これらのサブルーチンには、 パッドとスクリーンのどの部分が関与するかを示すパラメーターが必要です。
変更されなかった領域のリフレッシュ
サブウィンドウを処理する場合、またはウィンドウがオーバーラップされる場合には、 touchwin および wrefresh サブルーチンの結合が役立ちます。 1 つのウィンドウの後方から別のウィンドウを前方に出して見えるようにするには、 touchwin サブルーチンに続いて wrefresh サブルーチンを呼び出します。
正しく変更されなかったディスプレイ
echo または printf サブルーチンなどの非 curses サブルーチンを使用して、テキストを端末のディスプレイに送信すると、 外部ウィンドウが正しく変更されない場合があります。 この場合、ディスプレイは変更されますが、 現在のスクリーンはこれらの変更を反映するように更新されません。 正しく変更されなかったスクリーンに関して refresh を呼び出すと、 リフレッシュするウィンドウと現在のスクリーン構造体の間に差がないので、 問題が生じる可能性があります。 結果として、正しく変更されなかったテキストによって生じるディスプレイ上のスペースは、 変更されません。
同様の問題が、ウィンドウの移動時に発生します。 非 curses サブルーチンを使用してディスプレイに送信した文字は、 内部でウィンドウとともに移動しません。
スクリーンが正しく変更されなかった場合、curscr 上で wrefresh サブルーチンを呼び出して、 現在の物理的なディスプレイを反映するようにディスプレイを更新します。
ウィンドウの内容の操作
| サブルーチン | 説明 |
|---|---|
| ボックス | ウィンドウ内、またはウィンドウの回りにボックスを描画します。 |
| コピーウィン | overlay および overwrite サブルーチンをより正確に制御します。 |
| ガーベッジ・ライン (garbagedlines) | スクリーン行は廃棄されたので、 何かがそこに上書きされる前に破棄する必要があることを curses に指示します。 |
| mvwin | ウィンドウまたはサブウィンドウを新しい位置に移動します。 |
| overlay または overwrite | 1 つのウィンドウを別のウィンドウ上にコピーします。 |
| ripoffline | デフォルト・スクリーンから行を除去します。 |
overlay および overwrite サブルーチンを使用するには、2 つのウィンドウをオーバーラップする必要があります。 overwrite サブルーチンは破壊的ですが、overlay サブルーチンは破壊的ではありません。 overwrite サブルーチンを使用して、 テキストを 1 つのウィンドウから別のウィンドウにコピーする場合、 コピー元のウィンドウからのブランク部分はコピー先のウィンドウのどの部分にも上書きされます。 overlay サブルーチンは、 コピー元のウィンドウからブランク部分をコピーしないので、 破壊的ではありません。
overlay および overwrite サブルーチンと同様に、 copywin サブルーチンによっても、 1 つのウィンドウの一部を別のウィンドウにコピーすることができます。 overlay および overwrite サブルーチンと異なり、 copywin サブルーチンを使用するために、 ウィンドウをオーバーラップする必要はありません。
ripoffline サブルーチンを使用すれば、 行を stdscr から除去することができます。 このサブルーチンに正の line 引数を渡すと、 指定した行数が stdscr のトップから除去されます。 負の line 引数をサブルーチンに渡すと、 指定した行数が stdscr のボトムから除去されます。
garbagedlines サブルーチンを使用すれば、 新規データを書き込む前に、指定した範囲の行を破棄することができます。
フィルターのサポート
filter サブルーチンは、フィルターである curses アプリケーション用に提供されています。 このサブルーチンによって、curses は、stdscr が単一行であるかのように操作します。 filter サブルーチンを使用して実行する場合、curses は、curses が存在している行に関する知識を必要とする端末機能を使用しません。