diff --git a/libobs/obs-scene.c b/libobs/obs-scene.c index 65707166a..8948027fc 100644 --- a/libobs/obs-scene.c +++ b/libobs/obs-scene.c @@ -1239,6 +1239,10 @@ obs_scene_t *obs_scene_duplicate(obs_scene_t *scene, const char *name, obs_data_apply(new_scene->source->private_settings, scene->source->private_settings); + /* never duplicate sub-items for groups */ + if (scene->is_group) + make_unique = false; + for (size_t i = 0; i < items.num; i++) { item = items.array[i]; source = make_unique ? @@ -1292,6 +1296,9 @@ obs_scene_t *obs_scene_duplicate(obs_scene_t *scene, const char *name, for (size_t i = 0; i < items.num; i++) obs_sceneitem_release(items.array[i]); + if (new_scene->is_group) + resize_scene(new_scene); + da_free(items); return new_scene; } @@ -1321,6 +1328,14 @@ obs_scene_t *obs_scene_from_source(const obs_source_t *source) return source->context.data; } +obs_scene_t *obs_group_from_source(const obs_source_t *source) +{ + if (!source || source->info.id != group_info.id) + return NULL; + + return source->context.data; +} + obs_sceneitem_t *obs_scene_find_source(obs_scene_t *scene, const char *name) { struct obs_scene_item *item; diff --git a/libobs/obs-source.c b/libobs/obs-source.c index be4f76b81..d77be3249 100644 --- a/libobs/obs-source.c +++ b/libobs/obs-source.c @@ -439,6 +439,8 @@ void obs_source_copy_filters(obs_source_t *dst, obs_source_t *src) duplicate_filters(dst, src, dst->context.private); } +extern obs_scene_t *obs_group_from_source(const obs_source_t *source); + obs_source_t *obs_source_duplicate(obs_source_t *source, const char *new_name, bool create_private) { @@ -455,6 +457,11 @@ obs_source_t *obs_source_duplicate(obs_source_t *source, if (source->info.type == OBS_SOURCE_TYPE_SCENE) { obs_scene_t *scene = obs_scene_from_source(source); + if (!scene) + scene = obs_group_from_source(source); + if (!scene) + return NULL; + obs_scene_t *new_scene = obs_scene_duplicate(scene, new_name, create_private ? OBS_SCENE_DUP_PRIVATE_COPY : OBS_SCENE_DUP_COPY);