ファイヤープロジェクト
パッド
2003-07-20T15:13+09:00   matsu
ウィンドウは物理画面や親ウィンドウの範囲内に収まっていなければならない.パッドとはそのような制約なしに自由な大きさで作成できる論理画面である.
ウィンドウはかならず画面内に収まっていなければならないので,「後で表示するかもしれないが今は画面外にあるデータ」はなんらかの方法で確保しておくか,表示するときに取得,生成などをしなければならない.後者の場合は処理が複雑になりがちである.前者はシンプルに実装できそうだが,リソースを食いそうだ.パッドはこの前者の実装に便利である.すなわち,パッドを使用すると論理画面にまとめて表示データを格納しておいて,必要な分だけ物理画面で表示することが可能になる.しかも簡単に.
パッドの生成は
WINDOW *newpad(int nlines, int ncols);
でできる.nlines,ncolsはそれぞれ行数と行幅で,上記の通りこれらは物理画面のサイズに制限されない.そしてパッドを表示するには,
int prefresh(WINDOW *pad, int pminrow, int pmincol,
             int sminrow, int smincol, int smaxrow, int smaxcol);
を使用する.padのpminrow,pmincolを左上にして,画面(stdscr)のsminrow,smincol,smaxrow,smaxcloの範囲に表示できるだけ表示する.そしてパッドを削除するにはウィンドウと同じ
int delwin(WINDOW *win);
を使用する.また,touchwinもパッドに対して使用できる.
スクロールのところでなんちゃってmoreを作成した.そしてパッドには上記のような利点がある.ということで,パッドを使用するサンプルはなんちゃってlessにしてみた.
これはlessっぽい機能を持つ.C-n,C-p,C-v,M-vで画面を上下にスクロールする.そして'q'で終了する.また,画面右端での折り返しはしない.そのかわりC-f,C-bでの左右のスクロールを可能にしてみた.ちょっと残念なのが,冒頭のいくつかのdefine文だ.たぶんどっかのヘッダなどで定義されていると思うのだが,発見できなかった.また,ハマった点は,最初はrefreshしてからでないといきなりprefreshしても起動直後になにも表示されないということだった(サンプル中,main関数のswitch文の手前).ただし,何も表示されていない状態でキーを押すとファイルが表示される.
matsu(C)
Since 2002
Mail to matsu