如何在自行创建的Qt Wayland合成器中打开Firefox等GUI应用
操作指南
你的理解基本正确,Wayland合成器本身就整合了显示服务器和窗口管理器的能力,只要应用通过Wayland协议连接到你的合成器,窗口就会显示在你的合成器窗口内,你当前无法打开Firefox的核心原因是合成器缺少主流应用依赖的协议支持。
1 修改合成器代码,补全协议支持
你当前的代码仅实现了Wayland早期的WlShell协议,仅能兼容少数旧的Wayland应用,包括Firefox在内的绝大多数主流桌面应用都使用更新的XdgShell协议通信,所以需要先补全这部分支持,修改后的完整代码如下:
import QtQuick 2.15 import QtQuick.Window 2.15 import QtQuick.Controls 2.0 import QtWayland.Compositor 1.0 WaylandCompositor{ id:comp WaylandOutput{ compositor:comp sizeFollowsWindow:true window:Window{ visible:true width:700 height:700 Repeater{ model:shellSurfaces ShellSurfaceItem{ shellSurface:modelData.shellSurface onSurfaceDestroyed:shellSurfaces.remove(index) } } } } ListModel{id:shellSurfaces} WlShell{ onWlShellSurfaceCreated:{ shellSurfaces.append({shellSurface:shellSurface}); } } // 新增XdgShell支持,兼容主流现代Wayland应用 XdgShell { onToplevelCreated: { shellSurfaces.append({shellSurface: xdgSurface}) } } }
2 获取合成器的Socket标识
运行修改后的合成器后,它会在系统的XDG_RUNTIME_DIR目录下生成专属的Wayland Socket文件,命名格式一般为wayland-数字,你可以在终端执行以下命令查看当前运行的所有Wayland合成器Socket:ls ${XDG_RUNTIME_DIR}/wayland-*
除了你系统默认合成器对应的wayland-0之外,多出来的那个就是你的Qt合成器对应的Socket,下文示例默认假设对应值为wayland-1。
3 启动应用到你的合成器中
启动应用时只需指定对应的WAYLAND_DISPLAY环境变量即可,不同应用的额外参数如下:
- Qt原生应用:
WAYLAND_DISPLAY=wayland-1 应用名 --platform wayland - Firefox等GTK应用:
Firefox需要额外开启Wayland支持的环境变量:WAYLAND_DISPLAY=wayland-1 MOZ_ENABLE_WAYLAND=1 firefox - 其他普通Wayland应用:
多数应用会自动适配Wayland,直接指定环境变量即可:WAYLAND_DISPLAY=wayland-1 应用名
内容的提问来源于stack exchange,提问作者Newtron Malayalam
相关产品推荐
相关产品推荐

