你想的太多太多太复杂了。像 GTK+ 或 Qt 这样的工具包在某些东西上添加了相当多的抽象层,这实际上相当简单:您系统的图形设备由一个处理器和一些可以运行的内存组成。在最简单的情况下,处理器是普通的系统 CPU,而内存是普通的系统内存。但是,现代计算机具有专用图形处理器 (GPU),它具有自己的高带宽内存。
内存保存帧缓冲区。从逻辑上讲,帧缓冲区是一个二维值数组。可以对 GPU 进行编程,以某种方式处理帧缓冲区中的值。这可用于绘制帧缓冲区。显示图片的监视器连接到一个特殊的电路,该电路连续地将内存中某个帧缓冲区的数据馈送到屏幕(通常称为 RAMDAC 或 CRTC)。所以在 GPU 的内存中有一个帧缓冲区,它直接进入屏幕。如果你在那里画画,屏幕上就会出现东西。
像 X11 服务器这样的程序可以加载“知道”如何对 GPU 进行编程以绘制图形基元的驱动程序。X11 本身定义了某些图形基元,扩展模块可以添加更多的图形基元。X11 本身允许将 GPU 内存上的帧缓冲区分离到称为 Drawable 的逻辑区域中。屏幕帧缓冲区上的可绘制对象称为 Windows。由于逻辑窗口可以重叠,X 服务器还管理 Z 堆叠,它用于对窗口进行排序以进行重绘。每次客户端想要绘制到 X11 服务器会告诉 GPU 的某个窗口时,绘制操作将只修改帧缓冲区的那些像素,其中绘制到的窗口是可见的(这称为“像素所有权测试”)。X11 服务器也会创建 Drawables(即 帧缓冲区),它们不属于屏幕上的帧缓冲区内存区域。这些在 X11 术语中称为 PBuffers 或 Pixmaps(也有一个特殊的扩展,它也可以将窗口移出屏幕)。
然而,所有这些 Drawables 只是内存。从技术上讲,这些是画布上的东西。这被称为“图形原语”。X11本身提供了一定的集合,命名为X core。还有一个名为 XRender 的事实上的标准扩展,它提供了 X 核心中没有的原语。然而,X11 核心和 XRender 都没有提供可以生成 3D 绘图印象的图形基元。所以还有另一个扩展,称为 GLX,它教 X11 服务器另一组图形基元,即 OpenGL 的形式。
然而,X 核心、XRender 和 GLX/OpenGL 都只是不同的笔、画笔和铅笔,它们都在同一种 Canvas 上运行,即由 X11 管理的简单帧缓冲区。
那么像 Qt 或 GTK+ 这样的工具包呢?好吧,他们使用 X11 和它提供的图形基元来实际绘制小部件,例如按钮、菜单和类似的东西,而 X11 不知道这些。