curs_refresh(3X) | curs_refresh(3X) |
名称
doupdate, redrawwin, refresh, wnoutrefresh, wredrawln, wrefresh - curses ウィンドウと行をリフレッシュする書式
#include <curses.h>解説
refresh と wrefresh ルーチン (または wnoutrefresh と doupdate) は、他のルーチンがデータ構造を単に操作するように、端末への実際の出力を得るために呼び出さなければなりません。ルーチン wrefresh は、最適化を行うために、既にそこにあるものを考慮して、指定されたウィンドウを物理的な端末画面にコピーします。 refresh ルーチンは、同じで、デフォルトのウィンドウとして stdscr を使用します。 leaveok が有効になっていないなら、端末の物理カーソルは、そのウィンドウのためのカーソルの位置に残されます。wnoutrefresh と doupdate ルーチンは、単独の wrefresh より効率的に複数の更新を許可します。すべてのウィンドウ構造に加えて、 curses は、端末画面を表す次の 2 つのデータ構造を保持しています: 物理的な画面は、画面に実際にあるものを記述し、仮想画面は、プログラマが画面に表示したいものを記述します。
ルーチン wrefresh は、仮想画面に指定されたウィンドウをコピーする wnoutrefresh を最初に呼び出し、次に物理的な画面と仮想画面を比較し、実際の更新を行う、 doupdate を呼び出すことで動作します。プログラマがいくつかのウィンドウを同時に出力したいなら、 wrefresh への一連の呼び出しは、 wnoutrefresh と doupdate への交互に呼び出されることになり、画面への出力のさまざまなバースト (爆発) をもたらします。各ウィンドウのために wnoutrefresh を最初に呼び出すことによって、次に送信される少ない合計文字と使用される少ない CPU 時間で、 1 回の出力のバーストだけが行われる結果となり、 doupdate を一度呼び出すことが可能です。 wrefresh への win 引数がグローバル変数 curscr であるなら、画面は、直ちにクリアされ、最初から再描画されます。
上記の "仮想画面に指定されたウィンドウをコピーする"という言いまわしは曖昧です。現実に起こることは、ウィンドウで タッチされた (変更された) すべての行が仮想画面にコピーされるということです。これは、オーバラップするウィンドウを使用するプログラムに影響します。それは、2 つのウィンドウがオーバラップするなら、どちらか一方の順序で、それらをリフレッシュすることができ、明示的に変更されるときだけ、オーバラップ領域が修正されることを意味します。 (しかし、この振る舞いの悪用に関する警告については、下記の 移植性のセクションを参照してください。)
wredrawln ルーチンは、いくつかの画面の行が破損しており、それらに何かを書き込む前にそれらを廃棄すべきことを、 curses に知らせます。知らされた行をタッチします (それらが変更されたとマークする)。ルーチン redrawwin() は、すべてのウィンドウをタッチします。
戻り値
整数を返すルーチンは、失敗すると ERR を返し、成功して終了すれば、 OK (SVr4 は、" ERR 以外の整数値"とだけ明記されています) を返します。X/Open は、エラー条件を何も定義していません。この実装では、
- wnoutrefresh
- は、ウィンドウのポインタが NULL であるか、またはウィンドウが実際に詰め物 (pad) であるなら、エラーを返します。
- wredrawln
- は、 touchln への関連する呼び出しがあるなら、エラーを返します。
注
refresh と redrawwin は、マクロであるかもしれないことに注意してください。移植性
XSI Curses standard, Issue 4 は、これらの関数を記述しています。wnoutrefresh() が仮想画面のウィンドウのすべての内容または単に変更された部分をコピーするかどうかは、歴史的な curses バージョン (SVr4 を含んで) できちんと文書化されていません。他の curses 実装でリンクされなければならないプログラムのいずれかの振る舞いに依存することは愚です。代わりに、すべての内容のコピーをいかなる場所でも保証するために wnoutrefresh() 呼び出しの前に明示的な touchwin() を行うことができます。