pointers - X11:如何真正捕获鼠标指针?

标签 pointers mouse x11 xlib xgrabpointer

我在 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/

相关文章:

c++ - 双*数组,与双*指针

c - 指向 float 或 char 的指针总是 int 吗?

java - 如何在Java中按下鼠标按钮时监听鼠标移动事件

c++ - 创建带有帧缓冲区的 xlib 窗口,我可以直接绘制并使用 XPutImage

c++ - XGrabKeyboard 后无法取消键盘抓取

3d - 如何构建新的 X11 3D 驱动程序?

c++ - 在 c/c++ 中分配指针

c++ - 在C++中,强制转换为int8_t *意味着什么?

linux - 将带有时间戳的鼠标坐标和鼠标点击写入文件?

javascript - 在javascript中模拟用鼠标滑动