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

データをコールバックへ渡す

コールバックに渡されるのはコンテキスト情報で、呼び出しまでの条件を決定します。C プロシージャの場合、この情報は一般的に callData 構造体へ渡されます。たとえば、valueChangedCallback を呼び出すスケール・ウィジェットは、次のような構造を callData に渡します。

typedef struct {
  int  reason;
  XEvent event;
  int value; 
}XmScaleCallbackStruct;

C アプリケーションのコールバックは、次のように動作します。

if (scaleCallData->reason == XmCR_VALUE_CHANGED)  
{
   eventType =scaleCallData->event->type;
   display =scaleCallData->event->xany.display;  
}

同様に、コールバックが dtksh で呼び出された場合、実行する前に次の特別な環境変数が設定されます。

CB_WIDGET

これは、コールバックを呼び出しているウィジェットのウィジェット ID に対して設定されます。

CB_CALL_DATA

これは、ウィジェットがコールバックに渡す callData 構造体のアドレスに対して設定されます。

CB_CALL_DATA 環境変数は構造体へのポインタを表し、そのフィールドへのアクセスには、C のそれと同様の構文を使用します。入れ子形式で環境変数が定義され、構造体のフィールドと同じ名前が付けられます (ただし、すべて大文字です)。この時、構造体の要素の内容を示すためにドットが使用されます。こうして、スケール・ウィジェットによって提供される callData へアクセスする前述の C コードは、次のように翻訳されます。

if [ ${CB_CALL_DATA.REASON} = "CR_VALUE_CHANGED" ]; then    
   eventType=${CB_CALL_DATA.EVENT.TYPE}    
   display=${CB_CALL_DATA.EVENT.XANY.DISPLAY}  
fi

同様のことが、callData 構造体内のイベント構造体の場合にも言えます。

ほとんどのコールバック構造体において、シェル・スクリプトは、特定のコールバック構造体に定義される任意のフィールドを先に記述した手法を使用して参照できます。たいていの場合、シェル・スクリプトは、これらの構造体内のフィールドを変更できません。この例外として XmTextVerifyCallbackStruct があり、テキスト・ウィジェットの losingFocusCallbackmodifyVerifyCallback、および motionVerifyCallback 中では変更できます。

dtksh は、Motif でサポートしている範囲内において、この構造体内のフィールドの変更をサポートしています。コールバック構造体内の次のフィールドは、変更ができます。

次は、上記のフィールドの変更例です。