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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/wayland-devel _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel