X11:我如何真正抓住鼠标指针?

时间:2010-05-08 04:43:56

标签: pointers mouse x11 xlib xgrabpointer

我在Xlib中实现了一个水平拆分器小部件。当用户点击&时,我正试图抓住鼠标在分割条上拖动(以便用户可以动态移动分割和放大器,从而调整分割条两侧的窗口大小)。

我在接到左键单击后使用XGrabPointer(),希望将来所有鼠标移动(拖动)都会转移到拆分器窗口,直到释放左键。

不幸的是,它似乎并没有像那样工作。如果用户拖得太快并且鼠标指针进入分割两侧的其中一个窗口,则MotionEvent消息将转移到该(子)窗口而不是分割器窗口。

我做错了什么?我的XGrabPointer()电话如下:

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

1 个答案:

答案 0 :(得分:14)

我很尴尬承认这一点,但答案结果就像将第三个参数(owner_events)从True更改为False一样简单。

来自Xlib tutorial/reference at tronche.com

  

如果owner_events为False,则会针对grab_window报告所有生成的指针事件,并仅在event_mask选择时报告。如果owner_events为True,并且通常会将生成的指针事件报告给此客户端,则会照常报告。否则,将报告与grab_window相关的事件,并仅在event_mask选择时报告。

我仍然不确定我是否完全理解True案例的行为,但我的解释是,如果为True,其他X程序(即由其他进程创建的窗口)被禁止接收XEvents,但那些会点击您的流程创建的任何窗口都正常交付。在错误的情况下,将根据您选择的特定窗口报告所有事件。这就是我追求的行为。