如何使用libxcb-xinput注册事件

时间:2016-09-22 14:21:37

标签: c linux touch x11 xcb

我正在尝试在根窗口上收听触摸事件(TOUCH_BEGIN,TOUCH_UPDATE,TOUCH_END和TOUCH_OWNERSHIP)。
触摸事件没有直接集成到XCB中,所以我必须使用输入扩展名(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);

核心在编译时抛出“隐式截断为无符号类型的大整数”警告,并且在运行时只出现“失败请求:(null),(null):0x000000D5”错误。

(我对C很新,特别是XCB,所以请原谅任何明显的错误)

2 个答案:

答案 0 :(得分: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_events here的来源验证此用法,但其代码 expletive deleted 无法读取。我没有丝毫知道人们应该如何使用这个库。

答案 1 :(得分: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
);

它看起来有点神秘,但它确实有效。