日本語SMGには,次のような高度な機能があります。
この後の節では,これらの高度な機能について説明します。
注意
日本語SMGは,漢字ターミナルが完全に日本語SMGの管理下にあることを 仮定しています。したがって,アプリケーションは,日本語SMGルーチンと 日本語DEC GKSや日本語VAX FMSのような画面管理用製品を 同時に呼ぶべきではありません。
日本語SMGはリエントラントではありません。したがって複数のプロセスが, 1つのターミナルで同時に操作を行うために,日本語SMGルーチンを 呼び出そうとした場合,予想できない結果を招く恐れがあります。 アプリケーションが複数のプロセスを持ち,画面修正が必要な場合は, 一方のプロセスは日本語SMGルーチンを呼び出し,もう一方のプロセスは ルーチンを呼び出しているプロセスに対して,メッセージを送る必要があります。 それによって,プロセスは適切な日本語SMGルーチンを呼び出すことができます。
次に示す3種類の非同期イベントは画面のイメージを破壊する可能性があります。
この後の節では,これらの操作を制御する方法について説明します。
注意
日本語SMGはASTリエントラントではありません。したがって,この章で説明する 日本語SMGルーチンを呼び出すプログラムは, 必要な同期処理を実行しなければなりません。
通常,ブロードキャスト・メッセージ(たとえば,MAILの通知や オペレータ・メッセージなど)は,いつでもターミナル画面に表示される 可能性があり,その結果,画面イメージは破壊されます。 SMG$SET_BROADCAST_TRAPPINGルーチンを使用すれば,指定された漢字ターミナル (ペーストボード)にブロード・キャストされたメッセージを受け取ることができ, さらに,ブロードキャスト・メッセージが受け取られるときに必ず呼び出される ASTルーチンを指定できます。ユーザが指定するASTルーチンは, SMG$GET_BROADCAST_MESSAGEルーチンを呼び出すことにより, ブロードキャスト・メッセージをアクセスできます。
SMG$SET_BROADCAST_TRAPPINGルーチンを呼び出すときにASTルーチンを 指定したかどうかとは無関係に,ブロードキャスト・メッセージを 受信したかどうかということはいつでも確認できます。 ブロードキャスト・メッセージの受信を確認する場合には, SMG$GET_BROADCAST_MESSAGEルーチンを呼び出します。
SMG$ENABLE_UNSOLICITED_INPUTルーチンは,要求されていない入力の存在を 検出します。このルーチンは入力文字を読み込むわけではなく,単に SMG$READ_COMPOSED_LINE,SMG$READ_KEYSTROKE,SMG$READ_STRING, SMG$READ_VERIFYルーチンを使用して読み込み操作を実行しなければならないことを アプリケーションに通知するために,ASTルーチンを呼び出すだけです。 要求されない入力を実際に読み込むのはユーザの役割です。
SMG$SET_OUT_OF_BAND_ASTSルーチンは,[Ctrl/Y]や[Ctrl/C],[Ctrl/O]などの アウト・オブ・バンド文字を受け取るための方法を提供します。このルーチンを 使用すれば,どの文字をアウト・オブ・バンド文字として取り扱うかを指定でき, また,これらの文字が入力されたときに呼び出されるASTルーチンも指定できます。
日本語SMGでは,サブプロセスを使って,アプリケーションからDCLコマンドを 実行することができます。各仮想ディスプレイに対して,サブプロセスは 1つだけ作成できます。
サブプロセスはSMG$CREATE_SUBPROCESSルーチンを使用して作成されます。 このルーチンはDCLサブプロセスを生成し,そのサブプロセスをユーザが指定した 仮想ディスプレイに対応づけます。サブプロセスはSET NOVERIFYとSET NOONの DCLコマンドを使用して初期化されます。プロセスを生成するには, BYTLMの値が少なくとも5000で,PRCLM の値が少なくとも1でなければなりません。 日本語SMGは,サブプロセスを生成する前に, 十分なリソースが残されているかどうかを確認します。
サブプロセス・コマンドを実行した後,SMG$DELETE_SUBPROCESSルーチンを 使用してサブプロセスを削除できます。このルーチンを呼び出さずに処理を 終了した場合には,日本語SMGルーチンはサブプロセスを削除するために 終了ハンドラを使用します。しかし,このような日本語SMGが提供する 終了ハンドラを実行できないような状況があります。その場合には, 次のコマンドを使用してサブプロセスを削除しなければなりません。
$ SHOW PROCESS/SUB $ STOP/IDENT=xxxx
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を使用しなければなりません。
日本語SMGでは,物理画面の指定された位置にカーソルを移動できます。 この操作はSMG$SET_PHYSICAL_CURSORルーチンを使用して実行します。しかし, カーソルをペーストボードの画面境界の外部に移動しようとした場合には, エラーが返されます。
日本語SMGは,イメージ終了の前に起動される終了ハンドラを提供しています。 このハンドラは,現在のイメージに関連するすべてのペーストボードと 仮想キーボードを削除し,ターミナル属性を再設定します。日本語SMGの 終了ハンドラは,ユーザが指定した終了ハンドラの前に起動される場合もありますし, 後で起動される場合もあります。したがって,ユーザ指定の終了ハンドラの内部から ペーストボードや仮想ディスプレイを削除すべきではありません。 ペーストボードや仮想ディスプレイは,日本語SMGの終了ハンドラによってすでに 削除され,その識別子の割り当てが取り消されている可能性があるからです。