前面已经可以成功的连接服务器了。本文介绍如何显示一个窗口。
Wayland窗口绘制有两种方法:1) 共享内存方式(SHM)、2)EGL。
要想使用EGL,你得会EGL,还得先会OpenGL,这两个哪一个工程量都不小。本文使用方式1绘制窗口(第二种方法等OpenGL开发系列和EGL开发系列更新完再说)。
窗口
先将上一篇的代码拿过来,当然不需要输出所有的registry信息。
所以将
printf("Got a registry event for %s id %d\n", interface, id);
删除。
改动之后最好编译一下,以确保每一步都正确。
在添加注册函数中添加一个shm部分的处理
static void
global_registry_handler(void *data, struct wl_registry *registry,
uint32_t id, const char *interface, uint32_t version) {
if (strcmp(interface, "wl_compositor") == 0) {
BIND_WL_REG(registry, compositor, id, &wl_compositor_interface, 1);
} else if (strcmp(interface, "wl_shell") == 0) {
BIND_WL_REG(registry, shell, id, &wl_shell_interface, 1);
} else if (strcmp(interface, "wl_shm")==0){
BIND_WL_REG(registry, shm, id, &wl_shm_interface, 1);
wl_shm_add_listener(shm, &shm_listener, NULL);
}
}
可以看到共享内存中有回调函数shm_listener,我们要实现它:
struct wl_shm_listener shm_listener={
.format=shm_format
};
和之前一样
struct wl_shm_listener shm_listener={
shm_format
};
这样也可以,具体声明在wayland-client-protocol.h。
此函数的作用是
struct wl_shm_listener {
/**
* pixel format description
*
* Informs the client about a valid pixel format that can be used
* for buffers. Known formats include argb8888 and xrgb8888.
* @param format buffer pixel format
*/
void (*format)(void *data,
struct wl_shm *wl_shm,
uint32_t format

本文介绍了如何在Wayland环境中成功连接服务器,使用SHM绘制窗口,展示支持的像素格式,并创建和修改窗口内容。重点涉及wl_surface和wl_buffer的使用,以及如何实现窗口的基本绘制和像素操作。
最低0.47元/天 解锁文章
3776





