diff --git a/docs/docs/generate_md.py b/docs/docs/generate_md.py
index fc1db33a..34c5b78a 100644
--- a/docs/docs/generate_md.py
+++ b/docs/docs/generate_md.py
@@ -18,7 +18,7 @@
'General',
'Config',
'Sources',
- 'Canvas',
+ 'Canvases',
'Scenes',
'Inputs',
'Transitions',
diff --git a/src/eventhandler/EventHandler_Canvases.cpp b/src/eventhandler/EventHandler_Canvases.cpp
index 6151e74e..188fb3b5 100644
--- a/src/eventhandler/EventHandler_Canvases.cpp
+++ b/src/eventhandler/EventHandler_Canvases.cpp
@@ -31,7 +31,7 @@ with this program. If not, see
* @rpcVersion -1
* @initialVersion 5.7.0
* @api events
- * @category canvas
+ * @category canvases
*/
void EventHandler::HandleCanvasCreated(obs_canvas_t *canvas)
{
@@ -53,7 +53,7 @@ void EventHandler::HandleCanvasCreated(obs_canvas_t *canvas)
* @rpcVersion -1
* @initialVersion 5.7.0
* @api events
- * @category canvas
+ * @category canvases
*/
void EventHandler::HandleCanvasRemoved(obs_canvas_t *canvas)
{
@@ -76,7 +76,7 @@ void EventHandler::HandleCanvasRemoved(obs_canvas_t *canvas)
* @rpcVersion -1
* @initialVersion 5.7.0
* @api events
- * @category canvas
+ * @category canvases
*/
void EventHandler::HandleCanvasNameChanged(obs_canvas_t *canvas, std::string oldCanvasName, std::string canvasName)
{
diff --git a/src/eventhandler/EventHandler_SceneItems.cpp b/src/eventhandler/EventHandler_SceneItems.cpp
index ebd871a6..b21303c3 100644
--- a/src/eventhandler/EventHandler_SceneItems.cpp
+++ b/src/eventhandler/EventHandler_SceneItems.cpp
@@ -49,6 +49,10 @@ void EventHandler::HandleSceneItemCreated(void *param, calldata_t *data)
if (!sceneItem)
return;
+ OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene));
+ if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN))
+ return;
+
json eventData;
eventData["sceneName"] = obs_source_get_name(obs_scene_get_source(scene));
eventData["sceneUuid"] = obs_source_get_uuid(obs_scene_get_source(scene));
@@ -56,11 +60,6 @@ void EventHandler::HandleSceneItemCreated(void *param, calldata_t *data)
eventData["sourceUuid"] = obs_source_get_uuid(obs_sceneitem_get_source(sceneItem));
eventData["sceneItemId"] = obs_sceneitem_get_id(sceneItem);
eventData["sceneItemIndex"] = obs_sceneitem_get_order_position(sceneItem);
- OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene));
- if (canvas) {
- eventData["canvasName"] = obs_canvas_get_name(canvas);
- eventData["canvasUuid"] = obs_canvas_get_uuid(canvas);
- }
eventHandler->BroadcastEvent(EventSubscription::SceneItems, "SceneItemCreated", eventData);
}
@@ -95,17 +94,16 @@ void EventHandler::HandleSceneItemRemoved(void *param, calldata_t *data)
if (!sceneItem)
return;
+ OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene));
+ if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN))
+ return;
+
json eventData;
eventData["sceneName"] = obs_source_get_name(obs_scene_get_source(scene));
eventData["sceneUuid"] = obs_source_get_uuid(obs_scene_get_source(scene));
eventData["sourceName"] = obs_source_get_name(obs_sceneitem_get_source(sceneItem));
eventData["sourceUuid"] = obs_source_get_uuid(obs_sceneitem_get_source(sceneItem));
eventData["sceneItemId"] = obs_sceneitem_get_id(sceneItem);
- OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene));
- if (canvas) {
- eventData["canvasName"] = obs_canvas_get_name(canvas);
- eventData["canvasUuid"] = obs_canvas_get_uuid(canvas);
- }
eventHandler->BroadcastEvent(EventSubscription::SceneItems, "SceneItemRemoved", eventData);
}
@@ -132,15 +130,14 @@ void EventHandler::HandleSceneItemListReindexed(void *param, calldata_t *data)
if (!scene)
return;
+ OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene));
+ if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN))
+ return;
+
json eventData;
eventData["sceneName"] = obs_source_get_name(obs_scene_get_source(scene));
eventData["sceneUuid"] = obs_source_get_uuid(obs_scene_get_source(scene));
eventData["sceneItems"] = Utils::Obs::ArrayHelper::GetSceneItemList(scene, true);
- OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene));
- if (canvas) {
- eventData["canvasName"] = obs_canvas_get_name(canvas);
- eventData["canvasUuid"] = obs_canvas_get_uuid(canvas);
- }
eventHandler->BroadcastEvent(EventSubscription::SceneItems, "SceneItemListReindexed", eventData);
}
@@ -174,16 +171,15 @@ void EventHandler::HandleSceneItemEnableStateChanged(void *param, calldata_t *da
bool sceneItemEnabled = calldata_bool(data, "visible");
+ OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene));
+ if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN))
+ return;
+
json eventData;
eventData["sceneName"] = obs_source_get_name(obs_scene_get_source(scene));
eventData["sceneUuid"] = obs_source_get_uuid(obs_scene_get_source(scene));
eventData["sceneItemId"] = obs_sceneitem_get_id(sceneItem);
eventData["sceneItemEnabled"] = sceneItemEnabled;
- OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene));
- if (canvas) {
- eventData["canvasName"] = obs_canvas_get_name(canvas);
- eventData["canvasUuid"] = obs_canvas_get_uuid(canvas);
- }
eventHandler->BroadcastEvent(EventSubscription::SceneItems, "SceneItemEnableStateChanged", eventData);
}
@@ -217,16 +213,15 @@ void EventHandler::HandleSceneItemLockStateChanged(void *param, calldata_t *data
bool sceneItemLocked = calldata_bool(data, "locked");
+ OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene));
+ if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN))
+ return;
+
json eventData;
eventData["sceneName"] = obs_source_get_name(obs_scene_get_source(scene));
eventData["sceneUuid"] = obs_source_get_uuid(obs_scene_get_source(scene));
eventData["sceneItemId"] = obs_sceneitem_get_id(sceneItem);
eventData["sceneItemLocked"] = sceneItemLocked;
- OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene));
- if (canvas) {
- eventData["canvasName"] = obs_canvas_get_name(canvas);
- eventData["canvasUuid"] = obs_canvas_get_uuid(canvas);
- }
eventHandler->BroadcastEvent(EventSubscription::SceneItems, "SceneItemLockStateChanged", eventData);
}
@@ -257,15 +252,14 @@ void EventHandler::HandleSceneItemSelected(void *param, calldata_t *data)
if (!sceneItem)
return;
+ OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene));
+ if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN))
+ return;
+
json eventData;
eventData["sceneName"] = obs_source_get_name(obs_scene_get_source(scene));
eventData["sceneUuid"] = obs_source_get_uuid(obs_scene_get_source(scene));
eventData["sceneItemId"] = obs_sceneitem_get_id(sceneItem);
- OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene));
- if (canvas) {
- eventData["canvasName"] = obs_canvas_get_name(canvas);
- eventData["canvasUuid"] = obs_canvas_get_uuid(canvas);
- }
eventHandler->BroadcastEvent(EventSubscription::SceneItems, "SceneItemSelected", eventData);
}
@@ -300,15 +294,14 @@ void EventHandler::HandleSceneItemTransformChanged(void *param, calldata_t *data
if (!sceneItem)
return;
+ OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene));
+ if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN))
+ return;
+
json eventData;
eventData["sceneName"] = obs_source_get_name(obs_scene_get_source(scene));
eventData["sceneUuid"] = obs_source_get_uuid(obs_scene_get_source(scene));
eventData["sceneItemId"] = obs_sceneitem_get_id(sceneItem);
eventData["sceneItemTransform"] = Utils::Obs::ObjectHelper::GetSceneItemTransform(sceneItem);
- OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene));
- if (canvas) {
- eventData["canvasName"] = obs_canvas_get_name(canvas);
- eventData["canvasUuid"] = obs_canvas_get_uuid(canvas);
- }
eventHandler->BroadcastEvent(EventSubscription::SceneItemTransformChanged, "SceneItemTransformChanged", eventData);
}
diff --git a/src/eventhandler/EventHandler_Scenes.cpp b/src/eventhandler/EventHandler_Scenes.cpp
index 4480899b..73d1f7d8 100644
--- a/src/eventhandler/EventHandler_Scenes.cpp
+++ b/src/eventhandler/EventHandler_Scenes.cpp
@@ -36,15 +36,14 @@ with this program. If not, see
*/
void EventHandler::HandleSceneCreated(obs_source_t *source)
{
+ OBSCanvasAutoRelease canvas = obs_source_get_canvas(source);
+ if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN))
+ return;
+
json eventData;
eventData["sceneName"] = obs_source_get_name(source);
eventData["sceneUuid"] = obs_source_get_uuid(source);
eventData["isGroup"] = obs_source_is_group(source);
- OBSCanvasAutoRelease canvas = obs_source_get_canvas(source);
- if (canvas) {
- eventData["canvasName"] = obs_canvas_get_name(canvas);
- eventData["canvasUuid"] = obs_canvas_get_uuid(canvas);
- }
BroadcastEvent(EventSubscription::Scenes, "SceneCreated", eventData);
}
@@ -65,15 +64,17 @@ void EventHandler::HandleSceneCreated(obs_source_t *source)
*/
void EventHandler::HandleSceneRemoved(obs_source_t *source)
{
+ OBSCanvasAutoRelease canvas = obs_source_get_canvas(source);
+ // NOTE: Groups do not emit source_remove when they are deleted and canvas will already be NULL
+ // during source_destroy. As a result, this event will never be emitted here for groups.
+ // This should be fixed in the future when more thorough canvas support is added.
+ if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN))
+ return;
+
json eventData;
eventData["sceneName"] = obs_source_get_name(source);
eventData["sceneUuid"] = obs_source_get_uuid(source);
eventData["isGroup"] = obs_source_is_group(source);
- OBSCanvasAutoRelease canvas = obs_source_get_canvas(source);
- if (canvas) {
- eventData["canvasName"] = obs_canvas_get_name(canvas);
- eventData["canvasUuid"] = obs_canvas_get_uuid(canvas);
- }
BroadcastEvent(EventSubscription::Scenes, "SceneRemoved", eventData);
}
@@ -94,15 +95,14 @@ void EventHandler::HandleSceneRemoved(obs_source_t *source)
*/
void EventHandler::HandleSceneNameChanged(obs_source_t *source, std::string oldSceneName, std::string sceneName)
{
+ OBSCanvasAutoRelease canvas = obs_source_get_canvas(source);
+ if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN))
+ return;
+
json eventData;
eventData["sceneUuid"] = obs_source_get_uuid(source);
eventData["oldSceneName"] = oldSceneName;
eventData["sceneName"] = sceneName;
- OBSCanvasAutoRelease canvas = obs_source_get_canvas(source);
- if (canvas) {
- eventData["canvasName"] = obs_canvas_get_name(canvas);
- eventData["canvasUuid"] = obs_canvas_get_uuid(canvas);
- }
BroadcastEvent(EventSubscription::Scenes, "SceneNameChanged", eventData);
}
diff --git a/src/requesthandler/RequestHandler_Canvases.cpp b/src/requesthandler/RequestHandler_Canvases.cpp
index 26d545a6..532f3510 100644
--- a/src/requesthandler/RequestHandler_Canvases.cpp
+++ b/src/requesthandler/RequestHandler_Canvases.cpp
@@ -22,41 +22,43 @@ with this program. If not, see
/**
* Gets an array of canvases in OBS.
*
- * @responseField canvases | Array