animation: only store a single WP to animationmgr signals

This commit is contained in:
Maximilian Seidler 2025-01-26 09:49:46 +01:00
parent 27d35e8d08
commit 60dbdc46cc
4 changed files with 32 additions and 39 deletions

View file

@ -12,6 +12,12 @@ namespace Hyprutils {
namespace Animation { namespace Animation {
class CAnimationManager; class CAnimationManager;
struct SAnimVarEvents {
Signal::CSignal connect;
Signal::CSignal forceDisconnect;
Signal::CSignal lazyDisconnect;
};
/* A base class for animated variables. */ /* A base class for animated variables. */
class CBaseAnimatedVariable { class CBaseAnimatedVariable {
public: public:
@ -94,12 +100,6 @@ namespace Hyprutils {
Memory::CWeakPointer<CBaseAnimatedVariable> m_pSelf; Memory::CWeakPointer<CBaseAnimatedVariable> m_pSelf;
struct {
Memory::CWeakPointer<Signal::CSignal> connect;
Memory::CWeakPointer<Signal::CSignal> forceDisconnect;
Memory::CWeakPointer<Signal::CSignal> lazyDisconnect;
} m_sEvents;
private: private:
Memory::CWeakPointer<SAnimationPropertyConfig> m_pConfig; Memory::CWeakPointer<SAnimationPropertyConfig> m_pConfig;
@ -109,14 +109,16 @@ namespace Hyprutils {
// TODO: remove this pointer. We still need it for getBezier in getCurveValue. // 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. // 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;
bool m_bRemoveEndAfterRan = true; Memory::CWeakPointer<SAnimVarEvents> m_events;
bool m_bRemoveBeginAfterRan = true;
CallbackFun m_fEndCallback; bool m_bRemoveEndAfterRan = true;
CallbackFun m_fBeginCallback; bool m_bRemoveBeginAfterRan = true;
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 */ /* This concept represents the minimum requirement for a type to be used with CGenericAnimatedVariable */

View file

@ -25,10 +25,6 @@ namespace Hyprutils {
virtual void scheduleTick() = 0; virtual void scheduleTick() = 0;
virtual void onTicked() = 0; virtual void onTicked() = 0;
void connectListener(std::any data);
void lazyDisconnectListener(std::any data);
void forceDisconnectListener(std::any data);
void addBezierWithName(std::string, const Math::Vector2D&, const Math::Vector2D&); void addBezierWithName(std::string, const Math::Vector2D&, const Math::Vector2D&);
void removeAllBeziers(); void removeAllBeziers();
@ -45,18 +41,17 @@ namespace Hyprutils {
bool m_bTickScheduled = false; bool m_bTickScheduled = false;
uint32_t m_pendingDisconnects = 0; uint32_t m_pendingDisconnects = 0;
void connectListener(std::any data);
void lazyDisconnectListener(std::any data);
void forceDisconnectListener(std::any data);
struct { struct {
Signal::CHyprSignalListener connect; Signal::CHyprSignalListener connect;
Signal::CHyprSignalListener forceDisconnect; Signal::CHyprSignalListener forceDisconnect;
Signal::CHyprSignalListener lazyDisconnect; Signal::CHyprSignalListener lazyDisconnect;
} m_sListeners; } m_sListeners;
struct { Memory::CSharedPointer<SAnimVarEvents> m_events;
// Those events are shared between animated vars
Memory::CSharedPointer<Signal::CSignal> connect;
Memory::CSharedPointer<Signal::CSignal> forceDisconnect;
Memory::CSharedPointer<Signal::CSignal> lazyDisconnect;
} m_sEvents;
friend class CBaseAnimatedVariable; friend class CBaseAnimatedVariable;
}; };

View file

@ -13,9 +13,7 @@ void CBaseAnimatedVariable::create(Hyprutils::Animation::CAnimationManager* pAni
m_Type = typeInfo; m_Type = typeInfo;
m_pSelf = pSelf; m_pSelf = pSelf;
m_sEvents.connect = pAnimationManager->m_sEvents.connect; m_events = pAnimationManager->m_events;
m_sEvents.forceDisconnect = pAnimationManager->m_sEvents.forceDisconnect;
m_sEvents.lazyDisconnect = pAnimationManager->m_sEvents.lazyDisconnect;
m_bDummy = false; m_bDummy = false;
} }
@ -24,15 +22,15 @@ void CBaseAnimatedVariable::connectToActive() {
if (m_bDummy || m_bIsConnectedToActive) if (m_bDummy || m_bIsConnectedToActive)
return; return;
if (const auto CONNECT = m_sEvents.connect.lock()) { if (const auto PEVENTS = m_events.lock()) {
CONNECT->emit(m_pSelf.lock()); PEVENTS->connect.emit(m_pSelf.lock());
m_bIsConnectedToActive = true; m_bIsConnectedToActive = true;
} }
} }
void CBaseAnimatedVariable::disconnectFromActive() { void CBaseAnimatedVariable::disconnectFromActive() {
if (const auto DISCONNECT = m_sEvents.forceDisconnect.lock()) if (const auto PEVENTS = m_events.lock())
DISCONNECT->emit(static_cast<void*>(this)); PEVENTS->forceDisconnect.emit(static_cast<void*>(this));
m_bIsConnectedToActive = false; m_bIsConnectedToActive = false;
} }
@ -85,7 +83,7 @@ float CBaseAnimatedVariable::getCurveValue() const {
// Guard against m_pAnimationManager being deleted // Guard against m_pAnimationManager being deleted
// TODO: Remove this and m_pAnimationManager // TODO: Remove this and m_pAnimationManager
if (m_sEvents.connect.expired()) { if (m_events.expired()) {
return 1.f; return 1.f;
} }
@ -108,7 +106,7 @@ float CBaseAnimatedVariable::getCurveValue() const {
} }
bool CBaseAnimatedVariable::ok() const { bool CBaseAnimatedVariable::ok() const {
return m_pConfig && !m_bDummy; return m_pConfig && !m_bDummy && !m_events.expired();
} }
void CBaseAnimatedVariable::onUpdate() { void CBaseAnimatedVariable::onUpdate() {
@ -144,8 +142,8 @@ void CBaseAnimatedVariable::resetAllCallbacks() {
void CBaseAnimatedVariable::onAnimationEnd() { void CBaseAnimatedVariable::onAnimationEnd() {
m_bIsBeingAnimated = false; m_bIsBeingAnimated = false;
/* lazy disconnect, since this animvar is atill alive */ /* lazy disconnect, since this animvar is atill alive */
if (const auto DISCONNECT = m_sEvents.lazyDisconnect.lock()) if (const auto PEVENTS = m_events.lock())
DISCONNECT->emit(static_cast<void*>(this)); PEVENTS->lazyDisconnect.emit(static_cast<void*>(this));
if (m_fEndCallback) { if (m_fEndCallback) {
/* loading m_bRemoveEndAfterRan before calling the callback allows the callback to delete this animation safely if it is false. */ /* loading m_bRemoveEndAfterRan before calling the callback allows the callback to delete this animation safely if it is false. */

View file

@ -14,13 +14,11 @@ CAnimationManager::CAnimationManager() {
BEZIER->setup(DEFAULTBEZIERPOINTS); BEZIER->setup(DEFAULTBEZIERPOINTS);
m_mBezierCurves["default"] = BEZIER; m_mBezierCurves["default"] = BEZIER;
m_sEvents.connect = makeShared<CSignal>(); m_events = makeShared<SAnimVarEvents>();
m_sEvents.forceDisconnect = makeShared<CSignal>();
m_sEvents.lazyDisconnect = makeShared<CSignal>();
m_sListeners.connect = m_sEvents.connect->registerListener([this](std::any data) { connectListener(data); }); m_sListeners.connect = m_events->connect.registerListener([this](std::any data) { connectListener(data); });
m_sListeners.forceDisconnect = m_sEvents.forceDisconnect->registerListener([this](std::any data) { forceDisconnectListener(data); }); m_sListeners.forceDisconnect = m_events->forceDisconnect.registerListener([this](std::any data) { forceDisconnectListener(data); });
m_sListeners.lazyDisconnect = m_sEvents.lazyDisconnect->registerListener([this](std::any data) { lazyDisconnectListener(data); }); m_sListeners.lazyDisconnect = m_events->lazyDisconnect.registerListener([this](std::any data) { lazyDisconnectListener(data); });
} }
void CAnimationManager::connectListener(std::any data) { void CAnimationManager::connectListener(std::any data) {