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

前へ | 次へ | 目次 | 索引

# 5.6 画面管理が使用する機能フィールド

第 5.2 節 の表は，日本語 SMG が特定の機能文字列を要求できるかどうかを示しています。ライン描画などの一部の機能は，ラインを描く日本語 SMG ルーチンを呼び出した場合などにだけ要求されます。通常のテキストを画面に書き込む操作だけしか実行しない場合には，次のフィールドだけを定義しておけば十分です。

基本的な機能

- NAME

- SET_CURSOR_ABS

SET_CURSOR_ABS を省略した場合には，日本語 SMG は漢字ターミナルをハード・コピー装置として取り扱います(ハード・コピー装置に対する日本語 SMG の使用は，本バージョンではサポートされません)。

次のオプション機能を指定した場合には，日本語 SMG 操作はより効率的になります。

- ERASE_TO_END_DISPLAY

- ERASE_TO_END_LINE

- SET_SCROLLING_REGION

ERASE_TO_END_DISPLAY，ERASE_TO_END_LINE，SET_SCROLLING_REGION を指定しなかった場合には，日本語 SMG はこれらの機能を実行するために空白を挿入します。しかし，空白を挿入する操作は時間のかかる操作です。同様に，ハードウェアのスクロール機能を使用すれば，出力の速度を向上できます。スクロール機能を使用できない場合には，日本語 SMG は画面全体を描き直さなければなりません。

日本語 SMG は ASCII 文字集合を使用します。漢字ターミナルにライン描画文字セットが備えられている場合には，ライン描画文字 ( bottom_t_char, horizontal_bar など ) を定義しなければなりません。ライン描画文字が定義されていない場合には， SMG は境界を描くために通常の ASCII 文字を使用します。

また日本語 SMG は，ターミナル・ドライバを管理しているターミナル属性にも依存します。これらの属性は，DCL の SET TERMINAL コマンドを使用して変更できます。たとえば，SET TERMINAL/NOTAB と入力すると，日本語 SMG は漢字ターミナルにタブを送信しなくなります。

# 5.7 フォーリン・ターミナルに対する入力のサポート

フォーリン・ターミナル とは， OpenVMS が認識する標準的なターミナル以外の装置タイプの漢字ターミナル，あるいは ANSI_CRT 属性が設定されていない漢字ターミナルです。

ANSI ターミナルを使用する場合には，ファンクション・キーやキーパッド・キーなどの特殊なキーを入力すると，エスケープ・シーケンス ( ANSI 標準規格によって定義されているシーケンス ) が OpenVMS ターミナル・ドライバに送信されます。 OpenVMS ターミナル・ドライバはこの ANSI 標準規格を認識し，この標準規格に従って，エスケープ・シーケンスを解釈します。したがって，OpenVMS ターミナル・ドライバは，エスケープ・シーケンスの長さと，そのシーケンス内のどの位置でどの文字が認められるかを認識しています。

OpenVMS ターミナル・ドライバは，エスケープ・シーケンス内のプリント文字をエコー表示しません。これは，これらの文字がエスケープ・シーケンスの一部として特殊な意味を持つものとして解釈されるからです。ただし，TRM$M_TM_NOECHO 修飾子を指定しない限り，通常のキーはエコー表示されます。

OpenVMS ターミナル・ドライバはエスケープ・シーケンス，シーケンスの長さ，ファンクション・キーが押される前に入力された文字数を日本語 SMG ルーチンに戻します。日本語 SMG ルーチンは，シーケンスとその長さを TERMTABLE.EXE 内の特定の漢字ターミナルに対するキー定義のリストと比較することにより，どのキーが押されたかを判断します。このコードは SMG$K_TRM_xxx という形式でユーザに戻されます。ただし，xxx は特定のキーを指します。

フォーリン・ターミナルでファンクション・キーやキーパッド・キーなどの特殊なキーを押した場合には， ANSI 標準ではないシーケンスが OpenVMS ターミナル・ドライバに送信されます。このシーケンスが制御文字から始まる場合には， OpenVMS ターミナル・ドライバはこの文字を終了文字として解釈します ( 省略時の設定では，特に他の目的で終了文字マスクを使用しない限り，すべての制御文字は終了文字になります )。その後，ターミナル・ドライバは文字の読み込みを停止し，その文字，長さ1，およびファンクション・キーが押される前に入力された文字数を日本語 SMG ルーチンに戻します。

