From 6d0d07abfe5151d53ef0ddcf4c5c064dc34bf54f Mon Sep 17 00:00:00 2001 From: Chris Angelico Date: Sat, 11 May 2019 05:46:47 +1000 Subject: [PATCH] Fire an event whenever an item is locked/unlocked --- src/WSEvents.cpp | 42 ++++++++++++++++++++++++++++++++++++++++++ src/WSEvents.h | 1 + 2 files changed, 43 insertions(+) diff --git a/src/WSEvents.cpp b/src/WSEvents.cpp index 4e978cc4..405cdebe 100644 --- a/src/WSEvents.cpp +++ b/src/WSEvents.cpp @@ -304,6 +304,8 @@ void WSEvents::connectSourceSignals(obs_source_t* source) { signal_handler_connect(sh, "item_remove", OnSceneItemDelete, this); signal_handler_connect(sh, "item_visible", OnSceneItemVisibilityChanged, this); + signal_handler_connect(sh, + "item_locked", OnSceneItemLockedChanged, this); signal_handler_connect(sh, "item_transform", OnSceneItemTransform, this); signal_handler_connect(sh, "item_select", OnSceneItemSelected, this); signal_handler_connect(sh, "item_deselect", OnSceneItemDeselected, this); @@ -333,6 +335,8 @@ void WSEvents::disconnectSourceSignals(obs_source_t* source) { signal_handler_disconnect(sh, "item_remove", OnSceneItemDelete, this); signal_handler_disconnect(sh, "item_visible", OnSceneItemVisibilityChanged, this); + signal_handler_disconnect(sh, + "item_locked", OnSceneItemLockedChanged, this); signal_handler_disconnect(sh, "item_transform", OnSceneItemTransform, this); signal_handler_disconnect(sh, "item_select", OnSceneItemSelected, this); signal_handler_disconnect(sh, "item_deselect", OnSceneItemDeselected, this); @@ -1453,6 +1457,44 @@ void WSEvents::OnSceneItemVisibilityChanged(void* param, calldata_t* data) { instance->broadcastUpdate("SceneItemVisibilityChanged", fields); } +/** + * An item's locked status has been toggled. + * + * @return {String} `scene-name` Name of the scene. + * @return {String} `item-name` Name of the item in the scene. + * @return {int} `item-id` Scene item ID + * @return {boolean} `item-locked` New locked state of the item. + * + * @api events + * @name SceneItemLockedChanged + * @category sources + * @since 4.7.0 + */ +void WSEvents::OnSceneItemLockedChanged(void* param, calldata_t* data) { + auto instance = reinterpret_cast(param); + + obs_scene_t* scene = nullptr; + calldata_get_ptr(data, "scene", &scene); + + obs_sceneitem_t* sceneItem = nullptr; + calldata_get_ptr(data, "item", &sceneItem); + + bool locked = false; + calldata_get_bool(data, "locked", &locked); + + const char* sceneName = + obs_source_get_name(obs_scene_get_source(scene)); + const char* sceneItemName = + obs_source_get_name(obs_sceneitem_get_source(sceneItem)); + + OBSDataAutoRelease fields = obs_data_create(); + obs_data_set_string(fields, "scene-name", sceneName); + obs_data_set_string(fields, "item-name", sceneItemName); + obs_data_set_int(fields, "item-id", obs_sceneitem_get_id(sceneItem)); + obs_data_set_bool(fields, "item-locked", locked); + instance->broadcastUpdate("SceneItemLockedChanged", fields); +} + /** * An item's transform has been changed. * diff --git a/src/WSEvents.h b/src/WSEvents.h index 684fe654..ec2621fe 100644 --- a/src/WSEvents.h +++ b/src/WSEvents.h @@ -136,6 +136,7 @@ private: static void OnSceneItemAdd(void* param, calldata_t* data); static void OnSceneItemDelete(void* param, calldata_t* data); static void OnSceneItemVisibilityChanged(void* param, calldata_t* data); + static void OnSceneItemLockedChanged(void* param, calldata_t* data); static void OnSceneItemTransform(void* param, calldata_t* data); static void OnSceneItemSelected(void* param, calldata_t* data); static void OnSceneItemDeselected(void* param, calldata_t* data);