compositor: do not release if re-attaching buffer

If a client called wl_surface.attach with the same wl_buffer as
previously, the compositor would mistakenly send a release on that
buffer. This will cause problems only when clients start to properly use
the wl_buffer.release event.

Do not send wl_buffer.release if the same buffer is attached again.

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
Pekka Paalanen 12 years ago committed by Kristian Høgsberg
parent 82ec909b07
commit a6421c4ea8
  1. 8
      src/compositor.c

@ -912,16 +912,18 @@ weston_surface_destroy(struct weston_surface *surface)
static void static void
weston_surface_attach(struct weston_surface *surface, struct wl_buffer *buffer) weston_surface_attach(struct weston_surface *surface, struct wl_buffer *buffer)
{ {
if (surface->buffer) { if (surface->buffer && buffer != surface->buffer) {
weston_buffer_post_release(surface->buffer); weston_buffer_post_release(surface->buffer);
wl_list_remove(&surface->buffer_destroy_listener.link); wl_list_remove(&surface->buffer_destroy_listener.link);
} }
if (buffer) { if (buffer && buffer != surface->buffer) {
buffer->busy_count++; buffer->busy_count++;
wl_signal_add(&buffer->resource.destroy_signal, wl_signal_add(&buffer->resource.destroy_signal,
&surface->buffer_destroy_listener); &surface->buffer_destroy_listener);
} else { }
if (!buffer) {
if (weston_surface_is_mapped(surface)) if (weston_surface_is_mapped(surface))
weston_surface_unmap(surface); weston_surface_unmap(surface);
} }

Loading…
Cancel
Save