在介绍这些类的时候我必须给大家把wayland的interface分个类.
- Global Object, 我把它叫做服务类, 就是提供给客户端各种功能的接口. 就相当于是说,对于客户端来说,我给你提供了哪些服务,你就只能通过这些服务来进行各种操作,因此,服务越多,肯定功能越多.服务类,根据实际情况是不一样的,并且可以根据需要服务端再添加更多的服务,wayland标准提供的服务接口有以下一些:
- wl_compositor
- wl_shm
- wl_shell
- wl_seat
- wl_output
- wl_subcompositor
- wl_data_device_manager
- 依赖服务创建的接口类. 为什么这么说呢? 因为这样的接口对象,都是通过服务类提供的接口产生的.
理解wayland就要明白, wayland的所有对象都是道生一,一生二,二生三,三生万物. 通俗一点,就是wayland给你提供了道(wl_display), 后续的所有对象都是基于它产生的. 你最终能产生多少对象完全看你怎么去发挥了。
- wl_display
这个是wayland协议的核心类,它作为客户端的标识,一个wl_display对象代表着一个客户端,因为这个对象建立了和wayland服务器通信的socket,所有和服务器交互都是通过这个socket。这个也是客户端必须第一个创建的wayland对象。也就是我上面所说的‘道’。
wl_display接口类提供了两个请求函数,和两个事件函数。前面我说过了,关于什么是请求和事件。但是,对于wl_display这个接口对象,它的事件处理函数,是wayland源码里面提供的。用户在不修改源码的情况下,是不能再设置的。接下来说说这几个函数:
- sync,这个请求函数的作用是返回一个wl_callback对象,这个对象有个事件release,是当服务器端处理你这个sync请求后主动调用的,也就是说,当你调用sync之后,你设置了release事件处理函数,那么当你的release处理函数被调用的时候,就代表你当前的请求已经得到响应了。这个接口的作用是提供客户端一个确认你前面所有的请求都被处理的保证。(wayland有个接口wl_display_roundtrip就是利用了这一点,因此,你完全可以自己实现这个功能,通过这个请求。)
- get_registry,这个请求基本是客户端调用的第二个wayland函数(第一个是获取wl_display的函数),然后返回一个wl_registry对象,这个对象是干什么的?这个对象就是可以告诉你,wayland服务器端给你通过了哪些你可以使用的服务。这些服务才是你创建wayland窗口的核心。
- error, 这个函数是在服务器端向客户端报错用的。
- delete_id,这个接口是在服务器端删除客户端对象的时候用的,目的是告诉客户端,某一个对象可以安全的delete了。
- wl_registry
这个也是wayland的核心类,这个类对象通过wl_display的请求函数得到,然后服务器端收到这个请求之后就会传递给客户端,目前可以使用的所有服务信息。客户端再根据自己的需要,通过bind这个请求函数得到服务的对象,就可以使用这些服务提供的接口了。
- bind