Wayland入门8:获取全局对象

Wayland全局对象

几乎所有的Wayland API都需要Wayland全局对象作为参数。Wayland全局对象:

  • wl_display:表示与服务器的连接。
  • wl_registry:全局对象注册表,全局对象需要通过它获取。
  • wl_compositor:窗口合成器,也是服务器。
  • wl_shm:内存管理器,与窗口合成器共享内存用。
  • wl_shell:支持窗口操作功能。
  • wl_seat:输入设备管理器。
  • wl_pointer:代表鼠标设备。
  • wl_keyboard:代表键盘设备。

Wayland没有提供Get函数来获取以上全局对象,只能通过wl_registry获取全局对象。

首先创建wl_registry_listener对象:

static struct wl_registry_listener s_registryListener
{
    .global = on_global_added,
    .global_remove = on_global_removed
};

.global和.global_remove是此结构体提供的两个回调函数指针,我们要自己实现这些函数。

也可以直接写

static struct wl_registry_listener s_registryListener
{
    on_global_added,
    on_global_removed
};

看你喜欢哪一种写法。

然后设置回调函数

struct wl_registry *reg = wl_display_get_registry(disp);
if (!reg) {
    std::cerr << "Faild to get registry!" << std::endl;
}

std::cerr << "Got registry OK!" << std::endl;

wl_registry_add_listener(reg, &s_registryListener, nullptr);
// wl_registry_destroy(reg);

在回调函数中继续处理。

static void on_global_added(void *data,
                            struct wl_registry *wl_registry,
                            uint32_t name,
                            const char *interface,
                            uint32_t version)
{
    (void)data;
    (void)wl_registry;
    std::cerr << " Global added: " << interface
              << ", v" << version
              << " (name " << name << ")"
              << std::endl;
}

在此就只是输出名称、版本。

编译运行,Ubuntu21.04输出为:

XDG_RUNTIME_DIR = /run/user/1000
Connect OK!
Got registry OK!
 Global added: wl_drm, v2 (name 1)
 Global added: wl_compositor, v4 (name 2)
 Global added: wl_shm, v1 (name 3)
 Global added: wl_output, v2 (name 4)
 Global added: zxdg_output_manager_v1, v3 (name 5)
 Global added: wl_data_device_manager, v3 (name 6)
 Global added: zwp_primary_selection_device_manager_v1, v1 (name 7)
 Global added: gtk_primary_selection_device_manager, v1 (name 8)
 Global added: wl_subcompositor, v1 (name 9)
 Global added: xdg_wm_base, v3 (name 10)
 Global added: zxdg_shell_v6, v1 (name 11)
 Global added: wl_shell, v1 (name 12)
 Global added: gtk_shell1, v3 (name 13)
 Global added: wp_viewporter, v1 (name 14)
 Global added: zwp_pointer_gestures_v1, v1 (name 15)
 Global added: zwp_tablet_manager_v2, v1 (name 16)
 Global added: wl_seat, v5 (name 17)
 Global added: zwp_relative_pointer_manager_v1, v1 (name 18)
 Global added: zwp_pointer_constraints_v1, v1 (name 19)
 Global added: zxdg_exporter_v1, v1 (name 20)
 Global added: zxdg_importer_v1, v1 (name 21)
 Global added: zwp_linux_dmabuf_v1, v3 (name 22)
 Global added: zwp_keyboard_shortcuts_inhibit_manager_v1, v1 (name 23)
 Global added: zwp_text_input_manager_v3, v1 (name 24)
 Global added: gtk_text_input_manager, v1 (name 25)
Sleeping for 3 secs...

在回调函数中我们并没有使用最关键的wl_registry

#define BIND_WL_REG(registry, ptr, id, intf, n)\
	do { (ptr) = (typeof(ptr))wl_registry_bind(\
			registry, id, intf, n); } while(0)

static void
global_registry_handler(void *data, struct wl_registry *registry,
		uint32_t id, const char *interface, uint32_t version) {
	printf("Got a registry event for %s id %d\n", interface, id);
	if (strcmp(interface, "wl_compositor") == 0) {
		//compositor = (struct wl_compositor *)wl_registry_bind(registry, id,
		//	   	&wl_compositor_interface, 1);
		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);
	}
}

获取并绑定全局变量和registry。

然后获取渲染器

if (compositor == NULL) {
	fprintf(stderr, "Can't find compositor\n");
	exit(1);
} else {
	fprintf(stderr, "Found compositor\n");
}

surface = wl_compositor_create_surface(compositor);
if (surface == NULL) {
	fprintf(stderr, "Can't create surface\n");
	exit(1);
} else {
	fprintf(stderr, "Created surface\n");
}

shell_surface = wl_shell_get_shell_surface(shell, surface);
if (shell_surface == NULL) {
	fprintf(stderr, "Can't create shell surface\n");
	exit(1);
} else {
	fprintf(stderr, "Created shell surface\n");
}
wl_shell_surface_set_toplevel(shell_surface);

输出为:

connected to display
Got a registry event for wl_drm id 1
Got a registry event for wl_compositor id 2
Got a registry event for wl_shm id 3
Got a registry event for wl_output id 4
Got a registry event for zxdg_output_manager_v1 id 5
Got a registry event for wl_data_device_manager id 6
Got a registry event for zwp_primary_selection_device_manager_v1 id 7
Got a registry event for gtk_primary_selection_device_manager id 8
Got a registry event for wl_subcompositor id 9
Got a registry event for xdg_wm_base id 10
Got a registry event for zxdg_shell_v6 id 11
Got a registry event for wl_shell id 12
Got a registry event for gtk_shell1 id 13
Got a registry event for wp_viewporter id 14
Got a registry event for zwp_pointer_gestures_v1 id 15
Got a registry event for zwp_tablet_manager_v2 id 16
Got a registry event for wl_seat id 17
Got a registry event for zwp_relative_pointer_manager_v1 id 18
Got a registry event for zwp_pointer_constraints_v1 id 19
Got a registry event for zxdg_exporter_v1 id 20
Got a registry event for zxdg_importer_v1 id 21
Got a registry event for zwp_linux_dmabuf_v1 id 22
Got a registry event for zwp_keyboard_shortcuts_inhibit_manager_v1 id 23
Got a registry event for zwp_text_input_manager_v3 id 24
Got a registry event for gtk_text_input_manager id 25
Found compositor
Created surface
Created shell surface
disconnected from display

完整代码在Wayland_Frashman的8.interface中。

如果是使用wldbg进行测试,需要注意的是wldbg捕获到连接信号后阻塞,如果要继续输出registry信息需要按下c

hyper@ubuntu:~$ wldbg -s
Listening for incoming connections...
Stopped on the first message
[interface2     ] C: wl_display@1.get_registry(new id wl_registry@2)
(wldbg) c
[interface2     ] S: wl_registry@2.global(1, 7:"wl_drm", 2)
[interface2     ] S: wl_registry@2.global(2, 14:"wl_compositor", 4)
[interface2     ] S: wl_registry@2.global(3, 7:"wl_shm", 1)
[interface2     ] S: wl_registry@2.global(4, 10:"wl_output", 2)
[interface2     ] S: wl_registry@2.global(5, 23:"zxdg_output_manager_v1", 3)
[interface2     ] S: wl_registry@2.global(6, 23:"wl_data_device_manager", 3)
[interface2     ] S: wl_registry@2.global(7, 40:"zwp_primary_selection_device_manager_v1", 1)
[interface2     ] S: wl_registry@2.global(8, 37:"gtk_primary_selection_device_manager", 1)
[interface2     ] S: wl_registry@2.global(9, 17:"wl_subcompositor", 1)
[interface2     ] S: wl_registry@2.global(10, 12:"xdg_wm_base", 3)
[interface2     ] S: wl_registry@2.global(11, 14:"zxdg_shell_v6", 1)
[interface2     ] S: wl_registry@2.global(12, 9:"wl_shell", 1)
[interface2     ] S: wl_registry@2.global(13, 11:"gtk_shell1", 3)
[interface2     ] S: wl_registry@2.global(14, 14:"wp_viewporter", 1)
[interface2     ] S: wl_registry@2.global(15, 24:"zwp_pointer_gestures_v1", 1)
[interface2     ] S: wl_registry@2.global(16, 22:"zwp_tablet_manager_v2", 1)
[interface2     ] S: wl_registry@2.global(17, 8:"wl_seat", 5)
[interface2     ] S: wl_registry@2.global(18, 32:"zwp_relative_pointer_manager_v1", 1)
[interface2     ] S: wl_registry@2.global(19, 27:"zwp_pointer_constraints_v1", 1)
[interface2     ] S: wl_registry@2.global(20, 17:"zxdg_exporter_v1", 1)
[interface2     ] S: wl_registry@2.global(21, 17:"zxdg_importer_v1", 1)
[interface2     ] S: wl_registry@2.global(22, 20:"zwp_linux_dmabuf_v1", 3)
[interface2     ] S: wl_registry@2.global(23, 42:"zwp_keyboard_shortcuts_inhibit_manager_v1", 1)
[interface2     ] S: wl_registry@2.global(24, 26:"zwp_text_input_manager_v3", 1)
[interface2     ] S: wl_registry@2.global(25, 23:"gtk_text_input_manager", 1)
[interface2     ] C: wl_registry@2.bind(2, 14:"wl_compositor", 1, new id [unknown]@3)
[interface2     ] C: wl_registry@2.bind(12, 9:"wl_shell", 1, new id [unknown]@4)
[interface2     ] C: wl_display@1.sync(new id wl_callback@5)
[interface2     ] S: wl_callback@5.done(6998)
[interface2     ] S: wl_display@1.delete_id(5)

本文首发于:Wayland入门8:获取全局对象

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幽迷狂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值