diff options
author | Keyu Tao <me@taoky.moe> | 2024-04-03 03:26:24 +0800 |
---|---|---|
committer | Keyu Tao <me@taoky.moe> | 2024-04-09 04:20:10 +0800 |
commit | e5eb2e4771b5331297967973c05a945578815ef2 (patch) | |
tree | 8012349443580ff1c5af3c8a73e69982ba0abecc /src | |
parent | b8bd31e237d9f752f3acff0388e6728071303bc6 (diff) |
wayland: implement registry_handle_global_remove()
The uint name of corresponding interface is also recorded in
global listener. When in global remove listener, this would be
used to compare with the name that got removed.
Diffstat (limited to 'src')
-rw-r--r-- | src/wayland-extensions.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/wayland-extensions.c b/src/wayland-extensions.c index cbe5716..dec69ce 100644 --- a/src/wayland-extensions.c +++ b/src/wayland-extensions.c @@ -69,6 +69,7 @@ registry_handle_global(void *data, "zwp_relative_pointer_manager_v1", relative_pointer_manager, (GDestroyNotify)zwp_relative_pointer_manager_v1_destroy); + g_object_set_data(G_OBJECT(widget), "zwp_relative_pointer_v1_name", GUINT_TO_POINTER(name)); } else if (g_strcmp0(interface, "zwp_pointer_constraints_v1") == 0) { struct zwp_pointer_constraints_v1 *pointer_constraints; pointer_constraints = registry_bind_gtk(widget, name, @@ -78,6 +79,7 @@ registry_handle_global(void *data, "zwp_pointer_constraints_v1", pointer_constraints, (GDestroyNotify)zwp_pointer_constraints_v1_destroy); + g_object_set_data(G_OBJECT(widget), "zwp_pointer_constraints_v1_name", GUINT_TO_POINTER(name)); } } @@ -86,6 +88,25 @@ registry_handle_global_remove(void *data, struct wl_registry *registry, uint32_t name) { + GtkWidget *widget = GTK_WIDGET(data); + + struct zwp_relative_pointer_manager_v1 *relative_pointer_manager; + uint32_t relative_pointer_manager_name = 0; + relative_pointer_manager = g_object_get_data(G_OBJECT(widget), "zwp_relative_pointer_manager_v1"); + relative_pointer_manager_name = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(widget), "zwp_relative_pointer_v1_name")); + if (relative_pointer_manager && relative_pointer_manager_name == name) { + g_object_set_data_full(G_OBJECT(widget), "zwp_relative_pointer_manager_v1", NULL, NULL); + g_object_steal_data(G_OBJECT(widget), "zwp_relative_pointer_v1_name"); + } + + struct zwp_pointer_constraints_v1 *pointer_constraints; + uint32_t pointer_constraints_name = 0; + pointer_constraints = g_object_get_data(G_OBJECT(widget), "zwp_pointer_constraints_v1"); + pointer_constraints_name = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(widget), "zwp_pointer_constraints_v1_name")); + if (pointer_constraints && pointer_constraints_name == name) { + g_object_set_data_full(G_OBJECT(widget), "zwp_pointer_constraints_v1", NULL, NULL); + g_object_steal_data(G_OBJECT(widget), "zwp_pointer_constraints_v1_name"); + } } static const struct wl_registry_listener registry_listener = { |