共通デスクトップ環境 Dtksh ユーザーズ・ガイド

コンテキスト変数の使い方

dtksh には、アプリケーションのいろいろな状態に対するコンテキストを提供する数多くの変数があります。

イベント・ハンドラ・コンテキスト変数

アプリケーションは、指定したイベントの 1 つが発生した時に起こるアクションを指定するウィジェットにイベント・ハンドラを登録します。アクションには、任意の dtksh コマンド行を指定できます。たとえば、次のとおりです。

XtAddEventHandler $W "Button2MotionMask" false "ActivateProc" 
XtAddEventHandler $W "ButtonPressMask|ButtonReleaseMask" ¥
      false "echo action"

2 つの環境変数が、イベント・ハンドラへのコンテキストを提供するために次のように定義されます。

EH_WIDGET

イベント・ハンドラが登録されるウィジェットの ID を設定します。

EH_EVENT

イベント・ハンドラを起動する XEvent のアドレスを設定します。

XEvent 構造体内のフィールドへのアクセスを次の例に示します。

if [ ${EH_EVENT.TYPE} = "ButtonPress" ]; then
   echo "X = "${EH_EVENT.XBUTTON.X}
   echo "Y= "${EH_EVENT.XBUTTON.Y}
elif [ ${EH_EVENT.TYPE} = "KeyPress" ]; then     
   echo "X = "${EH_EVENT.XKEY.X}
   echo "Y = "${EH_EVENT.XKEY.Y}    
fi

トランスレーション・コンテキスト変数

Xt イントリンシクスは、ウィジェットに対して登録されるイベントのトランスレーションを提供します。イベントのトランスレーション・コンテキストは、イベント・ハンドラの場合と同じ方法で提供されます。トランスレーション・コマンドで定義される 2 つの変数は次のとおりです。

TRANSLATION_WIDGET

トランスレーションが登録されるウィジェットのウィジェット・ハンドルを設定します。

TRANSLATION_EVENT

トランスレーションを起動する XEvent のアドレスを設定します。

次のようなドット表記で、イベントのフィールドへアクセスします。

echo "Event type = "${TRANSLATION_EVENT.TYPE} 
echo "Display ="${TRANSLATION_EVENT.XANY.DISPLAY}

ワークスペース・コールバック・コンテキスト変数

アプリケーションは、ユーザが新規ワークスペースへ移動するたびに呼び出せるコールバック関数を登録できます。コールバックが呼び出されると、次に挙げる 2 つの特別な環境変数が設定され、これらはシェル・コールバック・コードによってアクセス可能です。

CB_WIDGET

コールバックを呼び出すウィジェットの ID を設定します。

CB_CALL_DATA

新規ワークスペースを一意に識別する X アトムを設定します。これは、XmGetAtomName コマンドを使用して文字列表現に変換できます。

入力コンテキスト変数

Xt イントリンシクスは、XtAddInput 機能を提供します。これにより、アプリケーションは、特定のファイル記述子から利用可能なデータの配信対象を登録できます。C 言語でプログラミングする場合、アプリケーションはハンドラ関数を提供します。この関数は、入力が可能な場合に呼び出されます。入力ソースからデータを読み込んだり、エスケープ文字や継続行を処理するのは、ハンドラの役割です。

dtkshXtAddInput 機能もサポートしますが、シェル・プログラマが簡単に使用できるようにします。デフォルトでは、シェル・スクリプトがファイル記述子の配信対象を登録する場合、dtksh は、テキストの絶対行を受け取った時のみシェル・スクリプトの入力ハンドラを呼び出します。テキストの絶対行は、エスケープされていない改行文字またはファイルの終わりによって終了している行と定義されます。入力ハンドラは、利用可能なデータが存在せず、ファイルの終わりに達した場合にも呼び出されます。この時、ハンドラは、XtRemoveInput を使用して入力ソースを削除し、ファイル記述子を閉じることができます。このデフォルト動作の利点は、入力ハンドラがエスケープ処理や継続行の処理にかかわらず動作する点です。不便な点は、すべての入力が行単位であり、バイナリ情報を含んでいないことを前提にしている点です。

dtksh はまた、入力ソースにバイナリ情報がある場合や、入力ハンドラがデータを入力ソースから直接読み込みたい場合に、「raw」 入力モードをサポートします。raw モードでは、dtksh は、入力ソースからデータを全く読み込みません。dtksh は入力が入力ソース上で行えるようになると、シェル・スクリプトの入力ハンドラを呼び出します。この時、入力データを読み込んだり、バッファリング要求やエスケープ処理を行なったり、いつファイルの終わりに到達したかを検出したりするのは、ハンドラの責任において行われます (これにより、入力ソースが削除され、ファイル記述子を閉じます)。dtksh スクリプトで、このモードが使用されることは、ほとんどありません。

入力ハンドラがデフォルト・モードまたは raw モードのどちらで作動するように構成されているかによって、シェル・スクリプトの入力ハンドラを呼び出す前に、dtksh がいくつかの環境変数を設定します。これらの環境変数は、入力データを処理するのに必要なすべてのものを入力ハンドラに提供します。その環境変数は次のとおりです。

INPUT_LINE

デフォルト・モードで動作する場合、この変数には入力ソースで利用可能な次の完全入力行が格納されます。INPUT_EOF が true の場合、このバッファにはデータはありません。raw モードで作動する場合、この変数には常に空の文字列が格納されます。

INPUT_EOF

デフォルト・モードで動作する場合、この変数は、INPUT_LINE にデータが格納されている限り false が設定され、ファイルの終わりに到達すると、true が設定されます。ファイルの終わりに到達すると、シェル・スクリプトの入力ハンドラは、入力ソースを登録解除し、ファイル記述子を閉じなければなりません。raw モードの場合、この変数は常に false が設定されます。

INPUT_SOURCE

これは、入力が可能なファイル記述子を示します。raw モードで動作する場合、このファイル記述子は、保留になっている入力を獲得するために使用されます。ファイル記述子はまた、必要がなくなった時に入力ソースを閉じるためにも使用されます。

INPUT_ID

これは、入力ソースがすでに登録されている場合に XtAddInput が返す ID を示します。この情報は、XtRemoveInput で入力ソースを削除するのに必要です。