この章では,漢字ターミナルから独立した機能を実行する, 実行時ライブラリ・ルーチンについて説明します。日本語SMGのもっとも重要な要素は, 入出力を実際に実行する物理装置とユーザ・プログラムが完全に分離されるということです。 ユーザ・プログラムは物理画面に直接書き込みを実行するのではなく, 仮想ディスプレイに書き込みます。 同様に,ユーザ・プログラムは物理キーボードから直接入力を実行するのではなく, 仮想キーボードから入力を実行します (仮想ディスプレイと仮想キーボードは論理的なものであり, その使い方についてはこの後の節で詳しく説明します)。 このように,仮想操作を物理操作から分離することにより, 入出力をターミナルから独立させることが可能になります。
この後に示す日本語SMGルーチンは,ビデオ画面上で複雑なイメージを設計し, 構成し,管理するのに役立ちます。これらのルーチンは,通常は, VT100クラスの漢字ターミナルで実行される操作タイプに対応しており,また, 日本語SMGがハードウェアで実現されていない漢字ターミナルで, その機能をソフトウェアでエミュレーションできるようにもします。 各ルーチンはその機能に従って次の3つに分類されています。
表 1-1は, 弊社製品以外の漢字ターミナルをサポートするルーチンです。 これらのルーチンについては, 第5章を参照してください。
弊社以外の漢字ターミナルをサポートするルーチン |
---|
SMG$DEL_TERM_ TABLE |
SMG$GET_NUMERIC_ DATA |
SMG$GET_TERM_ DATA |
SMG$INIT_TERM_ TABLE |
SMG$INIT_TERM_TABLE_BY_TYPE |
表 1-2は,日本語SMG出力ルーチンを示しています。 これらのルーチンについては, 第2章を参照してください。
出力ルーチン | |
---|---|
SMG$BEGIN_PASTEBOARD_UPDATE | |
SMG$CHANGE_PBD_ CHARACTERISTICS | |
SMG$CHANGE_RENDITION | |
SMG$CHANGE_ VIEWPORT | |
SMG$CHANGE_ VIRTUAL_DISPLAY | |
SMG$CHECK_FOR_OCCLUSION | |
SMG$CONTROL_MODE | |
SMG$COPY_VIRTUAL_DISPLAY | |
SMG$CREATE_MENU | |
SMG$CREATE_PASTEBOARD | |
SMG$CREATE_SUBPROCESS | |
SMG$CREATE_VIEWPORT | |
SMG$CREATE_VIRTUAL_DISPLAY | |
SMG$CURSOR_COLUMN | |
SMG$CURSOR_ROW | |
SMG$DELETE_CHARS | |
SMG$DELETE_LINE | |
SMG$DELETE_MENU | |
SMG$DELETE_PASTEBOARD | |
SMG$DELETE_SUBPROCESS | |
SMG$DELETE_VIEWPORT | |
SMG$DELETE_VIRTUAL_DISPLAY | |
SMG$DISABLE_BROADCAST_TRAPPING | |
SMG$DISABLE_UNSOLICITED_ INPUT | |
SMG$DRAW_ CHAR | |
SMG$DRAW_ LINE | |
SMG$DRAW_ RECTANGLE | |
SMG$ENABLE_ UNSOLICITED_INPUT | |
SMG$END_PASTEBOARD_UPDATE | |
SMG$ERASE_CHARS | |
SMG$ERASE_COLUMN | |
SMG$ERASE_DISPLAY | |
SMG$ERASE_LINE | |
SMG$ERASE_PASTEBOARD | |
SMG$EXECUTE_COMMAND | |
SMG$FIND_CURSOR_DISPLAY | |
SMG$FLUSH_BUFFER | |
SMG$GET_BROADCAST_MESSAGE | |
SMG$GET_DISPLAY_ATTR | |
SMG$GET_PASTEBOARD_ATTRIBUTES | |
SMG$GET_PASTING_INFO | |
SMG$GET_VIEWPORT_CHAR | |
SMG$HOME_CURSOR | |
SMG$INSERT_CHARS | |
SMG$INSERT_LINE | |
SMG$LABEL_BORDER | |
SMG$LIST_PASTING_ORDER | |
SMG$LOAD_VIRTUAL_DISPLAY | |
SMG$MOVE_TEXT | |
SMG$MOVE_VIRTUAL_DISPLAY | |
SMG$PASTE_VIRTUAL_DISPLAY | |
SMG$POP_VIRTUAL_DISPLAY | |
SMG$PUT_CHARS | |
SMG$PUT_CHARS_HIGHWIDE | |
SMG$PUT_CHARS_MULTI | |
SMG$PUT_CHARS_WIDE | |
SMG$PUT_HELP_TEXT | |
SMG$PUT_LINE | |
SMG$PUT_LINE_HIGHWIDE | |
SMG$PUT_LINE_MULTI | |
SMG$PUT_LINE_WIDE | |
SMG$PUT_STATUS_LINE | |
SMG$READ_FROM_DISPLAY | |
SMG$REMOVE_LINE | |
SMG$REPAINT_SCREEN | |
SMG$REPASTE_VIRTUAL_DISPLAY | |
SMG$RESTORE_PHYSICAL_SCREEN | |
SMG$RETURN_CURSOR_POS | |
SMG$RING_BELL | |
SMG$SAVE_PHYSICAL_SCREEN | |
SMG$SAVE_VIRTUAL_DISPLAY | |
SMG$SCROLL_DISPLAY_AREA | |
SMG$SCROLL_VIEWPORT | |
SMG$SELECT_FROM_MENU | |
SMG$SET_BROADCAST_TRAPPING | |
SMG$SET_CURSOR_ABS | |
SMG$SET_CURSOR_MODE | |
SMG$SET_CURSOR_REL | |
SMG$SET_DISPLAY_SCROLL_REGION | |
SMG$SET_OUT_OF_BAND_ASTS | |
SMG$SET_PHYSICAL_CURSOR | |
SMG$SET_TERM_CHARACTERISTICS | |
SMG$UNPASTE_VIRTUAL_DISPLAY |
表 1-3は,日本語SMG入力ルーチンをまとめています。 これらのルーチンについては, 第3章を参照してください。
入力ルーチン |
---|
SMG$ADD_KEY_DEF |
SMG$CANCEL_INPUT |
SMG$CREATE_KEY_TABLE |
SMG$CREATE_VIRTUAL_KEYBOARD |
SMG$DEFINE_KEY |
SMG$DELETE_KEY_DEF |
SMG$DELETE_VIRTUAL_KEYBOARD |
SMG$GET_KEY_DEF |
SMG$GET_KEYBOARD_ATTRIBUTES |
SMG$KEYCODE_TO_NAME |
SMG$LIST_KEY_DEFS |
SMG$LOAD_KEY_DEFS |
SMG$NAME_TO_KEYCODE |
SMG$READ_COMPOSED_LINE |
SMG$READ_KEYSTROKE |
SMG$READ_STRING |
SMG$READ_VERIFY |
SMG$REPLACE_INPUT_LINE |
SMG$RETURN_INPUT_LINE |
SMG$SET_DEFAULT_STATE |
SMG$SET_KEYPAD_MODE |
日本語SMGは,次に示す2つの重要なサービスを提供します。
日本語SMGルーチンは,使用している漢字ターミナルのタイプを考慮せずに, 一般に必要とされる画面機能を実行できるようにすることにより, 漢字ターミナルからの独立性を実現しています。入出力も含めてすべての操作は, 呼び出し側の漢字ターミナルから独立した要求を,その動作を実行するのに必要な, 一連のコードに変換するルーチンを呼び出すことにより実行されます。
使用している漢字ターミナルが, 要求された操作をハードウェアでサポートしない場合には,ほとんどの場合, 日本語SMGは,その機能をソフトウェアでエミュレートすることにより, 要求された動作を実行します。同様に,日本語SMGルーチンは, 使用しているキーボードのタイプを考慮せずに, キーボードから入力を実行できるように, 漢字ターミナルから独立した入力方法も提供します。
- 注意
- 日本語SMGは,漢字ターミナルが完全に日本語SMGの管理下にあることを仮定しています。 したがって,アプリケーションは, 日本語SMGルーチンと日本語DEC GKSや日本語VAX FMS のような画面管理用製品を同時に呼ぶべきではありません。
日本語SMGルーチンは,画面上で複雑なイメージを構成するのに役立ちます。 たとえば,画面の一部からユーザ入力を要求し,結果を画面の別の部分に表示し, さらに画面の別の部分に状態情報を表示できます。通常, これらのいずれかの領域から読み込むルーチンやこれらの領域に書き込むルーチンは, 他の領域が存在するかどうかを確認しなければなりません。 これらの情報を知らなければ,行情報とカラム情報を使用して, 画面の適切な部分に情報を書き込んだり, 画面の適切な部分から情報を読み込むことができません。 日本語SMGルーチンを使用すれば,各ルーチンは領域の位置とは無関係に, 画面上の特定の領域に書き込むことができます。行とカラムに対する参照は, ルーチンが指定する画面の領域にだけ関係します。
この後の節では,画面管理の基本要素について説明します。 これらの要素はペーストボード,仮想ディスプレイ,ビューポート,および仮想キーボードです。
ペーストボードは, 漢字ターミナルの画面に対して出力操作を実行するための論理構造です。 ペーストボードは,仮想ディスプレイを配置し, 操作するための2次元の領域として考えることができます。 ペーストボードは常に物理装置に対応しますが, ペーストボードのサイズは物理画面より大きくても,小さくてもかまいません。 各出力装置に対し,ペーストボードは1つだけ設定できます。
- 注意
- 日本語SMGは,RMSファイルとプリンタを出力装置としてサポートしません。
ペーストボードを作成するには,SMG$CREATE_PASTEBOARDルーチンを呼び出し, 引数としてペーストボードに対応づける物理装置を指定します。 SMG$CREATE_PASTEBOARDルーチンは, 固有のペーストボード識別子( pasteboard-id )を返します。この情報は, 後続のルーチン呼び出しでペーストボード識別子が必要なときに使用できます。
たとえば,仮想ディスプレイをペーストする物理ターミナル画面を指定する場合には, pasteboard-id 引数を使用します。 SMG$CREATE_PASTEBOARDルーチンは出力引数として, 対応する装置で使用できる行数とカラム数も指定します。 この情報を使用すれば,物理画面のサイズで仮想ディスプレイを作成できます (仮想ディスプレイについては,次の節で説明します)。
ペーストボードは, 1つ以上の仮想ディスプレイの相対的な位置を指定するための論理座標系である, と考えると便利です(ペーストボード自体には物理的な境界はありませんが, 物理画面には物理的な境界があります)。 図 1-1は, ペーストボード座標系を示しています。
原点(セル位置1,1)は物理画面の左上の角に対応します。 行番号とカラム番号はこの原点から始まります。たとえば, VT200シリーズ・ターミナルの場合には,24行×80カラムであり, ペーストボード座標系の最初の24行と最初の80カラムが物理画面にマップされます。 仮想ディスプレイはこの座標系のどこにでも配置でき, 物理画面に対応する象限に制限されません。したがって, ペーストするときに(つまり,ペーストボードに配置するときに), 仮想ディスプレイが物理画面上に表示されなかったり, あるいは部分的にしか表示されないことがあります。
ペーストボードを削除する(つまり,特定の装置から切り離す)には, SMG$DELETE_PASTEBOARDルーチンを使用します。ペーストボードを削除すると, このペーストボードにペーストされたすべての仮想ディスプレイはアンペーストされます。
ペーストボードを作成した後, SMG$GET_PASTEBOARD_ATTRIBUTESルーチンを呼び出すことにより, そのペーストボードの属性(特にそのサイズ)を調べることができます。 ペーストボードの属性を変更するには, SMG$CHANGE_PBD_CHARACTERISTICS ルーチンを使用します。 ただし,属性を変更できるのは, 対応する物理装置がその属性の変更を認めている場合に限ります。 たとえば,装置がVT100の場合には, ペーストボードの幅を80カラムから132カラムに変更できます。
ペーストボードを作成するときに,日本語SMGは,画面をクリアします。しかし, 画面をそのまま保存することを要求することもできます。さらに, SMG$ERASE_PASTEBOARDルーチンを使用すれば,画面を消去することを要求できます。
仮想ディスプレイはターミナル画面の中の長方形の部分であり, プログラムはルーチン呼び出しを使用して,その領域にデータを書き込みます。 仮想ディスプレイは日本語SMGの中心的な部分です。 画面に配置するイメージを作成する場合には,物理画面ではなく, 仮想ディスプレイを基準にしてイメージを考慮しなければなりません。 このように仮想ディスプレイを物理画面と切り離すことにより, メイン・プログラムは仮想ディスプレイの位置を変更でき, 仮想ディスプレイに書き込むサブルーチンが物理画面でのディスプレイの位置を考慮する必要がないようにしています。
仮想ディスプレイがペーストボードに対応づけられている場合には, 仮想ディスプレイはペーストボードにペーストされていると言います。 ディスプレイをペーストボードから削除することを,アンペーストと言います。 仮想ディスプレイがペーストボードにペーストされていない限り, その仮想ディスプレイは表示されません (仮想ディスプレイのペーストについての詳しい説明は, 第2.1.1項を参照してください)。
プログラムは仮想ディスプレイをいくつでも作成し, 管理できます(仮想ディスプレイの数は, 使用できる仮想アドレス空間によってのみ制限されます)。 1つの仮想ディスプレイを一度に複数のペーストボードにペーストできます。 したがって,プログラムは仮想ディスプレイだけを管理すれば十分です。 仮想ディスプレイが変更された場合には,その変更結果は, ディスプレイがペーストされている各ペーストボード (およびそれに対応するターミナル画面)で自動的に反映されます。
仮想ディスプレイを作成するには, SMG$CREATE_VIRTUAL_DISPLAY ルーチンを使用します。 このルーチンを呼び出す場合には, 仮想ディスプレイの行数とカラム数も指定しなければなりません。 プログラムはまた, ディスプレイに適用される特定のディスプレイ属性とビデオ属性も指定できます。
SMG$CREATE_VIRTUAL_DISPLAYルーチンは固有の仮想ディスプレイ識別子 ( display-id )を返します。 ディスプレイを変更する後続のルーチン呼び出しで仮想ディスプレイを識別する場合には, この display-id 引数を使用します。
プログラムやサブルーチンはSMG$GET_DISPLAY_ATTRルーチンを呼び出すことにより, 仮想ディスプレイの属性とサイズを判断できます。 複数の仮想ディスプレイをペーストボードにペーストしている場合には, SMG$LIST_ PASTING_ORDERルーチンを使用することにより, 仮想ディスプレイをペーストした順序を判断できます。
他の属性が指定されていない場合には,省略時のビデオ属性が出力に適用されます。 レンディション(属性)は,オンまたはオフに設定できるビデオ属性です。 このようなビデオ属性としては,点滅表示,高輝度表示,反転表示, 下線付きテキストがあります。ディスプレイ属性は, ディスプレイが次の操作を実行するかどうかを指定する属性です。
仮想ディスプレイを指定するときに指定したビデオ属性とディスプレイ属性は, 後で変更できます。また,SMG$CHANGE_VIRTUAL_DISPLAYルーチンを使用すれば, ビテオ属性とディスプレイ属性をどちらも変更できます。
たとえば,SMG$CHANGE_VIRTUAL_DISPLAYルーチンを使用すれば, 仮想ディスプレイのサイズを変更できます。 仮想ディスプレイのサイズを変更する場合には,そのディスプレイ内のデータは, サイズを変更した後のディスプレイにコピーされます。 つまり,現在の内容は(1行目,1カラム目から順に) サイズを変更した新しいディスプレイに格納できるだけ保存されます。
仮想ディスプレイを削除するには,SMG$DELETE_VIRTUAL_DISPLAYルーチンを使用します。 削除操作についての詳しい説明は, 第2.1.5項を参照してください。
仮想ディスプレイは非常に大きいものである可能性があるため, ディスプレイ全体を一度に画面に表示できないことがあります。 このような場合には,仮想ディスプレイの各部分を表示するために, 大きい仮想ディスプレイを再度ペーストしなければなりません。 仮想ディスプレイに対応するビューポートはこの操作を容易にします。
ビューポート操作とは,仮想ディスプレイの各部分を表示するために, 仮想ディスプレイを囲む長方形の表示領域を移動する操作です。 ビューポートは仮想ディスプレイに対応づけられます。 したがって,仮想ディスプレイに対して実行される出力操作はすべて, ビューポートに対して実行されます。ビューポートは作成,削除, ペースト,アンペースト,スクロール,および移動できます。 ビューポートについての詳しい説明は, 第2.2.10項を参照してください。
ペーストボードが出力操作のための論理構造であるのと同様に, 仮想キーボードは入力操作のための論理構造です。 仮想キーボードを使用すれば,装置からの独立性を実現できます。 日本語SMG入力ルーチンを使用する場合には, 使用している漢字ターミナルのタイプを考慮する必要がありません。たとえば, 各プログラムは特定の漢字ターミナルでどの行終了文字が使用されているかを知る必要がありません。 日本語SMGは異なる行終了文字を統一された機能コードに変換します (行終了文字コードについての詳しい説明は, 第3章を参照してください)。
仮想キーボードは通常,漢字ターミナルの物理キーボードに対応づけられます。 複数の仮想キーボードを1つの入力装置に対して対応づけることができます。
- 注意
- 日本語SMGは,RMSファイルを入力装置としてサポートしません。
入力ソース(仮想キーボード)を設定するには, SMG$CREATE_VIRTUAL_KEYBOARDルーチンを使用します。 仮想キーボードを削除するには,SMG$DELETE_VIRTUAL_KEYBOARDルーチンを使用します。
仮想キーボードを作成した後,SMG$READ_COMPOSED_LINE,SMG$READ_ KEYSTROKE, SMG$READ_STRING,SMG$READ_VERIFYルーチンのいずれかを使用することにより, 仮想キーボードからデータを受け付けることができます。
SMG$READ_COMPOSED_LINEルーチンは,通常のキーストロークと, キーパッドおよび制御キーに対応する定義済み文字列で構成される行を読み込みます。 このルーチンは,単一キー・コマンド機能を提供することにより, コマンド向きユーティリティのためのインタフェースを容易にコーディングできるようにします。 SMG$READ_KEYSTROKEルーチンはキーボードから入力された1つのキーストロークを読み込むために使用します。 SMG$READ_STRINGルーチンは文字と終了文字で構成される文字列を読み込みます。 このルーチンは汎用性と柔軟性が高く, OpenVMSターミナル・ドライバの多くの機能をアクセスできます。 SMG$READ_VERIFYルーチンは書式化された入力を読み込むために使用します。
どのタイプの読み込み操作も, SMG$CANCEL_INPUTルーチンを呼び出すことにより強制終了できます。
日本語画面管理ライブラリ(JSY$SMGSHR.EXE)をご使用の際には, リンク時に明示的に指定する必要があります。 自動的にJSY$SMGSHR.EXEとリンクされることはありません。 JSY$SMGSHR.EXEとリンクするには以下のようにします。
$ link foo.obj, sys$input/option sys$share:jsy$smgshr.exe/share ^Z