From 5839e59e24c094104fcfd83884a7406a9e9e0e7f Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Mon, 15 Mar 2021 09:29:14 +0200 Subject: [PATCH] effects: Properly reset present times in coverswitch and flipswitch effects The last presentation timestamps should be reset when all animations finish rather than when the effect finishes. Otherwise, the calculated time diff for the first animation frame will be too big. BUG: 433471 --- src/effects/coverswitch/coverswitch.cpp | 13 ++++++------ src/effects/flipswitch/flipswitch.cpp | 28 +++++++++++++------------ 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/effects/coverswitch/coverswitch.cpp b/src/effects/coverswitch/coverswitch.cpp index a42ffa95c2..bc1bdc2f56 100644 --- a/src/effects/coverswitch/coverswitch.cpp +++ b/src/effects/coverswitch/coverswitch.cpp @@ -106,15 +106,14 @@ void CoverSwitchEffect::reconfigure(ReconfigureFlags) void CoverSwitchEffect::prePaintScreen(ScreenPrePaintData& data, std::chrono::milliseconds presentTime) { - std::chrono::milliseconds delta = std::chrono::milliseconds::zero(); - if (lastPresentTime.count()) { - delta = presentTime - lastPresentTime; - } - lastPresentTime = presentTime; - if (mActivated || stop || stopRequested) { data.mask |= Effect::PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS; if (animation || start || stop) { + std::chrono::milliseconds delta = std::chrono::milliseconds::zero(); + if (lastPresentTime.count()) { + delta = presentTime - lastPresentTime; + } + lastPresentTime = presentTime; timeLine.update(delta); } if (selected_window == nullptr) @@ -284,6 +283,7 @@ void CoverSwitchEffect::postPaintScreen() if ((mActivated && (animation || start)) || stop || stopRequested) { if (timeLine.done()) { timeLine.reset(); + lastPresentTime = std::chrono::milliseconds::zero(); if (stop) { stop = false; effects->setActiveFullScreenEffect(nullptr); @@ -292,7 +292,6 @@ void CoverSwitchEffect::postPaintScreen() } referrencedWindows.clear(); currentWindowList.clear(); - lastPresentTime = std::chrono::milliseconds::zero(); if (startRequested) { startRequested = false; mActivated = true; diff --git a/src/effects/flipswitch/flipswitch.cpp b/src/effects/flipswitch/flipswitch.cpp index c149fa7f31..00c948e6a7 100644 --- a/src/effects/flipswitch/flipswitch.cpp +++ b/src/effects/flipswitch/flipswitch.cpp @@ -97,20 +97,21 @@ void FlipSwitchEffect::reconfigure(ReconfigureFlags) void FlipSwitchEffect::prePaintScreen(ScreenPrePaintData& data, std::chrono::milliseconds presentTime) { int time = 0; - if (m_lastPresentTime.count()) { - time = (presentTime - m_lastPresentTime).count(); + if (m_animation || m_start || m_stop) { + if (m_lastPresentTime.count()) { + time = (presentTime - m_lastPresentTime).count(); + } + m_lastPresentTime = presentTime; } - m_lastPresentTime = presentTime; - if (m_active) { - data.mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS; - if (m_start) - m_startStopTimeLine.setCurrentTime(m_startStopTimeLine.currentTime() + time); - if (m_stop && m_scheduledDirections.isEmpty()) - m_startStopTimeLine.setCurrentTime(m_startStopTimeLine.currentTime() - time); - if (m_animation) - m_timeLine.setCurrentTime(m_timeLine.currentTime() + time); - } + data.mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS; + if (m_start) + m_startStopTimeLine.setCurrentTime(m_startStopTimeLine.currentTime() + time); + if (m_stop && m_scheduledDirections.isEmpty()) + m_startStopTimeLine.setCurrentTime(m_startStopTimeLine.currentTime() - time); + if (m_animation) + m_timeLine.setCurrentTime(m_timeLine.currentTime() + time); + effects->prePaintScreen(data, presentTime); } @@ -325,7 +326,6 @@ void FlipSwitchEffect::postPaintScreen() m_stop = false; m_active = false; m_captionFrame->free(); - m_lastPresentTime = std::chrono::milliseconds::zero(); effects->setActiveFullScreenEffect(nullptr); effects->addRepaintFull(); qDeleteAll(m_windows); @@ -351,6 +351,8 @@ void FlipSwitchEffect::postPaintScreen() } if (m_start || m_stop || m_animation) effects->addRepaintFull(); + else + m_lastPresentTime = std::chrono::milliseconds::zero(); } effects->postPaintScreen(); }