libobs: Add callback for enumerating all scene children
Prevents infinite recursion when adding children to a scene.
This commit is contained in:
@@ -162,7 +162,7 @@ static void scene_destroy(void *data)
|
||||
|
||||
static void scene_enum_sources(void *data,
|
||||
obs_source_enum_proc_t enum_callback,
|
||||
void *param)
|
||||
void *param, bool active)
|
||||
{
|
||||
struct obs_scene *scene = data;
|
||||
struct obs_scene_item *item;
|
||||
@@ -175,7 +175,7 @@ static void scene_enum_sources(void *data,
|
||||
next = item->next;
|
||||
|
||||
obs_sceneitem_addref(item);
|
||||
if (os_atomic_load_long(&item->active_refs) > 0)
|
||||
if (!active || os_atomic_load_long(&item->active_refs) > 0)
|
||||
enum_callback(scene->source, item->source, param);
|
||||
obs_sceneitem_release(item);
|
||||
|
||||
@@ -185,6 +185,20 @@ static void scene_enum_sources(void *data,
|
||||
full_unlock(scene);
|
||||
}
|
||||
|
||||
static void scene_enum_active_sources(void *data,
|
||||
obs_source_enum_proc_t enum_callback,
|
||||
void *param)
|
||||
{
|
||||
scene_enum_sources(data, enum_callback, param, true);
|
||||
}
|
||||
|
||||
static void scene_enum_all_sources(void *data,
|
||||
obs_source_enum_proc_t enum_callback,
|
||||
void *param)
|
||||
{
|
||||
scene_enum_sources(data, enum_callback, param, false);
|
||||
}
|
||||
|
||||
static inline void detach_sceneitem(struct obs_scene_item *item)
|
||||
{
|
||||
if (item->prev)
|
||||
@@ -957,7 +971,8 @@ const struct obs_source_info scene_info =
|
||||
.get_height = scene_getheight,
|
||||
.load = scene_load,
|
||||
.save = scene_save,
|
||||
.enum_active_sources = scene_enum_sources
|
||||
.enum_active_sources = scene_enum_active_sources,
|
||||
.enum_all_sources = scene_enum_all_sources
|
||||
};
|
||||
|
||||
obs_scene_t *obs_scene_create(const char *name)
|
||||
|
Reference in New Issue
Block a user