Qt Wayland Compositor

Qt Wayland Compositor 是一个模块,它提供了基于 Wayland 协议的方便且强大的 QML 和 C++ API,用于开发自定义显示服务器。显示服务器(通常称为合成器)显示支持 Wayland 协议的客户端应用程序的内容。

Wayland 的设计理念是保持核心协议简单和最小化。开发者可以使用案例特定的扩展来扩展此核心协议。Qt Wayland Compositor 默认支持许多常见扩展,并且还提供了 API 以便创建新的、定制的扩展。

通常,使用 Qt Wayland Compositor 编写的合成器成为更大应用程序管理进程的子系统。Qt Wayland Compositor 提供了与客户端通信的 API 以及在屏幕上显示其内容的 API。QML API 包含高级 API,可以轻松集成到 Qt 的其他功能中,通过 Qt Quick 实现方便的动画、效果和 UI。还提供了 C++ API,如果您需要更底层的访问。

应用程序管理器通常会实现额外的功能,例如应用生命周期、虚拟键盘输入、安全和进程间通信 (IPC)。Qt 提供了 API,可用于在其他模块中开发应用程序管理器剩余的部分。《Qt Automotive Suite》提供了 Qt 应用程序管理器,这是一个完整的应用程序管理器,包括使用 Qt Wayland Compositor 开发的合成器。

有关 Wayland 的更多信息,请参阅Wayland 和 Qt

Qt Wayland Compositor 功能

Qt Wayland Compositor 包含创建合成器所需的所有功能

  • 一个 QML API 用来显示和操作客户端内容,与 Qt Quick 中的所有功能完全集成。
  • 一个 C++ API 用于低级访问和控制。
  • 支持常见扩展,包括 XDG Shell 和 IVI Application。
  • API 便于扩展对定制扩展的支持。

环境变量和命令行参数

Qt Wayland Compositor 识别以下环境变量和命令行参数

  • 环境变量
    • QT_WAYLAND_HARDWARE_INTEGRATION 选择要使用的硬件集成插件。
    • QT_WAYLAND_CLIENT_BUFFER_INTEGRATION 选择要使用的客户端缓冲区集成插件。
    • QT_WAYLAND_SERVER_BUFFER_INTEGRATION 选择要使用的服务器集成插件。
  • 命令行参数
    • --wayland-socket-name 覆盖与客户端通信时使用的默认套接字名称。

运行 Wayland 合成器

只要它不依赖任何不可用的平台特定功能,合成器就可以轻松地在基于X11的桌面系统上测试。这在开发过程中很有用,既有利于简化调试,又能提高尝试新特性的效率。

Qt Wayland支持在客户端和服务器之间共享图形缓冲区的几个后端。主要的是

  • wayland-egl:这是默认后端,尽可能时应优先选择。它需要在系统上支持OpenGL驱动才能正常工作。

可以通过设置环境变量QT_WAYLAND_CLIENT_BUFFER_INTEGRATION来选择其他后端。

注意:如果Qt Wayland合成器无法初始化客户端缓冲区后端,则将回退到使用“共享内存”后端(基于wl_shm)作为安全措施。此后端将使用CPU内存来共享图形缓冲区,并在需要时来回复制数据。这可能会影响性能,尤其是在高分辨率屏幕和有限图形硬件上。在调查Qt Wayland合成器性能问题时,请首先检查是否使用了正确的客户端缓冲区集成。

还要记住,如果你的系统已经运行了Wayland合成器,你可能必须设置XDG_RUNTIME_DIR以指向不同的位置。如果是这种情况,在启动合成器时你可能会看到警告。XDG_RUNTIME_DIR可以指向任何可访问的位置,但不能已经被占用。

例如,如果你想使用wayland-egl后端运行fancy-compositor示例,可以使用以下命令行

% XDG_RUNTIME_DIR=~/my_temporary_runtime QT_XCB_GL_INTEGRATION=xcb_egl QT_WAYLAND_CLIENT_BUFFER_INTEGRATION=wayland-egl ./fancy-compositor

客户端可以通过设置相同的XDG_RUNTIME_DIR并将“-platform wayland”作为命令行参数来在合成器上运行。也可以使用环境变量QT_QPA_PLATFORM在客户端侧选择Wayland QPA插件。

注意:在大多数情况下,客户端连接时会适应与服务器相同的OpenGL。然而,在运行某些特定驱动程序上的EGL后端时,需要提前进行初始化。如果你遇到这个问题,你可以传递“-platform wayland-egl”来预先初始化客户端为EGL。

故障排除

有时,在开发一个复杂的合成器时,可能会遇到需要进一步调查的问题。

将环境变量WAYLAND_DEBUG设置为“1”将启用Wayland库本身的日志输出。这非常有用,例如,当调试Wayland协议的自定义扩展时。它会显示客户端和服务器之间传递的哪些事件和请求,以及它们的时间戳。

此外,Qt提供了日志分类qt.waylandcompositor.*qt.qpa.wayland.*,可以启用额外的日志记录。后者应该在客户端侧设置,因为它启用了从Wayland QPA插件的日志记录。

示例

请参阅Qt Wayland合成器示例,了解如何使用这些API编写自定义合成器。

API参考

Qt Wayland合成器可以使用C++或QML。

此外,该模块提供了CMake功能qt_generate_wayland_protocol_server_sources()`。

模块演变

Porting to Qt 6 - Qt Wayland Compositor列出了对Qt 6系列Qt模块API和功能的重要变更。

许可和归属

Qt Wayland 合成器以及 Qt Wayland 集成插件可在 Qt 公司 的商业许可证下使用。

此外,Qt Wayland 合成器可在 GNU 通用公共许可证,版本 3 下使用,而 Qt Wayland 集成插件则可在 GNU 宽通用公共许可证,版本 3GNU 通用公共许可证,版本 2 下使用。

有关更详细信息,请参阅 Qt 许可

Qt Wayland 合成器和 Qt Wayland 集成插件使用的协议定义以下许可协议下

© 2024 Qt 公司 Ltd. 以下所述文档贡献的版权属于其各自所有者。此处提供的文档是根据由自由软件基金会发布的 GNU 自由文档许可证版本 1.3 条款许可的。Qt 及相关标志是芬兰的 Qt 公司以及/或全球其他国家的注册商标。所有其他商标都属于它们各自的所有者。