この章では, 新しいプログラムを開発するための日本語SMGの望ましい使用方法について説明します。 この章の説明では特に, 日本語SMGルーチンがASTリエントラントでないことに注意してください。
アプリケーションから日本語SMGルーチンを呼び出す方法としては, 次の2種類の方法があります。
日本語SMGを直接呼び出すアプリケーションは, ペーストボードと仮想ディスプレイを使用している。
この種のアプリケーションは日本語SMGを直接使用しないが, 他のルーチン中で,日本語SMGを使用する。
今後, これまでより多くの呼び出し可能ルーチンが日本語SMGを使用して出力を作成できるようになります。 そのようになると, アプリケーションがこのカテゴリに分類されるかどうかを判断するのは困難になります。
どちらの場合も,呼び出しルーチンは何らかの時点でサブシステムを呼び出すことにより, サブシステムが画面にデータを書き込むことができるようにします。
その後,端末ユーザは,サブシステム固有のディスプレイを消去する必要があるでしょう。 しかしサブシステムが,データを表示するために仮想ディスプレイを作成し使用した場合には, ディスプレイ識別子は呼び出しプログラムからは利用できません。 したがって,呼び出しプログラムはディスプレイを消去できません。 さらに,呼び出しプログラムが日本語SMGを使っていない場合, 画面のペーストボード識別子も呼び出しプログラムから利用できません。
この問題を解決するには, 日本語SMGを直接的または間接的に使用するすべての呼び出し可能ルーチンが, pasteboard-id 引数に対して(省略可能な)入力引数と, 仮想 display-id 引数に対して(省略可能な)出力引数を使用するようにしなければなりません。 ペーストボード識別子とディスプレイ識別子を渡すことにより, 呼び出しプログラムから消去できないサブシステム固有のデータが, 画面に蓄積されるのを防止できます。これらのガイドラインをまとめると, 次のようになります。
仮想ディスプレイを後で再利用できると考えて, SMG$UNPASTE_VIRTUAL_DISPLAYルーチンを呼び出されるプログラムから単純に呼び出してはならない。 呼び出されるプログラムと呼び出しプログラムはペーストボードを共用するため, 呼び出しプログラムはSMG$POP_VIRTUAL_DISPLAYルーチンを使用して, 呼び出されたプログラムが作成したすべてのディプレイを削除できる。
呼び出されるプログラムは, SMG$CREATE_PASTEBOARDルーチン呼び出しの状態を確認することにより, 固有のペーストボード識別子を作成したのか, 既存のペーストボードのペーストボード識別子を受信したのかを判断しなければならない。 ペーストボードがすでに存在する場合には, 呼び出されるプログラムはそのペーストボートを削除してはならない。
次のガイドラインに従えば,モジュール方式でアプリケーションを開発できます。
呼び出されるプログラムは, 最初にペーストした仮想ディスプレイの display-id 引数を戻すことにより, 呼び出しプログラムがSMG$POP_VIRTUAL_DISPLAYルーチンを呼び出すことで, このディスプレイと,その後ペーストしたすべてのディスプレイを削除できるようにする。
日本語SMGを使用せずに画面に書き込みを実行するサブルーチン(またはサブシステム) を呼び出す場合には,別の状況が発生します。日本語SMGを使用しない場合には (つまり,画面上で日本語SMGによって制御されない領域にテキストが配置される場合), 画面を更新しようとするときに問題が発生します。
この理由から,日本語SMGには, 画面管理を使用しないプログラムに画面(またはその一部)を一時的に渡すルーチンと, 制御がSMG$ ルーチン以外のルーチンから戻された後, 前の状態に画面を復元するためのルーチンがあります。 これらのルーチンはSMG$SAVE_PHYSICAL_SCREENルーチンと SMG$RESTORE_PHYSICAL_SCREENルーチンです。
SMG$ 以外の入出力を,画面に対して実行するルーチンを呼び出す場合には, その前にSMG$SAVE_PHYSICAL_SCREENルーチンを呼び出し, 画面のどの部分をSMG$ 以外のルーチンに渡すかを指定します。 SMG$SAVE_PHYSICAL_SCREENルーチンは指定された領域を消去し, ターミナルの物理スクロール領域をこの領域に設定し,物理カーソルを領域の行1, カラム1に設定します。 SMG$ 以外のコードが順次入出力だけしか実行しない場合には (つまり,カーソル・アドレスを直接指定しない場合には), 出力は画面の指定された領域に制限されます。
制御がSMG$ 以外のルーチンから戻された後, SMG$RESTORE_PHYSICAL_SCREENルーチンを呼び出してください。このルーチンは, SMG$SAVE_PHYSICAL_SCREENルーチンを呼び出す前の状態に画面イメージを復元します。