diff --git a/libobs/obs-canvas.c b/libobs/obs-canvas.c index fc43bea9e..494a02f39 100644 --- a/libobs/obs-canvas.c +++ b/libobs/obs-canvas.c @@ -34,6 +34,7 @@ static const char *canvas_signals[] = { "void source_add(ptr canvas, ptr source)", "void source_remove(ptr canvas, ptr source)", + "void source_rename(ptr source, string new_name, string prev_name)", "void rename(ptr source, string new_name, string prev_name)", @@ -367,6 +368,32 @@ void obs_canvas_remove_source(obs_source_t *source) source->canvas = NULL; } +void obs_canvas_rename_source(obs_source_t *source, const char *name) +{ + obs_canvas_t *canvas = obs_weak_canvas_get_canvas(source->canvas); + if (canvas) { + struct calldata data; + char *prev_name = bstrdup(source->context.name); + + obs_context_data_setname_ht(&source->context, name, &canvas->sources); + + calldata_init(&data); + calldata_set_ptr(&data, "source", source); + calldata_set_string(&data, "new_name", source->context.name); + calldata_set_string(&data, "prev_name", prev_name); + + signal_handler_signal(source->context.signals, "rename", &data); + signal_handler_signal(canvas->context.signals, "source_rename", &data); + if (canvas->flags & MAIN) + signal_handler_signal(obs->signals, "source_rename", &data); + + calldata_free(&data); + bfree(prev_name); + + obs_canvas_release(canvas); + } +} + /*** Public Canvas Object API ***/ bool obs_canvas_reset_video(obs_canvas_t *canvas, struct obs_video_info *ovi) diff --git a/libobs/obs-internal.h b/libobs/obs-internal.h index 49a864b5c..26d67d24e 100644 --- a/libobs/obs-internal.h +++ b/libobs/obs-internal.h @@ -683,6 +683,7 @@ extern void obs_free_canvas_mixes(void); extern bool obs_canvas_reset_video_internal(obs_canvas_t *canvas, struct obs_video_info *ovi); extern void obs_canvas_insert_source(obs_canvas_t *canvas, obs_source_t *source); extern void obs_canvas_remove_source(obs_source_t *source); +extern void obs_canvas_rename_source(obs_source_t *source, const char *name); /* ------------------------------------------------------------------------- */ /* sources */ diff --git a/libobs/obs-source.c b/libobs/obs-source.c index b162948ac..528a569a2 100644 --- a/libobs/obs-source.c +++ b/libobs/obs-source.c @@ -4144,24 +4144,28 @@ void obs_source_set_name(obs_source_t *source, const char *name) return; if (!name || !*name || !source->context.name || strcmp(name, source->context.name) != 0) { - struct calldata data; - char *prev_name = bstrdup(source->context.name); - - if (!source->context.private) { - obs_context_data_setname_ht(&source->context, name, &obs->data.public_sources); + if (requires_canvas(source)) { + obs_canvas_rename_source(source, name); } else { - obs_context_data_setname(&source->context, name); - } + struct calldata data; + char *prev_name = bstrdup(source->context.name); - calldata_init(&data); - calldata_set_ptr(&data, "source", source); - calldata_set_string(&data, "new_name", source->context.name); - calldata_set_string(&data, "prev_name", prev_name); - if (!source->context.private) - signal_handler_signal(obs->signals, "source_rename", &data); - signal_handler_signal(source->context.signals, "rename", &data); - calldata_free(&data); - bfree(prev_name); + if (!source->context.private) { + obs_context_data_setname_ht(&source->context, name, &obs->data.public_sources); + } else { + obs_context_data_setname(&source->context, name); + } + + calldata_init(&data); + calldata_set_ptr(&data, "source", source); + calldata_set_string(&data, "new_name", source->context.name); + calldata_set_string(&data, "prev_name", prev_name); + if (!source->context.private) + signal_handler_signal(obs->signals, "source_rename", &data); + signal_handler_signal(source->context.signals, "rename", &data); + calldata_free(&data); + bfree(prev_name); + } } }