Selections:是X11定义的最基本的用来在X Client间交换信息的机制,例如,在两个窗口间进行数据的剪切和粘贴。在X Server上可以有任意多个Selections,Selection用atom来标识,在server范围内有效。每个Selection被一个client拥有,并和一个窗口相关联。Selections用来在owner和requestor间通信,owner保存有selection的数据,requestor会接收数据。一个requestor通过提供以下数据来获得selection的数据:
1、 selection的名字
2、 属性名
3、 窗口
4、 数据类型(用atom描述)
5、 一些参数(可选)
如果selection有owner,则owner会收到一个事件,并需要完成以下过程:
1、 将selection的内容转换成被请求的数据类型
2、 将数据放在指定窗口的指定属性里
3、 给requestor发送一个事件通知属性已经准备好
一个Client通过SetSelectionOwner函数来获得一个selection的所有权。指定该selection的owner为一个窗口。
实现_XSETTINGS_SETTINGS机制的两个selection分别是_XSETTINGS_SETTINGS与_XSETTING_SN
1、 将_XSETTINGS_SN的owner设置成一个窗口,所有关心_XSETTINGS_SETTINGS的程序通过GetSelectionOwner函数获取_XSETTINGS_SN的窗口ID,然后通过XSelectInput函数订阅在该窗口上的PropertyNotify事件
2、 需要修改_XSETTINGS_SETTINGS属性的client,通过XChangeProperty修改_XSETTINGS_SN的owner窗口上的_XSETTINGS_SETTINGS属性,这样,所有订阅了该窗口的PropertyNotify事件的client都会接收到该事件,
3、 ,当接收到该窗口的PropertyNotify事件后,通过XGetWindowProperty获取到修改后的_XSETTINGS_SETTINGS属性并应用
综上所述:_XSETTINGS_SN的主要作用是为不同的SCREEN提供一个owner窗口,所有关心_XSETTINGS_SETTINGS的client都能通过获取_XSETTINGS_SN的owner窗口来订阅同一个窗口上的PropertyNotify事件。而修改_XSETTINGS_SETTINGS的client也会通过修改在该窗口上的属性来通知所有其他窗口应用设置。
Property:窗口属性,是一个字符串,用atom来标识
XChangeProperty可以用来修改属性,也可以用来创建属性
Xprop可以查看一个窗口的属性
Atom:Atom是一个ID,标识一个字符串,该字符串存在于X Server上,因为字符串长度不固定,并且可能会很长,在客户端和服务器间传递会很不方便,因此,使用atom来标识,atom实际上是一个32位值。XInternAtom函数用来创建一个字符串,并返回标识该字符串的atom。
xlsatom命令可以查看所有的atom