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)