アクション

ウィジェットには、アクションと呼ばれる一連の定義済み手続きが組み込まれています。これらは、ユーザーイベントに対するウィジェットの動作を定義します。イベントがウィジェットに到着すると、ウィジェットのトランスレーションテーブル内のシーケンスと照合され、一致した場合にはアクションが実行されます。

ウィジェットに関連付けられたアクション群は、ウィジェットの作成者があらかじめ定義したものです。ウィジェットの動作を拡張したい場合には、独自のアクションルーチンを記述して、それをツールキットに登録する必要があります。

アクションルーチンをツールキットに登録するには、次の手続きを使用します。

	XtAppAddActions(XtAppContext app_context,
			XtActionList action_table,
			Cardinal     num_actions)

アクションテーブルとは、名前と、手続き - ポインタの組み合わせで構成される、XtActionRec の配列です。この名前部分は、ウィジェットのトランスレーションでアクションルーチンを指定するためのものです。

アクションテーブルに入力された手続きは、呼び出し時に以下の引数を受け取ります。

	void MyActionHandler(Widget    widget,
			     XEvent   *event,
			     String   *params,
			     Cardinal *num_params)

例題

Motif の描画領域には、組み込みアクションがほとんどありません。そこで、ユーザーがウィジェット内でマウスをドラッグすると呼び出されるハンドラを追加することにします。ハンドラを起動する実際のイベントシーケンスをユーザーに決定させることもできます。したがって、リソースファイルのトランスレーション仕様から呼び出せるアクションを指定するとよいでしょう。

最初に、アクションルーチンを作成します。

	void handle_drag(Widget    w,
			 XEvent   *event,
			 String   *params,
			 Cardinal *num_params)
	{
		/* ドラッグを処理するアプリケーションコードを記述 */
	}

次に、作成した手続きとリソースファイルで使用する名前を関連付けるアクションテーブルを構築します。

	XtActionsRec drag_actions[] =
	{
		{ "handle_drag", handle_drag }
	} ;

最後に、このアクションテーブルを X ツールキットに登録します。

	XtAppContext app_context ;
	...
	XtAppAddActions(app_context, drag_actions, XtNumber(drag_actions)) ;

これで、ユーザーはドラッグによって呼び出される任意のシーケンスをリソースファイルに入力できます。

	XApplication*drawing_area.translations:\
	<Btn1Down>:   handle_drag(start)\n\
	<Btn1Motion>: handle_drag(move)\n\
	<Btn1Up>:     handle_drag(end)\n\

start」、「move」、「end」は、params 配列の handle_drag 手続きにさまざまな方法で渡されます。

X アクションテーブルと手続きの詳細については、X マニュアルを参照してください。

関連項目: