uwac: fix wl_buffer_destroy of wl_cursor buffer

Following the wayland-cursor documentation [1] the buffer created by
wl_cursor_image_get_buffer should not be destroyed. The new code avoid to
destroy it by avoiding to connect the release callback to this buffer.

[1] https://gitlab.freedesktop.org/wayland/wayland/-/blob/main/cursor/wayland-cursor.c#L147-L154
This commit is contained in:
Benoît Gschwind 2022-10-18 22:46:12 +02:00 committed by David Fort
parent eb77fd7b0d
commit 1cf69f04e6

View File

@ -96,7 +96,6 @@ static UwacReturnCode set_cursor_image(UwacSeat* seat, uint32_t serial)
struct wl_cursor_image* image = NULL; struct wl_cursor_image* image = NULL;
struct wl_surface* surface = NULL; struct wl_surface* surface = NULL;
int32_t x = 0, y = 0; int32_t x = 0, y = 0;
int buffer_add_listener_success = -1;
if (!seat || !seat->display || !seat->default_cursor || !seat->default_cursor->images) if (!seat || !seat->display || !seat->default_cursor || !seat->default_cursor->images)
return UWAC_ERROR_INTERNAL; return UWAC_ERROR_INTERNAL;
@ -108,6 +107,9 @@ static UwacReturnCode set_cursor_image(UwacSeat* seat, uint32_t serial)
buffer = create_pointer_buffer(seat, seat->pointer_data, seat->pointer_size); buffer = create_pointer_buffer(seat, seat->pointer_data, seat->pointer_size);
if (!buffer) if (!buffer)
return UWAC_ERROR_INTERNAL; return UWAC_ERROR_INTERNAL;
if (wl_buffer_add_listener(buffer, &buffer_release_listener, seat) < 0)
return UWAC_ERROR_INTERNAL;
surface = seat->pointer_surface; surface = seat->pointer_surface;
x = image->hotspot_x; x = image->hotspot_x;
y = image->hotspot_y; y = image->hotspot_y;
@ -130,13 +132,7 @@ static UwacReturnCode set_cursor_image(UwacSeat* seat, uint32_t serial)
break; break;
} }
if (buffer) if (surface && buffer)
{
buffer_add_listener_success =
wl_buffer_add_listener(buffer, &buffer_release_listener, seat);
}
if (surface && buffer_add_listener_success > -1)
{ {
wl_surface_attach(surface, buffer, -x, -y); wl_surface_attach(surface, buffer, -x, -y);
wl_surface_damage(surface, 0, 0, image->width, image->height); wl_surface_damage(surface, 0, 0, image->width, image->height);