From 5d74d5d03e4da8858978bfbfd8d6070997288ece Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Lepin?= <stephane.lepin@gmail.com>
Date: Fri, 30 Aug 2019 13:36:45 +0200
Subject: [PATCH] WSEvents(OnTransitionBegin): refactor event code

---
 src/Utils.cpp    | 20 ++++++++++++++++++++
 src/Utils.h      |  2 ++
 src/WSEvents.cpp | 28 ++++++++++------------------
 3 files changed, 32 insertions(+), 18 deletions(-)

diff --git a/src/Utils.cpp b/src/Utils.cpp
index 670585a6..59d6c67d 100644
--- a/src/Utils.cpp
+++ b/src/Utils.cpp
@@ -362,6 +362,26 @@ QSpinBox* Utils::GetTransitionDurationControl() {
 	return window->findChild<QSpinBox*>("transitionDuration");
 }
 
+int Utils::GetTransitionDuration(obs_source_t* transition) {
+	if (!transition || obs_source_get_type(transition) != OBS_SOURCE_TYPE_TRANSITION) {
+		return -1;
+	}
+
+	OBSSourceAutoRelease destinationScene = obs_transition_get_active_source(transition);
+	OBSDataAutoRelease destinationSettings = obs_source_get_private_settings(destinationScene);
+
+	// Detect if transition is the global transition or a transition override.
+	// Fetching the duration is different depending on the case.
+	obs_data_item_t* transitionDurationItem = obs_data_item_byname(destinationSettings, "transition_duration");
+	int duration = (
+		transitionDurationItem
+		? obs_data_item_get_int(transitionDurationItem)
+		: obs_frontend_get_transition_duration()
+	);
+
+	return duration;
+}
+
 bool Utils::SetTransitionByName(QString transitionName) {
 	OBSSourceAutoRelease transition = GetTransitionFromName(transitionName);
 
diff --git a/src/Utils.h b/src/Utils.h
index d832157b..8e2d410d 100644
--- a/src/Utils.h
+++ b/src/Utils.h
@@ -54,6 +54,8 @@ class Utils {
 	// TODO contribute a proper frontend API method for this to OBS and remove this hack
 	static QSpinBox* GetTransitionDurationControl();
 
+	static int GetTransitionDuration(obs_source_t* transition);
+
 	static bool SetTransitionByName(QString transitionName);
 
 	static QString OBSVersionString();
diff --git a/src/WSEvents.cpp b/src/WSEvents.cpp
index 74decf82..32b4ecce 100644
--- a/src/WSEvents.cpp
+++ b/src/WSEvents.cpp
@@ -847,33 +847,25 @@ void WSEvents::OnTransitionBegin(void* param, calldata_t* data) {
 	auto instance = reinterpret_cast<WSEvents*>(param);
 
 	OBSSource transition = calldata_get_pointer<obs_source_t>(data, "source");
-	if (!transition) return;
+	if (!transition) {
+		return;
+	}
 
-	// Detect if transition is the global transition or a transition override.
-	// Fetching the duration is different depending on the case.
-	OBSSourceAutoRelease sourceScene = obs_transition_get_source(transition, OBS_TRANSITION_SOURCE_A);
-	OBSSourceAutoRelease destinationScene = obs_transition_get_active_source(transition);
-	OBSDataAutoRelease destinationSettings = obs_source_get_private_settings(destinationScene);
-	int duration = -1;
-	if (obs_data_has_default_value(destinationSettings, "transition_duration") ||
-		obs_data_has_user_value(destinationSettings, "transition_duration"))
-	{
-		duration = obs_data_get_int(destinationSettings, "transition_duration");
-	} else {
-		duration = obs_frontend_get_transition_duration();
+	int duration = Utils::GetTransitionDuration(transition);
+	if (duration < 0) {
+		blog(LOG_WARNING, "OnTransitionBegin: duration is negative !");
 	}
 
 	OBSDataAutoRelease fields = obs_data_create();
 	obs_data_set_string(fields, "name", obs_source_get_name(transition));
-	if (duration >= 0) {
-		obs_data_set_int(fields, "duration", duration);
-	} else {
-		blog(LOG_WARNING, "OnTransitionBegin: duration is negative !");
-	}
+	obs_data_set_int(fields, "duration", duration);
 
+	OBSSourceAutoRelease sourceScene = obs_transition_get_source(transition, OBS_TRANSITION_SOURCE_A);
 	if (sourceScene) {
 		obs_data_set_string(fields, "from-scene", obs_source_get_name(sourceScene));
 	}
+
+	OBSSourceAutoRelease destinationScene = obs_transition_get_active_source(transition);
 	if (destinationScene) {
 		obs_data_set_string(fields, "to-scene", obs_source_get_name(destinationScene));
 	}