[other] 关于Wayland学习之——基础篇2
Tofloor
poster avatar
PurestAsh
deepin
2024-04-24 11:22
Author

通信方式:

应用程序(client)和wayland compositor之间通过unix domain socket通信。

通信步骤(大概):

  1. compositor先启动,在系统目录下生成一个"wayland-0"的socket文件
  2. 然后应用程序启动,首先向compositor发connect请求,尝试连接到"wayland-0"。
  3. compositor收到请求后,会返回给client一个全局对象列表,每个全局对象都代表着不同的功能。
  4. 应用程序收到响应之后,开始使用egl向显存绘制图像。
  5. 写完之后,使用前面获取到的全局对象,再发一个请求给compositor,告诉他当前图像在显存中的句柄。
  6. compositior收到所有client发过来的图像句柄后,在显存中进行合成,压成一个帧。然后通知显卡显示。

关于请求和响应:

0000000A Object ID (10)
00180002 Message length (24) and request opcode (2)
00000000 X coordinate (int): 0
00000000 Y coordinate (int): 0
00000100 Width (int): 256
00000100 Height (int): 256

一个简单的client发给compositor请求包含请求头和请求体,跟http协议类似,不过是基于socket之间的二进制方式。

请求头包含:对象ID(Object ID),请求长度(Message Length),操作码(opcode)。

请求体:一般由操作码决定。操作码需要哪些参数就给那些,比如这个操作码就需要4个参数,x,y坐标,长度和宽度。

相应也和请求类似。

操作码可以理解为对象里面的方法。这里,操作码为2,就表示要调用compositor中对象ID为10的第3个方法。

所以,compositor和client之间的通信,可以理解为相互调用对方对象的方法。

关于对象和操作码:

对象和操作码由wayland.xml协议文件定义,或者说描述。

再由各compositor实现(比如:kiwn,hyperLand等)。

关于扩展:

除了wayland.xml,这个核心协议。里面定义的一些核心对象和方法外。

还有一些扩展。一个比较重要的扩展是xdg-shell.xml。

这些扩展里面的对象也是通过全局对象的方式暴露给client的。

这个扩展里面有一个比较重要的对象 xdg_wm_base

从这个对象的名字不难猜出,“wm” 就是window manager的缩写。

他的主要功能是给client的图像外围包裹一个窗口,然后在窗口的右上角加上最大化,最小化,关闭,这些按钮。

如果使用client使用了这个对象和compositor进行通信,那么应用程序就和我们日常看到的一样啦!

所以一般client都会使用这个xdg-shell这个扩展。

所以不同compositor对这个扩展的实现,决定了不同的窗口样式风格。

比如hyperland这些平铺式的,就没有最大化,最小化,关闭这些按钮。

再比如:比如kwin风格。gnome风格等。

Screenshot777.png

欢迎指正!!

书籍:wayland-book

Reply Favorite View the author
All Replies
👀偷偷观察
deepin
2024-04-24 14:42
#1

看了你这个我算是明白这个《卡姆破贼特儿》 了,

compositor 收到所有client发过来的图像句柄后,在显存中进行合成,压成一个帧。然后通知显卡显示。

Reply View the author
PurestAsh
deepin
2024-04-24 16:34
#2
👀偷偷观察

看了你这个我算是明白这个《卡姆破贼特儿》 了,

compositor 收到所有client发过来的图像句柄后,在显存中进行合成,压成一个帧。然后通知显卡显示。

哇!是官方!!

Reply View the author
👀偷偷观察
deepin
2024-04-24 17:17
#3
PurestAsh

哇!是官方!!

你认错了吧,我不是官方,你也可以叫deepin懒洋洋

Reply View the author