diff --git a/repos/gems/include/gems/animated_geometry.h b/repos/gems/include/gems/animated_geometry.h index 854d38a46f..1a3a20a1b0 100644 --- a/repos/gems/include/gems/animated_geometry.h +++ b/repos/gems/include/gems/animated_geometry.h @@ -64,6 +64,8 @@ class Genode::Animated_rect : private Animator::Item, Noncopyable Animated_point _p1 { }, _p2 { }; + Steps _remaining { 0 }; + public: Animated_rect(Animator &animator) : Animator::Item(animator) { } @@ -77,6 +79,9 @@ class Genode::Animated_rect : private Animator::Item, Noncopyable _rect = Rect(Point(_p1.x(), _p1.y()), Point(_p2.x(), _p2.y())); + if (_remaining.value > 1) + _remaining.value--; + /* schedule / de-schedule animation */ Animator::Item::animated(_p1.animated() || _p2.animated()); } @@ -90,6 +95,12 @@ class Genode::Animated_rect : private Animator::Item, Noncopyable */ void move_to(Rect rect, Steps steps) { + /* retarget animation while already in progress */ + if (animated()) + steps.value = max(_remaining.value, 1U); + + _remaining = steps; + _p1.move_to(rect.p1(), steps); _p2.move_to(rect.p2(), steps); animate(); diff --git a/repos/gems/src/app/menu_view/widget.h b/repos/gems/src/app/menu_view/widget.h index b08b5387aa..5f78d66be1 100644 --- a/repos/gems/src/app/menu_view/widget.h +++ b/repos/gems/src/app/menu_view/widget.h @@ -163,9 +163,6 @@ class Menu_view::Widget : List_model::Element void _trigger_geometry_animation() { - if (_animated_geometry.animated()) - return; - bool const changed = (_geometry.p1() != _animated_geometry.p1() || _geometry.p2() != _animated_geometry.p2()); if (changed)