diff options
author | Simon Ser <contact@emersion.fr> | 2023-02-02 17:35:53 +0100 |
---|---|---|
committer | Alexander Orzechowski <alex@ozal.ski> | 2023-02-02 18:24:38 +0000 |
commit | cfa7696d7bd6b7b23d73922ad48631b1b0df6e02 (patch) | |
tree | bbdca59d75c7b07c302d741afc531e56a28d0c9f /backend | |
parent | 2b5eb0733ee326102cc2bd6494be429110f7bb28 (diff) |
backend/wayland: handle wl_registry.global_remove for wl_seat
Destroy the struct wlr_wl_seat when the global is removed.
Diffstat (limited to 'backend')
-rw-r--r-- | backend/wayland/backend.c | 12 | ||||
-rw-r--r-- | backend/wayland/seat.c | 4 |
2 files changed, 13 insertions, 3 deletions
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; |