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

我几乎不好意思承认这一点,但结果证明就像将第三个参数 (owner_events) 从 True 更改为 False 一样简单。

来自tronche.com 上的 Xlib 教程/参考

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

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

于 2010-05-08T10:10:22.137 回答