animation: fix end callbacks readding the animation var (#43)

* animation: fix end callbacks readding the animation var

* include fix
This commit is contained in:
Maximilian Seidler 2025-02-02 17:33:44 +00:00 committed by GitHub
parent 6a8bc9d2a4
commit dd790b90d7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 28 additions and 11 deletions

View file

@ -160,11 +160,11 @@ namespace Hyprutils {
m_bIsBeingAnimated = false;
if (endCallback)
onAnimationEnd();
if (forceDisconnect)
disconnectFromActive();
if (endCallback)
onAnimationEnd();
}
const VarType& value() const {

View file

@ -1,7 +1,6 @@
#pragma once
#include "../memory/WeakPtr.hpp"
#include "hyprutils/memory/WeakPtr.hpp"
#include <string>
#include <unordered_map>

View file

@ -13,8 +13,8 @@ void CBaseAnimatedVariable::create(CAnimationManager* pManager, int typeInfo, SP
m_pSelf = pSelf;
m_pAnimationManager = pManager;
m_pSignals = pManager->getSignals();
m_bDummy = false;
m_pSignals = pManager->getSignals();
m_bDummy = false;
}
void CBaseAnimatedVariable::connectToActive() {
@ -136,11 +136,12 @@ void CBaseAnimatedVariable::onAnimationEnd() {
/* We do not call disconnectFromActive here. The animation manager will remove it on a call to tickDone. */
if (m_fEndCallback) {
/* loading m_bRemoveEndAfterRan before calling the callback allows the callback to delete this animation safely if it is false. */
auto removeEndCallback = m_bRemoveEndAfterRan;
m_fEndCallback(m_pSelf);
if (removeEndCallback)
m_fEndCallback = nullptr; // reset
CallbackFun cb = nullptr;
m_fEndCallback.swap(cb);
cb(m_pSelf);
if (!m_bRemoveEndAfterRan && /* callback did not set a new one by itself */ !m_fEndCallback)
m_fEndCallback = cb; // restore
}
}

View file

@ -344,6 +344,23 @@ int main(int argc, char** argv, char** envp) {
EXPECT(s.m_iA->getCurveValue(), 1.f);
EXPECT(endCallbackRan, 6);
// test end callback readding the var
*s.m_iA = 5;
s.m_iA->setCallbackOnEnd([&endCallbackRan](WP<CBaseAnimatedVariable> v) {
endCallbackRan++;
const auto PAV = dynamic_cast<CAnimatedVariable<int>*>(v.lock().get());
*PAV = 10;
PAV->setCallbackOnEnd([&endCallbackRan](WP<CBaseAnimatedVariable> v) { endCallbackRan++; });
});
while (pAnimationManager->shouldTickForNext()) {
pAnimationManager->tick();
}
EXPECT(endCallbackRan, 8);
EXPECT(s.m_iA->value(), 10);
// Test duplicate active anim vars are not allowed
{
EXPECT(pAnimationManager->m_vActiveAnimatedVariables.size(), 0);