Xlib 学习笔记
第一章
1.2 X Window System概念
display: 由键盘,鼠标和一个或多个屏幕组成的一个工作站
screen:一个display可以有多个screen
server-client模型:
窗口管理器
事件
X扩展
第二章 X概念
x协议:
请求消息
回复消息:需要回复的请求比较浪费资源,需要等待网络传输
事件:
错误:
缓冲:
xlib会保存请求来使客户端持续运行不至于等待网络传输。
引起发送缓冲情况有:
调用等待事件函数但事件队列中没有匹配的事件,如:XNextEvent
客户端调用从服务器获得信息的函数,Query Fetch Get类函数
客户端强制刷新缓冲 XFlush XSync
资源
为了减少网络传输,x为每个抽象事物使用一个唯一id进行标识(window, gc, etc),也就是atom
properties和atoms
property是每个window拥有的一组属性。atom用来标识每个property,可通过XInternAtom()获得atom。XA_为前坠的宏代表内置的atom
窗口管理器:
substructure redirection。substurcture引用大小,位置,子窗口z序。redirection代表对窗口配置改变的请求。请求由窗口管理器决定是否实施。
Window
Window Characteristics:
父窗体:每个窗体都有父窗体,除了root window。
窗体坐标系统:以窗体左上角为原点
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。顶层窗口被映射时,窗口的显示可能延迟,需要等待window manager决定。应用程序应该等到第一个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
bit gravity 当窗体变化时决定窗体内容如何被保留
window gravity 当窗体变化时子窗口如何重新定位
backing store 当重提被覆盖时,窗体内容是否被自动保存,需要xserver支持。DoesBackingStore()用来检查是否支持
Saving Under 用于popup菜单,当窗体被popup类窗口覆盖时,是否保存被覆盖内容,xserver不一定支持;DoesSaveUnders()来检查
events 指定接收的时间
substructure redirect override 是否需要wm干扰
colormap 指定窗体的virtual colormap
cursor 指定指针
2.4.2窗体配置
指坐标,高宽,边框宽度,z-order。与属性不同,他们有wm进行干扰
2.4.4depth和visual
depth就是plane数量,inputonly窗口depth总是0
2.5事件
do_not_propagate_mask 指定事件不再向父窗口传递
2.6 x编程
错误处理
三类错误:
检测创建服务资源的函数返回值
编程引起的协议错误 (错误的atom) XErrorHandler
重大系统错误,死机或网络错误 XIOErrorHandler
程序退出
WM_PROTOCOLS 协议
指定应用程序参与WM_PROTOCOLS协议
Atom wmProtocols = 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
5 GC
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.5 Graphics Tricks
plane_mask: 指定一个像素当中,哪些位可以被设置。
function: 指定对像素赋值时所使用的方式,是一些位逻辑操作
5.6 Graphics Exposure
graphices_exposures: 设置为true 将导致使用XCopyArea/XCopyPlane时会发送 GrapicsEcpose 和 NoExpose 事件,这些事件无法通过XSelectEvent进行设置
5.7 subwindow_mode: 指定如果有子窗口阻挡的位置是否绘画。
6 绘图
6.1.1 请求限制: XDrawLines, XDrawPoints....有绘画数量限制,可通过XMaxRequestSize()获得限制
6.1.6 XCopyArea XCopyPlane
XCopyPlane可以用来将bitmap复制成相应的位深的pixmap
6.2 Fonts and Text
XFontStruct 描述整个字体
XCharStruct 描述单个字符
字体的原点不位于左上角,位于baseline
ascent 从bashline开始最高高度
descent 从bashline开始最低高度
direction 字体方向
default_char 不存在的字符默认图形
min_bounds最小字符尺寸
max_bounds最大字符尺寸
XDrawImageString 用背景色填充
XGetFontProperty 等到更多字体细节属性
6.2.10 XFreeFontPath XGetFontPath XSetFontpath 设置字体搜索路径
6.3 Regions
用来设置gc中的clip_mask
6.4 Image
在client和server之间传输image
XGetImage,从server端获得图片,在对图片进行操作之前需要将图片的字节序和位序转换成client的
XPutImage,不需要转换字节序和位序,XPutImage会做这件事
7 Color
Colormap 颜色表 由ColorCell组成,ColorCell的编号成为Pixel, Pixel的每一个bit成为Plane.
Xcms: X Color manager system 用来定义string对应的颜色,支持多种颜色描述方法
Colormap
colormap中每个colorcell可以被单独的修改。有些硬件当中仅支持同一时刻只有一个colormap。X提供virtual colormap的概念,virtual colormap通过窗口管理器换进换出
Visual 描述可以被创建的colormap的特征
Read/Write Colomap不可共享
Read-Only Colormap 可在client间共享
XAllocColor 当是Read/Write Colormap时,返回指定RGB值对应的Pixel。当是Read-Only colormap时,返回最接近指定RGB值对应的Pixel。
9 keyboard
keycode -> keysym -> string
XLookupString()用来翻译keycode
XComposeStatus用来键盘输入了不存在
XKeyEvent->keycode 按键码
XKeyEvent->state modifier keys状态
9.2 The Pointer
三种获取指针轨迹的方法。
1.抓取所有MotionEvent
2.通过XQueryPointer获得指针当前位置
3.XGetMotionEvents获取轨迹历史,可以获得两个时间段之间的指针轨迹。并不是所有server都支持
XGrabKeyboard() 捕捉模式 GrabModeAsync GrabModeSync
GrabModeSync使用XAllowEvents允许时间发送。
12 Atom
12.4 Selections
应用程序间交换数据的方法,采用传统的IPC只能假设所有应用程序位于本机。而X的客户端可能位于不同的主机。
selections分为两个角色:requestor owner
selection交互步骤如下:
1.一端使用SetSelectionOwner获得指定selection的拥有全,同一时刻仅有一个窗口可以获得selection,失去selection的窗口将获得SelectionClear(XSelectionClearEvent)事件
2.XConvertSelection来请求获得selectiond的数据,可以指定要获得数据的格式(通过atom来标识),请求后owner将获得SelectionRequest事件,获得XSelectionRequestEvent结构体
3.owner将数据放入XSelectionEvent结构,并通过XSendEvent向requestor发送SelectionNotify事件。如果property成员为none则表示数据交换失败。
系统默认有XA_PRIMARY XA_SECONDARY
12.5 Cut Buffers
就是screen0上的root窗口的属性,XA_CUT_BUFFER0到XA_CUT_BUFFER7。可通过PropertyChangeMask监测数据变化。