Browse Source

Ensure names are valid

Ensure that a source has a valid name.  Duplicates aren't a big deal
internally, but sources without a name are probably something that
should be avoided.  Made is so that if a source is programmatically
created without a name, it's assigned an index based name.

In the main basic-mode window, made it check to make sure the name was
valid as well.
jp9000 11 years ago
parent
commit
5288467aeb

+ 3 - 1
build/data/obs-studio/locale/en.txt

@@ -18,6 +18,8 @@ MainWindow.AddSourceDlg.Text="Please enter the name of the source"
 MainWindow.NameExists.Title="Name already exists"
 MainWindow.NameExists.Text="The name is already in use by another source."
 
+MainWindow.NoNameEntered="Please enter a valid name"
+
 MainWindow.Exit="Exit"
 MainWindow.Lock="Lock Preview"
 MainWindow.Preview="Enable Preview"
@@ -50,7 +52,7 @@ Settings.Video.DisableAeroWindows="Disable Aero (Windows only)"
 Settings.Video.FPS="FPS:"
 Settings.Video.FPS.Common="Common FPS Values"
 Settings.Video.FPS.Integer="Integer FPS Value"
-Settings.VIdeo.FPS.Fraction="Fractional FPS Value"
+Settings.Video.FPS.Fraction="Fractional FPS Value"
 Settings.Video.FPS.Nanoseconds="Frame Interval (nanoseconds)"
 Settings.Video.FPS.Numerator="Numerator:"
 Settings.Video.FPS.Denominator="Denominator:"

+ 2 - 0
libobs/obs-internal.h

@@ -141,6 +141,8 @@ struct obs_core_data {
 
 	struct obs_view                 main_view;
 
+	long long                       unnamed_index;
+
 	volatile bool                   valid;
 };
 

+ 2 - 2
libobs/obs-scene.c

@@ -202,7 +202,7 @@ static const char *obs_scene_signals[] = {
 	NULL
 };
 
-
+void source_init_name(struct obs_source *source, const char *name);
 
 obs_scene_t obs_scene_create(const char *name)
 {
@@ -229,7 +229,7 @@ obs_scene_t obs_scene_create(const char *name)
 		return NULL;
 	}
 
-	source->name  = bstrdup(name);
+	source_init_name(source, name);
 
 	scene->source = source;
 	obs_source_init(source, &scene_info);

+ 14 - 1
libobs/obs-source.c

@@ -151,6 +151,18 @@ static inline void obs_source_dosignal(struct obs_source *source,
 	calldata_free(&data);
 }
 
+void source_init_name(struct obs_source *source, const char *name)
+{
+	if (!name || !*name) {
+		struct dstr unnamed = {0};
+		dstr_printf(&unnamed, "__unnamed%004lld",
+				obs->data.unnamed_index++);
+		source->name = unnamed.array;
+	} else {
+		source->name = bstrdup(name);
+	}
+}
+
 obs_source_t obs_source_create(enum obs_source_type type, const char *id,
 		const char *name, obs_data_t settings)
 {
@@ -167,7 +179,8 @@ obs_source_t obs_source_create(enum obs_source_type type, const char *id,
 	if (!obs_source_init_handlers(source))
 		goto fail;
 
-	source->name     = bstrdup(name);
+	source_init_name(source, name);
+
 	source->settings = obs_data_newref(settings);
 	source->data     = info->create(source->settings, source);
 

+ 16 - 0
obs/window-basic-main.cpp

@@ -586,6 +586,14 @@ void OBSBasic::on_actionAddScene_triggered()
 			name);
 
 	if (accepted) {
+		if (name.empty()) {
+			QMessageBox::information(this,
+					QTStr("MainWindow.NoNameEntered"),
+					QTStr("MainWindow.NoNameEntered"));
+			on_actionAddScene_triggered();
+			return;
+		}
+
 		obs_source_t source = obs_get_source_by_name(name.c_str());
 		if (source) {
 			QMessageBox::information(this,
@@ -661,9 +669,17 @@ void OBSBasic::AddSource(obs_scene_t scene, const char *id)
 		if (!accepted)
 			break;
 
+		if (name.empty()) {
+			QMessageBox::information(this,
+					QTStr("MainWindow.NoNameEntered"),
+					QTStr("MainWindow.NoNameEntered"));
+			continue;
+		}
+
 		obs_source_t source = obs_get_source_by_name(name.c_str());
 		if (!source) {
 			success = true;
+			break;
 		} else {
 			QMessageBox::information(this,
 					QTStr("MainWindow.NameExists.Title"),