libobs: Add obs_canvas_rename_source()

This commit is contained in:
Dennis Sädtler 2025-05-02 14:36:35 +02:00 • committed by Ryan Foster
commit 66f47924ea
3 changed files with 48 additions and 16 deletions

View file

@ -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)

View file

@ -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 */

View file

@ -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);
}
}
}