compositor: Insert the fade surface in the surface list
This lets us repaint it in the repaint loop instead of the fade_output()
special case.
diff --git a/src/compositor.c b/src/compositor.c
index 427d217..3f178ae 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -695,37 +695,44 @@
}
static void
-fade_output(struct weston_output *output,
- GLfloat tint, pixman_region32_t *region)
+solid_surface_init(struct weston_surface *surface,
+ struct weston_output *output, GLfloat tint)
{
struct weston_compositor *compositor = output->compositor;
- struct weston_surface surface;
- surface.compositor = compositor;
- surface.x = output->x;
- surface.y = output->y;
- surface.pitch = output->current->width;
- surface.width = output->current->width;
- surface.height = output->current->height;
- surface.texture = GL_NONE;
- surface.transform = NULL;
- surface.alpha = compositor->current_alpha;
- surface.shader = &compositor->solid_shader;
- surface.color[0] = 0.0;
- surface.color[1] = 0.0;
- surface.color[2] = 0.0;
- surface.color[3] = tint;
- pixman_region32_init(&surface.damage);
- pixman_region32_copy(&surface.damage, region);
+ surface->compositor = compositor;
+ surface->x = output->x;
+ surface->y = output->y;
+ surface->pitch = output->current->width;
+ surface->width = output->current->width;
+ surface->height = output->current->height;
+ surface->texture = GL_NONE;
+ surface->transform = NULL;
+ surface->alpha = compositor->current_alpha;
+ surface->shader = &compositor->solid_shader;
+ surface->color[0] = 0.0;
+ surface->color[1] = 0.0;
+ surface->color[2] = 0.0;
+ surface->color[3] = tint;
+ pixman_region32_init(&surface->damage);
+ pixman_region32_copy(&surface->damage, &output->region);
+ pixman_region32_init(&surface->opaque);
- if (tint <= 1.0)
- surface.visual = WESTON_ARGB_VISUAL;
- else
- surface.visual = WESTON_RGB_VISUAL;
+ if (tint <= 1.0) {
+ surface->visual = WESTON_ARGB_VISUAL;
+ } else {
+ surface->visual = WESTON_RGB_VISUAL;
+ pixman_region32_copy(&surface->opaque, &output->region);
+ }
- weston_surface_draw(&surface, output);
+ wl_list_insert(&compositor->surface_list, &surface->link);
+}
- pixman_region32_fini(&surface.damage);
+static void
+solid_surface_release(struct weston_surface *surface)
+{
+ wl_list_remove(&surface->link);
+ pixman_region32_fini(&surface->damage);
}
static void
@@ -799,7 +806,7 @@
weston_output_repaint(struct weston_output *output)
{
struct weston_compositor *ec = output->compositor;
- struct weston_surface *es;
+ struct weston_surface *es, solid;
pixman_region32_t opaque, new_damage, total_damage,
overlap, surface_overlap;
@@ -815,8 +822,7 @@
pixman_region32_init(&overlap);
if (ec->fade.spring.current >= 0.001)
- pixman_region32_union(&overlap, &overlap, &output->region);
-
+ solid_surface_init(&solid, output, ec->fade.spring.current);
wl_list_for_each(es, &ec->surface_list, link) {
pixman_region32_subtract(&es->damage, &es->damage, &opaque);
@@ -859,7 +865,7 @@
weston_surface_draw(es, output);
if (ec->fade.spring.current > 0.001)
- fade_output(output, ec->fade.spring.current, &total_damage);
+ solid_surface_release(&solid);
pixman_region32_fini(&total_damage);
}