XtAppProcessEvent(3) イベントと入力の問い合わせや処理を行う

Other Alias

XtAppNextEvent, XtAppPending, XtAppPeekEvent, XtDispatchEvent, XtAppMainLoop

書式

void XtAppNextEvent(app_context, event_return)

      XtAppContext app_context;

      XEvent *event_return;

Boolean XtAppPeekEvent(app_context, event_return)

      XtAppContext app_context;

      XEvent *event_return;

XtInputMask XtAppPending(app_context)

      XtAppContext app_context;

void XtAppProcessEvent(app_context, mask)

      XtAppContext app_context;

      XtInputMask mask;

Boolean XtDispatchEvent(event)

      XEvent *event;

void XtAppMainLoop(app_context)

      XtAppContext app_context;

引き数

app_context
アプリケーションを識別するアプリケーションコンテクストを指定する。
event
イベント構造体を指定する。 この構造体は適切なイベントハンドラに配送される。
event_return
指定したイベント構造体にイベント情報が返される。
mask
処理するイベントの型を指定する。 このマスクは、 XtIMXEvent, XtIMTimer, XtIMAlternateInput, XtIMSignal の任意の組み合わせについてビットごとの論理和を取ったものである。 記述を容易にするために、X ツールキットでは全てのイベント型の論理和 であるシンボル名 XtIMAll が定義されている。

説明

X のイベントキューが空の場合、 XtAppNextEvent はアプリケーションコンテクスト内で指定された各ディスプレイの出力バッファ をフラッシュし、イベントの発生を待つ。その間、他の入力のソース、タイム アウトのタイムアウト値、シグナルハンドラの状態を調べて、それらによって 引き起こされるコールバック手続きを呼び出す。この待ち時間の間にバックグ ラウンド処理が行なわれる(7.8 節を参照)。

イベントキューにイベントが存在する場合には、 XtAppPeekEvent event_return 情報構造体にイベントの情報を設定し、0 でない値を返す。キューに Xからの入力が入っていない場合には、 XtAppPeekEvent は出力バッファをフラッシュし、入力が可能になるまで処理をブロックする (この処理の間、タイムアウトのコールバックが呼ばれる場合がある)。 入力がイベントの場合、 XtAppPeekEvent はこの event 情報構造体に情報をセットし、0 でない値を返す。 そうでない場合、入力は他の入力ソースからのものであり、 XtAppPeekEvent は 0 を返す。

関数 XtAppPending は、まだ処理されていない X サーバからのイベント、処理されていないタイ マ処理、処理されていない他からの入力ソースがある場合に 0 でない値を返 す。 返される値は XtIMXEvent, XtIMTimer, XtIMAlternateInput, XtIMSignal のビットごとの論理和であるビットマスク値である( XtAppProcessEvent を参照)。 処理されていないイベントがない場合、 XtAppPending は出力バッファをフラッシュして 0 を返す。

関数 XtAppProcessEvent は、タイマ、代替入力、シグナルソース、X のイベントのいずれか1つを処理 する。処理する適切な型がない場合には、処理できるようになるまで XtAppProcessEvent はブロックされる。 処理できる型のものが複数ある場合、どれが処理されるかは未定義である。 通常はクライアントアプリケーションがこの手続きを呼ぶことはない( XtAppMainLoop を参照)。 XtAppProcessEvent は、適切なタイマコールバックを呼んでタイマイベントを処理し、適切な他の 入力コールバックを呼んで他の入力を処理し、適切なシグナルコールバックを 呼んでシグナルソースを処理し、 XtDispatchEvent を呼んで X のイベントを処理する。

X のイベントを受け取ったとき、これは XtDispatchEvent に渡される。この関数は適切なイベントハンドラを呼び出し、これらに対して それぞれの手続きに登録されたウィジェット、イベント、クライアント固有の データを渡す。

訳注: このクライアント固有のデータとは、イベントハンドラに予め割り当て られているクライアントデータのことである。 イベントに対して登録されたイベントハンドラがない場合は、イベントは無視 され、ディスパッチャは単に戻ってくるだけである。 ハンドラが呼び出される順序は未定義である。

関数 XtDispatchEvent は、既に配送ルーチンに登録されているイベントをイベントハンドラに送る。 XtDispatchEvent は、イベントをハンドラに配送した場合には True を返し、イベントを配送するハンドラが無かった場合には False を返す。 XtDispatchEvent の最も一般的な使い方は XtAppNextEvent によって選られたイベントを各種手続きに配送することである。 なお、この関数はユーザが作成したイベントを(イベントハンドラに)配送する ためにも利用できる。 XtDispatchEvent はまた、 XtAddGrab のためのグラブのセマンティクスを実現する役割も持っている。

関数 XtAppMainLoop は、最初に XtAppNextEvent を呼び、次にやってくる X のイベントを取得する。 そして、次に XtDispatchEvent を呼び、登録されている適切な手続きにこのイベントを配送する。 これはツールキットアプリケーションのメインループを構成する。 したがって、 XtAppSetExitFlag が呼ばれるまではこの関数は戻ってくることはない。 アプリケーションはユーザのアクションに対する応答の中で終了する(exitす る)ことが期待されている。 XtAppMainLoop に関して特別なことは何もない。 この関数は単に、 XtAppGetExitFlag() が真を返すまで XtAppNextEventXtDispatchEvent を繰り返し呼ぶループに過ぎない。

アプリケーションでこのループを自分自身で作ることができる。 この場合には、ループ内で XtAppNextEvent を繰り返して呼ぶ前に、グローバルな終了フラグを確認したり、トップレベル のウィジェットの数が 0 より多いかどうかを確認したりすることで、終了す るか呼び出しループに戻るかを決めることができる。