WindowServer: Fix animations not triggering rendering

When starting the first animation and while animations are ongoing we
need to make sure we trigger rendering.
This commit is contained in:
Tom 2021-06-28 17:42:13 -06:00 committed by Andreas Kling
parent ab88f4e082
commit 85bb13e081
Notes: sideshowbarker 2024-07-18 11:21:53 +09:00
3 changed files with 21 additions and 5 deletions

View File

@ -29,6 +29,7 @@ void Animation::start()
{
m_running = true;
m_timer.start();
Compositor::the().animation_started({});
}
void Animation::stop()

View File

@ -528,11 +528,16 @@ void Compositor::compose()
m_invalidated_window = false;
m_invalidated_cursor = false;
Screen::for_each([&](auto& screen) {
auto& screen_data = m_screen_data[screen.index()];
update_animations(screen, screen_data.m_flush_special_rects);
return IterationDecision::Continue;
});
if (!m_animations.is_empty()) {
Screen::for_each([&](auto& screen) {
auto& screen_data = m_screen_data[screen.index()];
update_animations(screen, screen_data.m_flush_special_rects);
return IterationDecision::Continue;
});
// As long as animations are running make sure we keep rendering frames
m_invalidated_any = true;
start_compose_async_timer();
}
if (need_to_draw_cursor) {
auto& screen_data = m_screen_data[cursor_screen.index()];
@ -1205,8 +1210,17 @@ void Compositor::recompute_occlusions()
void Compositor::register_animation(Badge<Animation>, Animation& animation)
{
bool was_empty = m_animations.is_empty();
auto result = m_animations.set(&animation);
VERIFY(result == AK::HashSetResult::InsertedNewEntry);
if (was_empty)
start_compose_async_timer();
}
void Compositor::animation_started(Badge<Animation>)
{
m_invalidated_any = true;
start_compose_async_timer();
}
void Compositor::unregister_animation(Badge<Animation>, Animation& animation)

View File

@ -71,6 +71,7 @@ public:
invalidate_screen();
}
void animation_started(Badge<Animation>);
void invalidate_occlusions() { m_occlusions_dirty = true; }
void overlay_rects_changed();