我一直在阅读有关XCB API的很多内容,并从各个站点编译了大量示例。但是,它们都没有直接解决实际为GUI应用程序创建实际窗口的问题;他们都对如何使用XCB绘制原始2D图形感到遗憾。例如。创建一个窗口,绘制几个正方形,关闭窗口。
如何让进程在XCB窗口管理器中生成窗口?
我只能假设在进行处理时,会通知X服务器并将请求转发给您的应用程序,然后将流程窗口映射到屏幕以及任何底层图形子系统代表X服务器绘制图形(和你的窗口管理员)。
我还读过人们如何从他们的窗口管理器fork()第三方进程。这似乎是一个愚蠢的想法。是吗?应用程序不应该独立于窗口管理器运行吗?
我已经阅读了很多窗口管理器源代码,并称我为新手,但我没有看到任何与应用程序如何绘制自己的窗口直接相关的内容。
如果有人能说明你应该如何通过XCB处理应用程序的窗口创建,我会非常感激。感谢。
答案 0 :(得分:1)
但是,它们都没有直接解决实际为GUI应用程序创建实际窗口的问题;
无论如何,这不是你想用裸协议级API做的事情。如果您想要一个丰富的GUI,请使用一个工具包,为您完成所有繁重的任务。 Xlib / XCB将只为您提供适用于相当简单的窗口的基本工具;即使在那里,我也不会在没有使用像cairo之类的东西的情况下开始一个项目。
如何让进程在XCB窗口管理器中生成窗口?
致电xcb_create_window
然后xcb_map_window
。就是这样。这就是全部。您创建一个窗口,然后使其可见。
当然,你应该对你的windows做很多其他的事情,但是在创建和显示它方面,就是这样。
我只能假设在进行处理时,会通知X服务器
X服务器并不关心流程。
将请求转发给您的申请
有什么要求?
不应该独立于窗口管理器运行应用程序吗?
嗯,是的......但实际上,窗口管理器的生命周期等于X服务器的生命周期(人们通常不会在其间切换窗口管理器)。没有X服务器,所有X客户端都会死掉。
理论上它完全独立,但现实是没有真正的理由去做出这样的区分。也就是说,我所知道的所有窗口管理器都提供了一些启动应用程序的方法,这样即使窗口管理器退出,分叉的进程仍然存在。
我已经阅读了很多窗口管理器源代码,并称我为新手,但我没有看到任何与应用程序如何绘制自己的窗口直接相关的内容。
那是因为窗口管理器根本不涉及渲染窗口 - 根本不是。窗口管理器只知道窗口存在并管理它们的抽象属性,但是对于所有窗口管理器都知道,窗口是一个具有一些属性的矩形。
实际上,渲染到窗口是X客户端直接与X服务器进行的操作。
窗体管理器通常涉及的一种渲染是装饰渲染(窗口边框和标题等)。但是窗口管理器也只是一个X客户端,所以在这方面它只是另一个呈现某些东西的应用程序(通常是窗口管理器将这些装饰渲染到它自己创建的框架窗口中 - 所谓的重新定位窗口管理器)。 / p>
第一次评论后更新: X客户端(想要创建窗口)将这些请求(创建/地图窗口)发送到X服务器。 X提供了多种实现方式,这是Linux系统上最常见的案例,现在是UNIX套接字。
在X中,客户可以选择不同的事件。其中一种事件类型是子结构重定向,这意味着客户端可以在某个窗口(例如创建子窗口)时通知X服务器。
根窗口也只是一个窗口,但它有一些独特的属性,例如它始终存在且无法关闭。只有一个X客户端可以在根窗口上选择子结构重定向 - 这样做会使窗口管理器成为窗口管理器。
所以现在我们在根窗口(我们的WM)上有一个带有子结构重定向的X客户端。现在,只要客户端请求映射窗口,X服务器就会将此请求重定向到窗口管理器客户端(通过MapRequestEvent)并停在那里。 唯一的例外是来自窗口管理器本身的映射请求:X服务器将处理这些请求(为了不仅仅与窗口管理器一起打乒乓球)。
这基本上设置了一个干预循环:客户端请求X服务器映射窗口,X服务器转发请求到窗口管理器,窗口管理器可以选择将窗口的映射请求发送回服务器,服务器处理映射请求,因为它来自窗口管理器。
就是这样;这就是窗口的映射方式。
我的窗口管理员如何确定何时制作和映射窗口?
窗口管理器不会告诉客户端要做什么。怎么会知道客户甚至想做什么?恰恰相反:客户端做了事情,窗口管理器根据需要进行干预和反应(在某些方面 - 窗口管理器决不能完全控制X服务器)。
是否有某种事件循环需要创建一个案例(从X服务器创建窗口的请求)?
如上所述,决定何时创建窗口取决于客户端。但是,X客户端的核心概念是他们需要设置一个事件循环。
例如,在映射窗口的情况下:客户端发送映射请求,并且不得假设要映射的窗口(因为窗口管理器可以选择拒绝请求!)。客户端知道他们的窗口已被映射,因为当它发生时,X服务器将创建一个MapEvent并将其发送到客户端。
请注意,窗口管理器不仅可以拒绝来自客户端的地图请求,甚至还可以映射它从未接收过客户端的地图请求的窗口。因此,客户端必须始终等待这些事件,并在其中一个窗口已映射后做出相应的反应。
还有一大堆对客户很重要的事件,特别是Expose事件,告诉客户它需要重绘(部分)窗口。