2010-05-08 95 views
10

我已经在Xlib中实现了一个水平拆分器小部件。当用户在分隔条上单击&拖动时(以便用户可以动态地移动分隔条&,从而调整分隔条任一侧的窗口大小),我试图抓住鼠标。X11:我怎样才能真正抓住鼠标指针?

我在收到左键单击之后使用了XGrabPointer(),希望所有将来的鼠标移动(拖动)都将被转移到分隔窗口,直到释放左键。

不幸的是,它似乎并没有像那样工作。如果用户拖动太快并且鼠标指针进入分割任一侧的窗口之一,则MotionEvent消息将被转移到该(子)窗口而不是分割窗口。

我做错了什么?我XGrabPointer()电话如下:

::XGrabPointer(mDisplay, window, True, 
       ButtonPressMask | 
       ButtonReleaseMask | 
       PointerMotionMask | 
       FocusChangeMask | 
       EnterWindowMask | 
        LeaveWindowMask, 
       GrabModeAsync, 
       GrabModeAsync, 
       RootWindow(mDisplay, DefaultScreen(mDisplay)), 
       None, 
       CurrentTime); 

回答

11

我几乎不好意思承认这一点,但得到的答复竟然是为改变这种第三个参数(owner_events)从真到假的那么简单。

Xlib tutorial/reference at tronche.com

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

我还不确定我完全理解True情况的行为,但我的理解是,如果True,其他X程序(即由其他进程创建的窗口)禁止接收XEvent,但那些会碰到你的进程创建的任何窗口将正常交付。在假的情况下,所有事件都会根据您选择的特定窗口进行报告。这是我之后的行为。

+2

我讨厌接受我自己的答案,但只是为了配合松散的目的... – 2010-07-23 22:49:25