Wayland协议的理解就是对wayland的协议文件xml的理解。
Wayland是一种窗口管理协议.它的协议都定义在wayland.xml文件里面, 协议其实就是定义一组一组的接口.包含关系如下:
Interface 接口 比如: wl_shm
{
}
其中请求,是在服务器端需要实现的接口,在客户端调用。而事件是在服务器端调用,在客户端实现的接口。而枚举是当前接口提供的带有具体含义的常量值。这些定义,一般都有一项xml值来描述其功能含义。(比如: description/ summary)
因此, wayland协议文件xml里面就是由多个interface接口组成。
然后再详细分析:
请求和事件都是定义的函数接口,既然是函数,那么肯定就会涉及到参数,因此,在request/event的xml项内,包含子项arg,就是描述该请求的参数(注意:所有的request/event函数都有默认参数,request的默认参数有两个,一个是指示调用该接口的客户端指针,一个是指示接口信息的参数; event的默认参数有一个,就是该event所在的interface的指针,和this指针作用类似。默认参数是不会在xml协议文件中写出来,阅读的时候需要自己注意),参数包括多项: 参数的名字, 参数的类型,参数的功能描述, 如果参数类型是object,那就还有一项标明该object是哪一个interface的object(interface即wayland协议定义的接口), 然后还有一项标明该object是否可以为空。
参数详解:
Wayland 函数的参数类型只有8种:
* * `i`: int
* *`u`: uint
* * `f`: fixed
of integerprecision and 8 bits of decimal precision. Consider `wl_fixed_t` as an opaquestruct with methods that facilitate conversion to and from `double` and `int`types.)
* *`s`: string
* *`o`: object
* * `n`: new_id
* *`a`: array
* *`h`: fd
核心:wayland协议创建的对象都是客户端和服务器端各一份。然后用同一个ID索引进行关联,存放在wayland的数据结构w_map里面。客户端的那一个相当于代理,服务器端的那一个才是实际的对象。(还有一个特点,客户端创建的对象其实不管是什么对象,全都是wl_proxy, 而服务器端的是wl_resource,然后wl_resource结构体可以存放一个实际的对象的指针)
总结:在wayland的实现里面,任何的对象都肯定是某一个接口返回回来的,是不能通过用户直接创建出来,就是因为,这些对象都需要通过内部的处理,来进行客户端和服务器端的映射绑定。并且,所有的接口都只是声明的一个名字,而没有实体的结构定义。
如2.2所说,基于wayland协议写的客户端,所有的对象都必须通过接口来创建。因此肯定有第一个wayland对象,那就是wl_display对象。然后通过这个对象可以获取一系列的全局对象。这些全局对象就是wayland服务端提供的服务接口。Wayland基本就是通过这些全局对象一步步展开,生成各种需要的对象。完成客户端功能。
Wayland 协议的窗口是通过客户端来绘制好,然后服务器端拷贝到显存里面去。
其中 wl_shell 被官方描述,可能被xdg_shell取代。当然wl_surface就被xdg_surface取代。
文字描述为:
首先客户端创建wl_display对象,然后通过这个wl_display对象提供的功能请求,获取全局对象wl_registry的注册器,注册器可以获取到wl_compositor、wl_shell、wl_shm等全局的接口。 然后通过wl_compositor可以创建wl_surface(用来依附wl_buffer), wl_shm可以创建wl_shm_pool, 然后通过wl_shm_pool创建wl_buffer(真正的绘制内存)。最后wl_shell 创建wl_shell_surface(真正用来展示窗口(内容就是wl_surface))。