X11概述
- GNU Linux本身没有图形界面,linux现在的图形界面的实现只是linux下的应用程序实现的。
- X是协议,就像HTTP协议,IP协议一样.因为输入设备和显示设备不是同一个设备,而且他们需要相互配合,进行画面显示,所以需要一个交互协议,建立他们直接的沟通桥梁。
- X11就是X协议的第11版X协议主要有X应用程序和X服务器组成,如:我需要划个圆,X应用程序告诉X服务器在屏幕的什么地方用什么颜色画一个多大的圆,而具体的"画"的动作,比如这个圆如何生成,用什么显卡的驱动程序去指挥显卡完成等等工作是由X服务器来完成的.
- X11协议是X。 实现这个协议的常用服务器有Xfree86,Xorg,Xnest等,目前用到的更多的是Xorg的实现。
- 请求这些服务器来完成显示任务的客户:所有的X应用程序.
- XFree86是X协议的服务器软件,但Client端更多的是方便程序员更方便的使用X协议与服务器端的XFree86交互,故就产生了一个Xlib库,封装了X协议内容,如果你还觉得直接使用Xlib不方便,于是就产生了qt和gtk,对Xlib进一步封装,提供了很多控件,可以可视化的使用X协议更方便程序员的开发。
X-window-system基本概念
Display
- 若干个屏幕(screen)以及一套输入设备(键盘和鼠标)构成一个display,display概念的关键就是有一套完整的输入输出。屏幕不一定必须是一个,可以有多个,各个屏幕可以用来显示相同的内容,也可以用来构成矩阵显示一个大屏幕的内容。
- 一个x server可以支持多个display。
Screen
- Screen的层次在display之下,是x server显示管理的次级单位。一个screen对应一个根窗口(root window),根窗口的大小与screen相同。如果在命令行执行"X"的话,启动了x server,这时在屏幕上看到一个单调的桌面,以及一个"X"形的鼠标,不过因为没有启动window manager,所以什么都不能做,只能动动鼠标。这时你看到的这个单调的“桌面”正是根窗口
Window
- Window是比screen还要小一级的概念了。Window是有树形继承关系的,每一个屏幕上都对应有一个“窗口树”,树的根就是root window,即根窗口,它没有父窗口;除此之外,所有window都有父窗口。一个窗口还可能有子窗口,但并不是必须的。
Xlib基本概念
- Xlib把应用程序的图形操作转换为发送给x server的请求,xlib与xserver之间的通信是异步的。当应用程序调用Xlib与xserver通信时,xlib不会每次都立刻把请求发送出去,而是把请求进行排队,放在一个缓冲区里,当某种条件被满足时,再一次性地把多个请求一起发出。
- 如果应用程序需要马上得到响应的话,可以调用类似于SYNC之类的xlib接口来强制清空缓冲。
- 因为与server之间是通过网络来通信的,所以Xlib并不能保证请求立刻就能到达server,因为可能有网络的延时;即使到达了,也不能保证server立刻就处理请求。
- 从server到xlib的消息一般是event,应用需要处理这些event。同样,event的传递也是异步的,会有排队也会有网络延时。
- 关于资源,当应用调用xlib创建某种资源时,比如window, font, pixmap, colormap, cursor或gcontext时,会返回给应用一个ID,而资源本身是在server上的。这些资源是有可能在应用之间共享的,其中是font和cursor是自动被同一display上所有screen的所有window共享的。
- 关于error。有两种,一种是调用xlib时的返回值错误,如果函数调用失败的话,一般的xlib函数会返回0;另一种是error是由server发出的,在与xlib通信中,如果发现了错误,按照x protocol的规范,server会发error到xlib,进而到达应用程序,应用程序需要处理这样的错误。
- 注意与window manager的合作,通常,你的程序不一定必须是独占屏幕的,当window manager对你的窗口进行管理时,应用程序要有相应的支持