2011-05-01 63 views
2

为我的罪孽(和 乐趣 的学习经历)我正在写一个窗口管理器(我知道,我知道)。窗口管理器应该如何处理ConfigureRequestEvent?

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

谢谢。

+0

调试窗口管理器的方式是使用像Xephyr或Xnes​​t这样的嵌套X服务器。编写一个脚本,在每次更改之后使用单个命令启动WM,以便在嵌套X服务器内进行测试。如果你看一下metacity的来源,那就是或曾经是这样的脚本。 – 2011-05-02 14:36:57

+0

我处于几乎相同的情况。我的小WM管理着以固定的位置和大小映射窗口,但是像你一样,我得到两个ConfigureRequest事件,它们之间的延迟很长。你有没有想过为什么你会得到两个事件,或者为什么他们之间有这样的延迟? – 2011-10-06 12:45:58

回答

1

简短的答案是通过调用ConfigureWindow配置窗口(大小,堆栈等)。长的答案就是在这里强制执行策略并遵守XSizeHints等规范。最好看一下现有WM的来源,并了解他们的工作。你究竟做了什么取决于你想要的用户界面。

让它工作的最简单的方法就是仅仅根据请求询问没有策略或提示覆盖时的ConfigureWindow。但是你很快就会看到很多可用性问题,不得不添加更多的智能。

+0

谢谢。我在问什么应该更清楚。我的意思是我打电话来实际配置窗口。我有这样的印象,我应该修改事件并将其传递,但​​我现在还不确定。我在抽象中理解WM应该做什么,并且为了让更好的术语成为我想要写的东西,就是一个'Pass Through'WM。我澄清了我的问题。 – DaedalusFall 2011-05-02 13:00:07

+0

对,协议请求是ConfigureWindow,它是Xlib中的XConfigureWindow()和XCB中的xcb_configure_window()。我认为Python称之为类似的东西。如果你看一下现有的WM源代码,你可以看到这个想法。 ConfigureWindow中的字段与ConfigureRequestEvent中的字段完全匹配,因此只需将它们复制即可。 – 2011-05-02 14:34:58

+0

查看“man XConfigureWindow”和“man XConfigureRequestEvent”以获得很多好的细节。 – 2011-05-02 14:36:06