diff options
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; |