十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

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

The Wayland Protocol —新手入门学习(二) 目录1、wayland协议理解2、wayland.xml1解析上面的xml可以分为以下标签2Wayland协议文件还有以下标签3Wayland的标签解释4实例解释5“翻译”The Wayland Protocol —新手入门学习一1、wayland协议理解Wayland 是一个为了替代 Xorg 服务而设计和构建的用于类 Unix 系统的下一代显示服务。并自称是将应用程序窗口显示在用户屏幕上的最佳方法。Wayland协议通俗来讲就是一个定义怎么来进行窗口管理的协议。窗口管理讲的是什么我们了解在Windows操作系统上有很多很多的应用程序我们去启动应用程序之后一般会弹出一个该应用程序的窗口。我们在创建窗口的时候都是必须调用指定的接口才可以创建这个接口就相当于窗口管理的协议提供的一个接口。各种各样的接口在不同的操作系统上是不一样的如果我们要创建窗口在不同的操作系统上就需要不同的代码因此跨平台就是件很麻烦的事情。然而在这种情况下涌现出了大量跨平台的框架他们把和操作系统相关的创建窗口的接口封装了起来然后通过提供统一的接口给用户。这样一来用户就可以使用相同的代码在不同的操作系统上创建出窗口比如Qt等。为什么我们需要窗口管理 我们都知道窗口都是通过显示器来显示给我们看的然后通过鼠标键盘等外设来操作的但这些东西都只有一份如果现在有两个进程都需要显示出来他们都去争夺这个显示屏去绘制最终出来不就是花屏吗因为这两个进程是不知道对方的存在不知道对方现在占用了哪里因此需要一个东西来协调才能让多个进程完美的同时显示出来这个就是窗口管理的作用。2、wayland.xmlWayland 协议通过 XML 文件进行定义。如果定位到并在编辑器中打开了 wayland.xml 文件你将会发现 Wayland 核心协议的 XML 规范。这是一个高级协议。git clone https://gitlab.freedesktop.org/wayland/wayland.gitwayland是一种窗口管理的协议它和x11协议是同等的。那么是什么样的协议呢如下上面的片段是从wayland.xml里面截取出来的以此来介绍。 Wayland的核心协议全部在这个wayland.xml这个xml文件里面。也有很多wayland的扩展协议是为了实现一些其他目的而添加当然如果我们学了这些协议也可以自己添加一些协议内容。然后去实现一些功能。1解析上面的xml可以分为以下标签Interface 接口用于事先定义请求和事件的列表与每个请求相关联的操作码和解码消息所需的签名也都来自于其。Request 客户端使用它来表示表层的某些部分已经更改并需要重新绘制。请求客户端主动调用的接口实际就是个函数。Event请求是对于客户端到服务端而言的反之服务端可以给客户端发回送事件消息。事件服务器端主动调用的接口实际就是个函数。2Wayland协议文件还有以下标签Description 描述可能是接口的描述,请求的描述事件的描述等。Arg 参数请求或者事件的参数。Enum 枚举用来更形象的代表一些值。Entry 枚举的成员。3Wayland的标签解释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指针一样。告诉是哪个具体对象调用的这个接口。
返回列表