diff --git a/src/eventhandler/EventHandler.cpp b/src/eventhandler/EventHandler.cpp index a4359568..73630dff 100644 --- a/src/eventhandler/EventHandler.cpp +++ b/src/eventhandler/EventHandler.cpp @@ -176,6 +176,7 @@ void EventHandler::ConnectSourceSignals(obs_source_t *source) // Applies to inpu // Transitions if (sourceType == OBS_SOURCE_TYPE_TRANSITION) { signal_handler_connect(sh, "transition_start", HandleSceneTransitionStarted, this); + signal_handler_connect(sh, "transition_stop", HandleSceneTransitionEnded, this); } // Filters @@ -243,6 +244,7 @@ void EventHandler::DisconnectSourceSignals(obs_source_t *source) // Transitions if (sourceType == OBS_SOURCE_TYPE_TRANSITION) { signal_handler_disconnect(sh, "transition_start", HandleSceneTransitionStarted, this); + signal_handler_disconnect(sh, "transition_stop", HandleSceneTransitionEnded, this); } // Filters diff --git a/src/eventhandler/EventHandler.h b/src/eventhandler/EventHandler.h index 305e525e..7452b29a 100644 --- a/src/eventhandler/EventHandler.h +++ b/src/eventhandler/EventHandler.h @@ -116,6 +116,7 @@ class EventHandler void HandleCurrentSceneTransitionChanged(); void HandleCurrentSceneTransitionDurationChanged(); static void HandleSceneTransitionStarted(void *param, calldata_t *data); // Direct callback + static void HandleSceneTransitionEnded(void *param, calldata_t *data); // Direct callback // Filters static void FilterAddMultiHandler(void *param, calldata_t *data); // Direct callback diff --git a/src/eventhandler/EventHandler_Transitions.cpp b/src/eventhandler/EventHandler_Transitions.cpp index 66f89342..35f0b67b 100644 --- a/src/eventhandler/EventHandler_Transitions.cpp +++ b/src/eventhandler/EventHandler_Transitions.cpp @@ -86,3 +86,31 @@ void EventHandler::HandleSceneTransitionStarted(void *param, calldata_t *data) eventData["transitionName"] = obs_source_get_name(source); eventHandler->BroadcastEvent(EventSubscription::Transitions, "SceneTransitionStarted", eventData); } + +/** + * A scene transition has completed fully. + * + * Note: Does not appear to trigger when the transition is interrupted by the user. + * + * @dataField transitionName | String | Scene transition name + * + * @eventType SceneTransitionEnded + * @eventSubscription Transitions + * @complexity 2 + * @rpcVersion -1 + * @initialVersion 5.0.0 + * @api events + * @category transitions + */ +void EventHandler::HandleSceneTransitionEnded(void *param, calldata_t *data) +{ + auto eventHandler = static_cast(param); + + obs_source_t *source = GetCalldataPointer(data, "source"); + if (!source) + return; + + json eventData; + eventData["transitionName"] = obs_source_get_name(source); + eventHandler->BroadcastEvent(EventSubscription::Transitions, "SceneTransitionEnded", eventData); +}