[PATCH] compositor: Don't use empty bounding boxes for output assigninment
Pekka Paalanen
ppaalanen at gmail.com
Tue Sep 11 23:15:20 PDT 2012
On Tue, 11 Sep 2012 17:37:29 +0300
Ander Conselvan de Oliveira <conselvan2 at gmail.com> wrote:
> From: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira at intel.com>
>
> When weston_surface_assign_output() is called for an unmap'd surface,
> its bounding box is empty causing no output to be assigned. This later
> causes calls to weston_surface_schedule_repaint() to schedule no
> repaint at all. This is the cause of surfaces not being shown on the
> screen until a some input event or other drawing causes a repaint.
>
> This patch fix this by forcing an update of the bouding box if it is
> empty. Although doing this can cause problems if the surface is
> already mapped on the screen, for the particular case it should be safe
> as described in the comment in the code.
> ---
> src/compositor.c | 13 +++++++++++++
> 1 file changed, 13 insertions(+)
>
> diff --git a/src/compositor.c b/src/compositor.c
> index 911eaba..840a2a9 100644
> --- a/src/compositor.c
> +++ b/src/compositor.c
> @@ -1109,6 +1109,19 @@ weston_surface_assign_output(struct weston_surface *es)
> uint32_t max, area, mask;
> pixman_box32_t *e;
>
> + /* Update the surface's bounding box if it is empty to make sure
> + * we end up with a surface assigned. This is done only on the
Did you mean "an output assigned"?
> + * empty case though so that weston_surface_damage_below() isn't
> + * broken. Some places expect the bouding box to be the old
> + * surface position and updating it here could cause portions of
> + * the output to not be damaged correctly. For the empty case,
> + * however, this is not a problem since damaging below an empty
> + * surface would result in no damage. Damaging below the surface
> + * after the update will not produce any artifacts, although it
> + * may result in some extra drawing. */
> + if (!pixman_region32_not_empty(&es->transform.boundingbox))
> + weston_surface_update_transform(es);
> +
> new_output = NULL;
> max = 0;
> mask = 0;
The idea seems fine to me. Good explanation, covers everything I would
worry about.
Thanks,
pq
More information about the wayland-devel
mailing list