我正在尝试在根窗口上收听触摸事件(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,所以请原谅任何明显的错误)
答案 0 :(得分:1)
您需要以下列方式一起使用xcb_input_event_mask_t
和xcb_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
);
它看起来有点神秘,但它确实有效。