# 日本語 OpenVMS
日本語画面管理ライブラリ
利用者の手引き

前へ | 次へ | 目次 | 索引

# 第 4 章
日本語 SMG の高度な機能

日本語 SMG には，次のような高度な機能があります。

- 非同期イベントをトラップする。

- サブプロセス内でコマンドを生成し，実行する。

- 物理カーソルを移動する。

- 終了時に画面を整理する。

この後の節では，これらの高度な機能について説明します。

注意 日本語 SMG は，漢字ターミナルが完全に日本語 SMGの管理下にあることを仮定しています。したがって，アプリケーションは，日本語 SMG ルーチンと日本語 DIGITAL GKS や日本語 FMS のような画面管理用製品を同時に呼ぶべきではありません。 日本語 SMG はリエントラントではありません。したがって複数のプロセスが，1 つのターミナルで同時に操作を行うために，日本語 SMG ルーチンを呼び出そうとした場合，予想できない結果を招く恐れがあります。アプリケーションが複数のプロセスを持ち，画面修正が必要な場合は，一方のプロセスは日本語 SMG ルーチンを呼び出し，もう一方のプロセスはルーチンを呼び出しているプロセスに対して，メッセージを送る必要があります。それによって，プロセスは適切な日本語 SMG ルーチンを呼び出すことができます。

# 4.1 非同期イベント

次に示す3種類の非同期イベントは画面のイメージを破壊する可能性があります。

- ブロードキャスト・メッセージ

- 要求されていない入力

- アウト・オブ・バンド非同期システム・トラップ

この後の節では，これらの操作を制御する方法について説明します。

注意 日本語 SMG は AST リエントラントではありません。したがって，この章で説明する日本語 SMG ルーチンを呼び出すプログラムは，必要な同期処理を実行しなければなりません。

## 4.1.1 ブロードキャスト・メッセージ

通常，ブロードキャスト・メッセージ ( たとえば， MAIL の通知やオペレータ・メッセージなど ) は，いつでもターミナル画面に表示される可能性があり，その結果，画面イメージは破壊されます。 SMG$SET_BROADCAST_TRAPPING ルーチンを使用すれば，指定された漢字ターミナル ( ペーストボード ) にブロード・キャストされたメッセージを受け取ることができ，さらに，ブロードキャスト・メッセージが受け取られるときに必ず呼び出される AST ルーチンを指定できます。ユーザが指定する AST ルーチンは， SMG$GET_BROADCAST_MESSAGE ルーチンを呼び出すことにより，ブロードキャスト・メッセージをアクセスできます。

SMG$SET_BROADCAST_TRAPPING ルーチンを呼び出すときに AST ルーチンを指定したかどうかとは無関係に，ブロードキャスト・メッセージを受信したかどうかということはいつでも確認できます。ブロードキャスト・メッセージの受信を確認する場合には， SMG$GET_BROADCAST_MESSAGE ルーチンを呼び出します。

## 4.1.2 要求されていない入力

SMG$ENABLE_UNSOLICITED_INPUT ルーチンは，要求されていない入力の存在を検出します。このルーチンは入力文字を読み込むわけではなく，単に SMG$READ_COMPOSED_LINE， SMG$READ_KEYSTROKE，SMG$READ_STRING， SMG$READ_VERIFY ルーチンを使用して読み込み操作を実行しなければならないことをアプリケーションに通知するために，AST ルーチンを呼び出すだけです。要求されない入力を実際に読み込むのはユーザの役割です。

## 4.1.3 アウト・オブ・バンド AST

SMG$SET_OUT_OF_BAND_ASTS ルーチンは，`[Ctrl/Y]`や`[Ctrl/C]`， `[Ctrl/O]` などのアウト・オブ・バンド文字を受け取るための方法を提供します。このルーチンを使用すれば，どの文字をアウト・オブ・バンド文字として取り扱うかを指定でき，また，これらの文字が入力されたときに呼び出される AST ルーチンも指定できます。

# 4.2 サブプロセス

日本語 SMG では，サブプロセスを使って，アプリケーションから DCL コマンドを実行することができます。各仮想ディスプレイに対して，サブプロセスは1つだけ作成できます。

## 4.2.1 サブプロセスの作成

サブプロセスは SMG$CREATE_SUBPROCESS ルーチンを使用して作成されます。このルーチンは DCL サブプロセスを生成し，そのサブプロセスをユーザが指定した仮想ディスプレイに対応づけます。サブプロセスは SET NOVERIFY と SET NOON の DCL コマンドを使用して初期化されます。プロセスを生成するには，BYTLM の値が少なくとも5000で， PRCLM の値が少なくとも 1 でなければなりません。日本語 SMG は，サブプロセスを生成する前に，十分なリソースが残されているかどうかを確認します。

