[PATCH weston 4/5] animation: ensure repaints are always scheduled during animations

Kristian Høgsberg hoegsberg at gmail.com
Wed Jun 18 16:26:54 PDT 2014


On Thu, May 22, 2014 at 10:41:33PM +0200, Jonny Lamb wrote:
> Animations are run off the repaint cycle so if there's nothing to
> repaint, an animation will stop running. This is usually not a problem
> as each frame function of an animation causes something to change and
> therefore a repaint to happen. This patch helps detect when the
> animation isn't in said case and triggers a repaint to keep the
> animation running.
> 
> This problem was found by using weston_move_scale_run() to move a view
> onscreen from completely off. The very first time the animation frame
> function was called the progress wasn't enough to move it into
> view. The compositor saw there was nothing to repaint and stopped
> doing anything else. When something else (like a pointer move) forced
> a redraw, the view's position was very much onscreen and jumped into
> view in an ugly way.

Yup, this should work.

Kristian

> ---
>  src/animation.c   | 11 +++++++++++
>  src/spring-tool.c |  5 +++++
>  2 files changed, 16 insertions(+)
> 
> diff --git a/src/animation.c b/src/animation.c
> index 392e32d..5ded3ad 100644
> --- a/src/animation.c
> +++ b/src/animation.c
> @@ -161,6 +161,8 @@ weston_view_animation_frame(struct weston_animation *base,
>  	struct weston_view_animation *animation =
>  		container_of(base,
>  			     struct weston_view_animation, animation);
> +	struct weston_compositor *compositor =
> +		animation->view->surface->compositor;
>  
>  	if (base->frame_counter <= 1)
>  		animation->spring.timestamp = msecs;
> @@ -178,6 +180,15 @@ weston_view_animation_frame(struct weston_animation *base,
>  
>  	weston_view_geometry_dirty(animation->view);
>  	weston_view_schedule_repaint(animation->view);
> +
> +	/* The view's output_mask will be zero if its position is
> +	 * offscreen. Animations should always run but as they are also
> +	 * run off the repaint cycle, if there's nothing to repaint
> +	 * the animation stops running. Therefore if we catch this situation
> +	 * and schedule a repaint on all outputs it will be avoided.
> +	 */
> +	if (animation->view->output_mask == 0)
> +		weston_compositor_schedule_repaint(compositor);
>  }
>  
>  static struct weston_view_animation *
> diff --git a/src/spring-tool.c b/src/spring-tool.c
> index 41cc52c..685bfd9 100644
> --- a/src/spring-tool.c
> +++ b/src/spring-tool.c
> @@ -40,6 +40,11 @@ weston_view_schedule_repaint(struct weston_view *view)
>  {
>  }
>  
> +WL_EXPORT void
> +weston_compositor_schedule_repaint(struct weston_compositor *compositor)
> +{
> +}
> +
>  int
>  main(int argc, char *argv[])
>  {
> -- 
> 2.0.0.rc2
> 
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel


More information about the wayland-devel mailing list