diff --git a/src/animation.c b/src/animation.c index 8739f194..f717b333 100644 --- a/src/animation.c +++ b/src/animation.c @@ -377,3 +377,65 @@ weston_slide_run(struct weston_view *view, float start, float stop, return animation; } + +struct weston_move_animation { + int dx; + int dy; + int reverse; + weston_view_animation_done_func_t done; +}; + +static void +move_frame(struct weston_view_animation *animation) +{ + struct weston_move_animation *move = animation->private; + float scale; + float progress = animation->spring.current; + + if (move->reverse) + progress = 1.0 - progress; + + scale = animation->start + + (animation->stop - animation->start) * + progress; + weston_matrix_init(&animation->transform.matrix); + weston_matrix_scale(&animation->transform.matrix, scale, scale, 1.0f); + weston_matrix_translate(&animation->transform.matrix, + move->dx * progress, move->dy * progress, + 0); +} + +static void +move_done(struct weston_view_animation *animation, void *data) +{ + struct weston_move_animation *move = animation->private; + + if (move->done) + move->done(animation, data); + + free(move); +} + +WL_EXPORT struct weston_view_animation * +weston_move_scale_run(struct weston_view *view, int dx, int dy, + float start, float end, int reverse, + weston_view_animation_done_func_t done, void *data) +{ + struct weston_move_animation *move; + struct weston_view_animation *animation; + + move = malloc(sizeof(*move)); + if (!move) + return NULL; + move->dx = dx; + move->dy = dy; + move->reverse = reverse; + move->done = done; + + animation = weston_view_animation_run(view, start, end, move_frame, + NULL, move_done, data, move); + animation->spring.k = 400; + animation->spring.friction = 1150; + + return animation; +} diff --git a/src/compositor.h b/src/compositor.h index ea53f3f9..a8504afd 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -1298,6 +1298,12 @@ struct weston_view_animation * weston_fade_run(struct weston_view *view, float start, float end, float k, weston_view_animation_done_func_t done, void *data); + +struct weston_view_animation * +weston_move_scale_run(struct weston_view *view, int dx, int dy, + float start, float end, int reverse, + weston_view_animation_done_func_t done, void *data); + void weston_fade_update(struct weston_view_animation *fade, float target);