XWayland开发入门系列1:运行测试程序

系列索引地址:X11/Wayland开发入门系列教程索引

上一篇:XWayland开发入门系列0:说明

先运行一下看看实际运行效果

先准备一个Linux环境,我的是Ubuntu 20.04.2 LTS。

Wayland under X

Weston是Wayland提供的示例程序。

Ubuntu下安装:

1
sudo apt install weston

效果为:

weston

独立运行

将环境切换到tty2,或者其他的tty。

一般Ctrl+Alt+F[1-7]表示切换到tty[1-7]。

ttye3

然后执行

1
weston-launch

效果为:

launch

这时左上角的按钮可以使用了,点击后会出现新终端界面。

可以看到weston实现了一个完整的桌面,而桌面中可以打开软件(普通系统状态下默认的终端)。

本系列就是探索和实现Weston的所有可能的功能,最后会试探着实现桌面级的窗口管理器(好像窗口管理器就是桌面级的)。

编译运行

本系列文章会逐步实现Weston的功能,为了方便调试,需要了解如何编译运行,以便边开发边查看开发效果。

此部分译自:https://wayland.freedesktop.org/building.html

大多数主要的Linux发行版现在在其包管理系统中包括Wayland和Weston的版本。

您也可以自己手动构建。下面的说明是作为指南提供,但需要适应您正在使用的Linux系统。下面的说明假设我们对git、pkg-config、meson以及构建和运行实验软件有些熟悉。

Wayland是用meson建造的。如有必要,最新的weston可以以用户安装:

1
pip3 install --user meson

Pip3将meson安装在~/.local/,因此如果还没有添加就需要将~/.local/bin添加到PATH环境变量中。

硬件/驱动

X输出需要DRI2。X之外的输出需要使用页面翻转ioctl的DRM和内核模式设置(KMS)。所有开源驱动程序都支持这些功能。

设置环境变量

安装到自定义位置

如果不想安装系统范围内的安装,则需要设置以下环境变量,以便适当地链接各种库:

1
2
3
4
export WLD=$HOME/install   # change this to another location if you prefer
export LD_LIBRARY_PATH=$WLD/lib
export PKG_CONFIG_PATH=$WLD/lib/pkgconfig/:$WLD/share/pkgconfig/
export PATH=$WLD/bin:$PATH

不要将LD_LIBRARY_PATH设置为默认值,它会搞破坏。

您可以将上述内容放在一个脚本中,并在您希望构建的终端中获取软件包。

安装到系统目录

要安装到系统范围内,您需要以不同的方式设置WLD,向每个meson调用添加一些开关,并在安装步骤中使用子组件。根据您的分发和架构选择列表目录(可以是/usr/lib32或/usr/lib64)。

1
2
3
4
5
6
export WLD=/usr
...
meson build/ --prefix=$WLD --libdir=/usr/lib --sysconfdir=/etc
ninja -C build/
sudo ninja -C build/ install
...

Wayland库

这是必需的,以能够编译meson与wayland EGL平台。

1
2
3
4
5
git clone https://gitlab.freedesktop.org/wayland/wayland.git
cd wayland
meson build/ --prefix=$WLD
ninja -C build/ install
cd ..
  • 您可以使用-Ddocumentation=false避免Doxgen依赖关系。
  • 在Arch Linux下,在构建文档时将需要DocBook依赖关系。这些文件包括文档本xml和文档本xsl。

Wayland协议

这包含了一组添加Wayland核心协议中不可用的功能的协议。

1
2
3
4
5
git clone https://gitlab.freedesktop.org/wayland/wayland-protocols.git
cd wayland-protocols
meson build/ --prefix=$WLD
ninja -C build/ install
cd ..

Mesa

Mesa EGL和Mesa Vulkan堆栈支持Wayland。Weston的硬件加速(gl-renderer)依赖于EGL GBM平台。许多Wayland应用程序,包括一些Weston demos,依赖于EGL Wayland平台。

