日本語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の終了ハンドラによってすでに削除され, その識別子の割り当てが取り消されている可能性があるからです。