From cfa7696d7bd6b7b23d73922ad48631b1b0df6e02 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Thu, 2 Feb 2023 17:35:53 +0100 Subject: [PATCH] backend/wayland: handle wl_registry.global_remove for wl_seat Destroy the struct wlr_wl_seat when the global is removed. --- backend/wayland/backend.c | 12 ++++++++++-- backend/wayland/seat.c | 4 +++- include/backend/wayland.h | 4 +++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/backend/wayland/backend.c b/backend/wayland/backend.c index f3aa462ad..913642343 100644 --- a/backend/wayland/backend.c +++ b/backend/wayland/backend.c @@ -354,7 +354,7 @@ static void registry_global(void *data, struct wl_registry *registry, } struct wl_seat *wl_seat = wl_registry_bind(registry, name, &wl_seat_interface, target_version); - if (!create_wl_seat(wl_seat, wl)) { + if (!create_wl_seat(wl_seat, wl, name)) { wl_seat_destroy(wl_seat); } } else if (strcmp(iface, xdg_wm_base_interface.name) == 0) { @@ -398,7 +398,15 @@ static void registry_global(void *data, struct wl_registry *registry, static void registry_global_remove(void *data, struct wl_registry *registry, uint32_t name) { - // TODO + struct wlr_wl_backend *wl = data; + + struct wlr_wl_seat *seat; + wl_list_for_each(seat, &wl->seats, link) { + if (seat->global_name == name) { + destroy_wl_seat(seat); + break; + } + } } static const struct wl_registry_listener registry_listener = { diff --git a/backend/wayland/seat.c b/backend/wayland/seat.c index 35fc4dc2e..a64795a8c 100644 --- a/backend/wayland/seat.c +++ b/backend/wayland/seat.c @@ -233,7 +233,8 @@ void init_seat_touch(struct wlr_wl_seat *seat) { static const struct wl_seat_listener seat_listener; -bool create_wl_seat(struct wl_seat *wl_seat, struct wlr_wl_backend *wl) { +bool create_wl_seat(struct wl_seat *wl_seat, struct wlr_wl_backend *wl, + uint32_t global_name) { struct wlr_wl_seat *seat = calloc(1, sizeof(struct wlr_wl_seat)); if (!seat) { wlr_log_errno(WLR_ERROR, "Allocation failed"); @@ -241,6 +242,7 @@ bool create_wl_seat(struct wl_seat *wl_seat, struct wlr_wl_backend *wl) { } seat->wl_seat = wl_seat; seat->backend = wl; + seat->global_name = global_name; wl_list_insert(&wl->seats, &seat->link); wl_seat_add_listener(wl_seat, &seat_listener, seat); return true; diff --git a/include/backend/wayland.h b/include/backend/wayland.h index 6dd457a56..5af8ed53d 100644 --- a/include/backend/wayland.h +++ b/include/backend/wayland.h @@ -105,6 +105,7 @@ struct wlr_wl_pointer { struct wlr_wl_seat { char *name; struct wl_seat *wl_seat; + uint32_t global_name; struct wlr_wl_backend *backend; @@ -148,7 +149,8 @@ void init_seat_touch(struct wlr_wl_seat *seat); void init_seat_tablet(struct wlr_wl_seat *seat); void finish_seat_tablet(struct wlr_wl_seat *seat); -bool create_wl_seat(struct wl_seat *wl_seat, struct wlr_wl_backend *wl); +bool create_wl_seat(struct wl_seat *wl_seat, struct wlr_wl_backend *wl, + uint32_t global_name); void destroy_wl_seat(struct wlr_wl_seat *seat); void destroy_wl_buffer(struct wlr_wl_buffer *buffer);