aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2023-02-02 17:35:53 +0100
committerAlexander Orzechowski <alex@ozal.ski>2023-02-02 18:24:38 +0000
commitcfa7696d7bd6b7b23d73922ad48631b1b0df6e02 (patch)
treebbdca59d75c7b07c302d741afc531e56a28d0c9f
parent2b5eb0733ee326102cc2bd6494be429110f7bb28 (diff)
backend/wayland: handle wl_registry.global_remove for wl_seat
Destroy the struct wlr_wl_seat when the global is removed.
-rw-r--r--backend/wayland/backend.c12
-rw-r--r--backend/wayland/seat.c4
-rw-r--r--include/backend/wayland.h4
3 files changed, 16 insertions, 4 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;
diff --git a/include/backend/wayland.h b/include/backend/wayland.h
index 6dd457a5..5af8ed53 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);