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

コールバックの使い方

コールバックは、1 つのイベント、またはいくつか組み合わされたイベントが発生した場合に実行される関数またはプロシージャです。たとえば、コールバックは、プッシュ・ボタンが押された時、 それによって要求される結果を出すために使用されます。dtksh シェル・スクリプトにとって、特定のコールバックがウィジェットに呼び出される時に、必ず起動するようにコマンドを割り当てることは容易です。そのコマンドは、共にブロックされるコマンドの文字列、または呼び出すシェル関数名と同じくらい単純です。

コールバックの登録

アプリケーションは、関係のある条件を指定するウィジェット、およびその条件が発生した時に起こるアクションを指定するウィジェットでコールバックを登録します。コールバックは、XtAddCallback を使用して登録します。登録するアクションは、任意の有効な dtksh コマンドになります。たとえば、次のとおりです。

XtAddCallback $WIDGET activateCallback "ActivateProc" 
XtAddCallback $WIDGET activateCallback ¥    
     "XtSetSensitive $BUTTON false"

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

コールバックに渡されるのはコンテキスト情報で、呼び出しまでの条件を決定します。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 でサポートしている範囲内において、この構造体内のフィールドの変更をサポートしています。コールバック構造体内の次のフィールドは、変更ができます。

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