diff options
author | Brian Ashworth <bosrsf04@gmail.com> | 2020-01-05 22:29:32 -0500 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2020-01-06 10:12:28 +0100 |
commit | 1e2a2b07781057cd23f41411418e8b5870bf5b89 (patch) | |
tree | be9da1b1b96454f217a57f03e30f3fbaef95cbf1 | |
parent | 897c36b12cc4b706bcb730a47181d829d7ab9729 (diff) |
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.
-rw-r--r-- | sway/input/cursor.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/sway/input/cursor.c b/sway/input/cursor.c index 215dc767..9d14c585 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; |