Просмотр исходного кода

UI: Change "main preview" to use OBSQTDisplay

(Non-compiling commit: windowless-context branch)

Gets rid of all functions/data related to setting up the main preview to
be associated with obs_reset_video and instead uses OBSQTDisplay for the
main window display (thus associating it with an obs_display object).
jp9000 10 лет назад
Родитель
Сommit
f0b903435c
1 измененных файлов с 24 добавлено и 47 удалено
  1. 24 47
      obs/window-basic-main.cpp

+ 24 - 47
obs/window-basic-main.cpp

@@ -841,10 +841,6 @@ void OBSBasic::OBSInit()
 	if (ret <= 0)
 		throw "Failed to get scene collection json file path";
 
-	/* make sure it's fully displayed before doing any initialization */
-	show();
-	App()->processEvents();
-
 	if (!obs_startup(App()->GetLocale()))
 		throw "Failed to initialize libobs";
 	if (!InitBasicConfig())
@@ -909,6 +905,20 @@ void OBSBasic::OBSInit()
 	RefreshSceneCollections();
 	RefreshProfiles();
 	disableSaving--;
+
+	auto addDisplay = [this] (OBSQTDisplay *window)
+	{
+		obs_display_add_draw_callback(window->GetDisplay(),
+				OBSBasic::RenderMain, this);
+
+		struct obs_video_info ovi;
+		if (obs_get_video_info(&ovi))
+			ResizePreview(ovi.base_width, ovi.base_height);
+	};
+
+	connect(ui->preview, &OBSQTDisplay::DisplayCreated, addDisplay);
+
+	show();
 }
 
 void OBSBasic::InitHotkeys()
@@ -1055,7 +1065,7 @@ void OBSBasic::ClearHotkeys()
 
 OBSBasic::~OBSBasic()
 {
-	bool previewEnabled = obs_preview_enabled();
+	bool previewEnabled = obs_display_enabled(ui->preview->GetDisplay());
 
 	/* XXX: any obs data must be released before calling obs_shutdown.
 	 * currently, we can't automate this with C++ RAII because of the
@@ -1087,6 +1097,9 @@ OBSBasic::~OBSBasic()
 	if (advAudioWindow)
 		delete advAudioWindow;
 
+	obs_display_remove_draw_callback(ui->preview->GetDisplay(),
+			OBSBasic::RenderMain, this);
+
 	obs_enter_graphics();
 	gs_vertexbuffer_destroy(box);
 	gs_vertexbuffer_destroy(circle);
@@ -1954,23 +1967,7 @@ bool OBSBasic::StreamingActive()
 
 static inline int AttemptToResetVideo(struct obs_video_info *ovi)
 {
-	int ret = obs_reset_video(ovi);
-	if (ret == OBS_VIDEO_INVALID_PARAM) {
-		struct obs_video_info new_params = *ovi;
-
-		if (new_params.window_width == 0)
-			new_params.window_width = 512;
-		if (new_params.window_height == 0)
-			new_params.window_height = 512;
-
-		new_params.output_width  = new_params.window_width;
-		new_params.output_height = new_params.window_height;
-		new_params.base_width    = new_params.window_width;
-		new_params.base_height   = new_params.window_height;
-		ret = obs_reset_video(&new_params);
-	}
-
-	return ret;
+	return obs_reset_video(ovi);
 }
 
 static inline enum obs_scale_type GetScaleType(ConfigFile &basicConfig)
@@ -2038,15 +2035,6 @@ int OBSBasic::ResetVideo()
 	ovi.gpu_conversion = true;
 	ovi.scale_type     = GetScaleType(basicConfig);
 
-	QTToGSWindow(ui->preview->winId(), ovi.window);
-
-	//required to make opengl display stuff on osx(?)
-	ResizePreview(ovi.base_width, ovi.base_height);
-
-	QSize size = GetPixelSize(ui->preview);
-	ovi.window_width  = size.width();
-	ovi.window_height = size.height();
-
 	ret = AttemptToResetVideo(&ovi);
 	if (IS_WIN32 && ret != OBS_VIDEO_SUCCESS) {
 		/* Try OpenGL if DirectX fails on windows */
@@ -2061,9 +2049,6 @@ int OBSBasic::ResetVideo()
 		}
 	}
 
-	if (ret == OBS_VIDEO_SUCCESS)
-		obs_add_draw_callback(OBSBasic::RenderMain, this);
-
 	return ret;
 }
 
@@ -2132,11 +2117,6 @@ void OBSBasic::ResizePreview(uint32_t cx, uint32_t cy)
 
 	previewX += float(PREVIEW_EDGE_SIZE);
 	previewY += float(PREVIEW_EDGE_SIZE);
-
-	if (isVisible()) {
-		QSize size = GetPixelSize(ui->preview);
-		obs_resize(size.width(), size.height());
-	}
 }
 
 void OBSBasic::CloseDialogs()
@@ -2212,10 +2192,6 @@ void OBSBasic::closeEvent(QCloseEvent *event)
 
 	signalHandlers.clear();
 
-	// remove draw callback in case our drawable surfaces go away before
-	// the destructor gets called
-	obs_remove_draw_callback(OBSBasic::RenderMain, this);
-
 	SaveProjectNow();
 	disableSaving++;
 
@@ -2550,7 +2526,8 @@ void OBSBasic::CreateSourcePopupMenu(QListWidgetItem *item, bool preview)
 				QTStr("Basic.Main.PreviewConextMenu.Enable"),
 				this, SLOT(TogglePreview()));
 		action->setCheckable(true);
-		action->setChecked(obs_preview_enabled());
+		action->setChecked(
+				obs_display_enabled(ui->preview->GetDisplay()));
 
 		previewProjector = new QMenu(QTStr("PreviewProjector"));
 		AddProjectorMenuMonitors(previewProjector, this,
@@ -3163,7 +3140,7 @@ void OBSBasic::on_previewDisabledLabel_customContextMenuRequested(
 			QTStr("Basic.Main.PreviewConextMenu.Enable"),
 			this, SLOT(TogglePreview()));
 	action->setCheckable(true);
-	action->setChecked(obs_preview_enabled());
+	action->setChecked(obs_display_enabled(ui->preview->GetDisplay()));
 
 	previewProjector = new QMenu(QTStr("PreviewProjector"));
 	AddProjectorMenuMonitors(previewProjector, this,
@@ -3476,8 +3453,8 @@ void OBSBasic::on_actionCenterToScreen_triggered()
 
 void OBSBasic::TogglePreview()
 {
-	bool enabled = !obs_preview_enabled();
-	obs_preview_set_enabled(enabled);
+	bool enabled = !obs_display_enabled(ui->preview->GetDisplay());
+	obs_display_set_enabled(ui->preview->GetDisplay(), enabled);
 	ui->preview->setVisible(enabled);
 	ui->previewDisabledLabel->setVisible(!enabled);
 }