使用 wl_compositor
有人说给事物命名是计算机科学中最为复杂的问题之一,而在这也是如此,并且证据确凿。wl_compositor
是全局的混成器,也是混成器的一部分。通过这个接口,你可以向服务端发送你要展示的窗口,以便与旁边其他的窗口进行混成。混成器有两项工作:创建表面和区域。
此处引用规范来介绍:一个 Wayland 表面有一个矩形区域,可以显示在 0 号(默认显示器)或者更多的输出设备上,递交缓冲区,接受用户输入,并定义一个相对坐标系。我们将在后期详细讨论这些问题,但从最根本的部分开始:获得一个表面并为其强加缓冲区。要获得一个表面,首先我们要自己的混成器绑定到全局 wl_compositor
。通过扩展 5.1 章的例子,我们可以得到如下结果:
struct our_state {
// ...
struct wl_compositor *compositor;
// ...
};
static void
registry_handle_global(void *data, struct wl_registry *wl_registry,
uint32_t name, const char *interface, uint32_t version)
{
struct our_state *state = data;
if (strcmp(interface, wl_compositor_interface.name) == 0) {
state->compositor = wl_registry_bind(
wl_registry, name, &wl_compositor_interface, 4);
}
}
int
main(int argc, char *argv[])
{
struct our_state state = { 0 };
// ...
wl_registry_add_listener(registry, ®istry_listener, &state);
// ...
}
注意,我们在调用 wl_registry_bind
时指定了版本 4,这是写作时的最新版本。有了这个引用的保证,我们就可以创建一个 wl_surface
。
struct wl_surface *surface = wl_compositor_create_surface(state.compositor);
在我们能够显示它之前,我们必须首先给它附加一个像素源:一个 wl_buffer
。