我在 Xlib 中实现了一个水平分割器小部件。当用户单击并拖动分割栏时,我试图捕获鼠标(以便用户可以动态移动分割,从而调整分割栏两侧的窗口大小)。
我在收到左键单击后使用了XGrabPointer()
,希望所有 future 的鼠标运动(拖动)都将转移到拆分窗口,直到释放左键。
不幸的是,它似乎并不是这样工作的。如果用户拖动速度太快并且鼠标指针进入拆分任一侧的一个窗口,则 MotionEvent 消息将转移到该(子)窗口而不是拆分窗口。
我做错了什么?我的 XGrabPointer()
调用如下:
::XGrabPointer(mDisplay, window, True,
ButtonPressMask |
ButtonReleaseMask |
PointerMotionMask |
FocusChangeMask |
EnterWindowMask |
LeaveWindowMask,
GrabModeAsync,
GrabModeAsync,
RootWindow(mDisplay, DefaultScreen(mDisplay)),
None,
CurrentTime);
最佳答案
我几乎不好意思承认这一点,但答案其实很简单,只需将第三个参数 (owner_events) 从 True 更改为 False 即可。
来自Xlib tutorial/reference at tronche.com :
If owner_events is False, all generated pointer events are reported with respect to grab_window and are reported only if selected by event_mask. If owner_events is True and if a generated pointer event would normally be reported to this client, it is reported as usual. Otherwise, the event is reported with respect to the grab_window and is reported only if selected by event_mask.
我仍然不确定我完全理解 True 情况的行为,但我的解释是,如果 True,其他 X 程序(即其他进程创建的窗口)将被禁止接收 XEvents,但那些会点击您的进程创建的任何窗口都会正常传递。在错误的情况下,将报告与您选择的特定窗口相关的所有事件。这就是我所追求的行为。
关于pointers - X11:如何真正捕获鼠标指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2792954/