Museum

Home

Lab Overview

Retrotechnology Articles

⇒ Online Manual

Media Vault

Software Library

Restoration Projects

Artifacts Sought

XtAppNextEvent(3Xt)  —  NEWS-OS Programmer’s Manual

名称

XtAppNextEvent, XtAppPending, XtAppPeekEvent, XtAppProcessEvent, 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 の任意の組合わせの、ビット単位の (内包的) 論理和です。 便宜上、X Toolkit では、シンボリック名、 XtIMAll を、すべてのイベントタイプのビット単位の (内包的) 論理和になるよう 定義しています。

解説

X の入力キュー上に入力が何もない場合は、 XtAppNextEvent は、X 出力バッファをフラッシュし、次のイベントを待ちます。 したがって、次の入力ソースあるいはタイムアウトが検出されればこれを トリガーにして適当なコールバックプロシージャを呼び出すことができます。 この待ち時間は、バックグラウンド処理に使用することができます (7.8 節参照)。 キューの中にイベントがある場合、 XtAppPeekEvent は、そのイベントの情報を event_returns にセットし、ゼロ以外の値を 関数値として返します。 キューの中に X の入力がない場合、 XtAppPeekEvent は、出力バッファをフラッシュし、次の入力がくるまでブロックします (そのプロセスのタイムアウトコールバックを呼び出すこともあります)。 入力がイベントである場合は、 XtAppPeekEvent は、イベント情報をセットし、ゼロ以外の値を返します。 そうではなく、入力が、別の入力ソースである場合は、 XtAppPeekEvent はゼロを返します。 XtAppPending 関数は、X サーバからのイベントでペンディングになっているもの、 ペンディングになっているタイマー、あるいは他の入力ソースでペンディング になっているものがある場合、ゼロ以外の値を返します。 返される値は、 XtIMXEvent、 XtIMTimer、 あるいは XtIMAlternateInput の論理和であるビットマスクです ( XtAppProcessEvent 参照)。 ペンデイングになっているイベントが何もない場合は、 XtAppPending は、出力バッファをフラッシュし、ゼロを返します。 XtAppProcessEvent 関数は、1 つのタイマ、別の入力または X のイベントを処理します。 処理すべきタイプが何もない場合は、 XtAppProcessEvent は、それが現われるまでブロックします。 処理のできる型が 1 つ以上ある場合は、どの型を処理するかということは 定義されていません。 普通は、このプロシージャは、クライアントアプリケーションからは 呼び出されません ( XtAppMainLoop 参照)。 XtAppProcessEvent は、何らかの適切なタイマコールバックを呼び出すことにより、 タイマイベントを何らかの適切な別の入力コールバックを呼び出すことに より別の入力を、そして XtDispatchEvent を呼び出すことにより X のイベントを処理します。 X のイベントが受取られると、そのイベントは XtDispatchEvent へ渡されます。そして、 XtDispatchEvent は適切なイベントハンドラを呼び出し、 ウィジェット、イベント、および、そのハンドラと一緒に登録された クライアント固有のデータをそのハンドラに渡します。 そのイベントの処理のためのハンドラが登録されていない場合は、 そのイベントは無視され、ディスパッチャはただリターンするだけです。 どの順番でハンドラが呼び出されるかは、定義されていません。 XtDispatchEvent 関数は、受け取ったイベントをその内容に従ってこのディスパッチルーチンに 登録されているそれぞれのイベントハンドラに、引き渡しますが、イベントが 何らかのハンドラにディスパッチされた場合は XtDispatchEvent は True を返し、そのイベントをディスパッチするハンドラが見つからない場合は False を返します。 XtAppNextEvent プロシージャでとったイベントをイベントハンドラにディスパッチするために 使用するのが XtDispatchEvent の最も一般的な使い方です。一方、 XtDispatchEvent は、ユーザが構成したイベントをディスパッチするためにも使用されます。 また、 XtDispatchEvent は、 XtAddGrab に対するグラブの実行も一方で行っています。 XtAppMainLoop 関数は、最初に XtAppNextEvent によって、次に入ってくる X のイベントを読込み、それから、 そのイベントを、 XtDispatchEvent により、すでに登録されてている適切なプロシージャにディスパッチします。 これは、X Toolkit アプリケーションのメインループを構成するもので、 ここからリターンすることはありません。 アプリケーションはユーザのあるオペレーションによって終了すようにして ください。 XtAppMainLoop については何も特別なことはありません。 XtAppMainLoop は、単に XtAppNextEvent を呼び出し、その後に XtDispatchEvent を呼び出すということを繰り返す無限ループです。 アプリケーションは、このループを自由に応じ自分で組み立てることも できます。 たとえば、あるグローバルな終了用フラグを検査し、それがセットされて いなければ、 XtAppNextEvent へ戻り、セットされていればループから出て、終了するようにもできますし、 また、トップレベルのウィジェットの数を毎回チェックし、0 より大きければ、 XtAppNextEvent へ戻り、0 ならば終了するというようにも作れます。

関連事項

X Toolkit Intrinsics − C Language Interface
Xlib − C Language X Interface

NEWS-OSRelease 4.2.1R

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026