[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