From e93ca4cd10adbd14b12ca2b717bd3ac06522dd2d Mon Sep 17 00:00:00 2001 From: jp9000 Date: Sun, 2 Aug 2015 00:25:08 -0700 Subject: [PATCH] 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 --- obs/window-basic-filters.cpp | 37 +++++------------------ obs/window-basic-filters.hpp | 3 -- obs/window-basic-interaction.cpp | 49 +++++------------------------- obs/window-basic-interaction.hpp | 5 --- obs/window-basic-properties.cpp | 52 +++++--------------------------- obs/window-basic-properties.hpp | 3 -- obs/window-projector.cpp | 18 +++++------ obs/window-projector.hpp | 1 - 8 files changed, 32 insertions(+), 136 deletions(-) diff --git a/obs/window-basic-filters.cpp b/obs/window-basic-filters.cpp index dbf12d463..ca0a64dc5 100644 --- a/obs/window-basic-filters.cpp +++ b/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(); } diff --git a/obs/window-basic-filters.hpp b/obs/window-basic-filters.hpp index f31829dcb..243897610 100644 --- a/obs/window-basic-filters.hpp +++ b/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(); diff --git a/obs/window-basic-interaction.cpp b/obs/window-basic-interaction.cpp index 50d76125e..e1585f053 100644 --- a/obs/window-basic-interaction.cpp +++ b/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); } diff --git a/obs/window-basic-interaction.hpp b/obs/window-basic-interaction.hpp index 019de79b7..d02725eb9 100644 --- a/obs/window-basic-interaction.hpp +++ b/obs/window-basic-interaction.hpp @@ -39,7 +39,6 @@ private: std::unique_ptr ui; OBSSource source; - OBSDisplay display; OBSSignal removedSignal; OBSSignal renamedSignal; std::unique_ptr 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; }; diff --git a/obs/window-basic-properties.cpp b/obs/window-basic-properties.cpp index 49cd05c21..867fffbbd 100644 --- a/obs/window-basic-properties.cpp +++ b/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() diff --git a/obs/window-basic-properties.hpp b/obs/window-basic-properties.hpp index 369d88b93..a5cbfa925 100644 --- a/obs/window-basic-properties.hpp +++ b/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; }; diff --git a/obs/window-projector.cpp b/obs/window-projector.cpp index 904e6eb36..505e52cf4 100644 --- a/obs/window-projector.cpp +++ b/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); diff --git a/obs/window-projector.hpp b/obs/window-projector.hpp index 30a3f1cf6..f623f9e3c 100644 --- a/obs/window-projector.hpp +++ b/obs/window-projector.hpp @@ -9,7 +9,6 @@ class OBSProjector : public OBSQTDisplay { Q_OBJECT private: - OBSDisplay display; OBSSource source; OBSSignal removedSignal;