summaryrefslogtreecommitdiff
path: root/src
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 /src
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.
Diffstat (limited to 'src')
-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 = {