animation: ensure repaints are always scheduled during animations

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.
dev
Jonny Lamb 11 years ago committed by Kristian Høgsberg
parent 5905ebcc33
commit f8bfd0581b
  1. 11
      src/animation.c
  2. 5
      src/spring-tool.c

@ -161,6 +161,8 @@ weston_view_animation_frame(struct weston_animation *base,
struct weston_view_animation *animation = struct weston_view_animation *animation =
container_of(base, container_of(base,
struct weston_view_animation, animation); struct weston_view_animation, animation);
struct weston_compositor *compositor =
animation->view->surface->compositor;
if (base->frame_counter <= 1) if (base->frame_counter <= 1)
animation->spring.timestamp = msecs; animation->spring.timestamp = msecs;
@ -178,6 +180,15 @@ weston_view_animation_frame(struct weston_animation *base,
weston_view_geometry_dirty(animation->view); weston_view_geometry_dirty(animation->view);
weston_view_schedule_repaint(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 * static struct weston_view_animation *

@ -40,6 +40,11 @@ weston_view_schedule_repaint(struct weston_view *view)
{ {
} }
WL_EXPORT void
weston_compositor_schedule_repaint(struct weston_compositor *compositor)
{
}
int int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {

Loading…
Cancel
Save