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 | |
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.
-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 = { |