如何使用xcb python为X11窗口管理器在根窗口上设置SubstructureRedirect事件掩码

如何使用xcb python为X11窗口管理器在根窗口上设置SubstructureRedirect事件掩码,python,x11,xcb,Python,X11,Xcb,我的代码没有给出任何异常,但我似乎没有收到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.co

我的代码没有给出任何异常,但我似乎没有收到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测试这个

我做错什么了吗?如果是,我该如何修复它?

编辑: 问题在于参数的数量不正确:
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

你能发布最小的可复制代码吗?我觉得还可以。服务器是否返回任何错误?请注意,只允许一个客户端设置给定窗口的子结构重定向掩码,如果您仍在运行窗口管理器,它可能拥有该掩码。@AndreySidorov我没有检查错误,但我会检查。当我在交互式解释程序中尝试它时,它返回了一个void cookie。ChangeWindowAttributes请求不返回数据(因此void cookie),但可能会导致错误。我更新了我的问题,以包括我正在Xephyr中测试,并且没有其他窗口管理器在运行。这段代码在Xephyr(在OSX/Quartz中)中对我很好:-JavaScript+github.com/sidorares/node-x11。我将尝试安装python xcb并运行您的示例我刚刚在交互式解释器中尝试过,得到了以下结果:
>>err=conn.core.changeWindowAttributeChecked(root,xproto.CW.EventMask,EventMask)>>>err.check()回溯(最近一次调用):文件“”,第1行,在xcb.xproto.BadLength:
这很奇怪。BadLength表示请求未正确序列化(使用两个事件掩码,其长度应精确为(3+2)*4字节)删除子结构Notify修复了该问题,但不确定原因