curs_initscr(3x) curs_initscr(3x)
initscr, newterm, endwin, isendwin, set_term, delscreen - curses 画面の初期化と操作
#include <curses.h> WINDOW *initscr(void); int endwin(void); bool isendwin(void); SCREEN *newterm(char *type, FILE *outfd, FILE *infd); SCREEN *set_term(SCREEN *new); void delscreen(SCREEN* sp);
initscr は通常、プログラムを初期化するとき最初に呼び出す curses ルーチンです。 時々その前に呼び出す必要のある少数の特別なルーチンには slk_init, filter, ripoffline, use_env があります。 複数の端末を使うアプリケーションは、 initscr の前に newterm を呼び出す場合があります。 initscr のコードは端末のタイプを決定し、 curses の データ構造のすべてを初期化します。 initscr はまた、画面をクリアするために最初の refresh 呼び出しを行います。 エラーが発生した場合、 initscr は適切なエラーメッセージを 標準エラーに書き出して終了します。 そうでない場合は、 stdscr へのポインタを返します。
複数の端末へ出力するプログラムは、 initscr の代わりに 端末ごとに newterm ルーチンを呼び出してください。 端末が画面指向プログラムをサポートしない場合に 行指向モードで実行し続けることができるように機能項目を 検査する必要のあるプログラムも newterm を使うでしょう。 newterm は端末ごとに一度ずつ呼び出さなければなりません。 newterm はその端末への参照として保存されるべき SCREEN * 型の変数を返します。(訳注: 変数でなく値) newterm の引数は o $TERM (=環境変数 TERM ) の代わりに使われる端末のタイプ type o 端末に出力するためのファイルポインタ o 端末から入力するための別のファイルポインタ type 引数が NULL の場合、 $TERM が使われます。
プログラムはまた、 curses を終了する前に使った端末 それぞれに対して endwin を呼び出さなければなりません。 もし同じ端末に対して newterm を 2 回以上呼び出した場合、 最初に参照した端末に対して最後の endwin を呼び出さなければ なりません。 プログラムは curses モードを終了するとき、 または一時的に抜ける前にはいつも endwin を呼び出さなければ なりません。このルーチンは o tty モードを復元し、 o カーソルを画面の左下隅に移動し、 o 端末を適切なノンビジュアルモードに戻します。 一時的に抜けたあとで refresh か doupdate を呼び出すと、 プログラムはビジュアルモードに戻ります。
isendwin ルーチンは endwin が呼び出された後、 wrefresh が 呼び出されていない場合に TRUE を、そうでない場合に FALSE を 返します。
set_term ルーチンは異なる端末間の切り替えに使います。 端末参照 new が新しい現在端末になります。 このルーチンは直前の端末を返します。 set_term は SCREEN ポインタを操作する唯一のルーチンです。 他のすべてのルーチンは、現在端末にしか作用しません。
delscreen ルーチンは SCREEN データ構造に関連する記憶領域を 開放します。 endwin ルーチンはこれをしないので、特定の SCREEN が必要なく なったなら endwin の後で delscreen を呼び出してください。
endwin は失敗の場合に整数 ERR を、正常終了の場合に OK を 返します。 ポインタを返すルーチンは、エラーの場合つねに NULL を 返します。 X/Open はエラーの条件を何も定義していません。この実装では o endwin は端末が初期化されていない場合にエラーを返します。 o newterm は画面、または画面内のトップレベル・ウインドウ curscr, newscr, stdscr に対するデータ構造の領域を 確保できなかった場合にエラーを返します。 o set_term はエラーを返すことはありません。
initscr と newterm はマクロであるかもしれないことに 注意してください。
これらの関数は XSI Curses standard, Issue 4 に記載されて います。 2015 年現在の文書は X/Open Curses, Issue 7 です。
X/Open はポータブル・アプリケーションは initscr を 2 回以上呼び出してはならないと指定しています。 o endwin の後で画面を復元するには refresh を使うので、 ポータブルな initscr の使い方は 1 回のみです。 ( curs_refresh(3x) 参照) o この実装では endwin の後で initscr を使うことを 許しています。 curses の古いバージョン、例えば BSD 4.4 では、エラーが 検出されたとき、 initscr は終了せずにヌルポインタを返します。 XSI Curses で initscr の戻り値を検査するのは安全ですが 冗長です。
変数 TERM が見つからないか空の場合、 initscr は、通常 generic (gn) 機能項目を持つ端末項目に対応する "unknown" 値を 使います。 収録項目 generic は setupterm で検出され ( curs_terminfo(3x) 参照) 、全画面動作では使われません。 他の実装では変数 TERM が見つからないか空の場合の扱いが 異なることがあります。
以下は X/Open Curses, section 3.1.1 から引用。 initscr() が呼び出されたときに SIGINT, SIGQUIT, SIGTSTP シグナルの処理方法 (disposition) が SIG_DFL の場合、 Curses の実装によってはこれらシグナルの 特別な取り扱いを与えることがある。… これらシグナルの特別な取り扱いは、実際上 プロセスの寿命まで、またはプロセスがシグナルの処理方法を 変更するまで続くことがある。 どの Curses 関数もシグナルに関して安全であることを 求められない… この実装は、例えば initscr または newterm による初期化の 間にシグナルハンドラを設定します。 これらのシグナルを扱わなければならないアプリケーションは ライブラリの初期化後に対応するハンドラを準備してください。 SIGINT ハンドラは終了時に画面を一掃しようとします。 通常は期待通りに動作しますが、いくつかの制限があります。 o SCREEN リストをたどることは安全ではありません。 すべてのリスト処理はどのシグナルもブロックせずに 行われるからです。 o REENTRANT を持つシステムを起動する際、 set_term は デッドロックその他の不都合を引き起こすかもしれない 関数を使います。 o endwin は他の関数を呼び出し、その多くは stdio その他の明らかに安全でないライブラリ関数を 使います。 SIGTERM SIGINT と同じハンドラを使い、同じ制限があります。 X/Open Curses では考慮されていませんが、 (デバッグに 使われる) SIGQUIT よりもこの用途により向いています。 SIGTSTP ジョブ制御で使われる stop シグナルを扱います。 プロセスを再開するとき、この実装は待機中の入力を flushinput で捨て ( curs_util(3x) 参照) 、 画面が完全に変更されたものとして再描画します。 (訳注: flushinput ではなく flushinp ) また、 def_shell_mode でセーブした端末モードを 更新します。 ( curs_kernel(3x) 参照) SIGWINCH 標準化の努力の中で当初は無視されていた、ウインドウの サイズ変更を扱います。 このハンドラは、後に wgetch でテストされる (シグナル安全な) 変数をセットします。 ( curs_getch(3x) 参照) 対応するウインドウで keypad が有効になっていれば、 wgetch はキー識別子 KEY_RESIZE を返します。 同時に wgetch は resizeterm を呼び出して 標準画面 stdscr を調整し、 LINES と COLS のような 他のデータを更新します。 (訳注: resizeterm(3x) 参照)
curses(3x), curs_kernel(3x), curs_refresh(3x), curs_slk(3x), curs_terminfo(3x), curs_util(3x), curs_variables(3x). curs_initscr(3x)