2

为了我的罪过(以及为了有趣的学习经验),我正在编写一个窗口管理器(我知道,我知道)。

我正在使用 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,因此我在这里问。可能会更好使用两台机器或一个虚拟机或其他东西。

谢谢。

4

1 回答 1

1

简短的回答是通过调用 ConfigureWindow 来配置窗口(大小、堆叠等)。长答案是在这里你强加政策和荣誉规范,如 XSizeHints。最好看看一些现有的 WM 的源代码并了解它们的作用。您所做的具体操作取决于您想要的 UI。

让它工作的最简单的方法是只按照请求的要求进行 ConfigureWindow,而不需要策略或提示覆盖。但是您可能很快就会看到很多可用性问题,并且必须添加更多智能。

于 2011-05-01T22:48:38.277 回答