mirror of
https://github.com/obsproject/obs-studio.git
synced 2026-05-18 13:33:27 -04:00
UI: Split out Whats New dialog, fix crash on shutdown
CEF crashes on shutdown if any browser window remains open during the shutdown flow. Reproducible 100% of the time on Linux with What's New. The previous implementation of the What's New dialog correctly deleted all the Qt widgets, but the CEF internal event flow would only call the "preparing to close" function, and never the "window safely closed" function. Moving the code (practically unchanged) to a custom QDialog solves the problem entirely, and is more consistent with other uses.
This commit is contained in:
committed by
Ryan Foster
parent
2e075f7513
commit
0eef4e25ee
@@ -58,4 +58,6 @@ target_sources(
|
||||
window-projector.hpp
|
||||
window-remux.cpp
|
||||
window-remux.hpp
|
||||
window-whats-new.cpp
|
||||
window-whats-new.hpp
|
||||
)
|
||||
|
||||
@@ -68,6 +68,7 @@
|
||||
#include "window-youtube-actions.hpp"
|
||||
#include "youtube-api-wrappers.hpp"
|
||||
#endif
|
||||
#include "window-whats-new.hpp"
|
||||
#include "context-bar-controls.hpp"
|
||||
#include "obs-proxy-style.hpp"
|
||||
#include "display-helpers.hpp"
|
||||
@@ -128,6 +129,8 @@ void DestroyPanelCookieManager();
|
||||
|
||||
namespace {
|
||||
|
||||
QPointer<OBSWhatsNew> obsWhatsNew;
|
||||
|
||||
template<typename OBSRef> struct SignalContainer {
|
||||
OBSRef ref;
|
||||
vector<shared_ptr<OBSSignal>> handlers;
|
||||
@@ -2544,37 +2547,11 @@ void OBSBasic::ShowWhatsNew(const QString &url)
|
||||
if (closing)
|
||||
return;
|
||||
|
||||
std::string info_url = QT_TO_UTF8(url);
|
||||
|
||||
QDialog *dlg = new QDialog(this);
|
||||
dlg->setAttribute(Qt::WA_DeleteOnClose, true);
|
||||
dlg->setWindowTitle("What's New");
|
||||
dlg->resize(700, 600);
|
||||
|
||||
Qt::WindowFlags flags = dlg->windowFlags();
|
||||
Qt::WindowFlags helpFlag = Qt::WindowContextHelpButtonHint;
|
||||
dlg->setWindowFlags(flags & (~helpFlag));
|
||||
|
||||
QCefWidget *cefWidget = cef->create_widget(nullptr, info_url);
|
||||
if (!cefWidget) {
|
||||
return;
|
||||
if (obsWhatsNew) {
|
||||
obsWhatsNew->close();
|
||||
}
|
||||
|
||||
connect(cefWidget, &QCefWidget::titleChanged, dlg, &QDialog::setWindowTitle);
|
||||
|
||||
QPushButton *close = new QPushButton(QTStr("Close"));
|
||||
connect(close, &QAbstractButton::clicked, dlg, &QDialog::accept);
|
||||
|
||||
QHBoxLayout *bottomLayout = new QHBoxLayout();
|
||||
bottomLayout->addStretch();
|
||||
bottomLayout->addWidget(close);
|
||||
bottomLayout->addStretch();
|
||||
|
||||
QVBoxLayout *topLayout = new QVBoxLayout(dlg);
|
||||
topLayout->addWidget(cefWidget);
|
||||
topLayout->addLayout(bottomLayout);
|
||||
|
||||
dlg->show();
|
||||
obsWhatsNew = new OBSWhatsNew(this, QT_TO_UTF8(url));
|
||||
#else
|
||||
UNUSED_PARAMETER(url);
|
||||
#endif
|
||||
|
||||
74
UI/window-whats-new.cpp
Normal file
74
UI/window-whats-new.cpp
Normal file
@@ -0,0 +1,74 @@
|
||||
#include "moc_window-whats-new.cpp"
|
||||
|
||||
#include <QPushButton>
|
||||
#include <QHBoxLayout>
|
||||
#include <QVBoxLayout>
|
||||
|
||||
#include "window-basic-main.hpp"
|
||||
|
||||
#ifdef BROWSER_AVAILABLE
|
||||
#include <browser-panel.hpp>
|
||||
extern QCef *cef;
|
||||
#endif
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
OBSWhatsNew::OBSWhatsNew(QWidget *parent, const std::string &url) : QDialog(parent)
|
||||
{
|
||||
#ifdef BROWSER_AVAILABLE
|
||||
if (!cef) {
|
||||
return;
|
||||
}
|
||||
|
||||
setWindowTitle("What's New");
|
||||
setAttribute(Qt::WA_DeleteOnClose, true);
|
||||
resize(700, 600);
|
||||
|
||||
Qt::WindowFlags flags = windowFlags();
|
||||
Qt::WindowFlags helpFlag = Qt::WindowContextHelpButtonHint;
|
||||
setWindowFlags(flags & (~helpFlag));
|
||||
|
||||
OBSBasic::InitBrowserPanelSafeBlock();
|
||||
|
||||
cefWidget = cef->create_widget(nullptr, url);
|
||||
if (!cefWidget) {
|
||||
return;
|
||||
}
|
||||
|
||||
connect(cefWidget, &QCefWidget::titleChanged, this, &OBSWhatsNew::setWindowTitle);
|
||||
|
||||
QPushButton *close = new QPushButton(QTStr("Close"));
|
||||
connect(close, &QAbstractButton::clicked, this, &QDialog::accept);
|
||||
|
||||
QHBoxLayout *bottomLayout = new QHBoxLayout();
|
||||
bottomLayout->addStretch();
|
||||
bottomLayout->addWidget(close);
|
||||
bottomLayout->addStretch();
|
||||
|
||||
QVBoxLayout *topLayout = new QVBoxLayout(this);
|
||||
topLayout->addWidget(cefWidget);
|
||||
topLayout->addLayout(bottomLayout);
|
||||
|
||||
show();
|
||||
#else
|
||||
UNUSED_PARAMETER(url);
|
||||
#endif
|
||||
}
|
||||
|
||||
OBSWhatsNew::~OBSWhatsNew() {}
|
||||
|
||||
void OBSWhatsNew::reject()
|
||||
{
|
||||
#ifdef BROWSER_AVAILABLE
|
||||
delete cefWidget;
|
||||
#endif
|
||||
QDialog::reject();
|
||||
}
|
||||
|
||||
void OBSWhatsNew::accept()
|
||||
{
|
||||
#ifdef BROWSER_AVAILABLE
|
||||
delete cefWidget;
|
||||
#endif
|
||||
QDialog::accept();
|
||||
}
|
||||
20
UI/window-whats-new.hpp
Normal file
20
UI/window-whats-new.hpp
Normal file
@@ -0,0 +1,20 @@
|
||||
#pragma once
|
||||
|
||||
#include <QPointer>
|
||||
#include <QDialog>
|
||||
#include <string>
|
||||
|
||||
class QCefWidget;
|
||||
|
||||
class OBSWhatsNew : public QDialog {
|
||||
Q_OBJECT
|
||||
|
||||
QCefWidget *cefWidget = nullptr;
|
||||
|
||||
public:
|
||||
OBSWhatsNew(QWidget *parent, const std::string &url);
|
||||
~OBSWhatsNew();
|
||||
|
||||
virtual void reject() override;
|
||||
virtual void accept() override;
|
||||
};
|
||||
Reference in New Issue
Block a user