diff --git a/plugins/base/macro-condition-transition.cpp b/plugins/base/macro-condition-transition.cpp index d25f0487f..0a0725e47 100644 --- a/plugins/base/macro-condition-transition.cpp +++ b/plugins/base/macro-condition-transition.cpp @@ -111,27 +111,42 @@ bool MacroConditionTransition::CheckCondition() return ret; } -void MacroConditionTransition::ConnectToTransitionSignals() +void advss::MacroConditionTransition::AddTransitionSignals( + obs_source_t *transition) { - const bool useFrontendTransitionSelection = - _transition.GetType() != - TransitionSelection::Type::TRANSITION || - (_condition == Condition::TRANSITION_SOURCE || - _condition == Condition::TRANSITION_TARGET); - - _signals.clear(); - OBSSourceAutoRelease source = - useFrontendTransitionSelection - ? obs_frontend_get_current_transition() - : obs_weak_source_get_source( - _transition.GetTransition()); - signal_handler_t *sh = obs_source_get_signal_handler(source); + signal_handler_t *sh = obs_source_get_signal_handler(transition); _signals.emplace_back(sh, "transition_start", TransitionStarted, this); _signals.emplace_back(sh, "transition_stop", TransitionEnded, this); _signals.emplace_back(sh, "transition_video_stop", TransitionVideoEnded, this); } +void MacroConditionTransition::ConnectToTransitionSignals() +{ + _signals.clear(); + + const bool watchSingleTransitionType = + _transition.GetType() == + TransitionSelection::Type::TRANSITION && + !(_condition == Condition::TRANSITION_SOURCE || + _condition == Condition::TRANSITION_TARGET); + + if (watchSingleTransitionType) { + OBSSourceAutoRelease transition = + OBSGetStrongRef(_transition.GetTransition()); + AddTransitionSignals(transition); + return; + } + + obs_frontend_source_list transitions = {}; + obs_frontend_get_transitions(&transitions); + for (size_t i = 0; i < transitions.sources.num; i++) { + obs_source_t *transition = transitions.sources.array[i]; + AddTransitionSignals(transition); + } + obs_frontend_source_list_free(&transitions); +} + void MacroConditionTransition::TransitionStarted(void *data, calldata_t *cd) { auto *condition = static_cast(data); diff --git a/plugins/base/macro-condition-transition.hpp b/plugins/base/macro-condition-transition.hpp index 77efb2a0c..2771efb89 100644 --- a/plugins/base/macro-condition-transition.hpp +++ b/plugins/base/macro-condition-transition.hpp @@ -42,6 +42,7 @@ class MacroConditionTransition : public MacroCondition { static void TransitionEnded(void *data, calldata_t *); static void TransitionVideoEnded(void *data, calldata_t *); static void HandleFrontendEvent(enum obs_frontend_event event, void *); + void AddTransitionSignals(obs_source_t *); std::vector _signals;