コールバックに渡されるのはコンテキスト情報で、呼び出しまでの条件を決定します。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 があり、テキスト・ウィジェットの losingFocusCallback、modifyVerifyCallback、および motionVerifyCallback 中では変更できます。
dtksh は、Motif でサポートしている範囲内において、この構造体内のフィールドの変更をサポートしています。コールバック構造体内の次のフィールドは、変更ができます。
CB_CALL_DATA.DOIT
CB_CALL_DATA.STARTPOS
CB_CALL_DATA.TEXT.PTR
CB_CALL_DATA.TEXT.LENGTH
CB_CALL_DATA.TEXT.FORMAT
次は、上記のフィールドの変更例です。
CB_CALL_DATA.DOIT="false"
CB_CALL_DATA.TEXT.PTR="*"
CB_CALL_DATA.TEXT.LENGTH=1