2016-09-22 274 views
1

我試圖在根窗口上偵聽觸摸事件(TOUCH_BEGIN,TOUCH_UPDATE,TOUCH_END和TOUCH_OWNERSHIP)。
觸摸事件不直接集成到XCB中,所以我必須使用輸入擴展名(libxcb-xinput)。如何使用libxcb-xinput註冊事件

我已經成功設置了一個來自輸入擴展的事件的事件監聽器,但我無法弄清楚如何註冊我想要監聽的事件。

我嘗試使用xcb_input_xi_select_events(),然而該函數採用類型xcb_input_event_mask_t的參數,而包含的事件掩碼的枚舉類型是xcb_input_ XI _event_mask_t且有投它們沒有明顯的方式。

因此,我認爲xcb_input_xi_select_events()是錯誤的函數,但我不知道使用什麼函數代替。

我不工作的代碼目前看起來像這樣:

xcb_input_event_mask_t mask[] = { 
    XCB_INPUT_XI_EVENT_MASK_TOUCH_BEGIN 
    | XCB_INPUT_XI_EVENT_MASK_TOUCH_END 
    | XCB_INPUT_XI_EVENT_MASK_TOUCH_UPDATE 
    | XCB_INPUT_XI_EVENT_MASK_TOUCH_OWNERSHIP 
}; 
xcb_input_xi_select_events(dpy, root, 4, mask); 

核心拋出一個「大整數隱截斷爲無符號類型」在編譯時,只是一個「失敗的請求警告:(空)(空):0x000000D5「運行時出錯。

(我很新的C,特別是XCB,所以請原諒任何明顯的錯誤)

回答

1

我找到了解決方案。
非常感謝https://github.com/eemikula/touchwm

const uint32_t mask[] = { 
    XCB_INPUT_XI_EVENT_MASK_TOUCH_BEGIN 
    | XCB_INPUT_XI_EVENT_MASK_TOUCH_UPDATE 
    | XCB_INPUT_XI_EVENT_MASK_TOUCH_END 
    | XCB_INPUT_XI_EVENT_MASK_TOUCH_OWNERSHIP 
}; 
const uint32_t modifiers[] = {XCB_INPUT_MODIFIER_MASK_ANY}; 

xcb_input_xi_passive_grab_device(
    dpy, 
    XCB_CURRENT_TIME, 
    root, 
    XCB_CURSOR_NONE, 
    0, // detail - as used by XIPassiveGrab 
    XCB_INPUT_DEVICE_ALL_MASTER, 
    1, // num_modifiers 
    1, // mask_len 
    XCB_INPUT_GRAB_TYPE_TOUCH_BEGIN, 
    XCB_INPUT_GRAB_MODE_22_TOUCH, 
    XCB_INPUT_GRAB_MODE_22_ASYNC, 
    XCB_INPUT_GRAB_OWNER_NO_OWNER, 
    mask, 
    modifiers 
); 

它看起來有點神祕,但它的工作原理。

1

您需要使用xcb_input_event_mask_txcb_input_xi_event_mask_t在一起,以下列方式:

struct { 
    xcb_input_event_mask_t head;  // describes the subsequent xcb_input_xi_event_mask_t (or an array thereof) 
    xcb_input_xi_event_mask_t mask; 
} mask; 

mask.head.deviceid = XCB_INPUT_DEVICE_ALL; 
mask.head.mask_len = sizeof(mask.mask)/sizeof(uint32_t); 

mask.mask = XCB_INPUT_XI_EVENT_MASK_TOUCH_BEGIN 
| XCB_INPUT_XI_EVENT_MASK_TOUCH_END 
| XCB_INPUT_XI_EVENT_MASK_TOUCH_UPDATE 
| XCB_INPUT_XI_EVENT_MASK_TOUCH_OWNERSHIP; 

xcb_input_xi_select_events(dpy, root, 1, &mask.head); 

免責聲明:我從來沒有用過這個。我在'net here上找到了一個單一的使用示例。我試圖驗證這種用法,對xcb_input_xi_select_eventshere的來源進行驗證,但其代碼是已刪除的無法讀取。我沒有絲毫的想法,人們應該如何使用這個庫。

+0

通過閱讀關於鏈接示例的註釋(「使用XInput非侵入式抓取輸入事件」),我猜測這會註冊觸摸事件,而不會阻止其他窗口接收它們,而我的目標是抓取事件,所以其他窗口只有在我拒絕這些事件時纔會得到它們(對不起,我沒有在我的問題中說清楚)。 現在我已經找到了另一個解決方案,我將立即發佈。 此外,xcb-xinput代碼是不可讀的,因爲據我所知,它是通過協議規範以某種方式自動生成的;) – freundTech