日本語 SMG ルーチンは，戻された文字を調べます。その文字が制御文字の場合には，日本語 SMG ルーチンは先読みバッファにシーケンスの次の文字が登録されていないかどうかを確認します。先読みバッファに文字が登録されている場合には，日本語 SMG ルーチンは先読みバッファから 1 文字を読み込み，それを前に読み込んだ制御シーケンスの後に追加し，この新しいシーケンスを TERMTABLE.EXE 内のこのターミナルに対するキー定義のリストと比較し，どのキーが押されたかを判断します。シーケンスが一致しない場合には，先読みバッファから次の文字が読み込まれます。一致するものが検出されるまで，または先読みバッファが空になるまで，この処理が継続的に実行されます。

ターミナル・ドライバはこのシーケンスに関して知識を持たないため，エコー表示を禁止する修飾子をユーザが指定しない限り，シーケンス内のプリント可能な文字はターミナル・ドライバによってエコー表示されます。日本語 SMG ルーチンにはどの文字がこのシーケンスを構成するのかがわからないため，シーケンスを構成する実際の文字を日本語 SMG ルーチンに戻すことができるようにするために，行編集機能が禁止されます。

特殊キーが制御文字から始まらないシーケンスを送信する漢字ターミナルは，入力の対象として日本語 SMG ルーチンでサポートされません。ファンクション・キー・シーケンスを開始する制御文字を除外するように終了文字マスクを変更する操作はサポートされません。さらに，入力を実行するフォーリン・ターミナルの性能は，同じ入力を実行する ANSI ターミナルの性能と一致しません。これは，日本語 SMG ルーチンが OpenVMS ターミナル・ドライバのかわりにシーケンスを解析しなければならないからです。

# 5.8 SET TERMINAL コマンドと SHOW TERMINAL コマンドのサポート

DCL の SET TERMINAL コマンドは， TERMTABLE 定義に従うように漢字ターミナルを設定します。 SET TERMINAL コマンドを使用すると， TERMTABLE データベースから次の 3 つのフィールドが検索され，漢字ターミナルに対して設定されます。

1. ターミナル・タイプ−システムが割り当てる，特定の装置タイプに関連する符号付き整数

2. 幅−物理画面のカラム数

3. ページ・サイズ−画面の行数

さらに，対応する論理値機能がターミナル定義に設定されている場合には，次のフラグが設定されます。

- ADVANCED_VIDEO

- ANSI_CRT

- BLOCK_MODE

- DEC_CRT

- EDIT

- EIGHT_BIT

- FORM

- FULLDUP

- LOWERCASE

- REGIS

- SCOPE

- SIXEL_GRAPHICS

- SOFT_CHARACTERS

- TAB

これらのフィールドのいずれかが定義から脱落している場合には，その属性に対しては，以前の設定が保存されます。 SET TERMINAL コマンドは漢字ターミナルに対してその属性を設定しようとしません。予測できない設定が発生するのを防止するには，ここに示したすべての機能を定義に指定しなければなりません。
SET TERMINAL コマンドは，VT300 シリーズ，VT200 シリーズ，VT100，および VT52 などの認識される漢字ターミナルに対しては，常に同様に動作します。 SET TERMINAL が認識しない装置名を検出した場合には， TERMTABLE からその名前を持つ定義を検索します。ユーザ固有の定義は， SET TERMINAL が現在認識する名前以外の名前でなければなりません。現在認識される漢字ターミナルは次に示すとおりです。

LA12 | LQP02 | VT102
LA34 | VT05 | VT125
LA36 | VT52 | VT131
LA38 | VT55 | VT132
LA100 | VT80 | VT200-SERIES
LA120 | VT100 | VT300-SERIES
Unknown | VT101 | FT1 から FT8

SET TERMINAL が独自の内部テーブルから装置名を検索する場合には， TERMTABLE データベースを検索しません。

