【问题标题】:Xlib and XCB. Multiple windows in one process. Xlib fails whereas XCB do notXlib 和 XCB。一个进程中有多个窗口。 Xlib 失败,而 XCB 没有
【发布时间】: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


【解决方案1】:

总结讨论,Xlib 文档中的某处指出,Windows 管理器将关闭连接。

“某处”是 Xlib 文档。而且你应该更仔细地阅读这些讨论,因为你似乎忽略了一些重要的观点。

XCB 库在存在多个窗口和 线程,所以它不显示 Xlib 错误行为?

你可能不喜欢 Xlib 在这方面的行为,但它不是“错误的”。它已记录在案,并且对许多程序很有用。此外,虽然关闭连接是 Xlib 下关闭顶级窗口时的默认行为,但这并不是唯一可能的行为。在您链接的问题的答案中,有一个描述(和文档引用)描述了您需要做的相对简单的事情,以避免在通过其关闭按钮关闭顶级窗口时关闭 X 连接。

然后,考虑到我们谈论的是 Xlib 的 默认 行为,而不是不可避免的行为,XCB 以不同的方式做事不应该太令人惊讶,因为 .... p>

XCB 是否 在后台使用 Xlib,或者它是否将命令发送到 X 服务器 其他格式?

不,XCB 不使用 Xlib。它是 Xlib 的一个替代品,Xlib 是一个年轻的兄弟姐妹,用来自 Xlib 经验的智慧编写。 Xlib 和 XCB 都通过 X 协议与 X 服务器通信。* 它们都是低级的,但 XCB 或多或少是一个直接的协议包装器,而 Xlib 提供了一个隐藏 X 客户端 / 的 API 外观服务器性质。

方向上的差异为关闭窗口按钮的默认行为差异提供了一个合理的解释。 Xlib 试图猜测 GUI 应用程序的程序员最有可能想要什么,并据此选择默认值。大多数 X 应用程序都提供一个顶级窗口,关闭窗口会终止应用程序,而自动关闭 X 连接对于此类应用程序来说是一种便利。另一方面,XCB 不会试图隐藏 X 协议或分层策略(尽管构建在它之上的工具包可能会这样做)。 XCB 就是要对其所做的事情保持透明。

不好意思,我不是很熟悉,怎么沟通 转 X11 协议。

一般来说,您使用 Xlib 或 XCB 进行通信。原则上可以将原始 X11 用于 X 服务器——毕竟,这就是 Xlib 和 XCB 所做的——但这样做很复杂。这就是 Xlib 和 XCB 存在的原因。甚至那些也不是那么容易使用,这就是为什么他们在它们之上构建了更高级别的工具包。

尤其是那个窗口管理器是怎么来的 不关闭与 XCB 的连接?

XCB 不指示窗口管理器这样做(至少,不是默认情况下)。 Xlib 也不这样做,如果你告诉它不要这样做。


* 最初是这样的。正如一位评论者所观察到的,这些天来,Xlib 不再直接使用 X 协议,而是使用 XCB(而不是相反)。

【讨论】:

  • 我认为我的用例不属于 Xlib 认为普通 GUI 程序应该做的事情。而且我的应用程序问题与您提到的关闭按钮无关。它就像它所说的那样简单 - 多个窗口。一旦它们中的任何一个关闭,Xlib 就会关闭连接。我不认为我在这里忽略了任何事情。只是我最不意外的原则与 Xlib 的不一致。
  • 还会有多个线程。而且我闻到我在那里也会遇到 Xlib 的问题。顺便说一句,如果你这么好心,如何“告诉 Xlib”改变关闭连接的行为?我已经在 Xlib 中有一些代码,也许,如果我能克服 Xlib 关闭连接的习惯,我可以管理自己的线程同步。
  • @yww,阅读您已经链接的这个问题的最高投票答案:stackoverflow.com/questions/10792361/…,全文(不是被接受的答案,它几乎没有那么好或相关)。
  • 关于多线程调用Xlib,也一定要使用XInitThreads
  • 现代版本的 Xlib 实际上使用 xcb 来管理与 X 服务器的连接,因为 libX11 1.4.0 于 2010 年发布:lists.freedesktop.org/archives/xorg-announce/2010-November/…
猜你喜欢
  • 2017-01-14
  • 2018-11-30
  • 1970-01-01
  • 2015-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多