OpenVMS
HP C ランタイム・ライブラリ・
リファレンス・マニュアル (上巻)


前へ 次へ 目次 索引



第 6 章
Curses 画面管理関数とマクロ

この章では, HP C for OpenVMS システムで提供される画面管理ルーチンについて説明します。

すべての OpenVMS システムで, OpenVMS Curses 画面管理パッケージがサポートされます。これは,VAX C 実行時ライブラリ (RTL) で使用されるルーチンのパッケージと同じです。

OpenVMS Alpha システムでは, 2 つの画面管理パッケージがサポートされます。それは OpenVMS Curses と,UNIX との互換性がより高く, BSD (Berkeley Standard Distribution) Curses ソフトウェア 1 第 6.1 節 を参照してください。

さらに,OpenVMS Alpha バージョン 7.0 以降, HP C RTL では,4.4BSD Berkeley Software Distribution をベースにした Curses パッケージも提供されるようになりました。 4.4BSD Curses パッケージに関する情報は,Kenneth C.R.C. Arnold 著,『Screen Updating and Cursor Movement Optimization: A Library Package』に記載されています。

OpenVMS と BSD ベースの Curses パッケージの関数およびマクロはほぼ同じです。両者の相違点の大部分については,この章で説明しています。それ以外の場合は,この章では 2 つの Curses パッケージを区別せず,単に「Curses」または「Curses 関数とマクロ」と呼んでいます。

注意

1 Copyright (c) 1981 Regents of the University of California.

6.1 BSD ベースの Curses パッケージの使用 (Alpha only)

BSD ベースの Curses インプリメンテーションを使用するのに必要な <curses.h>ヘッダ・ファイルは, OpenVMS Alpha システムでは HP C コンパイラで提供されます。

OpenVMS Curses 関数はデフォルトの Curses パッケージとして提供されるため,既存のプログラムは BSD ベースの Curses 関数の影響を受けません ( この点は,BSD ベースの Curses がデフォルトであった HP C の以前のバージョンから変更された点です)。

4.4BSD Curses インプリメンテーションを入手するには,次の修飾子を使用して <curses.h>を取り込むモジュールをコンパイルする必要があります。

/DEFINE=_BSD44_CURSES

BSD ベースの Curses 関数では,Curses 関数によって割り当てられたペーストボードとキーボードを使用する OpenVMS SMG$ ルーチンを呼び出すのに必要なサポートは提供されません。したがって, SMG$ エントリ・ポイントの呼び出しおよび Curses 関数に依存する Curses プログラムは,今後も OpenVMS の Curses インプリメンテーションを使用する必要があります。

BSD ベースの Curses インプリメンテーションは,以前のインプリメンテーションとの間で相互運用性がありません。新しい関数と古い関数の呼び出しが混在している場合,画面に不正な出力が表示され,SMG$ ルーチンから例外が発生する可能性があります。

6.2 Curses の概要

Curses,つまり HP C Screen Management Package は,端末画面の定義されたセクションの作成と変更,およびカーソルの最適な移動を行う HP C RTL 関数およびマクロで構成されています。画面管理パッケージを使用すると,ユーザにとって親しみやすく,魅力のあるユーザ・インタフェースを開発できます。 Curses は端末に依存しておらず,端末画面の書式設定を簡単に行うことができ,効率のよいカーソルの移動を実現できます。

ほとんどの Curses 関数とマクロは 2 つ 1 組で示されます。最初のルーチンがマクロで,2 番目が "ウィンドウ" を表す接頭語 "w" から始まる関数です。これらの接頭語は角括弧 ([ ]) で囲んで示されます。たとえば, [w]addstrは, addstrマクロと waddstr関数を示します。マクロのウィンドウは,デフォルトで stdscrに設定され,関数は,引数として指定されたウィンドウを受け付けます。

Curses 関数およびマクロにアクセスするには, <curses.h>ヘッダ・ファイルを取り込みます。

端末に依存しない Screen Management Software は OpenVMS RTL の一部であり, Curses をインプリメントするために使用されます。移植性を確保するために,ほとんどの関数とマクロは他の C インプリメンテーションと同様の方法で動作するように設計されています。しかし,Curses ルーチンは OpenVMS システムおよびその Screen Management Software に依存しているため,一部の関数とマクロの動作は他のインプリメンテーションの関数およびマクロと少し異なる可能性があります。

他のシステムで提供される関数とマクロの中には, HP C RTL Curses パッケージで提供されないものがあります。