## 4.2.2 サブプロセスの削除

サブプロセス・コマンドを実行した後， SMG$DELETE_SUBPROCESS ルーチンを使用してサブプロセスを削除できます。このルーチンを呼び出さずに処理を終了した場合には，日本語 SMG ルーチンはサブプロセスを削除するために終了ハンドラを使用します。しかし，このような日本語 SMG が提供する終了ハンドラを実行できないような状況があります。その場合には，次のコマンドを使用してサブプロセスを削除しなければなりません。

    $ SHOW PROCESS/SUB
    $ STOP/IDENT=xxxx

## 4.2.3 サブプロセス内でのコマンドの実行

SMG$EXECUTE_COMMAND ルーチンを使用すれば，作成したサブプロセス内で指定されたコマンドを実行できます。 SMG$CREATE_SUBPROCESS ルーチンで AST ルーチンが指定され，コマンドがバッファに登録されている場合には，SMG$EXECUTE_COMMAND ルーチンは，指定されたコマンドをバッファに登録し，制御を戻します。コマンドの実行が終了すると，コマンドの状態によってユーザが指定した AST ルーチンが起動されます。 SMG$CREATE_SUBPROCESS ルーチンで AST ルーチンが指定されずコマンドがバッファに登録されていない場合には， SMG$EXECUTE_COMMAND ルーチンはコマンドが実行がされるのを待ち，終了した後，コマンドの状態を戻します。

実行するコマンド文字列を指定する場合には， DCL コマンドの 1 文字目として "$" を指定しなければなりません。日本語 SMG は，"$" から始まらないコマンド文字列を前のコマンドの入力データとして解釈します。コマンドとその出力は，コマンドが実行されるときに指定された仮想ディスプレイに表示されます。 SPAWN コマンド，GOTO コマンド，および LOGOUT コマンドをコマンド文字列として使用することはできず，これらのコマンドを使用した場合には，予測できない結果を生じます。

また，入出力はターミナル・ドライバを通じてではなく，メールボックスを使用して実行されるため，`[Ctrl/C]` や `[Ctrl/Y]`， `[Ctrl/Z]` などの単一文字コマンドはまったく効果がありません。 `[Ctrl/Z]` をサブプロセスに渡すには， flags 引数として SMG$M_SEND_EOF を使用しなければなりません。

# 4.3 カーソルの移動

日本語 SMG では，物理画面の指定された位置にカーソルを移動できます。この操作は SMG$SET_PHYSICAL_CURSOR ルーチンを使用して実行します。しかし，カーソルをペーストボードの画面境界の外部に移動しようとした場合には，エラーが返されます。

# 4.4 終了ハンドラ

日本語 SMG は，イメージ終了の前に起動される終了ハンドラを提供しています。このハンドラは，現在のイメージに関連するすべてのペーストボードと仮想キーボードを削除し，ターミナル属性を再設定します。日本語 SMG の終了ハンドラは，ユーザが指定した終了ハンドラの前に起動される場合もありますし，後で起動される場合もあります。したがって，ユーザ指定の終了ハンドラの内部からペーストボードや仮想ディスプレイを削除すべきではありません。ペーストボードや仮想ディスプレイは，日本語 SMG の終了ハンドラによってすでに削除され，その識別子の割り当てが取り消されている可能性があるからです。

# 第 5 章
フォーリン・ターミナルのサポート

この章では，フォーリン・ターミナルに対する日本語 SMG ルーチンのサポートについて説明します。

フォーリン・ターミナルとは，装置タイプが OpenVMS で認識されない漢字ターミナル，あるいは ANSI_CRT 属性が設定されていない漢字ターミナルです。このサポート機能はおもに，日本語 SMG が使用しますが，フォーリン・ターミナルに対して独自の入出力を実行する必要のあるアプリケーション・プログラムもこの機能を使用できます。したがって，日本語 SMG を使用する場合には，フォーリン・ターミナルの機能の定義だけを考慮すればよく，フォーリン・ターミナル・ルーチンを直接に呼び出すことを考慮する必要はありません。

さらに，日本語 SMG がターミナルの画面を効果的に制御できるようにするには，ターミナル機能の一部 ( "set absolute cursor position"， "erase to end of display"，"erase to end of line" ) だけを定義すれば十分です。しかし，この章では日本語 SMG が使用するルーチンを示すことにより，ユーザがフォーリン・ターミナルに対して独自の入出力を実行できるようにしています。

