XUngrabPointer(display, time)
Display *display;
Time time;
XChangeActivePointerGrab(display, event_mask, cursor, time)
Display *display;
unsigned int event_mask;
Cursor cursor;
Time time;
the pointer_mode が GrabModeAsync ならば、ポインタイベントの処理は通常通り継続される。 このクライアントがポインタを凍結している場合、ポインタに関する イベントの処理は再開される。 pointer_mode が GrabModeSync ならば、ポインタの状態(クライアントアプリケーションが見る)は凍結されて いると考えられ、グラブを行っているクライアントが XAllowEvents を呼び出すか、ポインタのグラブが解放されるまでは X サーバはこれ以上の ポインタイベントを生成しない。 ポインタの実際の変化はポインタが凍結されている間も失われない。これらは 単にサーバのキューに入れられ、後で処理される。
keyboard_mode が GrabModeAsync ならば、キーボードイベントの処理はグラブのアクティブ化による影響は受け ない。 keyboard_mode が GrabModeSync ならば、キーボードの状態(クライアントアプリケーションが見る)は凍結され ていると考えられ、グラブを行っているクライアントが XAllowEvents を呼び出すか、ポインタのグラブが解放されるまでは X サーバはこれ以上の キーボードイベントを生成しない。 実際のキーボードイベントの変化はポインタが凍結されている間も失われない。 これらは後で処理するために、単にサーバのキューに入れられるだけである。
cursor が指定された場合、このカーソルはポインタがどのウィンドウに入っ ていても表示される。 None が指定された場合は、ポインタが grab_window やそのサブウィンドウの1つに 入った時にそのウィンドウの通常のカーソルが表示される。 それ以外の場合には、grab_window のカーソルが表示される。
confine_window が指定された場合は、ポインタはそのウィンドウ内に閉じ込 められる。 confine_to は grab_window と関係を持っている必要はない。 最初の状態でポインタが confine_window に入っていない場合は、 グラブがアクティブ化される直前にポインタがこのウィンドウの最も近い辺へ と自動的に移動する。この時、enter/leave イベントは通常通りに生成される。 その後に confine_to ウィンドウの構成が変えられた場合は、ポインタはこの ウィンドウに含まれたままになるように、必要に応じて自動的に移動する。
引き数 time を利用して、クライアントはアプリケーションが応答するまでに長 い間がかかる場合や、ネットワークの遅延が大きい場合に生じる不具合を避け ることができる。 例として、2つのアプリケーションがあり、そのいずれもクリックされた時に ポインタのグラブを普通に行うという状況を考える。 どちらのアプリケーションもイベントから得たタイムスタンプを指定していれ ば、2番目のアプリケーションは最初のアプリケーションよりも速く立ち上が り、ポインタをうまくグラブできる。 最初のアプリケーションは、自分のリクエストが処理される前に他の アプリケーションがポインタをグラブしたことを知らされる。
XGrabPointer は EnterNotify イベントと LeaveNotify を生成する。
grab_window ウィンドウか confine_to ウィンドウが表示不可能である場合か、 confine_to ウィンドウがルートウィンドウの境界から完全に外に出ている場 合には XGrabPointer は失敗し、 GrabNotViewable を返す。 他のクライアントがポインタをアクティブにグラブしている場合、この関数は 失敗し、 AlreadyGrabbed を返す。 ポインタが他のクライアントのアクティブなグラブによって凍結されている場 合は、この関数は失敗して GrabFrozen を返す。 指定した時間が最終ポインタグラブ時刻より早い場合や X サーバの現在時刻よ り遅い場合には、この関数は失敗して GrabInvalidTime を返す。 これ以外の場合には、最終ポインタグラブ時刻には指定した時間がセットされる (CurrentTime は X サーバの現在時刻に置き換えられる)。
XGrabPointer はエラー BadCursor, BadValue, BadWindow を起こすことがある。
関数 XUngrabPointer は、このクライアントが XGrabPointer, XGrabButton 関数の呼び出しや普通にボタンを押したことによってポインタをアクティブに グラブしている場合、ポインタとキューに入っているイベントを解放する。 指定した時刻が最終ポインタグラブ時刻より早い場合や、X サーバの現在時刻 よりも遅い場合には、 XUngrabPointer はポインタを解放しない。 この関数は EnterNotify イベントと LeaveNotify イベントを生成する。 ポインタのアクティブなグラブに対応するイベントウィンドウや confine_to ウィンドウが表示不能になった場合や、ウィンドウの構成の変化によって confine_to ウィンドウがルートウィンドウの境界から完全に外に出てしまっ た場合には、X サーバは UngrabPointer リクエストを自動的に実行する。
関数 XChangeActivePointerGrab は、クライアントがポインタをアクティブにグラブしていて、指定した時刻が 最終ポインタグラブ時刻よりも早くなく、かつ X サーバの現在時刻よりも遅 くない場合に指定された動的パラメータを変更する。 この関数は XGrabButton のパッシブなパラメータに対しては無効である。 引き数 event_mask と cursor の解釈は XGrabPointer の項目で説明した通りである。
XChangeActivePointerGrab はエラー BadCursor, BadValue を起こすことがある。