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

Pointers X11:我如何真正抓住鼠标指针?,pointers,mouse,x11,xlib,xgrabpointer,Pointers,Mouse,X11,Xlib,Xgrabpointer,我在Xlib中实现了一个水平拆分器小部件。当用户点击并拖动分割条时,我试图抓住鼠标(这样用户可以动态移动分割条,从而调整分割条两侧的窗口大小) 在收到左键单击后,我使用了XGrabPointer(),希望将来所有鼠标移动(拖动)都将转移到拆分器窗口,直到释放左键 不幸的是,它似乎不是那样工作的。如果用户拖动过快,并且鼠标指针进入拆分两侧的一个窗口,MotionEvent消息将转移到该(子)窗口,而不是拆分器窗口 我做错了什么?我的XGrabPointer()调用如下: ::XGrabPointe

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

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

不幸的是,它似乎不是那样工作的。如果用户拖动过快,并且鼠标指针进入拆分两侧的一个窗口,MotionEvent消息将转移到该(子)窗口,而不是拆分器窗口

我做错了什么?我的
XGrabPointer()
调用如下:

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

我几乎不好意思承认这一点,但答案很简单,只需将第三个参数(owner_events)从True改为False

从:

如果owner_events为False,则所有生成的指针事件都将相对于grab_窗口进行报告,并且仅当event_mask选择时才会进行报告。如果owner_events为True,并且如果生成的指针事件通常会报告给此客户端,则会像往常一样报告。否则,将针对抓取窗口报告事件,并且仅当事件掩码选择时才会报告事件

我仍然不确定我是否完全理解真实情况的行为,但我的解释是,如果是真的,其他X程序(即由其他进程创建的窗口)将被禁止接收XEvents,但那些将命中由您的进程创建的任何窗口的程序将正常交付。如果为false,则会报告与所选特定窗口相关的所有事件。这就是我所追求的行为。

如果上下文菜单打开(通常是在右键单击后),XGrabPointer()返回AlreadyGrabbed,我不知道如何恢复抓取鼠标的可能性。你能给我小费吗?