Xlib 学习笔记

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()获得atomXA_为前坠的宏代表内置的atom

窗口管理器:
  substructure redirection
substurcture引用大小,位置,子窗口z序。redirection代表对窗口配置改变的请求。请求由窗口管理器决定是否实施。

Window
Window Characteristics:
  
父窗体:每个窗体都有父窗体,除了root window
  
窗体坐标系统:以窗体左上角为原点
   window
配置包含: 高和宽,边框宽度,位置xyz序。
   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
是一部分可绘画的内存。pixmapwindow都是drawable
XCreatePixmap
创建

drawing
gc

tiles
stipples
tiles
, 一个pixmap用来重复贴图
stipples
,一个1depthpixmap,用来做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,仅使用foregroundbackground进行填充


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

   在clientserver之间传输image

   XGetImage,从server端获得图片,在对图片进行操作之前需要将图片的字节序和位序转换成client

   XPutImage,不需要转换字节序和位序,XPutImage会做这件事


7 Color

Colormap 颜色表 由ColorCell组成,ColorCell的编号成为Pixel, Pixel的每一个bit成为Plane.


Xcms: X Color manager system
用来定义string对应的颜色,支持多种颜色描述方法

Colormap

colormap中每个colorcell可以被单独的修改。有些硬件当中仅支持同一时刻只有一个colormapX提供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结构,并通过XSendEventrequestor发送SelectionNotify事件。如果property成员为none则表示数据交换失败。

系统默认有XA_PRIMARY XA_SECONDARY

12.5 Cut Buffers

就是screen0上的root窗口的属性,XA_CUT_BUFFER0XA_CUT_BUFFER7。可通过PropertyChangeMask监测数据变化。



你可能感兴趣的:(XWindow)