【问题标题】:What should a Window Manager do with a ConfigureRequestEvent?窗口管理器应该如何处理 ConfigureRequestEvent?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 谢谢。我问的应该更清楚。我的意思是我调用函数来实际配置窗口。我的印象是我应该修改事件并传递它,但我现在不确定。我抽象地理解了 WM 应该做什么,并且因为想要一个更好的术语,我试图写的开头是“通过”WM。我已经澄清了我的问题。
  • 对,协议请求是ConfigureWindow,即Xlib中的XConfigureWindow()和XCB中的xcb_configure_window()。我假设 Python 称之为类似的东西。如果您查看一些现有的 WM 源,您可以看到这个想法。 ConfigureWindow 中的字段与 ConfigureRequestEvent 中的字段完全匹配,因此您只需将它们复制过来即可。
  • 查看“man XConfigureWindow”和“man XConfigureRequestEvent”以获得更多详细信息。
猜你喜欢
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 2022-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-03
  • 1970-01-01
相关资源
最近更新 更多