diff options
-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; |