curs_refresh(3x) curs_refresh(3x)
doupdate, redrawwin, refresh, wnoutrefresh, wredrawln,
wrefresh - curses ウインドウと行の更新
#include <curses.h>
int refresh(void);
int wrefresh(WINDOW *win);
int wnoutrefresh(WINDOW *win);
int doupdate(void);
int redrawwin(WINDOW *win);
int wredrawln(WINDOW *win, int beg_line, int num_lines);
他のルーチンは単にデータ構造を操作するだけなので、
実際に端末へ出力するには、 refresh と wrefresh ルーチン
(または wnoutrefresh と doupdate ) を呼ばなければなりません。
wrefresh ルーチンは最適化のため、そこにすでに何があるかを
考慮しながら、指定されたウインドウを物理的な端末画面に
コピーします。
refresh ルーチンはデフォルト・ウインドウとして stdscr を
使いますが同じです。
leaveok を有効にしていない限り、端末の物理的なカーソルは
そのウインドウのカーソル位置にそのまま置かれます。
wnoutrefresh と doupdate ルーチンは、wrefresh だけよりも
効率的に複数の更新をすることができます。
curses はすべてのウインドウ構造体に加え、端末画面を表現する
2つのデータ構造を保持しています。実際の画面を表している
物理画面と、プログラムが画面上に描こうとしている仮想画面です。
wrefresh ルーチンは、まず、指定のウインドウを仮想画面に
コピーする wnoutrefresh を呼び出し、次に、仮想画面と
物理画面を比較し実際の更新を行う doupdate を呼び出すことで
動作します。
数個のウインドウを一度に出力しようとすれば、 wrefresh
呼び出しの連続は、 wnoutrefresh と doupdate をかわるがわる
呼び出すことになり、何度か画面への出力の集中を引き起こします。
先に各ウインドウに対して wnoutrefresh を呼び出しておくと、
後で doupdate を 1回呼び出すだけでよいので、出力の集中は
1回だけになり、送られる文字数は少なくなり、CPU時間も
短くなります。
wrefresh の引数 win が広域(グローバル)変数 curscr だった
場合は、ただちに画面をクリアし、はじめから描画し直します。
上の「指定のウインドウを仮想画面にコピーする」という
言い回しはあいまいです。実際には、ウインドウ内の
タッチ(touch) (=変更) されたすべての行が仮想画面に
コピーされます。
これは、重なりあったウインドウを使うプログラムに影響します。
もし 2つのウインドウが重なっていると、どちらの順序で
更新することもでき、重なっている部分は明示的に変更された場合
にのみ更新されることを意味します。
(しかし、この挙動を利用する際の注意について、下記の
移植性の節を参照してください。)
wredrawln ルーチンは、画面の何行かが書き換えられており、
何かが書き込まれる前にその内容を捨てなければならない、と
curses に指示します。
curses は指示された行をタッチ (=変更されたとマーク) します。
redrawwin() はウインドウ全体をタッチします。
整数を返すルーチンは、失敗した時には ERR を、正常終了した
時には OK ( SVr4 では「 ERR 以外の整数値」とだけ指定) を
返します。
X/Open はエラーの条件を何も定義していません。
この実装では次のようになっています。
wnoutrefresh
ウインドウ・ポインタがヌル、またはウインドウが
実際にはパッドだった場合にエラーを返します。
wredrawln
呼び出した touchln がエラーを返した場合に
エラーを返します。
refresh と redrawwin はマクロであるかもしれないことに
注意してください。
これらの関数は XSI Curses standard, Issue 4 に記載されて
います。
wnoutrefresh() がウインドウの内容全体を仮想画面に
コピーするのか、それとも変化のあった一部分のみなのかは、
curses の過去の ( SVr4 を含む) バージョンでは
はっきり文書化されていませんでした。
他の curses の実装にリンクしなければならないような
プログラムの中で、上のどちらかの挙動に頼るのは
賢明ではないかもしれません。
代わりに、 wnoutrefresh() を呼び出す前に
明示的に touchwin() を呼び出すことで、
どんな場面でも内容全体をコピーすることを保証できます。
curses(3x), curs_outopts(3x) curs_variables(3x).
curs_refresh(3x)