diff --git a/compositor/compositor.c b/compositor/compositor.c index 923c93ec..eab0a373 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 dc899624..50ccdb57 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;