From cfa7696d7bd6b7b23d73922ad48631b1b0df6e02 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Thu, 2 Feb 2023 17:35:53 +0100 Subject: 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 +++- 2 files changed, 13 insertions(+), 3 deletions(-) (limited to 'backend') diff --git a/backend/wayland/backend.c b/backend/wayland/backend.c index f3aa462a..91364234 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 35fc4dc2..a64795a8 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; -- cgit v1.2.3