2012-02-03 14 views
1

私は2つの共有ライブラリを持っています:1つは、ウィンドウを設定し、それらをOpenGLでレンダリングし、別の独立した入力ライブラリは、レンダリングライブラリで作成されたウィンドウのマウスとキーボードの入力を集めます。X11 MotionNotifyイベントは、別の共有ライブラリに表示されませんか?

これで、マウス、キーボード、その他のイベントなど、レンダリングライブラリで適切にイベントを受け取ることができます。入力ライブラリーでキーイベントを取得することもできますが、マウスイベントは送信されません。私はXPending()の戻り値を示すデバッグ出力を設定しました。待ち行列内のイベントの数、およびレンダリング・ライブラリー上には一連のイベントが表示されます。マウスを動かすかクリックすると、より多くのイベントがキューに入れられます。入力ライブラリには、そのデバッグ出力もあります。キーボードは、キーが押された/離されたときに1つのイベントのみを表示し、それ以外の場合はゼロを表示します。マウスは常にゼロイベントを表示します。

私のXウィンドウハンドルを取得するには、私のライブラリがクロスプラットフォームなので、X11とWindowsでウィンドウハンドルを格納するのに十分な大きさの64ビット整数を返すウィンドウクラスの関数があります。入力ライブラリでは、それをXウィンドウハンドルにキャストします。私のXディスプレイを得るために、私はXOpenDisplay(0)をマウス/キーボードコンストラクタで呼び出します。

なぜ私のレンダリングライブラリではマウスイベントが発生しますが、入力ライブラリでは発生しませんか?

EDIT:Here問題(コードの〜200行)を示し、ソースコードで複数のディスプレイのオープンを持つ

+0

問題の本質を2つの30行プログラムにまで減らすことはできますか? – sarnold

答えて

0

は、物事はトリッキーになります。この場合、Xサーバへの複数のソケットとコマンド/イベントストリームがあり、複数の異なるアプリケーション(異なるクライアント)としてXサーバに表示されます。

リクエスト処理とイベントの順序付けは、2つの異なる接続で定義されていません。たとえば、ユーザーがキーを押してからマウスを動かすと、ディスプレイに同じディスプレイが表示されますが、どちらの順序でも2つの異なるディスプレイに表示されます。

このような設定では、1つのディスプレイで作成するXリソース(ウィンドウ、GCなど)は、必ずXSync()するまで表示されません。これは、IDがクライアント側で作成され、その後、Xサーバーにフラッシュされるためです。 XSync()は両方ともリソース作成要求をフラッシュし、Xサーバーが要求を処理したことを確認します。 (より正確には:返信を待たなければならない往復リクエスト - これを行います;内部的にXSyncは任意に選択された往復リクエストであるXGetInputFocus()を実行します。後で同期する必要はありません)。

ポインタとキーボードのグラブも厄介です。グラブは、ポインターまたはキーボードを特定の接続にロックします。だから、あなたがつかむときはいつでも、あなたの他のディスプレイはあなたが解体されるまで、グラブによって覆われたイベントを取得しません。

XGrabServer()はさらに複雑です。この要求は、Xサーバーに要求の処理を停止し、サーバー・グラブを持つもの以外のすべてのディスプレイのイベントを送信するように要求します。したがって、あなたのディスプレイの1つがサーバをつかんだ場合、他のディスプレイを使用しようとすると、おそらくあなたのプログラムがロックされます。

最後に、入力マスク(ここではXCreateWindowに渡されますが、XSelectInputを参照)はディスプレイごとの接続です。私はこれがあなたの実際の問題かもしれないと思う。あなたのディスプレイのいくつかは、ウィンドウ上で必要なイベントを要求していません。しかし、私はこれを確認しなかった。

私はXOpenDisplay()を一度呼び出すと、単一のディスプレイをさまざまな他のコードに渡すことをお勧めします。物事をはるかにやりにくくし、おそらく問題を解決するかもしれません。

関連する問題