サポート機能はまず，TERMTABLE.TXT という名前のソース・ファイルから始まります。このファイルには，ターミナル名と関連する機能のリストが登録されています。このファイルは TERMTABLE.EXE というイメージ・ファイルを作成するために， SYS$SYSTEM:SMGBLDTRM.EXE プログラムによって処理されます。この後の節では，TERMTABLE データベースの作成と処理について説明します。

TERMTABLE サポート機能は，すべての漢字ターミナルに対して日本語 SMG が使用します。ターミナルに対する定義は SYS$SYSTEM:SMGTERMS.TXT という名前のファイルに登録されています。このファイルは日本語 SMG の一部として提供されます。この後の節の例では，フォーリン・ターミナル・パッケージを使用してターミナルを定義する方法が示されています。このような例を示したのは，大部分のユーザがこれらの漢字ターミナルを十分理解しているからです。しかし，ユーザ独自の定義を実際に作成する必要はなく，また SYS$SYSTEM:SMGTERMS.TXT 内の定義を変更すべきでもありません。

# 5.1 TERMTABLE インターフェイス・ルーチン

TERMTABLE.EXE は，複数の異なるタイプの漢字ターミナルに関する情報を登録したデータベースです。このデータベースから情報を検索する場合には，次の操作を実行します。

1. ターミナル名をデータベースに与えます。

2. そのターミナル・タイプについての情報を検索します(この操作は何回でも繰り返すことができます)。

3. データベースに対するアクセスを終了します。

日本語 SMG ルーチンを使用してフォーリン・ターミナルに対して入出力を実行する場合には，使用するフォーリン・ターミナルにとって適切な TERMTABLE エントリだけを作成しなければなりません。ここに示した操作が必要なのは，プログラムがフォーリン・ターミナルに対して直接に入出力を実行する場合だけです。

上記の1の操作は次の2種類の方法のいずれかを使用して実行できます。

- ターミナル名(たとえば VT100)を登録した文字列を SMG$INIT_TERM_TABLE ルーチンに渡すことができます。

- OpenVMS システム・サービス $GETDVI が戻した値を SMG$INIT_TERM_TABLE_BY_TYPE ルーチンに渡すこともできます。戻される値はシンボリック・ターミナル・タイプ ( たとえば， TT$_VT100 や TT$_VT52 ) であるか，または特定のフォーリン・ターミナルを指定するために日本語 SMG フォーリン・ターミナル・ルーチンが割り当てた値です。

2 の操作では，SMG$GET_TERM_DATA ルーチンを呼び出さなければなりません。このルーチンは，TERMTABLE からコマンド文字列 ( たとえばエスケープ・シーケンス ) を検索し，それをユーザが提供するバッファに入れます。その後，ユーザはコマンド文字列を漢字ターミナルに書き込まなければなりません。

SMG$GET_TERM_DATA ルーチンは何度も呼び出さなければならない可能性があります。コマンド・シーケンスを受け取るたびに，異なる操作を実行できます。また，引数に対して置換操作や算術演算が必要な機能文字列を使用する場合には，そのたびに SMG$GET_TERM_DATA ルーチンを呼び出さなければなりません。しかし，変更する必要のない機能文字列をプログラムのローカル記憶領域に保存しておくこともできます。これらの変更する必要のない機能文字列は1度検索すると，その後，何度でも使用できます。

3 の操作は省略可能です。この操作は，データベース内の情報をアクセスするために使用した仮想メモリの割り当てを，単に解放するだけです。

DCL の SET TERMINAL コマンドと SHOW TERMINAL コマンドは， OpenVMS ターミナルを認識すると同時に， TERMTABLE に定義されている名前を認識します。 OpenVMS オペレーティング・システムが認識しない漢字ターミナルのターミナル・タイプを指定するために， SET TERMINAL/DEVICE=name コマンドを使用した場合には， TERMTABLE データベースから指定された漢字ターミナルが検索されます。

特定のターミナル定義のアドレスを検索するために，2 つのルーチンが提供されます。 SMG$INIT_TERM_TABLE ルーチンは入力としてターミナル名を受け付けます。 SMG$INIT_TERM_TABLE_BY_TYPE ルーチンは入力として装置タイプを受け付けます。ターミナル名と装置タイプはそれぞれ， TERMTABLE.EXE セクション内の特定のターミナル・エントリにマップされます。これらのルーチンは将来の呼び出しで使用するために，この識別子を呼び出しプログラムに戻します。

