Python 窗口管理器应该如何处理ConfigureRequestEvent?

Python 窗口管理器应该如何处理ConfigureRequestEvent?,python,x11,window-managers,xcb,Python,X11,Window Managers,Xcb,为了我的罪(为了学习的乐趣),我正在写一个窗口管理器(我知道,我知道) 我正在使用python和XCB(PythonXPYB) 到目前为止,我已经发现我需要在根窗口上使用子结构重定向掩码,并且成功地向我传递了与应用程序顶级窗口相关的事件。我正在通过启动xterm来测试这一点 我得到一个ConfigureRequestEvent,接着是暂停,接着是另一个ConfigureRequestEvent,然后是MapRequestEvent 当我得到MapRequestEvent时,我调用connecti

为了我的罪(为了学习的乐趣),我正在写一个窗口管理器(我知道,我知道)

我正在使用python和XCB(PythonXPYB)

到目前为止,我已经发现我需要在根窗口上使用子结构重定向掩码,并且成功地向我传递了与应用程序顶级窗口相关的事件。我正在通过启动xterm来测试这一点

我得到一个ConfigureRequestEvent,接着是暂停,接着是另一个ConfigureRequestEvent,然后是MapRequestEvent

当我得到MapRequestEvent时,我调用
connection.core.MapWindowChecked(e.window)
,它可以工作,但映射的窗口只有一个像素或两个像素宽/高

那么,我的问题是,我应该如何处理ConfigureRequestEvent以使窗口具有正确的大小(假设这就是我缺少的)

更准确地说,我到底叫什么?MapWindowChecked是一个明显的选择,但我似乎找不到如何实际配置宽度/高度。我猜这是ConfigureWindow,但接受的参数对我来说似乎很模糊。上次调用它时,我使用了xcb.xproto.CW.EventMask,但CW中的任何标志似乎都与宽度/高度无关

PS关于所有这些的文档对我来说似乎很难理解。我看了两个据称使用xcb的python窗口管理器,它们似乎使用了自己的自定义版本和额外的功能。此外,检查/调试正在运行的窗口管理器(它也负责映射调试器的窗口)也是一个PITA,因此我在这里提问。可能最好使用两台机器或一个虚拟机或其他东西


谢谢。

简短的回答是通过调用ConfigureWindow来配置窗口(大小、堆叠等)。很长的答案是,在这里,您可以强制执行策略和荣誉规范,例如XSizeHints。最好看看一些现有WMs的来源,了解它们的功能。具体的操作取决于所需的UI


要使其正常工作,最简单的方法是只按照请求的要求配置Window,而不使用策略或提示覆盖。但是你可能会很快看到很多可用性问题,并且不得不添加更多的智能

谢谢。我问的应该更清楚。我的意思是调用函数来实际配置窗口。我的印象是我应该修改事件并将其传递出去,但我现在不确定。我从抽象上理解了WM应该做什么,由于缺少更好的术语,我试图从“传递”WM开始。我已经澄清了我的问题。对,协议请求是ConfigureWindow,在Xlib中是XConfigureWindow(),在xcb中是xcb_configure_window()。我假设Python称之为类似的东西。如果你看一些现有的WM源,你可以看到这个想法。ConfigureWindow中的字段与ConfigureRequestEvent中的字段完全匹配,因此要通过,只需将它们复制过来即可。有关许多详细信息,请参阅“man XConfigureWindow”和“man XConfigureRequestEvent”。调试窗口管理器的方法是使用嵌套的X服务器,如Xephyr或Xnest。编写一个脚本,在每次更改后,使用一个命令在嵌套的X服务器内启动WM进行测试。如果你看一下metacity的源代码,就会发现或者曾经有过这样一个脚本,我的情况也差不多。我的小WM设法将窗口映射到固定的位置和大小,但和您一样,我得到两个ConfigureRequest事件,它们之间有相当长的延迟。你有没有想过为什么会有两个事件,或者为什么它们之间会有这样的延迟?