<!--@page { margin: 2cm }P { margin-bottom: 0.21cm }-->
Xlib学习笔记
第一章
1.2X Window System概念
display:由键盘,鼠标和一个或多个屏幕组成的一个工作站
screen:一个display可以有多个screen
server-client模型:
窗口管理器
事件
X扩展
第二章 X概念
x协议:
请求消息
回复消息:需要回复的请求比较浪费资源,需要等待网络传输
事件:
错误:
缓冲:
xlib会保存请求来使客户端持续运行不至于等待网络传输。
引起发送缓冲情况有:
调用等待事件函数但事件队列中没有匹配的事件,如:XNextEvent
客户端调用从服务器获得信息的函数,QueryFetch Get类函数
客户端强制刷新缓冲 XFlushXSync
资源
为了减少网络传输,x为每个抽象事物使用一个唯一id进行标识(window,gc, etc),也就是atom
properties和atoms
property是每个window拥有的一组属性。atom用来标识每个property,可通过XInternAtom()获得atom。XA_为前坠的宏代表内置的atom
窗口管理器:
substructureredirection。substurcture引用大小,位置,子窗口z序。redirection代表对窗口配置改变的请求。请求由窗口管理器决定是否实施。
Window
WindowCharacteristics:
父窗体:每个窗体都有父窗体,除了rootwindow。
窗体坐标系统:以窗体左上角为原点
window 配置包含: 高和宽,边框宽度,位置xy,z序。
depth色深,visual
窗体类别 inputoutput,inputonly
一组window属性:边框和背景的颜色,当窗体大小变化时窗体内布局如何变化,窗体何时自动保存被遮盖的内容,接受什么类型的事件,是否允许窗体移动显示不同过窗口管理器,窗体使用哪个colormap,窗体内显示什么样的指针。
Mapping和 Visibility
XMapWindow()在当前z-order位置映射窗口,XMapRaised()将窗口放到Z-order顶部映射,当窗体是第一次创建时,两者行为一样,都在顶层显示窗体。
显示窗体的条件:
1。使用XMapWindow或相关函数显示窗体
2。祖先窗口必须已经显示
3。窗体没有被覆盖(使用XCirculateSubwindows(),XConfigureWindow(),XRestackWindows()改变窗口z-order)
4。缓冲被发送到server
5。顶层窗口被映射时,窗口的显示可能延迟,需要等待windowmanager决定。应用程序应该等到第一个expose事件,表示窗口显示了,并可以进行绘画。
当窗体被unmap了,其配置和属性会被保留
2.3图形
pixel和color
colormap决定每个像素值对应的颜色。colormap中的每一项称为colorcell
pixel和planes
像素的位数成为planes,指定颜色的数量
pixmaps和drawables
pixmaps是一部分可绘画的内存。pixmap和window都是drawable
XCreatePixmap创建
drawing和gc
tiles和stipples
tiles,一个pixmap用来重复贴图
stipples,一个1depth的pixmap,用来做mask
2.4更多窗体特性
2.4.1窗体属性
background
border
bitgravity 当窗体变化时决定窗体内容如何被保留
windowgravity 当窗体变化时子窗口如何重新定位
backingstore当重提被覆盖时,窗体内容是否被自动保存,需要xserver支持。DoesBackingStore()用来检查是否支持
SavingUnder用于popup菜单,当窗体被popup类窗口覆盖时,是否保存被覆盖内容,xserver不一定支持;DoesSaveUnders()来检查
events指定接收的时间
substructureredirect override 是否需要wm干扰
colormap指定窗体的virtualcolormap
cursor指定指针
2.4.2窗体配置
指坐标,高宽,边框宽度,z-order。与属性不同,他们有wm进行干扰
2.4.4depth和visual
depth就是plane数量,inputonly窗口depth总是0
2.5事件
do_not_propagate_mask指定事件不再向父窗口传递
2.6x编程
错误处理
三类错误:
检测创建服务资源的函数返回值
编程引起的协议错误(错误的atom) XErrorHandler
重大系统错误,死机或网络错误 XIOErrorHandler
程序退出
WM_PROTOCOLS协议
指定应用程序参与WM_PROTOCOLS协议
AtomwmProtocols = XInternAtom(display, "WM_DELETE_WINDOW",False);
XSetWMProtocols(display,win, &wmProtocols, 1);
收到ClientMessage后,判断event.xclient.data.l[0] ==XInternAtom(display, "WM_DELETE_WINDOW", False),以确定是否要退出
X资源申请,一般在失败时返回None
5GC
GC:存储着绘画时的参数,包括线宽,线条样式,填充样式,前景色,背景色。调用绘画函数时,会使用GC中指定的方式进行绘画。
XCreateGC:用XGCVaule来设置GC
cap_style:线条末端的样式,如:圆角
Join_Style:线条拐角处的样式
dashes:指定点画线的样式
font:可以使用XLoadFont加载字体。
FillRule:填充规则,再多边交叉的图形当中进行填充
clip_mask:通过bitmap指定可以绘画的区域
clip_x_origin/cliip_y_origin:指定clip_mask起始坐标
Tiles:填充图形
Stipples:与Tiles一样,只不过是bitmap,仅使用foreground和background进行填充
5.5Graphics Tricks
plane_mask:指定一个像素当中,哪些位可以被设置。
function:指定对像素赋值时所使用的方式,是一些位逻辑操作
5.6Graphics Exposure
graphices_exposures:设置为true将导致使用XCopyArea/XCopyPlane时会发送GrapicsEcpose 和NoExpose事件,这些事件无法通过XSelectEvent进行设置
5.7subwindow_mode: 指定如果有子窗口阻挡的位置是否绘画。
6绘图
6.1.1请求限制: XDrawLines,XDrawPoints....有绘画数量限制,可通过XMaxRequestSize()获得限制
6.1.6XCopyArea XCopyPlane
XCopyPlane可以用来将bitmap复制成相应的位深的pixmap
6.2Fonts and Text
XFontStruct描述整个字体
XCharStruct描述单个字符
字体的原点不位于左上角,位于baseline
ascent从bashline开始最高高度
descent从bashline开始最低高度
direction字体方向
default_char不存在的字符默认图形
min_bounds最小字符尺寸
max_bounds最大字符尺寸
XDrawImageString 用背景色填充
XGetFontProperty等到更多字体细节属性
6.2.10XFreeFontPath XGetFontPath XSetFontpath 设置字体搜索路径
6.3Regions
用来设置gc中的clip_mask
6.4Image
在client和server之间传输image
XGetImage,从server端获得图片,在对图片进行操作之前需要将图片的字节序和位序转换成client的
XPutImage,不需要转换字节序和位序,XPutImage会做这件事
7Color
Colormap颜色表 由ColorCell组成,ColorCell的编号成为Pixel,Pixel的每一个bit成为Plane.
Xcms:X Color manager system 用来定义string对应的颜色,支持多种颜色描述方法
Colormap
colormap中每个colorcell可以被单独的修改。有些硬件当中仅支持同一时刻只有一个colormap。X提供virtualcolormap的概念,virtualcolormap通过窗口管理器换进换出
Visual描述可以被创建的colormap的特征
Read/WriteColomap不可共享
Read-OnlyColormap 可在client间共享
XAllocColor当是Read/WriteColormap时,返回指定RGB值对应的Pixel。当是Read-Onlycolormap时,返回最接近指定RGB值对应的Pixel。
9keyboard
keycode -> keysym -> string
XLookupString()用来翻译keycode
XComposeStatus用来键盘输入了不存在
XKeyEvent->keycode按键码
XKeyEvent->statemodifier keys状态
9.2The Pointer
三种获取指针轨迹的方法。
1.抓取所有MotionEvent
2.通过XQueryPointer获得指针当前位置
3.XGetMotionEvents获取轨迹历史,可以获得两个时间段之间的指针轨迹。并不是所有server都支持
XGrabKeyboard()捕捉模式 GrabModeAsyncGrabModeSync
GrabModeSync使用XAllowEvents允许时间发送。
12Atom
12.4Selections
应用程序间交换数据的方法,采用传统的IPC只能假设所有应用程序位于本机。而X的客户端可能位于不同的主机。
selections分为两个角色:requestorowner
selection交互步骤如下:
1.一端使用SetSelectionOwner获得指定selection的拥有全,同一时刻仅有一个窗口可以获得selection,失去selection的窗口将获得SelectionClear(XSelectionClearEvent)事件
2.XConvertSelection来请求获得selectiond的数据,可以指定要获得数据的格式(通过atom来标识),请求后owner将获得SelectionRequest事件,获得XSelectionRequestEvent结构体
3.owner将数据放入XSelectionEvent结构,并通过XSendEvent向requestor发送SelectionNotify事件。如果property成员为none则表示数据交换失败。
系统默认有XA_PRIMARYXA_SECONDARY
12.5Cut Buffers
就是screen0上的root窗口的属性,XA_CUT_BUFFER0到XA_CUT_BUFFER7。可通过PropertyChangeMask监测数据变化。