SET TERMINAL コマンドは装置名の最初の15文字だけを認識するため，ターミナル名は15文字に制限することが必要です。

SET TERMINAL/DEVICE_TYPE=name コマンドを使用した場合，指定された漢字ターミナルが OpenVMS オペレーティング・システムによって認識されないときは， TERMTABLE データベースからその漢字ターミナルが検索されます。

SET TERMINAL/DEVICE_TYPE=name コマンドはその後，次の表に示すように， TERMTABLE データベース内の機能の存在をもとに，いろいろなターミナル属性を設定します。

機能フィールド | ターミナル属性
--- | ---
LOWERCASE | LOWERCASE
PHYSICAL_TABS | TABS
SCOPE | SCOPE
EIGHT_BIT | EIGHTBIT
PHYSICAL_FF | FORM
FULLDUP | FULLDUP
SIXEL_GRAPHICS | SIXEL
SOFT_CHARACTERS | SOFT
ANSI_CRT | ANSI_CRT
REGIS | REGIS
BLOCK_MODE | BLOCK
ADVANCED_VIDEO | AVO
EDIT_MODE | EDIT
DEC_CRT | DEC_CRT

TERMTABLE ターミナルに対しては， SET TERMINAL/DEVICE_TYPE= 形式のコマンドを使用しなければなりません。 SET TERMINAL/name は古い形式のコマンドであり，一部の装置名に対してだけしか機能せず， OpenVMS の前のバージョンとの互換性を維持する目的でのみ使用できます。

# 第 6 章
日本語 SMG を使用したプログラム開発

この章では，新しいプログラムを開発するための日本語 SMGの望ましい使用方法について説明します。この章の説明では特に，日本語 SMG ルーチンが AST リエントラントでないことに注意してください。

アプリケーションから日本語 SMG ルーチンを呼び出す方法としては，次の2種類の方法があります。

- 直接呼び出し
  日本語 SMGを直接呼び出すアプリケーションは，ペーストボードと仮想ディスプレイを使用している。

- 間接呼び出し
  この種のアプリケーションは日本語 SMGを直接使用しないが，他のルーチン中で，日本語 SMGを使用する。
  今後，これまでより多くの呼び出し可能ルーチンが日本語 SMGを使用して出力を作成できるようになります。そのようになると，アプリケーションがこのカテゴリに分類されるかどうかを判断するのは困難になります。

どちらの場合も，呼び出しルーチンは何らかの時点でサブシステムを呼び出すことにより，サブシステムが画面にデータを書き込むことができるようにします。

その後，端末ユーザは，サブシステム固有のディスプレイを消去する必要があるでしょう。しかしサブシステムが，データを表示するために仮想ディスプレイを作成し使用した場合には，ディスプレイ識別子は呼び出しプログラムからは利用できません。したがって，呼び出しプログラムはディスプレイを消去できません。さらに，呼び出しプログラムが日本語 SMGを使っていない場合，画面のペーストボード識別子も呼び出しプログラムから利用できません。

この問題を解決するには，日本語 SMGを直接的または間接的に使用するすべての呼び出し可能ルーチンが， pasteboard-id 引数に対して(省略可能な)入力引数と，仮想 display-id 引数に対して(省略可能な)出力引数を使用するようにしなければなりません。ペーストボード識別子とディスプレイ識別子を渡すことにより，呼び出しプログラムから消去できないサブシステム固有のデータが，画面に蓄積されるのを防止できます。これらのガイドラインをまとめると，次のようになります。

