diff options
author | Sebastian Krzyszkowiak <dos@dosowisko.net> | 2019-09-14 06:41:54 +0200 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2019-09-14 16:19:07 +0300 |
commit | a14d65086480652520d20622cbc92df2319158f0 (patch) | |
tree | c90811d5bffed78e80bcad4f1ea10c9416a72c07 | |
parent | 8b0f1bc850de3bcf5354c8afa00b9f5b1768f370 (diff) |
wlr_seat_touch: Destroy the touchpoint on client destroy
Since e26217c51e3a5e1d7dfc95a8a76299e056497981, touchpoints can outlive
surfaces. This works fine as long as the client stays around, but fails
horribly otherwise; therefore we have to make sure that touchpoints don't
outlive their clients.
Fixes #1788
-rw-r--r-- | include/wlr/types/wlr_seat.h | 1 | ||||
-rw-r--r-- | types/seat/wlr_seat_touch.c | 11 |
2 files changed, 11 insertions, 1 deletions
diff --git a/include/wlr/types/wlr_seat.h b/include/wlr/types/wlr_seat.h index 69fe1359..352483ed 100644 --- a/include/wlr/types/wlr_seat.h +++ b/include/wlr/types/wlr_seat.h @@ -64,6 +64,7 @@ struct wlr_touch_point { struct wl_listener surface_destroy; struct wl_listener focus_surface_destroy; + struct wl_listener client_destroy; struct { struct wl_signal destroy; diff --git a/types/seat/wlr_seat_touch.c b/types/seat/wlr_seat_touch.c index dd57b55a..b0228976 100644 --- a/types/seat/wlr_seat_touch.c +++ b/types/seat/wlr_seat_touch.c @@ -101,6 +101,7 @@ static void touch_point_destroy(struct wlr_touch_point *point) { touch_point_clear_focus(point); wl_list_remove(&point->surface_destroy.link); + wl_list_remove(&point->client_destroy.link); wl_list_remove(&point->link); free(point); } @@ -115,6 +116,13 @@ static void touch_point_handle_surface_destroy(struct wl_listener *listener, wl_list_init(&point->surface_destroy.link); } +static void touch_point_handle_client_destroy(struct wl_listener *listener, + void *data) { + struct wlr_touch_point *point = + wl_container_of(listener, point, client_destroy); + touch_point_destroy(point); +} + static struct wlr_touch_point *touch_point_create( struct wlr_seat *seat, int32_t touch_id, struct wlr_surface *surface, double sx, double sy) { @@ -143,7 +151,8 @@ static struct wlr_touch_point *touch_point_create( wl_signal_add(&surface->events.destroy, &point->surface_destroy); point->surface_destroy.notify = touch_point_handle_surface_destroy; - + wl_signal_add(&client->events.destroy, &point->client_destroy); + point->client_destroy.notify = touch_point_handle_client_destroy; wl_list_insert(&seat->touch_state.touch_points, &point->link); return point; |