diff --git a/include/hyprutils/animation/AnimatedVariable.hpp b/include/hyprutils/animation/AnimatedVariable.hpp index 84c288a..81ffab4 100644 --- a/include/hyprutils/animation/AnimatedVariable.hpp +++ b/include/hyprutils/animation/AnimatedVariable.hpp @@ -12,6 +12,12 @@ namespace Hyprutils { namespace Animation { class CAnimationManager; + struct SAnimVarEvents { + Signal::CSignal connect; + Signal::CSignal forceDisconnect; + Signal::CSignal lazyDisconnect; + }; + /* A base class for animated variables. */ class CBaseAnimatedVariable { public: @@ -94,12 +100,6 @@ namespace Hyprutils { Memory::CWeakPointer m_pSelf; - struct { - Memory::CWeakPointer connect; - Memory::CWeakPointer forceDisconnect; - Memory::CWeakPointer lazyDisconnect; - } m_sEvents; - private: Memory::CWeakPointer m_pConfig; @@ -109,14 +109,16 @@ namespace Hyprutils { // TODO: remove this pointer. We still need it for getBezier in getCurveValue. // getCurveValue is only used once in Hyprland. So either remove it or just pass pAnimationManager as a param. - CAnimationManager* m_pAnimationManager = nullptr; + CAnimationManager* m_pAnimationManager = nullptr; + + Memory::CWeakPointer m_events; - bool m_bRemoveEndAfterRan = true; - bool m_bRemoveBeginAfterRan = true; + bool m_bRemoveEndAfterRan = true; + bool m_bRemoveBeginAfterRan = true; - CallbackFun m_fEndCallback; - CallbackFun m_fBeginCallback; - CallbackFun m_fUpdateCallback; + CallbackFun m_fEndCallback; + CallbackFun m_fBeginCallback; + CallbackFun m_fUpdateCallback; }; /* This concept represents the minimum requirement for a type to be used with CGenericAnimatedVariable */ diff --git a/include/hyprutils/animation/AnimationManager.hpp b/include/hyprutils/animation/AnimationManager.hpp index 8d1c048..bbca960 100644 --- a/include/hyprutils/animation/AnimationManager.hpp +++ b/include/hyprutils/animation/AnimationManager.hpp @@ -51,12 +51,7 @@ namespace Hyprutils { Signal::CHyprSignalListener lazyDisconnect; } m_sListeners; - struct { - // Those events are shared between animated vars - Memory::CSharedPointer connect; - Memory::CSharedPointer forceDisconnect; - Memory::CSharedPointer lazyDisconnect; - } m_sEvents; + Memory::CSharedPointer m_events; friend class CBaseAnimatedVariable; }; diff --git a/src/animation/AnimatedVariable.cpp b/src/animation/AnimatedVariable.cpp index 02bb983..fb6b934 100644 --- a/src/animation/AnimatedVariable.cpp +++ b/src/animation/AnimatedVariable.cpp @@ -13,9 +13,7 @@ void CBaseAnimatedVariable::create(Hyprutils::Animation::CAnimationManager* pAni m_Type = typeInfo; m_pSelf = pSelf; - m_sEvents.connect = pAnimationManager->m_sEvents.connect; - m_sEvents.forceDisconnect = pAnimationManager->m_sEvents.forceDisconnect; - m_sEvents.lazyDisconnect = pAnimationManager->m_sEvents.lazyDisconnect; + m_events = pAnimationManager->m_events; m_bDummy = false; } @@ -24,15 +22,15 @@ void CBaseAnimatedVariable::connectToActive() { if (m_bDummy || m_bIsConnectedToActive) return; - if (const auto CONNECT = m_sEvents.connect.lock()) { - CONNECT->emit(m_pSelf.lock()); + if (const auto PEVENTS = m_events.lock()) { + PEVENTS->connect.emit(m_pSelf.lock()); m_bIsConnectedToActive = true; } } void CBaseAnimatedVariable::disconnectFromActive() { - if (const auto DISCONNECT = m_sEvents.forceDisconnect.lock()) - DISCONNECT->emit(static_cast(this)); + if (const auto PEVENTS = m_events.lock()) + PEVENTS->forceDisconnect.emit(static_cast(this)); m_bIsConnectedToActive = false; } @@ -85,7 +83,7 @@ float CBaseAnimatedVariable::getCurveValue() const { // Guard against m_pAnimationManager being deleted // TODO: Remove this and m_pAnimationManager - if (m_sEvents.connect.expired()) { + if (m_events.expired()) { return 1.f; } @@ -108,7 +106,7 @@ float CBaseAnimatedVariable::getCurveValue() const { } bool CBaseAnimatedVariable::ok() const { - return m_pConfig && !m_bDummy; + return m_pConfig && !m_bDummy && !m_events.expired(); } void CBaseAnimatedVariable::onUpdate() { @@ -144,8 +142,8 @@ void CBaseAnimatedVariable::resetAllCallbacks() { void CBaseAnimatedVariable::onAnimationEnd() { m_bIsBeingAnimated = false; /* lazy disconnect, since this animvar is atill alive */ - if (const auto DISCONNECT = m_sEvents.lazyDisconnect.lock()) - DISCONNECT->emit(static_cast(this)); + if (const auto PEVENTS = m_events.lock()) + PEVENTS->lazyDisconnect.emit(static_cast(this)); if (m_fEndCallback) { /* loading m_bRemoveEndAfterRan before calling the callback allows the callback to delete this animation safely if it is false. */ diff --git a/src/animation/AnimationManager.cpp b/src/animation/AnimationManager.cpp index 969d7a7..e3c2c29 100644 --- a/src/animation/AnimationManager.cpp +++ b/src/animation/AnimationManager.cpp @@ -14,13 +14,11 @@ CAnimationManager::CAnimationManager() { BEZIER->setup(DEFAULTBEZIERPOINTS); m_mBezierCurves["default"] = BEZIER; - m_sEvents.connect = makeShared(); - m_sEvents.forceDisconnect = makeShared(); - m_sEvents.lazyDisconnect = makeShared(); + m_events = makeShared(); - m_sListeners.connect = m_sEvents.connect->registerListener([this](std::any data) { connectListener(data); }); - m_sListeners.forceDisconnect = m_sEvents.forceDisconnect->registerListener([this](std::any data) { forceDisconnectListener(data); }); - m_sListeners.lazyDisconnect = m_sEvents.lazyDisconnect->registerListener([this](std::any data) { lazyDisconnectListener(data); }); + m_sListeners.connect = m_events->connect.registerListener([this](std::any data) { connectListener(data); }); + m_sListeners.forceDisconnect = m_events->forceDisconnect.registerListener([this](std::any data) { forceDisconnectListener(data); }); + m_sListeners.lazyDisconnect = m_events->lazyDisconnect.registerListener([this](std::any data) { lazyDisconnectListener(data); }); } void CAnimationManager::connectListener(std::any data) {