Browse Source

UI: Prune obs_display code from secondary windows

(Non-compiling commit: windowless-context branch)

Now that all obs_display related code has been moved to OBSQTDisplay,
we can prune a whole bunch of boilerplate code that had to be repeated
for the displays of each window.

Affects:
- Properties
- Filters
- Interact
- Projector
jp9000 10 years ago
parent
commit
e93ca4cd10

+ 8 - 29
obs/window-basic-filters.cpp

@@ -72,9 +72,6 @@ OBSBasicFilters::OBSBasicFilters(QWidget *parent, OBSSource source_)
 
 	installEventFilter(CreateShortcutFilter());
 
-	connect(ui->preview, SIGNAL(DisplayResized()),
-			this, SLOT(OnPreviewResized()));
-
 	connect(ui->asyncFilters->itemDelegate(),
 			SIGNAL(closeEditor(QWidget*,
 					QAbstractItemDelegate::EndEditHint)),
@@ -105,6 +102,14 @@ OBSBasicFilters::OBSBasicFilters(QWidget *parent, OBSSource source_)
 
 	if (audioOnly || (audio && !async))
 		ui->asyncLabel->setText(QTStr("Basic.Filters.AudioFilters"));
+
+	auto addDrawCallback = [this] ()
+	{
+		obs_display_add_draw_callback(ui->preview->GetDisplay(),
+				OBSBasicFilters::DrawPreview, this);
+	};
+
+	connect(ui->preview, &OBSQTDisplay::DisplayCreated, addDrawCallback);
 }
 
 OBSBasicFilters::~OBSBasicFilters()
@@ -115,21 +120,7 @@ OBSBasicFilters::~OBSBasicFilters()
 
 void OBSBasicFilters::Init()
 {
-	gs_init_data init_data = {};
-
 	show();
-
-	QSize previewSize = GetPixelSize(ui->preview);
-	init_data.cx      = uint32_t(previewSize.width());
-	init_data.cy      = uint32_t(previewSize.height());
-	init_data.format  = GS_RGBA;
-	QTToGSWindow(ui->preview->winId(), init_data.window);
-
-	display = obs_display_create(&init_data);
-
-	if (display)
-		obs_display_add_draw_callback(display,
-				OBSBasicFilters::DrawPreview, this);
 }
 
 inline OBSSource OBSBasicFilters::GetFilter(int row, bool async)
@@ -393,24 +384,12 @@ void OBSBasicFilters::AddFilterFromAction()
 	AddNewFilter(QT_TO_UTF8(action->data().toString()));
 }
 
-void OBSBasicFilters::OnPreviewResized()
-{
-	QSize size = GetPixelSize(ui->preview);
-	obs_display_resize(display, size.width(), size.height());
-}
-
 void OBSBasicFilters::closeEvent(QCloseEvent *event)
 {
 	QDialog::closeEvent(event);
 	if (!event->isAccepted())
 		return;
 
-	// remove draw callback and release display in case our drawable
-	// surfaces go away before the destructor gets called
-	obs_display_remove_draw_callback(display,
-			OBSBasicFilters::DrawPreview, this);
-	display = nullptr;
-
 	main->SaveProject();
 }
 

+ 0 - 3
obs/window-basic-filters.hpp

@@ -39,7 +39,6 @@ private:
 	OBSSource source;
 	OBSPropertiesView *view = nullptr;
 
-	OBSDisplay display;
 	OBSSignal addSignal;
 	OBSSignal removeSignal;
 	OBSSignal reorderSignal;
@@ -78,8 +77,6 @@ private slots:
 
 	void AddFilterFromAction();
 
-	void OnPreviewResized();
-
 	void on_addAsyncFilter_clicked();
 	void on_removeAsyncFilter_clicked();
 	void on_moveAsyncFilterUp_clicked();

+ 8 - 41
obs/window-basic-interaction.cpp

@@ -56,13 +56,16 @@ OBSBasicInteraction::OBSBasicInteraction(QWidget *parent, OBSSource source_)
 	OBSData settings = obs_source_get_settings(source);
 	obs_data_release(settings);
 
-	connect(windowHandle(), &QWindow::screenChanged, [this]() {
-		QSize size = GetPixelSize(ui->preview);
-		obs_display_resize(display, size.width(), size.height());
-	});
-
 	const char *name = obs_source_get_name(source);
 	setWindowTitle(QTStr("Basic.InteractionWindow").arg(QT_UTF8(name)));
