summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeyu Tao <me@taoky.moe>2024-04-03 03:26:24 +0800
committerKeyu Tao <me@taoky.moe>2024-04-09 04:20:10 +0800
commite5eb2e4771b5331297967973c05a945578815ef2 (patch)
tree8012349443580ff1c5af3c8a73e69982ba0abecc
parentb8bd31e237d9f752f3acff0388e6728071303bc6 (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.c21
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 = {