[w]clrattr[w]insstrmv[w]insstr[w]setattrなどの一部の関数は, HP C for OpenVMS Systems 固有であり,移植できません。

表 6-1 は, HP C RTL で提供されるすべての Curses 関数とマクロを示しています。各関数とマクロの詳細については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル (下巻)』「リファレンス・セクション」を参照してください。

表 6-1 Curses 関数とマクロ
関数またはマクロ 説明
[w]addch ウィンドウの現在のカーソルの位置に文字を追加する。
[w]addstr ウィンドウの現在のカーソルの位置に文字列を追加する。
box ウィンドウの周囲に四角形を描く。
[w]clear 指定されたウィンドウの内容を消去し,カーソルの位置を座標 (0,0) にリセットする。
clearok ウィンドウのクリア・フラグを設定する。
[w]clrattr ウィンドウの内部でビデオ表示属性を無効にする。
[w]clrtobot カーソルの現在の位置からウィンドウの最下部まで,ウィンドウの内容を消去する。
[w]clrtoeol 指定されたウィンドウの現在のカーソルの位置から行末まで,ウィンドウの内容を消去する。
[no]crmode 端末を cbreak モードに設定する。または設定を解除する。
[w]delch 指定されたウィンドウで,現在のカーソルの位置から文字を削除する。
[w]deleteln 現在のカーソルの位置から行を削除する。
delwin 指定されたウィンドウをメモリから削除する。
[no]echo 文字が端末画面に表示されるように,または表示されないように,端末を設定する。
endwin 端末画面をクリアし,Curses 構造体に割り当てられている仮想メモリを解放する。
[w]erase 空白をペイントすることにより,ウィンドウを消去する。
[w]getch 端末画面から 1 文字を取得し,指定されたウィンドウに表示する。
[w]getstr 端末画面から文字列を取得し,文字変数に格納し,指定されたウィンドウに表示する。
getyx ウィンドウで現在のカーソルの位置の座標 (y,x) を変数 y および変数 x に代入する。
[w]inch ウィンドウを変更せずに,指定されたウィンドウの現在のカーソルの位置にある文字を返す。
initscr 端末タイプ・データとすべての画面関数を初期化する。
[w]insch 指定されたウィンドウの現在のカーソルの位置に文字を挿入する。
[w]insertln 現在カーソルが設定されている行の上に 1 行を挿入する。
[w]insstr 指定されたウィンドウの現在のカーソルの位置に文字列を挿入する。
leaveok ウィンドウを更新した後,現在の座標にカーソルをそのまま置く。
longname 文字列を十分格納できるだけの大きさの文字名に完全な端末の名前を代入する。
[w]move 指定されたウィンドウの現在のカーソルの位置を変更する。
mv[w]addch カーソルを移動し,指定されたウィンドウに文字を追加する。
mv[w]addstr カーソルを移動し,指定されたウィンドウに文字列を追加する。
mvcur 端末のカーソルを移動する。
mv[w]delch カーソルを移動し,指定されたウィンドウで文字を削除する。
mv[w]getch カーソルを移動し,端末画面から文字を取得し,指定されたウィンドウに表示する。
mv[w]getstr カーソルを移動し,端末画面から文字列を取得し,その文字列を変数に格納し,指定されたウィンドウに表示する。
mv[w]inch カーソルを移動し,ウィンドウを変更せずに,指定されたウィンドウの文字を返す。
mv[w]insch カーソルを移動し,指定されたウィンドウに文字を挿入する。
mv[w]insstr カーソルを移動し,指定されたウィンドウに文字列を挿入する。
mvwin ウィンドウの開始位置を指定された座標に移動する。
newwin 端末画面の指定された座標から始まる行と列で新しいウィンドウを作成する。
[no]nl UNIX ソフトウェアとの互換性を維持するためだけに提供され, OpenVMS 環境では機能しない。
overlay 1 つのウィンドウの内容 (別のウィンドウの内容の上に完全に収まるサイズ) を別のウィンドウの内容に上に完全に書き込む。処理は 2 つのウィンドウの開始座標から開始される。
overwrite 1 つのウィンドウの内容を別のウィンドウの上に収まる範囲で書き込む。処理は 2 つのウィンドウの開始座標から開始される。
[w]printw 現在のカーソルの位置からウィンドウに対して printf を実行する。
[no]raw UNIX ソフトウェアとの互換性を維持するためだけに提供され, OpenVMS 環境では機能しない。
[w]refresh 指定されたウィンドウを端末画面に再表示する。
[w]scanw ウィンドウに対して scanf を実行する。
scroll ウィンドウのすべての行を 1 行ずつ上に移動する。
scrollok 指定されたウィンドウのスクロール・フラグを設定する。
[w]setattr ウィンドウ内でビデオ表示属性を有効にする。
[w]standend 指定されたウィンドウの太字属性を無効にする。
[w]standout 指定されたウィンドウの太字属性を有効にする。
subwin 端末画面で指定された座標から始まる行と列で新しいサブウィンドウを作成する。
touchwin 指定されたウィンドウの最新バージョンを端末画面に表示する。
wrapok OpenVMS Curses のみ。ウィンドウの右端から次の行の先頭への単語の折り返しを認める。

