XSendEvent(3) イベント構造体とポインタ移動履歴構造体の送信

Other Alias

XDisplayMotionBufferSize, XGetMotionEvents, XTimeCoord

書式

Status XSendEvent(display, w, propagate, event_mask, event_send)

      Display *display;

      Window w;

      Bool propagate;

      long event_mask;

      XEvent *event_send;

unsigned long XDisplayMotionBufferSize(display)

        Display *display;

XTimeCoord *XGetMotionEvents(display, w, start, stop, nevents_return)

      Display *display;

      Window w;

      Time startstop; 


      int *nevents_return;

引き数

display
X サーバへの接続を指定する。
event_mask
イベントマスクを指定する。
event_send
送るイベントを指定する。
nevents_return
移動履歴バッファからイベントの数が返される。
propagate
真偽値を指定する。
start

stop
イベントが移動履歴バッファより返される時間間隔を指定する。 タイムスタンプか CurrentTime を指定する。
w
イベントを送る先のウィンドウ、 PointerWindow, InputFocus のいずれかを指定する。

説明

関数 XSendEvent は対象ウィンドウを識別し、指定したイベントをどのクライアントが受け取る か決定し、アクティブなグラブを無視する。 この関数にはイベントマスクを渡さなければならない。 正しいイベントマスク名に関しては 10.3 章を参照すること。 この関数は引き数 w を用いて、以下のようにして対象ウィンドウを識別する。
  • w が PointerWindow ならば、対象ウィンドウはポインタを含むウィンドウである。
  • w が InputFocus であり、フォーカスウィンドウがポインタを含むならば、対象ウィンドウは ポインタを含むウィンドウである。 そうでなければ、対象ウィンドウはフォーカスウィンドウである。

XSendEvent は引き数 propagate を以下のように使って、指定したイベントを どのクライアントが受け取るかを決定する。

  • イベントマスクが空集合の場合、イベントは対象ウィンドウを作成した クライアントに送られる。 そのクライアントがもはや存在しない場合には、イベントはどこにも 送られない。
  • propagate が False の場合、イベントは対象ウィンドウでイベントマスクを使ってその イベント型を選択している全てのクライアントに送られる。
  • propagate が True であり、イベントマスクを使って対象ウィンドウでそのイベント型を選択 しているクライアントが無い場合には、次の条件を満たす最も近い 祖先ウィンドウに置き換えられる。その条件とは、対象ウィンドウは クライアントのどれかがイベントマスクでその型を選択していることと、 間にあるウィンドウがそのイベントの伝播を止めるようなマスクを 持っていないことである。 そのようなウィンドウが無い場合や、そのウィンドウがフォーカスウィンドウ の親であり、元々 InputFocus が対象ウィンドウとして指定されていた場合には、このイベントはどの クライアントにも送られない。 そうでない場合、このイベントは、最終的な対象ウィンドウ上で指定した型 のイベントをイベントマスクを使って選択している全てのクライアントに 通知される。

X サーバが必要に応じて構造体の中身のバイト交換を正しく行えるように、 XEvent 構造体はコアイベントの1つであるか、拡張として定義されたイベントの1つで なければならない(そうでない場合にはエラー BadValue となる)。 それ以外の場合には、X サーバによるイベント構造体の内容の変更、チェック は行われない。ただし、転送されるイベントでは send_event は強制的に True にされ、イベントのシリアル番号も正しく設定される。 従って、これらのフィールドと display フィールドは XSendEvent からは無視される。

XSendEvent は伝送プロトコルフォーマットへの変換に失敗した場合は 0 を返し、そうで なければ 0 以外の値を返す。 XSendEventBadValue, BadWindow エラーを起こすことがある。

サーバによってはポインタの動きの最近の履歴を保持していて、 MotionNotify イベントが通知するよりも細かくマウスの動きを与えることができるものがあ る。 関数 XGetMotionEvents は、この履歴を利用可能にする。

関数 XGetMotionEvents 指定した開始時刻から終了時刻まで(両端を含む)に起きたマウスの移動履歴の バッファ内のイベントを全て返す。このイベントは指定したウィンドウ内(境 界を含む)での現在位置の座標を持っている。 サーバが移動履歴をサポートしていないか、開始時刻が終了時刻より遅いか、 開始時刻が現在時刻より後である場合には、イベントは全く返されない。 この場合、 XGetMotionEvents は NULL を返す。 終了時刻が現在時刻より後の場合は、 CurrentTime を指定したことになる。 XGetMotionEvents はエラー BadWindow を起こすことがある。

構造体

XTimeCoord 構造体の内容を示す。

typedef struct {
     Time time;
     short x, y;
} XTimeCoord;

time メンバにはミリ秒単位で時刻が設定される。 x, y メンバには、指定したウィンドウの原点に対する座標でポインタの座標 が設定され、通知される。

返り値

BadValue
指定された数値に、リクエストの許容範囲を越えているものがある。引き数に対 して特定の範囲が指定されていなければ、引き数の型で定義されている全ての範 囲が許される。選択肢として定義されている引き数はこのエラーを起こすことが ある。
BadWindow
Window 引き数に指定された値が、定義されているウィンドウを指していない。