我在Xlib中实现了一个水平拆分器小部件。当用户点击&时,我正试图抓住鼠标在分割条上拖动(以便用户可以动态移动分割和放大器,从而调整分割条两侧的窗口大小)。
我在接到左键单击后使用XGrabPointer()
,希望将来所有鼠标移动(拖动)都会转移到拆分器窗口,直到释放左键。
不幸的是,它似乎并没有像那样工作。如果用户拖得太快并且鼠标指针进入分割两侧的其中一个窗口,则MotionEvent消息将转移到该(子)窗口而不是分割器窗口。
我做错了什么?我的XGrabPointer()
电话如下:
::XGrabPointer(mDisplay, window, True,
ButtonPressMask |
ButtonReleaseMask |
PointerMotionMask |
FocusChangeMask |
EnterWindowMask |
LeaveWindowMask,
GrabModeAsync,
GrabModeAsync,
RootWindow(mDisplay, DefaultScreen(mDisplay)),
None,
CurrentTime);
答案 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,但那些会点击您的流程创建的任何窗口都正常交付。在错误的情况下,将根据您选择的特定窗口报告所有事件。这就是我追求的行为。