When a surface becomes invisible frame callbacks will be queued until the surface is shown.
Signed-off-by: Jonas Ådahl <[email protected]> --- src/compositor.c | 28 +++++++++++++++++++++++++--- src/compositor.h | 6 ++++++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/compositor.c b/src/compositor.c index 7cc176c..139c379 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -233,6 +233,7 @@ weston_surface_create(struct weston_compositor *compositor) surface->opaque_rect[2] = 0.0; surface->opaque_rect[3] = 0.0; surface->pitch = 1; + surface->visible = true; surface->buffer = NULL; surface->output = NULL; @@ -1115,7 +1116,10 @@ WL_EXPORT void weston_layer_init(struct weston_layer *layer, struct wl_list *below) { wl_list_init(&layer->surface_list); - wl_list_insert(below, &layer->link); + if (below != NULL) + wl_list_insert(below, &layer->link); + else + wl_list_init(&layer->link); } WL_EXPORT void @@ -1175,6 +1179,24 @@ weston_compositor_fade(struct weston_compositor *compositor, float tint) &compositor->fade.animation.link); } +WL_EXPORT void +weston_surface_show(struct weston_surface *es) +{ + es->visible = true; + + if (!wl_list_empty(&es->frame_callback_list)) { + wl_list_insert_list(es->output->frame_callback_list.prev, + &es->frame_callback_list); + wl_list_init(&es->frame_callback_list); + } +} + +WL_EXPORT void +weston_surface_hide(struct weston_surface *es) +{ + es->visible = false; +} + static void surface_destroy(struct wl_client *client, struct wl_resource *resource) { @@ -1255,7 +1277,7 @@ weston_surface_assign_output(struct weston_surface *es) es->output = new_output; weston_surface_update_output_mask(es, mask); - if (!wl_list_empty(&es->frame_callback_list)) { + if (es->visible && !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); @@ -1349,7 +1371,7 @@ surface_frame(struct wl_client *client, wl_client_add_resource(client, &cb->resource); - if (es->output) { + if (es->output && es->visible) { wl_list_insert(es->output->frame_callback_list.prev, &cb->link); } else { diff --git a/src/compositor.h b/src/compositor.h index 2d52048..1f1095b 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -24,6 +24,7 @@ #ifndef _WAYLAND_SYSTEM_COMPOSITOR_H_ #define _WAYLAND_SYSTEM_COMPOSITOR_H_ +#include <stdbool.h> #include <pixman.h> #include <xkbcommon/xkbcommon.h> #include <wayland-server.h> @@ -383,6 +384,7 @@ struct weston_surface { GLfloat opaque_rect[4]; GLfloat alpha; int blend; + bool visible; /* Surface geometry state, mutable. * If you change anything, set dirty = 1. @@ -521,6 +523,10 @@ weston_compositor_schedule_repaint(struct weston_compositor *compositor); void weston_compositor_fade(struct weston_compositor *compositor, float tint); void +weston_surface_show(struct weston_surface *es); +void +weston_surface_hide(struct weston_surface *es); +void weston_compositor_damage_all(struct weston_compositor *compositor); void weston_compositor_unlock(struct weston_compositor *compositor); -- 1.7.9.5 _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