+
+	auto addDrawCallback = [this] ()
+	{
+		obs_display_add_draw_callback(ui->preview->GetDisplay(),
+				OBSBasicInteraction::DrawPreview, this);
+	};
+
+	connect(ui->preview, &OBSQTDisplay::DisplayCreated, addDrawCallback);
 }
 
 OBSBasicInteraction::~OBSBasicInteraction()
@@ -155,34 +158,12 @@ void OBSBasicInteraction::DrawPreview(void *data, uint32_t cx, uint32_t cy)
 	gs_viewport_pop();
 }
 
-void OBSBasicInteraction::OnInteractionResized()
-{
-	QSize size = GetPixelSize(ui->preview);
-	obs_display_resize(display, size.width(), size.height());
-}
-
-void OBSBasicInteraction::resizeEvent(QResizeEvent *event)
-{
-	if (isVisible()) {
-		QSize size = GetPixelSize(ui->preview);
-		obs_display_resize(display, size.width(), size.height());
-	}
-
-	QDialog::resizeEvent(event);
-}
-
 void OBSBasicInteraction::closeEvent(QCloseEvent *event)
 {
 	QDialog::closeEvent(event);
 	if (!event->isAccepted())
 		return;
 
-	// remove draw callback and release display in case our drawable
-	// surfaces go away before the destructor gets called
-	obs_display_remove_draw_callback(display,
-			OBSBasicInteraction::DrawPreview, this);
-	display = nullptr;
-
 	config_set_int(App()->GlobalConfig(), "InteractionWindow", "cx",
 			width());
 	config_set_int(App()->GlobalConfig(), "InteractionWindow", "cy",
@@ -381,19 +362,5 @@ bool OBSBasicInteraction::HandleKeyEvent(QKeyEvent *event)
 
 void OBSBasicInteraction::Init()
 {
-	gs_init_data init_data = {};
-
 	show();
-
-	QSize previewSize = GetPixelSize(ui->preview);
-	init_data.cx      = uint32_t(previewSize.width());
-	init_data.cy      = uint32_t(previewSize.height());
-	init_data.format  = GS_RGBA;
-	QTToGSWindow(ui->preview->winId(), init_data.window);
-
-	display = obs_display_create(&init_data);
-
-	if (display)
-		obs_display_add_draw_callback(display,
-				OBSBasicInteraction::DrawPreview, this);
 }

+ 0 - 5
obs/window-basic-interaction.hpp

@@ -39,7 +39,6 @@ private:
 
 	std::unique_ptr<Ui::OBSBasicInteraction> ui;
 	OBSSource  source;
-	OBSDisplay display;
 	OBSSignal  removedSignal;
 	OBSSignal  renamedSignal;
 	std::unique_ptr<OBSEventFilter> eventFilter;
@@ -58,9 +57,6 @@ private:
 
 	OBSEventFilter *BuildEventFilter();
 
-private slots:
-	void OnInteractionResized();
-
 public:
 	OBSBasicInteraction(QWidget *parent, OBSSource source_);
 	~OBSBasicInteraction();
@@ -68,7 +64,6 @@ public:
 	void Init();
 
 protected:
-	virtual void resizeEvent(QResizeEvent *event) override;
 	virtual void closeEvent(QCloseEvent *event) override;
 };
 

+ 8 - 44
obs/window-basic-properties.cpp

@@ -85,14 +85,6 @@ OBSBasicProperties::OBSBasicProperties(QWidget *parent, OBSSource source_)
 
 	installEventFilter(CreateShortcutFilter());
 
-	connect(view, SIGNAL(PropertiesResized()),
-			this, SLOT(OnPropertiesResized()));
-
-	connect(windowHandle(), &QWindow::screenChanged, [this]() {
-		QSize size = GetPixelSize(preview);
-		obs_display_resize(display, size.width(), size.height());
-	});
-
 	const char *name = obs_source_get_name(source);
 	setWindowTitle(QTStr("Basic.PropertiesWindow").arg(QT_UTF8(name)));
 
@@ -102,6 +94,14 @@ OBSBasicProperties::OBSBasicProperties(QWidget *parent, OBSSource source_)
 			"update_properties",
 			OBSBasicProperties::UpdateProperties,
 			this);
+
+	auto addDrawCallback = [this] ()
+	{
+		obs_display_add_draw_callback(preview->GetDisplay(),
+				OBSBasicProperties::DrawPreview, this);
+	};
+
+	connect(preview, &OBSQTDisplay::DisplayCreated, addDrawCallback);
 }
 
 OBSBasicProperties::~OBSBasicProperties()
