打开窗口所需的最低代码是多少?

打开窗口所需的最低代码是多少?

我最近一直在玩 C 代码,我想知道一些功能是如何实现的,特别是窗口创建。

我使用过SDL一段时间,但它似乎依赖于X11(或Wayland)。但X11本身是用C编写的,那么它是如何创建窗口的呢?我还能再低一点吗?

例如,我不知道有系统调用可以执行此操作。

这仅用于教育目的,不用于生产。

答案1

X11是一种客户端服务器架构,客户端可以请求一个窗口。服务器是实际显示东西的东西,客户端是应用程序。

作为客户端软件,您通常使用 libX11 来执行这些请求。

没有人会再直接基于 X11 开发 GUI 应用程序,这是有充分理由的:X11 的很多设计不再反映您想要如何编写这样的应用程序。例如,X11 具有用于线条或方框等内容的基本绘图例程。但是通过协议为您绘制的每条线发出请求的开销非常高。因此,明智的客户端会简单地将这些内容绘制在表面上(如果愿意的话,可以是位图)并将更改的区域发送到块上的服务器。

此外,特别是当您使用 SDL 时,您必须意识到客户端和服务器之间的这种严格分离无论如何都必须被打破,以启用 OpenGL 之类的功能,或者只是为了避免通过 X11 复制位图,而是直接允许应用程序写入 GPU 缓冲区。

此外,我认为可以公平地说,几乎所有在过去十年中活跃于功能开发的 X.org 开发人员都在 Wayland 中做到了这一点,因此在 2023 年学习如何进行低级 X11 可能不是最明智的选择。 Wayland 尚未完全实现这一点,但很明显 X 的日子已经屈指可数了。

这是不再进行低级别 X11 调用的另一个好理由。您将自己排除在越来越多的平台之外(或者添加另一层间接层 - xwayland 服务器在 Wayland 中模拟单个窗口的 X11 服务器,然后或多或少地工作 - 例如,XWayland 根本无法执行本机操作hidpi 支持)。

所以,回答“有多少代码?”这个问题:不多,除非你想做有用的事情。您想要使用线程支持来初始化 libX11,您需要设置处理程序,您需要初始化输入处理,至少初始化 xdamage,您需要设置窗口,获取表面,然后开始在其上绘图。这一切都发生在 1980 年代的 C 导管中。老实说,还有更好的时光。使用像 SDL、GTK4、FLTK 这样的框架...我个人发现 DearImgui 附带了基于与图形系统对话的不同方式的易于理解的示例,虽然这些确实抽象了获取 X11 窗口的具体细节,但您确实得到了感觉很好,因为你可以深入了解 GUI 是如何交互的,当它构建在现代 GPU 接口上时,而不是 4 MB RAM 太大的桌面想法上。

相关内容