SMG$GET_TERM_DATA ルーチンは，コンパイルされた TERMTABLE データベースの識別子と要求コードを受け付けます。要求コードは，適切なエスケープ・シーケンスを検索するためにデータに対するインデックスとして使用されます。一部のシーケンスは静的で変化しません。これらのシーケンスには可変情報は含まれず，単に呼び出し側のバッファにコピーされるだけです。

"！" ディレクティブと "%" ディレクティブを含む可変シーケンスを使用すると，追加処理が実行されます。可変シーケンスの例として，VT300 シリーズのカーソル設定コマンドがあります。この場合，要求されたバイナリの行番号とカラム番号をカーソル設定のために ASCII に変換しなければなりません。 SMG$GET_TERM_DATA ルーチンは，入力された引数を変換し，シーケンスを呼び出し側のバッファにコピーします。

SMG$GET_TERM_DATA ルーチンに入力引数を指定しなかった場合には，機能が必要とする引数に対して，省略時の値として1が使用されます。しかし，省略可能な引数の一部だけを指定し，他の引数に対しては省略時の値を使用することは認められません。このような場合には，すべての引数を指定するか，またはすべての引数の値として省略時の設定を使用しなければなりません。

SMG$GET_NUMERIC_DATA ルーチンは，数値データまたは論理データだけを検索したいユーザのために，簡略化されたインターフェイスを提供します。

すべてのターミナル入出力が終了した後，使用した仮想メモリの割り当てを解放するために SMG$DEL_TERM_TABLE ルーチンを呼び出すことができます。このルーチンは，プログラム途中で TERMTABLE を必要としない場合にだけ役立ちます。仮想メモリの割り当てを解放すると，プログラムはそのメモリを再利用できるようになります。

TERMTABLE.TXT というひな型は SYS$SYSTEM: に提供されています。 OpenVMS が認識するターミナルを定義する SMGTERMS.TXT も提供されます。 TERMTABLE.TXT というひな型は SMGTERMS.TXT という別のソース・ファイルを含むように REQUIRE ディレクティブを使用しています。したがって，実際にはフォーリン・ターミナルだけが TERMTABLE.TXT ソース・ファイルに定義されます。

ユーザは SMGTERMS.TXT を変更してはいけません。

# 5.2 機能フィールド

フォーリン・ターミナルを使用している場合には，日本語 SMG にとって漢字ターミナルが何を実行でき，何を実行できないか，つまり，漢字ターミナルがどのような機能を備えているかがわかりません。機能フィールドを使用することにより，フォーリン・ターミナルに対してどのような機能がサポートされるかを日本語 SMG に示すことができます。これらのフィールドを調べることにより，日本語 SMG ルーチンは共通のターミナル機能をエミュレートするのではなく，個々の漢字ターミナルの機能を使用できます。この結果，日本語 SMG ルーチンの性能を向上できます。

TERMTABLE エントリには次の 3 種類の機能フィールドを指定できます。

- 論理値

- 数値

- 文字列

この後の節では，これらの機能フィールドについて詳しく説明します。

ほとんどの漢字ターミナルに共通の機能は，使用可能なフィールドとして選択されています。すなわち，すべてのターミナル・タイプのすべての機能が表現されているわけではありません ( 特に，ブロック・モード，グラフィック，タイプセット機能などはサポートされません )。画面対応型アプリケーションは典型的なターミナル機能を中心に設計しなければならず，特定のモデルにだけしか存在しない機能に依存しないようにしなければなりません。

特殊な漢字ターミナルをサポートしなければならないアプリケーションの場合には，ユーザが定義できるように汎用機能名が確保されています。 PRIVATE_BOO_n，PRIVATE_NUM_n，PRIVATE_STR_n ( ただし，n は 1 〜 10 の数値です ) の形式の名前は，ユーザ定義ターミナル定義として登録でき， TERMTABLE インターフェイス・ルーチンから戻されます。これらの名前の意味はユーザが割り当てるため，各機能はアプリケーション間で異なるものになる可能性があります。

複数のアプリケーションを実行するシステムは， 1 つのプライベート機能に対して複数の定義が設定されないように注意しなければなりません(たとえば，実行するアプリケーション・プログラムに応じて， PRIVATE_STR_1 が 2 種類の異なる意味を持つ場合には，その漢字ターミナルに対して別々のターミナル・エントリを設定しなければなりません)。一般に，このようなプライベート機能を使用する必要はありません。

次に示す文字は機能フィールド内で区切り文字として使用されます。

区切り文字 | 意味
--- | ---
! | コメントの先頭を示す
= | 機能フィールド名と値を区切る
, | 機能フィールドを区切る
" | 文字列を区切る

前へ | 次へ | 目次 | 索引