@@ -190,30 +190,8 @@ void OBSBasicProperties::DrawPreview(void *data, uint32_t cx, uint32_t cy)
 	gs_viewport_pop();
 }
 
-void OBSBasicProperties::OnPropertiesResized()
-{
-	QSize size = GetPixelSize(preview);
-	obs_display_resize(display, size.width(), size.height());
-}
-
-void OBSBasicProperties::resizeEvent(QResizeEvent *event)
-{
-	if (isVisible()) {
-		QSize size = GetPixelSize(preview);
-		obs_display_resize(display, size.width(), size.height());
-	}
-
-	QDialog::resizeEvent(event);
-}
-
 void OBSBasicProperties::Cleanup()
 {
-	// remove draw callback and release display in case our drawable
-	// surfaces go away before the destructor gets called
-	obs_display_remove_draw_callback(display,
-			OBSBasicProperties::DrawPreview, this);
-	display = nullptr;
-
 	config_set_int(App()->GlobalConfig(), "PropertiesWindow", "cx",
 			width());
 	config_set_int(App()->GlobalConfig(), "PropertiesWindow", "cy",
@@ -250,21 +228,7 @@ void OBSBasicProperties::closeEvent(QCloseEvent *event)
 
 void OBSBasicProperties::Init()
 {
-	gs_init_data init_data = {};
-
 	show();
-
-	QSize previewSize = GetPixelSize(preview);
-	init_data.cx      = uint32_t(previewSize.width());
-	init_data.cy      = uint32_t(previewSize.height());
-	init_data.format  = GS_RGBA;
-	QTToGSWindow(preview->winId(), init_data.window);
-
-	display = obs_display_create(&init_data);
-
-	if (display)
-		obs_display_add_draw_callback(display,
-				OBSBasicProperties::DrawPreview, this);
 }
 
 int OBSBasicProperties::CheckSettings()

+ 0 - 3
obs/window-basic-properties.hpp

@@ -36,7 +36,6 @@ private:
 	bool       acceptClicked;
 
 	OBSSource  source;
-	OBSDisplay display;
 	OBSSignal  removedSignal;
 	OBSSignal  renamedSignal;
 	OBSSignal  updatePropertiesSignal;
@@ -53,7 +52,6 @@ private:
 	void Cleanup();
 
 private slots:
-	void OnPropertiesResized();
 	void on_buttonBox_clicked(QAbstractButton *button);
 
 public:
@@ -63,7 +61,6 @@ public:
 	void Init();
 
 protected:
-	virtual void resizeEvent(QResizeEvent *event) override;
 	virtual void closeEvent(QCloseEvent *event) override;
 	virtual void reject() override;
 };

+ 8 - 10
obs/window-projector.cpp

@@ -17,6 +17,14 @@ OBSProjector::OBSProjector(QWidget *widget, obs_source_t *source_)
 	setAttribute(Qt::WA_DeleteOnClose, true);
 
 	installEventFilter(CreateShortcutFilter());
+
+	auto addDrawCallback = [this] ()
+	{
+		obs_display_add_draw_callback(GetDisplay(), OBSRender, this);
+		obs_display_set_background_color(GetDisplay(), 0x000000);
+	};
+
+	connect(this, &OBSQTDisplay::DisplayCreated, addDrawCallback);
 }
 
 OBSProjector::~OBSProjector()
@@ -38,16 +46,6 @@ void OBSProjector::Init(int monitor)
 	if (source)
 		obs_source_inc_showing(source);
 
-	struct gs_init_data gid = {};
-	gid.cx                  = mi.cx;
-	gid.cy                  = mi.cy;
-	gid.format              = GS_RGBA;
-	QTToGSWindow(winId(), gid.window);
-
-	display = obs_display_create(&gid);
-	obs_display_set_background_color(display, 0x000000);
-	obs_display_add_draw_callback(display, OBSRender, this);
-
 	QAction *action = new QAction(this);
 	action->setShortcut(Qt::Key_Escape);
 	addAction(action);

+ 0 - 1
obs/window-projector.hpp

@@ -9,7 +9,6 @@ class OBSProjector : public OBSQTDisplay {
 	Q_OBJECT
 
 private:
-	OBSDisplay display;
 	OBSSource source;
 	OBSSignal removedSignal;