Как установить маску события SubstructureRedirect в корневом окне с помощью xcb python для оконного менеджера X11

У меня есть этот код, который не дает никаких исключений, но, похоже, я не получаю такие события, как MapRequests или ConfigureNotifys:

import xcb
import xcb.xproto as xproto
conn = xcb.connect()
root = conn.get_setup().roots[0].root
eventmask = [xproto.EventMask.SubstructureRedirect, xproto.EventMask.SubstructureNotify]
conn.core.ChangeWindowAttributesChecked(self.root, xproto.CW.EventMask, eventmask)
while True:
    e = conn.wait_for_event()
    print e

Я тестирую это в Xephyr.

Я делаю что-то неправильно? И если да, то как мне это исправить?


person Thoughtful Dragon    schedule 13.08.2012    source источник
comment
Не могли бы вы опубликовать минимальный воспроизводимый код? Выглядит нормально для меня. Отправляет ли сервер какие-либо ошибки обратно? Обратите внимание, что только одному клиенту разрешено устанавливать маску SubstructureRedirect для данного окна, и если у вас все еще работает оконный менеджер, он, вероятно, владеет этой маской.   -  person Andrey Sidorov    schedule 14.08.2012
comment
@AndreySidorov На ошибки не проверял, но проверю. Когда я попробовал это в интерактивном интерпретаторе, он вернул недействительный файл cookie.   -  person Thoughtful Dragon    schedule 15.08.2012
comment
Запрос ChangeWindowAttributes не возвращает данные (таким образом, аннулирует cookie), но может привести к ошибкам.   -  person Andrey Sidorov    schedule 15.08.2012


Ответы (1)


изменить: проблема заключается в неправильном количестве параметров: xproto.CW.EventMask указывает, что у вас есть одно значение, и вы передаете два как [xproto.EventMask.SubstructureRedirect, xproto.EventMask.SubstructureNotify], которые должны быть [xproto.EventMask.SubstructureRedirect|xproto.EventMask.SubstructureNotify]

import xcb
import xcb.xproto as xproto
conn = xcb.connect()
root = conn.get_setup().roots[0].root
conn.core.ChangeWindowAttributesChecked(self.root, xproto.CW.EventMask, [xproto.EventMask.SubstructureRedirect|xproto.EventMask.SubstructureNotify])
while True:
    e = conn.wait_for_event()
    print e
person Andrey Sidorov    schedule 14.08.2012
comment
Я обновил свой вопрос, указав, что я тестирую в Xephyr, и другие оконные менеджеры не запущены. - person Thoughtful Dragon; 15.08.2012
comment
этот код отлично работает для меня в Xephyr (в OSX/Quartz): gist.github.com/3354128 - JavaScript+github.com/sidorares/node-x11. Я попробую установить python-xcb и запустить ваш пример - person Andrey Sidorov; 15.08.2012
comment
Только что попробовал в интерактивном интерпретаторе и получил вот это: >>> err = conn.core.ChangeWindowAttributesChecked(root, xproto.CW.EventMask, eventmask) >>> err.check() Traceback (most recent call last): File "<stdin>", line 1, in <module> xcb.xproto.BadLength: <xcb.xproto.LengthError object at 0x7f540f5c4998> - person Thoughtful Dragon; 15.08.2012
comment
это странно. BadLength означает, что запрос не сериализуется должным образом (с маской из двух событий длина должна быть ровно (3+2)*4 байта) - person Andrey Sidorov; 15.08.2012
comment
удаление SubstructureNotify устранило проблему, не знаю почему - person Thoughtful Dragon; 15.08.2012
comment
не уверен насчет API python-xcb, но ожидается ли, что маска будет одним единственным параметром? xproto.EventMask.SubstructureRedirect|xproto.EventMask.SubstructureNotify вместо xproto.EventMask.SubstructureRedirect, xproto.EventMask.SubstructureNotify - person Andrey Sidorov; 15.08.2012
comment
Вероятно, это так: первый параметр (xproto.CW.EventMask в вашем случае) сообщает, сколько значений у вас есть (одно). EventMask - это единственный параметр - значение флагов 32-битных событий. - person Andrey Sidorov; 15.08.2012