浏览代码

libobs: Add obs_canvas_rename_source()

Dennis Sädtler 5 月之前
父节点
当前提交
66f47924ea
共有 3 个文件被更改,包括 48 次插入16 次删除
  1. 27 0
      libobs/obs-canvas.c
  2. 1 0
      libobs/obs-internal.h
  3. 20 16
      libobs/obs-source.c

+ 27 - 0
libobs/obs-canvas.c

@@ -34,6 +34,7 @@ static const char *canvas_signals[] = {
 
 
 	"void source_add(ptr canvas, ptr source)",
 	"void source_add(ptr canvas, ptr source)",
 	"void source_remove(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)",
 	"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;
 	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 ***/
 /*** Public Canvas Object API ***/
 
 
 bool obs_canvas_reset_video(obs_canvas_t *canvas, struct obs_video_info *ovi)
 bool obs_canvas_reset_video(obs_canvas_t *canvas, struct obs_video_info *ovi)

+ 1 - 0
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 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_insert_source(obs_canvas_t *canvas, obs_source_t *source);
 extern void obs_canvas_remove_source(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  */
 /* sources  */

+ 20 - 16
libobs/obs-source.c

@@ -4144,24 +4144,28 @@ void obs_source_set_name(obs_source_t *source, const char *name)
 		return;
 		return;
 
 
 	if (!name || !*name || !source->context.name || strcmp(name, source->context.name) != 0) {
 	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 {
 		} 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);
+		}
 	}
 	}
 }
 }