代码之家  ›  专栏  ›  技术社区  ›  Drew Hall

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

  •  11
  • Drew Hall  · 技术社区  · 14 年前

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

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

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

    我做错了什么?我的 xgrabbointer()。 呼叫如下:

    ::XGrabPointer(mDisplay, window, True,
                   ButtonPressMask |
                     ButtonReleaseMask |
                     PointerMotionMask |
                     FocusChangeMask |
                     EnterWindowMask |
                      LeaveWindowMask,
                   GrabModeAsync,
                   GrabModeAsync,
                   RootWindow(mDisplay, DefaultScreen(mDisplay)),
                   None,
                   CurrentTime);
    
    1 回复  |  直到 10 年前
        1
  •  13
  •   Drew Hall    14 年前

    我几乎不好意思承认这一点,但结果证明,答案很简单,只需将第三个参数(所有者事件)从“真”更改为“假”。

    来自 Xlib tutorial/reference at tronche.com :

    如果owner_events为false,则所有生成的指针事件都将报告为关于grab_窗口的事件,并且仅当由event_mask选择时才会报告。如果所有者事件为真,并且生成的指针事件通常会报告给此客户机,则会照常报告。否则,将根据“抓取”窗口报告事件,并且仅当通过“事件屏蔽”选择时才报告事件。

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