【发布时间】:2011-05-01 01:17:14
【问题描述】:
为了我的罪(以及乐趣的学习经验)我正在编写一个窗口管理器(我知道,我知道)。
我正在使用 python 和 XCB (python-xpyb)。
到目前为止,我发现我需要在根窗口上使用 SubStructureRedirect 掩码,并且我成功地传递了与应用程序的顶级窗口相关的事件。我正在通过启动 xterm 进行测试。
我得到一个 ConfigureRequestEvent,然后是一个暂停,接着是另一个 ConfigureRequestEvent,然后是一个 MapRequestEvent。
当我得到 MapRequestEvent 时,我调用 connection.core.MapWindowChecked(e.window),它可以工作,但映射的窗口只有一个像素或两个宽/高。
那么,我的问题是,我应该如何处理 ConfigureRequestEvent 以使窗口大小正确(假设这就是我所缺少的)?
更准确地说,我到底该怎么称呼? MapWindowChecked 是一个明显的选择,但我似乎无法找到如何实际配置宽度/高度。我猜它是 ConfigureWindow,但接受的参数对我来说似乎很模糊。上次我调用它时我使用了 xcb.xproto.CW.EventMask,但 CW 中的标志似乎都与宽度/高度无关。
PS 关于所有这些的文档对我来说似乎非常难以捉摸。我查看了几个据称使用 xcb 的 python 窗口管理器,它们似乎使用自己的自定义版本和额外的功能。此外,检查/调试正在运行的窗口管理器(也负责映射调试器的窗口)是一个 PITA,因此我在这里问。使用两台机器或虚拟机之类的东西可能会更好。
谢谢。
【问题讨论】:
-
调试窗口管理器的方式是使用嵌套的 X 服务器,如 Xephyr 或 Xnest。为自己编写一个脚本来启动 WM,以便在每次更改后使用单个命令在嵌套 X 服务器中进行测试。如果您查看 metacity 源,则有或曾经有这样的脚本。
-
我的情况几乎一样。我的小 WM 设法以固定位置和大小映射窗口,但像你一样,我得到两个 ConfigureRequest 事件,它们之间有相当长的延迟。你有没有想过为什么你会得到两个事件或者为什么它们之间会有这样的延迟?
标签: python x11 window-managers xcb