The Wayland Protocol —新手入门学习(二)

目录 

1、wayland协议理解

2、wayland.xml

(1)解析上面的xml可以分为以下标签

(2)Wayland协议文件还有以下标签

(3)Wayland的标签解释

(4)实例解释

(5)“翻译”


The Wayland Protocol —新手入门学习(一)

1、wayland协议理解

        Wayland 是一个为了替代 Xorg 服务而设计和构建的,用于类 Unix 系统的下一代显示服务。并自称是将应用程序窗口显示在用户屏幕上的最佳方法。

        Wayland协议,通俗来讲就是一个定义怎么来进行窗口管理的协议。窗口管理讲的是什么?我们了解在Windows操作系统上有很多很多的应用程序,我们去启动应用程序之后,一般会弹出一个该应用程序的窗口。我们在创建窗口的时候都是必须调用指定的接口才可以创建,这个接口就相当于窗口管理的协议提供的一个接口。

        各种各样的接口在不同的操作系统上是不一样的,如果我们要创建窗口,在不同的操作系统上就需要不同的代码,因此,跨平台就是件很麻烦的事情。然而,在这种情况下,涌现出了大量跨平台的框架,他们把和操作系统相关的创建窗口的接口封装了起来,然后通过提供统一的接口给用户。这样一来,用户就可以使用相同的代码在不同的操作系统上创建出窗口,比如Qt等。

        为什么我们需要窗口管理, 我们都知道,窗口都是通过显示器来显示给我们看的,然后通过鼠标键盘等外设来操作的,但这些东西都只有一份,如果现在有两个进程都需要显示出来,他们都去争夺这个显示屏去绘制,最终出来不就是花屏吗?因为这两个进程是不知道对方的存在,不知道对方现在占用了哪里,因此,需要一个东西来协调才能让多个进程完美的同时显示出来,这个就是窗口管理的作用。

2、wayland.xml

        Wayland 协议通过 XML 文件进行定义。如果定位到并在编辑器中打开了 "wayland.xml" 文件,你将会发现 Wayland 核心协议的 XML 规范。这是一个高级协议。

git clone https://gitlab.freedesktop.org/wayland/wayland.git

wayland是一种窗口管理的协议,它和x11协议是同等的。那么,是什么样的协议呢?如下: 

         上面的片段是从wayland.xml里面截取出来的,以此来介绍。 Wayland的核心协议全部在这个wayland.xml这个xml文件里面。也有很多wayland的扩展协议,是为了实现一些其他目的而添加,当然,如果我们学了这些协议也可以自己添加一些协议内容。然后去实现一些功能。

(1)解析上面的xml可以分为以下标签

Interface :接口用于事先定义请求和事件的列表,与每个请求相关联的操作码和解码消息所需的签名也都来自于其。
Request :客户端使用它来表示表层的某些部分已经更改并需要重新绘制。请求,客户端主动调用的接口,实际就是个函数。
Event:请求是对于客户端到服务端而言的,反之服务端可以给客户端发回送事件消息。事件,服务器端主动调用的接口,实际就是个函数。

(2)Wayland协议文件还有以下标签

Description :描述,可能是接口的描述,请求的描述,事件的描述等。
Arg :参数,请求或者事件的参数。
Enum :枚举,用来更形象的代表一些值。
Entry :枚举的成员。

(3)Wayland的标签解释

        Wayland协议就是通过这样一个文件(wayland/protocol/wayland.xml):描述一个客户端和服务器端相互知道的调用接口。 转换成C++的方式来理解这些肯定会容易一些。

        首先,这些标签是有包含关系的,一个wayland协议xml文件里包含一个或多个interface,一个interface里面可能包含一个或多个request和event,,有些可能包含enum,也可能没有,根据实际情况。其中最简单的enum最终就是直接转换成C语言的枚举类型,Entry即是它的成员。

(4)实例解释

eg1:

        wayland.xml协议文件里面定义一个类wl_buffer,该类的作用可以通过description标签的描述知道。然后,该类有两个成员函数,一个是request(destroy),还有一个event(release)。这两个函数也可以通过description标签的描述该函数的作用。

eg2:

        一个函数定义的组成一般都有参数,这个arg标签就是用来描述参数的,所以有些request和event包含arg标签,用来描述他的参数。

一个参数可能有5个属性:

Name (参数的名字)
Type (参数的类型)
Interface (参数的类型)

Allow-null (是否可以为空)
Summary (描述参数是做什么的)

通过上面的解释来分析buffer、x、y这个参数:

1、buffer 是一个wl_buffer类型的指针参数。名字是buffer,并且这个指针可以为空, 对这个指针参数的描述是” buffer of surface contents”。

2、X是一个int类型的参数,名字是x,,对这个参数的描述是” surface-local x coordinate”。

3、Y是一个int类型的参数,名字是y,对这个参数的描述是” surface-local y coordinate”。

(5)“翻译”

        最后把上面的xml翻译成:

 attach(wl_buffer *buffer, int x, int y),

        这样有点问题,一个函数必须有返回值,但是wayland协议里面没有描述返回值的,因此,大部分函数的返回值都是void,这个就是有一种arg类型是new_id的会作为函数的返回值类型。因此上面的函数最终会转换成:

void wl_surface_attach(struct wl_surface *wl_surface, struct wl_buffer *buffer, int32_t x, int32_t y)

        问:为什么又多了个参数?        

        答:wayland协议在翻译协议文件的时候,会给所有的函数添加一个默认的参数,就是它所在的interface,作为第一个参数传入进去,就相当于给一个类成员函数传递this指针一样。告诉是哪个具体对象调用的这个接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ITC小浪花、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值