2016-09-22 2 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_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_eventshere, но его код expletive deleted нечитабельно. Я не имею ни малейшего понятия, как именно люди должны иметь возможность использовать эту библиотеку.

+0

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

Смежные вопросы