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)