13

Xlibに水平スプリッターウィジェットを実装しました。ユーザーがスプリッターバーをクリックしてドラッグしたときにマウスをつかもうとしています(ユーザーがスプリットを動的に移動して、スプリッターバーの両側のウィンドウのサイズを変更できるようにするため)。

XGrabPointer()左ボタンが離されるまで、今後のすべてのマウスの動き(ドラッグ)がスプリッターウィンドウに転送されることを期待して、左クリックを受け取った後 に使用しました。

残念ながら、そのようには機能しないようです。ユーザーがドラッグする速度が速すぎて、マウスポインターが分割のいずれかの側にあるウィンドウのいずれかに入ると、MotionEventメッセージはスプリッターウィンドウではなく、その(子)ウィンドウに転送されます。

私は何を間違えましたか?私のXGrabPointer()電話は次のとおりです。

::XGrabPointer(mDisplay, window, True,
               ButtonPressMask |
                 ButtonReleaseMask |
                 PointerMotionMask |
                 FocusChangeMask |
                 EnterWindowMask |
                  LeaveWindowMask,
               GrabModeAsync,
               GrabModeAsync,
               RootWindow(mDisplay, DefaultScreen(mDisplay)),
               None,
               CurrentTime);
4

1 に答える 1

17

これを認めるのはほとんど恥ずかしいことですが、答えは3番目のパラメーター(owner_events)をTrueからFalseに変更するのと同じくらい簡単であることがわかりました。

tronche.comのXlibチュートリアル/リファレンスから:

owner_eventsがFalseの場合、生成されたすべてのポインターイベントはgrab_windowに関して報告され、event_maskによって選択された場合にのみ報告されます。owner_eventsがTrueであり、生成されたポインターイベントが通常このクライアントに報告される場合、通常どおりに報告されます。それ以外の場合、イベントはgrab_windowに関して報告され、event_maskによって選択された場合にのみ報告されます。

Trueの場合の動作を完全に理解するかどうかはまだわかりませんが、Trueの場合、他のXプログラム(つまり、他のプロセスによって作成されたウィンドウ)はXEventを受信できなくなりますが、どのウィンドウにもヒットする可能性があります。プロセスによって作成されたものは通常どおり配信されます。誤ったケースでは、選択した特定のウィンドウに関してすべてのイベントが報告されます。これが私が求めていた行動でした。

于 2010-05-08T10:10:22.137 に答える