aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Ashworth <bosrsf04@gmail.com>2020-01-05 22:29:32 -0500
committerSimon Ser <contact@emersion.fr>2020-01-06 10:12:28 +0100
commit1e2a2b07781057cd23f41411418e8b5870bf5b89 (patch)
treebe9da1b1b96454f217a57f03e30f3fbaef95cbf1
parent897c36b12cc4b706bcb730a47181d829d7ab9729 (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.c20
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;