有关编译Mesa,请参阅上游建造说明。当配置Mesa以充分利用Weston时,请确保启用了OpenGL ES2和GBM,并且包含wayland的EGL平台。

如果您计划编译XWayland,您可能需要安装它现在需要的任何依赖项。因此,Mesa使用了与xwayland相同的头文件。

libinput

Libinput将evdev事件转化为Wayland事件。它已经从Weston分离出来,以便代码可以被Linux上的任何Wayland合成器重用。前往libinput docs,以获取关于如何编译它的说明。

Weston和示例程序

Weston是一个Wayland合成器的参考实现。它可以在Wayland仓库中找到,并带有一些演示应用程序。

Weston的Meson构建不进行自动检测,它默认启用了所有功能,这意味着您可能在第一次尝试时丢失了依赖项。如果可以通过构建选项避免依赖项,则错误消息应该告诉您可以使用什么选项来避免它。如果要避免某些依赖项,则可能需要禁用多个特性。

1
2
3
4
5
git clone https://gitlab.freedesktop.org/wayland/weston.git
cd weston
meson build/ --prefix=$WLD
ninja -C build/ install
cd ..

meson命令将填充build目录。此步骤可能会由于缺少依赖项而失败。您想要的任何构建选项都可以添加到这一行上,例如meson build/ -prefix=$WLD -Dsimple-dmabuf-drm=intel。所有的构建选项都可以在文件meson_options.txt中找到。

一旦成功填充了构建目录,您就可以使用meson configure build/来检查配置。如果您需要更改一个选项,您可以这样做,例如meson configure build/ -Dsimple-dmabuf-drm=intel

运行Weston

Weston在所需的环境变量$XDG_RUNTIME_DIR指定的目录中创建其unix套接字文件(例如,wayland-0)。客户端使用相同的变量来找到该套接字。这是由一些发行版(Fedora,Arch自2012年6月或Exherbo)提供的。Ubuntu开始在Quantal版中提供它。Gentoo不提供。

如果$XDG_RUNTIME_DIR没有自动为您设置,您可以设置rundird或pam_rundir。

可选地,复制weston.ini文件并编辑它,以设置您喜欢的背景图像:

1
2
3
mkdir -p ~/.config
cp weston/weston.ini ~/.config
$EDITOR ~/.config/weston.ini

如果设置了$DISPLAY,那么Weston将在一个窗口中的X下运行,并从X中获取输入。通过输入以下方式运行合成器:

1
weston

否则(在X之外),它将在KMS/DRM框架缓冲区上运行,并从evdev设备中获取输入。

如果登录不可用,直接运行Weston将无效。在这种情况下,将需要一个特权助手,weston-launch。它需要setuid-root。

要运行客户端,顶部栏中的第二个按钮将运行weston-terminal,您可以从那里运行客户端。当在硬件上运行时,也可以从不同的VT运行客户端,或者如果在X下运行,则可以从xterm运行客户端。在韦斯顿构建目录中有一些演示客户端可用,但它们都非常简单,主要用于测试wayland协议中的特定特性:

  • “weston-terminal”是一个简单的终端模拟器,不是很兼容但工作得足够好的bash
  • “weston-flower”在屏幕上画了一朵花,测试框架协议
  • “weston-gears” wayland的glxgears
  • “weston-smoke”测试SHM缓冲区共享
  • “weston-image”加载在命令行上传递的图像文件并显示它们
  • “weston-view”对pdf文件也有同样的作用
  • “weston-resizor”显示窗口大小(使用上下键)
  • “weston-eventdemo”报告libtoytoolkit的事件到控制台(参见weston-eventdemo --help)

可选的环境变量,这将为您获得更多的调试输出:

1
2
3
4
export MESA_DEBUG=1
export EGL_LOG_LEVEL=debug
export LIBGL_DEBUG=verbose
export WAYLAND_DEBUG=1

下一篇:XWayland开发入门系列2:库安装配置与介绍