【发布时间】:2020-08-30 03:26:12
【问题描述】:
不久前,我面临一个事实,即在存在多线程和多个窗口的情况下使用Xlib 编程是一条棘手的道路。我面临的问题是,Xlib(或窗口管理器)在所谓的“顶级”窗口关闭后强制关闭与服务器的连接。
这个问题很容易重现,你只需要创建一个窗口,然后关闭它。在上述步骤之后尝试使用Display。将引发致命错误并且程序将退出。这是Xlib 的奇怪行为。
该问题在多个SO 主题中遇到:How do I gracefully exit an X11 event loop?、How do you exit X11 program without Error。总结讨论,在 Xlib 文档的某处指出,Windows 管理器将关闭连接。
出于好奇,我检查了XCB 库中的此类行为。 XCB,与 Xlib 相比,表现“正常”,我能够创建和销毁几个窗口,连接仍然存在。
问题是。 XCB 库在存在多个窗口和线程的情况下如何执行,因此它不会显示 Xlib 错误行为? XCB 是在后台使用Xlib,还是以其他格式向 X 服务器发送命令?不好意思,我不是很熟悉,如何与 X11 协议通信。尤其是那个窗口管理器怎么没有关闭与XCB的连接?
我会接受任何能阐明问题的答案。是否是指向XCB 源代码的网络链接,它解释了智能的做事方式。还是用X11 协议来解释。或者别的什么。
感谢您的长时间阅读。我希望我没有对所有这些文字感到厌烦。
更新
我搞砸了。如果在 WM_PROTOCOLS 中设置了 WM_DELETE_WINDOW,Xlib 的行为与我预期的一样。只是排序或同步导致连接处于错误状态。我认为多个线程以随机方式干扰了Xlib 状态,并且事件循环出错了。我必须警告其他人关于 Xlib,应该通过变量或原子原语进行同步。 Xlib 实际状态更改应仅在主线程中进行,并且在事件循环结束后。
【问题讨论】:
-
没有让 WM 终止您的 X11 连接的缺失位是包含 WM_DELETE_WINDOW 的 WM_PROTOCOLS 属性。参见 ICCCM §4.1.2.7 和 §4.2.8.1:tronche.com/gui/x/icccm/sec-4.html#s-4.1.2.7/tronche.com/gui/x/icccm/sec-4.html#s-4.2.8.1
-
@UliSchlachter 您的评论是我发布上述两个链接的原因。正如上面所写:我已经做好了所有的准备,我确实收到了一条好消息。然后 WM 关闭连接。就是这样。
-
@UliSchlachter 我忘了提到我在客户端消息之后做了
DestoryWindow。这在文档中被提及为有效程序。 -
@UliSchlachter 好的,现在我很困惑。我稍微改变了函数调用的顺序,连接就在这里了。有时,编程是一门神奇的艺术。需要对此进行调查。也许多个线程给了我错误的行为?
标签: linux x11 xlib window-managers xcb