mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 03:27:45 +00:00
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:
parent
ab88f4e082
commit
85bb13e081
3 changed files with 21 additions and 5 deletions
|
@ -29,6 +29,7 @@ void Animation::start()
|
||||||
{
|
{
|
||||||
m_running = true;
|
m_running = true;
|
||||||
m_timer.start();
|
m_timer.start();
|
||||||
|
Compositor::the().animation_started({});
|
||||||
}
|
}
|
||||||
|
|
||||||
void Animation::stop()
|
void Animation::stop()
|
||||||
|
|
|
@ -528,11 +528,16 @@ void Compositor::compose()
|
||||||
m_invalidated_window = false;
|
m_invalidated_window = false;
|
||||||
m_invalidated_cursor = false;
|
m_invalidated_cursor = false;
|
||||||
|
|
||||||
Screen::for_each([&](auto& screen) {
|
if (!m_animations.is_empty()) {
|
||||||
auto& screen_data = m_screen_data[screen.index()];
|
Screen::for_each([&](auto& screen) {
|
||||||
update_animations(screen, screen_data.m_flush_special_rects);
|
auto& screen_data = m_screen_data[screen.index()];
|
||||||
return IterationDecision::Continue;
|
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) {
|
if (need_to_draw_cursor) {
|
||||||
auto& screen_data = m_screen_data[cursor_screen.index()];
|
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)
|
void Compositor::register_animation(Badge<Animation>, Animation& animation)
|
||||||
{
|
{
|
||||||
|
bool was_empty = m_animations.is_empty();
|
||||||
auto result = m_animations.set(&animation);
|
auto result = m_animations.set(&animation);
|
||||||
VERIFY(result == AK::HashSetResult::InsertedNewEntry);
|
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)
|
void Compositor::unregister_animation(Badge<Animation>, Animation& animation)
|
||||||
|
|
|
@ -71,6 +71,7 @@ public:
|
||||||
invalidate_screen();
|
invalidate_screen();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void animation_started(Badge<Animation>);
|
||||||
void invalidate_occlusions() { m_occlusions_dirty = true; }
|
void invalidate_occlusions() { m_occlusions_dirty = true; }
|
||||||
void overlay_rects_changed();
|
void overlay_rects_changed();
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue