compiz ウィンドウマネージャー用のプラグインを開発しています。変換されたウィンドウ テクスチャを描画し、そのウィンドウにイベントを送信したいと考えています。変換されたウィンドウがレンダラーの場合、ポインターを取得してすべての xevents を制御します。ポインターを取得する compiz 関数の主要部分は次のようになります。
status = XGrabPointer (privateScreen.dpy, privateScreen.eventManager.getGrabWindow(), true,
POINTER_GRAB_MASK,
GrabModeAsync, GrabModeAsync,
privateScreen.rootWindow(), cursor,
CurrentTime);
ポインターがグラブされると、ボタンを押す座標を再計算し、 XSendEventを使用して宛先ウィンドウにイベントを送信します。これは、Google Chrome ウィンドウまたは次のような単純な xwindow アプリケーションでは問題なく動作します。残念ながら、OpenGL レンダリングを実行するウィンドウでは正しく動作しません。SDL と GLFW をテストしました。このようなウィンドウはクリック イベントを受け取りますが、パラメーター (xbutton.x_root、xbutton.y_root、xbutton.x、xbutton.y) は XSendEvent で指定したものとは異なります。イベントを送信するたびに、これらのパラメーターには、xgrabpointer が呼び出される前のマウス位置と思われる同じ値が含まれます。ポインターがグラブされていない場合、(XSendEvent からの) イベントは正しく受信されます。xsendevent、xgrabpointer、および OpenGL レンダリングを実行するウィンドウの間には、特定の関係が必要です。さらに、クライアント (ウィンドウ) の実装が異なる場合があります。これは、コードがその特定のウィンドウでのみ機能しないか、何か間違っている可能性があります。
編集1
次の例を考えてみましょう: フルスクリーン ウィンドウがあり、プラグインを使用して変換されたウィンドウ テクスチャ (たとえば、スケール変換 (0.5、0.5、1.0)) を描画できますが、X11 にはまだフルスクリーン ウィンドウが表示されるため、変換されたテクスチャ イベントの外側の領域はウィンドウに移動します。プラグインでポインターを取得すると、すべてのイベントの受信者は私だけになり、ウィンドウの変換に基づいて座標を再計算し、ウィンドウに送信できます。
Edit2 Freeglut を使用すると、ポインターがグラブされると、すべてのイベントが目的のウィンドウに正しく送信されます。ライブラリの実装にはいくつかの違いが必要です。