From 783f3209c0870dfda030fb934587e83bffd3095a Mon Sep 17 00:00:00 2001 From: Exeldro Date: Sat, 15 Nov 2025 21:15:51 +0100 Subject: [PATCH] libobs: Fix canvas private duplicated scenes --- libobs/obs-internal.h | 2 ++ libobs/obs-scene.c | 8 ++++---- libobs/obs-source.c | 8 ++++++++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/libobs/obs-internal.h b/libobs/obs-internal.h index 219293413f44df..9d61b5c114f253 100644 --- a/libobs/obs-internal.h +++ b/libobs/obs-internal.h @@ -1022,6 +1022,8 @@ extern void audio_monitor_destroy(struct audio_monitor *monitor); extern obs_source_t *obs_source_create_canvas(obs_canvas_t *canvas, const char *id, const char *name, obs_data_t *settings, obs_data_t *hotkey_data); +extern obs_source_t *obs_source_create_canvas_private(obs_canvas_t *canvas, const char *id, const char *name, + obs_data_t *settings); extern obs_source_t *obs_source_create_set_last_ver(obs_canvas_t *canvas, const char *id, const char *name, const char *uuid, obs_data_t *settings, obs_data_t *hotkey_data, uint32_t last_obs_ver, bool is_private); diff --git a/libobs/obs-scene.c b/libobs/obs-scene.c index 02fa144a26b63d..c5badde3c5b891 100644 --- a/libobs/obs-scene.c +++ b/libobs/obs-scene.c @@ -1785,9 +1785,9 @@ static inline obs_scene_t *create_id(obs_canvas_t *canvas, const char *id, const return source->context.data; } -static inline obs_scene_t *create_private_id(const char *id, const char *name) +static inline obs_scene_t *create_private_id(obs_canvas_t *canvas, const char *id, const char *name) { - struct obs_source *source = obs_source_create_private(id, name, NULL); + struct obs_source *source = obs_source_create_canvas_private(canvas, id, name, NULL); return source->context.data; } @@ -1798,7 +1798,7 @@ obs_scene_t *obs_scene_create(const char *name) obs_scene_t *obs_scene_create_private(const char *name) { - return create_private_id("scene", name); + return create_private_id(obs->data.main_canvas, "scene", name); } static obs_source_t *get_child_at_idx(obs_scene_t *scene, size_t idx) @@ -1939,7 +1939,7 @@ obs_scene_t *obs_scene_duplicate(obs_scene_t *scene, const char *name, enum obs_ /* --------------------------------- */ obs_canvas_t *canvas = obs_weak_canvas_get_canvas(scene->source->canvas); - new_scene = make_private ? create_private_id(scene->source->info.id, name) + new_scene = make_private ? create_private_id(canvas, scene->source->info.id, name) : create_id(canvas, scene->source->info.id, name); obs_canvas_release(canvas); diff --git a/libobs/obs-source.c b/libobs/obs-source.c index 533b91a5b33a5d..e67ff49887eb9d 100644 --- a/libobs/obs-source.c +++ b/libobs/obs-source.c @@ -284,6 +284,8 @@ static void obs_source_init_finalize(struct obs_source *source, obs_canvas_t *ca obs_context_data_insert_name(&source->context, &obs->data.sources_mutex, &obs->data.public_sources); } + } else if (requires_canvas(source)) { + source->canvas = obs_canvas_get_weak_canvas(canvas); } obs_context_data_insert_uuid(&source->context, &obs->data.sources_mutex, &obs->data.sources); } @@ -468,6 +470,12 @@ obs_source_t *obs_source_create_canvas(obs_canvas_t *canvas, const char *id, con return obs_source_create_internal(id, name, NULL, settings, hotkey_data, false, LIBOBS_API_VER, canvas); } +obs_source_t *obs_source_create_canvas_private(obs_canvas_t *canvas, const char *id, const char *name, + obs_data_t *settings) +{ + return obs_source_create_internal(id, name, NULL, settings, NULL, true, LIBOBS_API_VER, canvas); +} + obs_source_t *obs_source_create_set_last_ver(obs_canvas_t *canvas, const char *id, const char *name, const char *uuid, obs_data_t *settings, obs_data_t *hotkey_data, uint32_t last_obs_ver, bool is_private)