From 1e2a2b07781057cd23f41411418e8b5870bf5b89 Mon Sep 17 00:00:00 2001 From: Brian Ashworth Date: Sun, 5 Jan 2020 22:29:32 -0500 Subject: [PATCH] input/cursor: handle setting a NULL image surface This fixes a crash when attempting to listen to a signal on a NULL cursor image surface. If the surface is NULL, the listener is just reinitialized using wl_list_init. --- sway/input/cursor.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/sway/input/cursor.c b/sway/input/cursor.c index 215dc7672..9d14c585a 100644 --- a/sway/input/cursor.c +++ b/sway/input/cursor.c @@ -798,6 +798,17 @@ static void handle_image_surface_destroy(struct wl_listener *listener, cursor_rebase(cursor); } +static void set_image_surface(struct sway_cursor *cursor, + struct wlr_surface *surface) { + wl_list_remove(&cursor->image_surface_destroy.link); + cursor->image_surface = surface; + if (surface) { + wl_signal_add(&surface->events.destroy, &cursor->image_surface_destroy); + } else { + wl_list_init(&cursor->image_surface_destroy.link); + } +} + void cursor_set_image(struct sway_cursor *cursor, const char *image, struct wl_client *client) { if (!(cursor->seat->wlr_seat->capabilities & WL_SEAT_CAPABILITY_POINTER)) { @@ -805,10 +816,8 @@ void cursor_set_image(struct sway_cursor *cursor, const char *image, } const char *current_image = cursor->image; + set_image_surface(cursor, NULL); cursor->image = image; - wl_list_remove(&cursor->image_surface_destroy.link); - cursor->image_surface = NULL; - wl_list_init(&cursor->image_surface_destroy.link); cursor->hotspot_x = cursor->hotspot_y = 0; cursor->image_client = client; @@ -831,11 +840,8 @@ void cursor_set_image_surface(struct sway_cursor *cursor, return; } + set_image_surface(cursor, surface); cursor->image = NULL; - wl_list_remove(&cursor->image_surface_destroy.link); - cursor->image_surface = surface; - wl_signal_add(&cursor->image_surface->events.destroy, - &cursor->image_surface_destroy); cursor->hotspot_x = hotspot_x; cursor->hotspot_y = hotspot_y; cursor->image_client = client;