Wayland注册表中未找到xdg_shell或wl_shell问题排查
问题描述
我尝试用Wayland和EGL创建一个简单窗口,发现必须依赖xdg_shell或wl_shell才能实现。但运行打印全局Wayland注册表的代码时,只输出了wl_compositor和wl_shm,完全看不到xdg_shell或wl_shell的身影。是不是我的系统缺少相关组件?
测试代码
#include <cstdio> #include <wayland-client.h> void registry_global( void* data, struct wl_registry* wl_registry, uint32_t name, const char* interface, uint32_t version ) { puts(interface); } void registry_global_remove(void* data, struct wl_registry* wl_registry, uint32_t name) {} wl_registry_listener registry_listener{®istry_global, ®istry_global_remove}; int main() { auto display = wl_display_connect(nullptr); if (!display) throw; auto registry = wl_display_get_registry(display); if (!registry) throw; wl_registry_add_listener(registry, ®istry_listener, nullptr); wl_display_roundtrip(display); wl_display_disconnect(display); return 0; }
系统显卡信息
Graphics: Device-1: NVIDIA GP106 [GeForce GTX 1060 6GB] driver: nvidia v: 555.58.02 Device-2: AMD Raphael driver: amdgpu v: kernel Display: wayland server: X.org v: 1.21.1.13 with: Xwayland v: 24.1.1 compositor: kwin_wayland driver: X: loaded: amdgpu,nvidia unloaded: modesetting dri: radeonsi gpu: nvidia,amdgpu resolution: 1920x1080 API: EGL v: 1.5 drivers: nvidia,radeonsi,swrast,zink platforms: gbm,wayland,x11,surfaceless,device API: OpenGL v: 4.6.0 compat-v: 4.5 vendor: nvidia mesa v: 555.58.02 renderer: NVIDIA GeForce GTX 1060 6GB/PCIe/SSE2 API: Vulkan v: 1.3.279 drivers: nvidia surfaces: xcb,xlib,wayland
问题分析与解决
不是系统缺少组件,问题出在代码逻辑和Wayland协议的交互细节上:
- Shell接口的注册逻辑:现代Wayland中主流的
xdg_wm_base(替代旧版xdg_shell)不会在初始注册表中直接推送,需要客户端先绑定wl_compositor后, compositor 才会暴露相关shell接口。你的代码只做了一次wl_display_roundtrip,没等到后续接口的注册消息。 - 废弃接口的支持:wl_shell是已被Wayland协议废弃的接口,kwin_wayland这类现代 compositor 默认不会注册它,你应该优先使用
xdg_wm_base。 - 代码修正方向:
- 在
registry_global回调中,遇到wl_compositor时完成绑定操作 - 增加多轮
wl_display_roundtrip调用,确保所有全局对象都被推送 - 目标接口改为
xdg_wm_base而非已废弃的wl_shell
- 在
内容的提问来源于stack exchange,提问作者KAYSER
相关产品推荐
相关产品推荐

