Я пытаюсь прослушивать события касания (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, поэтому, пожалуйста, простите любые очевидные ошибки)
Отчитав комментарий на примере, который вы связали («Возьмите входные события неинвазивно с помощью XInput») Я бы предположил, что это регистрирует события касания, не мешая другим окнам получать их, в то время как моя цель - захватить события , поэтому другие окна получают их только тогда, когда я отклоняю события (извините, я не сделал это ясно в своем вопросе). К настоящему моменту я нашел другое решение, которое я опубликую через минуту. Также код xcb-xinput не читается, поскольку, насколько я знаю, он как-то автогенерируется из спецификаций протокола;) – freundTech