GUI工具包如何与Linux上的窗口pipe理器进行通信?

使GUI工具包(如Qt,GTK)与窗口pipe理器一起工作的基本机制是什么?

据我所知,GUI工具包可以绘制自己的主窗口,而不需要任何窗口pipe理器。 然而让我困惑的一点是,窗口pipe理器何时以及如何在x服务器中检测到“新窗口请求”,并在窗口周围绘制框架,标题等? 当然需要某种隐含的协调。 但是,从编码的angular度来看,窗口pipe理器的初始化似乎对GUI工具包完全透明。

是否可以说,GUI工具包和窗口pipe理器都是x窗口的2个对等客户端? 调用(通知)窗口pipe理器参与新的窗口创build过程是否是x服务器的责任? 如果是这种情况,谁没有窗口pipe理器,谁来决定“应用程序窗口”的位置?

主要的沟通机制是通过Windows属性 。 看看它的起点是ICCCM ,特别是第四章 。 这包括窗口装饰和按钮的东西。

现代桌面扩展了ICCCM中描述的约定,有关更多信息,请参阅standards / freedesktop.org / wm-spec 。 这些扩展包括诸如寻呼机和任务栏之类的东西。

另外,窗口管理器具有特殊的权限,即可以查看和拦截所有的窗口配置,调整大小和映射请求。 这就是所谓的重定向,参见这里 。 我想你主要是对这种交流感兴趣。

一次只有一个客户端可以执行重定向,这个客户端被定义为窗口管理器。 在所有其他方面,客户都是同行。

所有的窗口创建/配置请求都包含窗口坐标。 窗口管理器可以截取和修改这些坐标。 如果没有窗口管理器,则请求由X服务器执行,就像应用程序发送它们一样。

那么,一切都是通过X服务器最终协调的。 做一些阅读,我相信你会找到你正在寻找的答案…

一些一般信息:

http://en.wikipedia.org/wiki/X_Window_System_protocols_and_architecture#Inter-client_communication

http://en.wikipedia.org/wiki/X_window_manager#How_X_window_managers_work

Xlib编程手册 – 特别是第9,10和14章:

http://tronche.com/gui/x/xlib/