Цикл событий XCB не получает никаких событий

Я делаю надстройку в Firefox, поэтому у меня есть ChromeWorker, который является привилегированным WebWorker. Это просто поток, отличный от основного.

Здесь у меня нет кода, кроме этого (модифицированного, чтобы он выглядел не как js-ctypes [который является языком для дополнений])

При запуске я запускаю этот код, conn — это глобальная переменная:

conn = xcb_connect(null, null);

Затем я запускаю это с интервалом 200 мс:

evt = xcb_poll_for_event(conn);
console.log('evt:', evt);

if (!evt.isNull()) {
    console.log('good got an event!!');
    ostypes.API('free')(evt);
}

Однако evt всегда null, я никогда не получаю никаких событий. Моя цель - получить все события в системе.

Кто-нибудь знает, что может привести к тому, что что-то настолько простое не работает?

я пытался

xcb_change_window_attributes (conn, screens.data->root, XCB_CW_EVENT_MASK, values);

Но это не исправило :(

Единственный способ заставить его работать - это выполнить xcb_create_window xcb_map_window, но тогда я получаю ТОЛЬКО события, которые происходят в этом созданном окне.


person Noitidart    schedule 17.03.2016    source источник


Ответы (1)


Вы не просто волшебным образом получаете все события, открывая соединение. любой клиент получит очень мало сообщений, таких как клиентские сообщения, большинство других будет отправлено клиенту, только если он явным образом зарегистрировался для их получения.

И да, это означает, что вы должны регистрировать их в каждом окне, что включает в себя как обход дерева, так и прослушивание окон, которые создаются, отображаются, удаляются и уничтожаются, а также регистрируются в них.

Однако я бы еще раз подумал, стоит ли

Моя цель - получить все события в системе.

не является проблемой A-B. Зачем вам "нужны" все события? Что вы на самом деле хотите сделать?

person Ingo Bürk    schedule 08.04.2016
comment
Большое спасибо Инго за ваш ответ, я все еще борюсь с этим, я пытаюсь устранять неполадки время от времени. Из порожденного потока (не основного потока) я пытаюсь создать глобальную горячую клавишу. Я создал инструмент для создания снимков экрана — addons.mozilla.org/en-US/firefox. /addon/nativeshot — это аддон для firefox. Он использует js-ctypes для использования нативных методов. Люди просят, чтобы я разрешил пользователям установить свою клавишу PrtScn в качестве глобальной горячей клавиши для запуска моего снимка экрана. Так что я борюсь с этим. - person Noitidart; 09.04.2016
comment
Для этого все, что вам нужно сделать, это получить ключ в корневом окне через xcb_grab_key. Конечно, вы можете сделать это только в том случае, если никакое другое приложение не захватило ключ, см. документацию для этого (и, возможно, эквивалент Xlib, XGrabKey). - person Ingo Bürk; 09.04.2016
comment
Дополнение: если вы хотите, чтобы он работал без захвата ключа, вы можете использовать расширение Xinput2, которое немного сложнее и менее прямолинейно. Но вообще говоря, xcb_grab_key должно быть достаточно. Например, именно так обычно поступают оконные менеджеры. - person Ingo Bürk; 09.04.2016
comment
Большое спасибо, я буду продолжать пробовать, я пробовал xcb_grab_key, но это не сработало, я понятия не имею, почему :( - person Noitidart; 09.04.2016
comment
Привет, @Ingo, я попробовал это здесь - github. com/Noitidart/NativeShot/blob/master/modules/hotkey/, но я не получаю никаких событий :( Я не получаю ошибок, я понятия не имею, почему он не захватывает :( - person Noitidart; 09.04.2016
comment
А вот с этим разобрался! Я использовал XCB_ANY_KEY, и эта константа работает в Debian, но не в Ubuntu, которую я использовал для тестирования. Я переключил это на использование num lock, caps lock и т. д., и теперь это работает! :) github.com/Noitidart/NativeShot/ blob/master/modules/hotkey/ это было очень-очень безумно, я понятия не имел, что константа XCB_MOD_MASK_ANY не работает в Ubuntu - github.com/Noitidart/System-Hotkey/blob/master/modules/hotkey/ - person Noitidart; 06.05.2016