6.3 Curses の用語

ここでは,Curses の用語について説明し, Curses で端末画面がどのように取り扱われるかを示します。

Curses アプリケーションは重なり合う複数のウィンドウであると考えることができます。ウィンドウの重なり合いのことを重なり (occlusion) と呼びます。これらの重なり合うウィンドウの境界を区別するには,四角形のウィンドウに指定の文字で輪郭をつけるか,または反転表示オプションをオンにします ( ウィンドウの表示を明るい背景,暗い描画色に設定します )。

6.3.1 定義済みウィンドウ (stdscr と curscr)

端末画面の初期サイズ設定は, Curses で 2 つのウィンドウによってあらかじめ定義されています。これらのウィンドウを stdscrcurscrと呼びます。 stdscrウィンドウはユーザが使用するために定義されています。多くの Curses マクロのデフォルトはこのウィンドウに設定されています。たとえば, stdscrの周囲に四角形を描き,画面の左上にカーソルを移動し,文字列を stdscrに書き込み,端末画面に stdscrを表示すると,表示は 図 6-1 に示すようになります。

図 6-1 stdscr ウィンドウの例


2 番目の定義済みウィンドウである curscrは,内部的な Curses の動作のために設計されています。これは,端末画面に現在表示されているもののイメージです。このウィンドウを引数として受け付ける HP C for OpenVMS Curses 関数は clearokだけです。 curscrに対して,書き込みや読み込みを行うことはできません。すべての Curses アプリケーションで, stdscrおよびユーザ定義ウィンドウを使用してください。

6.3.2 ユーザ定義ウィンドウ

ユーザは, stdscrの上に自分のウィンドウを重ねることができます。各ウィンドウのサイズと位置は,行数,列数,開始位置によって示されます。

端末画面の行と列によって座標系,つまりウィンドウが作成されるグリッドが形成されます。ウィンドウの開始位置は,ウィンドウの左上の角の (y,x) 座標によって指定します。たとえば,端末画面の座標 (0,0) は画面の左上の角です。

ウィンドウの領域全体が端末画面の境界線の内部になければなりません。ウィンドウのサイズは 1 文字の大きさから端末画面全体の大きさまで,自由に設定できます。また,メモリの範囲内であれば,ウィンドウはいくつでも作成できます。

ウィンドウに書き込んだり,ウィンドウから削除しても,ウィンドウを再表示するまで,端末画面に変更結果は表示されません。ウィンドウを再表示すると,更新されたウィンドウが端末画面に表示されますが,画面の他の部分はそのまま変更されません。

デフォルト設定では,すべてのユーザ定義ウィンドウが stdscrに重なります。 stdscrと重なるだけでなく,互いに重なり合う 2 つ以上のウィンドウを作成することができます。重なり合う一方のウィンドウにデータを書き込んでも,もう一方のウィンドウにデータは書き込まれません。

オーバーラップ・ウィンドウ (サブウィンドウと呼びます) を作成することができます。宣言されるウィンドウには,サブウィンドウの領域全体を収納しなければなりません。データをサブウィンドウに書き込んだり,サブウィンドウがオーバーラップしているウィンドウの部分にデータを書き込むと,どちらのウィンドウにも新しいデータが表示されます。たとえば,サブウィンドウにデータを書き込んだ後,そのサブウィンドウを削除しても,データは下にあるウィンドウにそのまま残されます。

stdscrと重なるウィンドウ,および stdscrのサブウィンドウを作成すると,端末画面は 図 6-2 のようになります。

図 6-2 ウィンドウとサブウィンドウの表示


ユーザ定義ウィンドウとサブウィンドウの両方を削除した後,新しいイメージで端末画面を更新すると,端末画面は 図 6-3 のようになります。

図 6-3 端末画面の更新


ウィンドウに書き込んだ文字列は削除されますが,サブウィンドウに書き込んだ文字列は stdscrの上に残されます。


前へ 次へ 目次 索引