diff --git a/src/compositor.c b/src/compositor.c index dbdfe91f..bccd3727 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -789,7 +789,8 @@ weston_output_repaint(struct weston_output *output) { struct weston_compositor *ec = output->compositor; struct weston_surface *es; - pixman_region32_t opaque, new_damage, total_damage; + pixman_region32_t opaque, new_damage, total_damage, + overlap, surface_overlap; output->prepare_render(output); @@ -805,11 +806,25 @@ weston_output_repaint(struct weston_output *output) pixman_region32_init(&new_damage); pixman_region32_init(&opaque); + pixman_region32_init(&overlap); + + if (ec->fade.spring.current >= 0.001) + pixman_region32_union(&overlap, &overlap, &output->region); + wl_list_for_each(es, &ec->surface_list, link) { pixman_region32_subtract(&es->damage, &es->damage, &opaque); pixman_region32_union(&new_damage, &new_damage, &es->damage); pixman_region32_union(&opaque, &opaque, &es->opaque); + + pixman_region32_init(&surface_overlap); + pixman_region32_intersect_rect(&surface_overlap, + &overlap, es->x, es->y, + es->width, es->height); + es->overlapped = pixman_region32_not_empty(&surface_overlap); + pixman_region32_fini(&surface_overlap); + pixman_region32_union_rect(&overlap, &overlap, es->x, es->y, + es->width, es->height); } pixman_region32_init(&total_damage); @@ -819,6 +834,7 @@ weston_output_repaint(struct weston_output *output) &new_damage, &output->region); pixman_region32_fini(&opaque); + pixman_region32_fini(&overlap); pixman_region32_fini(&new_damage); wl_list_for_each(es, &ec->surface_list, link) { diff --git a/src/compositor.h b/src/compositor.h index d21e2856..529cc1ac 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -241,6 +241,7 @@ struct weston_surface { struct weston_transform *transform; uint32_t alpha; uint32_t visual; + int overlapped; /* * Which output to vsync this surface to.