Jelajahi Sumber

UI: Move properties window creation for new sources

Currently creating new sources can cause a deadlock:
OBSBasicSourceSelect locks the scene mutex when adding a new source
(required to add invisible sources), and later OBSBasic tries to
lock the graphics mutex (via CreatePropertiesWindow); meanwhile the
graphics thread is holding the graphics mutex and tries to lock each
scene as it renders them, resulting in a (non-obvious from the code)
lock ordering conflict.

Moving the CreatePropertiesWindow call out of the locked scene mutex
restores the previous lock ordering; in addition, the requirement
for keeping sourceSceneRefs for opening that initial properties
window is removed
Palana 10 tahun lalu
induk
melakukan
6c193435cc

+ 2 - 6
obs/window-basic-main.cpp

@@ -1266,8 +1266,6 @@ void OBSBasic::UpdateSources(OBSScene scene)
 
 void OBSBasic::InsertSceneItem(obs_sceneitem_t *item)
 {
-	obs_source_t *source = obs_sceneitem_get_source(item);
-
 	QListWidgetItem *listItem = new QListWidgetItem();
 	SetOBSRef(listItem, OBSSceneItem(item));
 
@@ -1275,10 +1273,6 @@ void OBSBasic::InsertSceneItem(obs_sceneitem_t *item)
 	ui->sources->setCurrentRow(0, QItemSelectionModel::ClearAndSelect);
 
 	SetupVisibilityItem(ui->sources, listItem, item);
-
-	/* if the source was just created, open properties dialog */
-	if (sourceSceneRefs[source] == 0 && loaded)
-		CreatePropertiesWindow(source);
 }
 
 void OBSBasic::CreateInteractionWindow(obs_source_t *source)
@@ -2732,6 +2726,8 @@ void OBSBasic::AddSource(const char *id)
 	if (id && *id) {
 		OBSBasicSourceSelect sourceSelect(this, id);
 		sourceSelect.exec();
+		if (sourceSelect.newSource)
+			CreatePropertiesWindow(sourceSelect.newSource);
 	}
 }
 

+ 4 - 2
obs/window-basic-source-select.cpp

@@ -114,7 +114,7 @@ static void AddExisting(const char *name, const bool visible)
 }
 
 bool AddNew(QWidget *parent, const char *id, const char *name,
-		const bool visible)
+		const bool visible, OBSSource &newSource)
 {
 	obs_source_t *source  = obs_get_output_source(0);
 	obs_scene_t  *scene   = obs_scene_from_source(source);
@@ -140,6 +140,8 @@ bool AddNew(QWidget *parent, const char *id, const char *name,
 			data.visible = visible;
 			obs_scene_atomic_update(scene, AddSource, &data);
 
+			newSource = source;
+
 			success = true;
 		}
 	}
@@ -170,7 +172,7 @@ void OBSBasicSourceSelect::on_buttonBox_accepted()
 		}
 
 		if (!AddNew(this, id, QT_TO_UTF8(ui->sourceName->text()),
-					visible))
+					visible, newSource))
 			return;
 	}
 

+ 2 - 0
obs/window-basic-source-select.hpp

@@ -45,4 +45,6 @@ private slots:
 
 public:
 	OBSBasicSourceSelect(OBSBasic *parent, const char *id);
+
+	OBSSource newSource;
 };