2010-05-08 97 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