- pasteboard-id 引数が呼び出しプログラムから提供される場合には，

  1. 呼び出されるプログラムは，独自のペーストボードを作成してはならない。

  2. 呼び出されるプログラムは，呼び出しプログラムから提供されるペーストボードにすべての出力を送信しなければならない。つまり，呼び出されるプログラムは， pasteboard-id 引数によって指定されるペーストボードにのみディスプレイをペーストできる。

  3. 呼び出されるプログラムは，SMG$DELETE_VIRTUAL_DISPLAY ルーチンを呼び出すことにより，作成した仮想ディスプレイを削除できるが，ペーストボードを削除してはならない。
     仮想ディスプレイを後で再利用できると考えて，SMG$UNPASTE_VIRTUAL_DISPLAY ルーチンを呼び出されるプログラムから単純に呼び出してはならない。呼び出されるプログラムと呼び出しプログラムはペーストボードを共用するため，呼び出しプログラムは SMG$POP_VIRTUAL_DISPLAY ルーチンを使用して，呼び出されたプログラムが作成したすべてのディプレイを削除できる。

  4. 呼び出されるプログラムは，そのプログラムが呼び出すルーチンに pasteboard-id 引数を渡さなければならない。このようにして，すべての出力は指定されたペーストボードに送られる。

- pasteboard-id 引数が呼び出しプログラムから提供されない場合には，

  1. 呼び出されるプログラムは，独自にペーストボードを作成しなければならない。呼び出されるプログラムは，他の方法によって特定の装置に出力を送る場合を除き，ペーストボードに対する物理装置を割り当てることができる。
     呼び出されるプログラムは，SMG$CREATE_PASTEBOARD ルーチン呼び出しの状態を確認することにより，固有のペーストボード識別子を作成したのか，既存のペーストボードのペーストボード識別子を受信したのかを判断しなければならない。ペーストボードがすでに存在する場合には，呼び出されるプログラムはそのペーストボートを削除してはならない。

  2. 呼び出されるルーチンがペーストボードを作成し，次にペーストボートを使用する可能性のあるサブルーチンを呼び出す場合には，pasteboard-id 引数をサブルーチンに渡さなければならない。

  3. 呼び出されるプログラムは，SMG$UNPASTE_VIRTUAL_DISPLAY ルーチンを使用して物理画面から消去し，再起動される可能性がある場合には，将来の起動のために再利用できるようにディスプレイを保存できる。しかし，SMG$UNPASTE_VIRTUAL_DISPLAY ルーチンを使用するのは，呼び出されるプログラムが独自のペーストボードを作成する場合に制限しなければならない。この場合，呼び出しプログラムは呼び出されるプログラムが作成した仮想ディスプレイを削除できないからである。

- 仮想 display-id 引数を呼び出しプログラムが与える場合には，呼び出しプログラムは呼び出されるプログラムが作成した仮想ディスプレイを削除しなければならない。呼び出されるプログラムは最初にペーストした仮想ディスプレイの識別子を呼び出しプログラムに戻さなければならない。呼び出しプログラムは SMG$POP_VIRTUAL_DISPLAY ルーチンを呼び出すことにより，この仮想ディスプレイとその後ペーストするすべての仮想ディスプレイを削除できる。

- 仮想 display-id 引数を呼び出しプログラムが与えない場合には，呼び出されるプログラムはペーストボードにペーストしたすべての仮想ディスプレイを削除しなければならない。

次のガイドラインに従えば，モジュール方式でアプリケーションを開発できます。

- 呼び出しプログラムは，どの情報をペーストボードにペーストするかを制御する。ペーストボード識別子は階層構造の上から下に流れ，各ルーチンは呼び出しプログラムが与えた pasteboard-id 引数を使用し，それをサブルーチンに渡す。

- 呼び出しプログラムが仮想 display-id 引数を与え，呼び出されるプログラムがその引数に識別子を格納する場合には，呼び出しプログラムは，呼び出されるプログラムが作成したディスプレイを削除しなければならないと解釈する。
  呼び出されるプログラムは，最初にペーストした仮想ディスプレイの display-id 引数を戻すことにより，呼び出しプログラムがSMG$POP_VIRTUAL_DISPLAYルーチンを呼び出すことで，このディスプレイと，その後ペーストしたすべてのディスプレイを削除できるようにする。

- 仮想ディスプレイは，それを必要とするルーチン内で作成される(およびペーストされる)。呼び出しプログラムが display-id 引数を与えない場合には，そのディスプレイを作成したルーチン内でディスプレイはアンペーストされるか，または削除される。

# 6.1 日本語 SMGを使用しないルーチンの呼び出し

日本語 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 ルーチンを呼び出す前の状態に画面イメージを復元します。

前へ | 次へ | 目次 | 索引