一直以来, 我对GUI是如何实现的很感兴趣, 我们平时电脑上面显示的那些漂亮的窗口界面, 是如何通过程序, 一步步转化成硬件上的操作? 在这里, 我从最上层的Qt图形库开始, 再到linux下面的X, 到内核, 最后到显卡来一个整体的介绍. 鉴于本人水平很差, 也没有多少的实践经验, 文章既不会详细, 也会出现很多错误, 如果你发现了问题, 请联系我.
对于用户来说, GUI就是一堆窗口, 但是在下层, 做了非常多复杂的操作, 这些操作是分成很多层来实现的. 不同操作系统的实现方式不同, 我们现在只看采用KDE(Qt图形库)做为图形界面的linux系统. 这里面整理了一下
Qt图形库 --- X协议 --- X server --- 系统调用 --- linux内核 --- IO操作 --- 显卡
整体分为上面几个层次:
- 最上层是Qt图形库, 应用程序采用Qt图形库开发, 描述窗口, 控件, 以及响应事件的方式.
- Qt图形库通过X协议, 与进程X server通讯, 然后X server进行生成窗口, 绘制控件的工作.
- X server通过系统调用, 绘制屏幕, 获取用户键盘鼠标和响应, 包装成事件, 通知X client(就是应用程序).
- linux内核响应系统调用, 把数据发送给显卡.
那么每层具体是如何实现的呢? 我们来看一个实际的例子. 一个简单的hello world程序.
Qt是一个图形库, 它让开发者很容易地开发出图形界面的应用. 我们现在写一个很简单的程序: recorder.
代码可以在这里下载到. 分成下面几个部分
main.cpp recorder.hpp recorder.cpp
我们先看懂代码是怎么样的. 那么Qt图形库在后面做了什么操作呢? 我们首先得知道Qt下层调用了什么, 必须先介绍一下X协议.
X协议介绍 通讯方式 命令 Qt如何把操作映射到X协议上面? 消息机制 QApplication后面干了什么? Qt是如何把上面的类层次转化到X协议上面的绘制操作的.
Xlib到底在下面实现了什么? 做了什么工作能够提供X协议的服务? 绘制窗口 控制窗口的移动 把输入设备映射成事件等等.
如何实现系统调用, 鼠标键盘如何转化成xxx, 写显示操作
显卡的通讯方式, 如何生成输出给显示器的信号
引用材料 .. Qt paint system: http://www.linuxgraphics.cn/qt/paint_system.html