summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2011-11-15 13:50:21 -0500
committerKristian Høgsberg <krh@bitplanet.net>2011-11-15 13:50:21 -0500
commit496433b5411014818c2ea673c0062ca48e5c60ba (patch)
treea4f967475ab94679e9635ce555ece51dd2a6936e
parent3164c946acf7fb397685b9b4ce8e555c4570d5bf (diff)
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.
-rw-r--r--compositor/compositor.c16
-rw-r--r--compositor/compositor.h1
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(&region,
@@ -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;