From 496433b5411014818c2ea673c0062ca48e5c60ba Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kristian=20H=C3=B8gsberg?= Date: Tue, 15 Nov 2011 13:50:21 -0500 Subject: [PATCH] compositor: Hold on to surface.frame requests until we assign an output We can't just throw away the callback, so hold on to the requests until we have an output for the surface. --- compositor/compositor.c | 16 ++++++++++++---- compositor/compositor.h | 1 + 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/compositor/compositor.c b/compositor/compositor.c index 923c93e..eab0a37 100644 --- a/compositor/compositor.c +++ b/compositor/compositor.c @@ -278,6 +278,7 @@ wlsc_surface_create(struct wlsc_compositor *compositor, pixman_region32_init(&surface->damage); pixman_region32_init(&surface->opaque); + wl_list_init(&surface->frame_callback_list); surface->buffer_destroy_listener.func = surface_handle_buffer_destroy; @@ -1065,11 +1066,12 @@ WL_EXPORT void wlsc_surface_assign_output(struct wlsc_surface *es) { struct wlsc_compositor *ec = es->compositor; - struct wlsc_output *output; + struct wlsc_output *output, *new_output; pixman_region32_t region; uint32_t max, area; pixman_box32_t *e; + new_output = NULL; max = 0; wl_list_for_each(output, &ec->output_list, link) { pixman_region32_init_rect(®ion, @@ -1080,10 +1082,17 @@ wlsc_surface_assign_output(struct wlsc_surface *es) area = (e->x2 - e->x1) * (e->y2 - e->y1); if (area >= max) { - es->output = output; + new_output = output; max = area; } } + + es->output = new_output; + if (!wl_list_empty(&es->frame_callback_list)) { + wl_list_insert_list(new_output->frame_callback_list.prev, + &es->frame_callback_list); + wl_list_init(&es->frame_callback_list); + } } static void @@ -1161,8 +1170,7 @@ surface_frame(struct wl_client *client, wl_list_insert(es->output->frame_callback_list.prev, &cb->link); } else { - wl_list_init(&cb->link); - wl_resource_destroy(&cb->resource, 0); + wl_list_insert(es->frame_callback_list.prev, &cb->link); } } diff --git a/compositor/compositor.h b/compositor/compositor.h index dc89962..50ccdb5 100644 --- a/compositor/compositor.h +++ b/compositor/compositor.h @@ -270,6 +270,7 @@ struct wlsc_surface { struct wlsc_output *output; enum wlsc_surface_map_type map_type; struct wlsc_output *fullscreen_output; + struct wl_list frame_callback_list; EGLImageKHR image; -- 2.7.4