1: http://blog.chinaunix.net/u/3771/showart_1891322.html
2: http://www.cppblog.com/zmj/archive/2007/05/18/24331.aspx
3: http://en.wikipedia.org/wiki/X_video_extension#The_Role_of_Window_Manager_Support_and_Compositing 该链接是xvideo extension的wiki网站,但是是2.0版本,与最新的2.2版本有一些差别,在2.2版本的时候增加了Xv{Shm}PutImage功能。
xserver框架浅析 input系统含驱动
1:http://blog.chinaunix.net/u1/40978/showart_1973082.html
xorg 架构 将来 以及一些基本常识浅析
2:http://blog.chinaunix.net/u1/40978/showart_1968756.html
xorg 硬件加速浅析 系列 kdrive的kaa框架的加速的实现
3:http://blog.chinaunix.net/u1/40978/showart_1972799.html
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把应用程序的图形操作转换为发送给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,进而到达应用程序,应用程序需要处理这样的错误。
应用程序方面的考虑:
所有的尺寸和座标值都是16位长度,这样的限制主要是为了确保网络带宽,如果应用传来的值是更长字节的,将会被截取掉。
在不同的工作站之间,键盘的差异往往是最大的,所以你在设计程序的时候,最好使用最通用的做法以加强可移植性。
很多显示系统的后台存储空间是很有限的,所以最好尽可能地减小pixmap和后台存储的使用。
注意与window manager的合作,通常,你的程序不一定必须是独占屏幕的,当window manager对你的窗口进行管理时,应用程序要有相应的支持。
XGCValues图元的数据结构
typedef struct {
int function; // 逻辑操作
unsigned long plane_mask; // 位掩码
unsigned long foreground; //前景色像素值
unsigned long background; // 背景色像素值
int line_width; //线宽度
int line_style; // 线类型LineSolid, LineOnOffDash, LineDoubleDash
int cap_style; //断点类型 CapNotLast, CapButt, CapRound, CapProjecting
int join_style; //接口处类型 JoinMiter, JoinRound, JoinBevel
int fill_style; //填充类型 FillSolid, FillTiled, FillStippled, FillOpaeue, FillOpaeueStippled
int fill_rule; // 填充规则 EvenOddRule, WindingRule
int arc_mode; // 弧模式 ArcChord, ArcPieSlice
Pixmap tile; //平铺图像
Pixmap stipple; //点刻图像的一个平面
int ts_x_origin; //点刻偏移值
int ts_y_origin;
Font font; //缺省字体
int subwindow_mode; //裁减模式 ClipByChildren IncludeInferiors
Bool graphics_expouseres; //是否产生曝光
int clip_x_origin; //裁减起点
int clip_y_origin;
Pixmap clip_mask; //位图裁减
int dash_offset; //图案线/ 虚线信息
char dashes; //虚线模式
} XGCValues;
下面是 XGCValues 的栏位说明。 栏位 预设值 说明
function GXcopy Xlib 定义了 16 种 function, 用以定义各种 X 所提供的绘图形式. Xlib 提供了一些绘图函数, 当我们在一个 drawable 上绘图时, 新绘上的 图该如何和在原本位置上的图形配合呢? function 定义了 X 所提供的 16 种可能中的一种. 当我们为 GC 设好新的 function 之後, 下一次我们使用 GC 进行绘图时, 新的 function 就开始发生了作用. 下面是 Xlib 定义的 16 种 function. GXclear 把输出图素清除为 0
GXand 把输出之图与原图素做 and 运算
GXandReverse 先把原图素反相, 然後和输出图素做 and 运算
GXcopy 直接用输出图素替代原图素
GXandInverted 先将输出图素和原图素做 and 运算後, 再将结果反相
GXnoop 维持原图素
GXxor 输出图素和原图素做 xor 运算
GXor 输出图素和原图素做 or 运算
GXnor 先分别把输出图素和原图素做反相, 再将反相後的两图做 and 运算
GXequiv 先反相输出图素,然後和原图素做 xor 运算
GXinvert 把原图素反相
GXorReverse 反相原图素, 然後和输出图素做 xor 运算
GXcopyInverted 把输出图素反相当为最後结果
GXorInverted 把输出图素反相後和原图素做 or 运算
GXnand 把输出图素和原图素做反相, 然後两图做 or 运算
GXset 把输出部分全设为 1
plane_mask AllPlanes 指定会被影的 planes, 会被影的 planes 设为 1。Xlib 中定义 AllPlanes 常数, 指定所有的 planes。绘图的最後结果是:
((输出图素 function 原图素) AND plane_mask)
foreground 1 指定图形输出时的前景所使用的图素值(pixel)
background 0 指定图形输出时的背景所使用的图素值(pixel)
line_width 0 如果输出中有线条时, 线条的宽度.
line_style LineSolid 线条的样式, Xlib 定义三个常数, 代表三种样式. LineSolid 实线
LineOnOffDash 虚线
LineDoubleDash 另一种虚线
cap_style CapButt 指定线条端线点(起点和终点)的样式。 CapNotLast 和 CapButt 相似, 只是 line width 为 0 时, 不画出端点.
CapButt 方形长角的端点
CapRound 圆弧形的端点
CapProjecting 和 CapButt 相似, 但端点会再延伸 line width 的一半长度
join_style JoinMiter 折线的折点形式。 JoinMiter 角状的折点
JoinRound 图弧状的折点
JoinBevel 像是两个 CapButt 的端点重叠在一起
fill_style FillSolid 设定线段,文字,和填充画面的来源。 FillSolid 前景填满 foreground 颜色
FillTiled 以 tile 填满
FillStippled 前景以填上 foreground 但以 stipple 遮罩起来.
FillOpaqueStippled 和 FillStippled 相似, 但被遮罩的部分(stipple 内为 0 的部分) 填上 background。
fill_rule EvenOddRule 设定呼叫 XFillPolygon 时,如何定义出内部和外部。 EvenOddRule 以通过指定点的线为基准, 通过 path 奇数次的为 inside
WindingRule 通过顺时钟方向的 path 和逆时钟方向的 path 的次数如果不同 即为 inside。
arc_mode ArcPieSlice 控制 XFillArcs 如何填满圆弧。 ArcChord 以琴弦般的填满弧
ArcPieSlice 像被切开的 pie 一样的填满弧