Revert "qtui: Don't create parented dialogs on the stack"
authorManuel Nickschas <sputnick@quassel-irc.org>
Thu, 4 Oct 2018 10:19:54 +0000 (12:19 +0200)
committerManuel Nickschas <sputnick@quassel-irc.org>
Thu, 4 Oct 2018 14:28:33 +0000 (16:28 +0200)
Auto-deleting dialogs is a bad idea if we're accessing the instance
after exec(). We could work around this in the affected cases,
however it may be easier and cleaner to create the dialogs on the
stack again, but don't parent them to avoid the crashes we intended
to fix with this commit.

This reverts commit 4e452ee828fdb411e6b1db07c18e02681a30ff27.

src/qtui/mainwin.cpp
src/uisupport/settingspage.cpp

index 8d122f3..7e48060 100644 (file)
@@ -819,17 +819,15 @@ void MainWin::changeActiveBufferView(int bufferViewId)
 void MainWin::showPasswordChangeDlg()
 {
     if(Client::isCoreFeatureEnabled(Quassel::Feature::PasswordChange)) {
 void MainWin::showPasswordChangeDlg()
 {
     if(Client::isCoreFeatureEnabled(Quassel::Feature::PasswordChange)) {
-        auto dlg = new PasswordChangeDlg(this);
-        dlg->setAttribute(Qt::WA_DeleteOnClose);
-        dlg->exec();
+        PasswordChangeDlg dlg(this);
+        dlg.exec();
     }
     else {
     }
     else {
-        auto box = new QMessageBox(QMessageBox::Warning, tr("Feature Not Supported"),
-                                   tr("<b>Your Quassel Core does not support this feature</b>"),
-                                   QMessageBox::Ok, this);
-        box->setInformativeText(tr("You need a Quassel Core v0.12.0 or newer in order to be able to remotely change your password."));
-        box->setAttribute(Qt::WA_DeleteOnClose);
-        box->exec();
+        QMessageBox box(QMessageBox::Warning, tr("Feature Not Supported"),
+                        tr("<b>Your Quassel Core does not support this feature</b>"),
+                        QMessageBox::Ok, this);
+        box.setInformativeText(tr("You need a Quassel Core v0.12.0 or newer in order to be able to remotely change your password."));
+        box.exec();
     }
 }
 
     }
 }
 
@@ -860,13 +858,12 @@ void MainWin::showMigrationWarning(bool show)
 void MainWin::onExitRequested(const QString &reason)
 {
     if (!reason.isEmpty()) {
 void MainWin::onExitRequested(const QString &reason)
 {
     if (!reason.isEmpty()) {
-        auto box = new QMessageBox(QMessageBox::Critical,
-                                   tr("Fatal error"),
-                                   "<b>" + tr("Quassel encountered a fatal error and is terminated.") + "</b>",
-                                   QMessageBox::Ok, this);
-        box->setInformativeText("<p>" + tr("Reason:<em>") + " " + reason + "</em>");
-        box->setAttribute(Qt::WA_DeleteOnClose);
-        box->exec();
+        QMessageBox box(QMessageBox::Critical,
+                        tr("Fatal error"),
+                        "<b>" + tr("Quassel encountered a fatal error and is terminated.") + "</b>",
+                        QMessageBox::Ok, this);
+        box.setInformativeText("<p>" + tr("Reason:<em>") + " " + reason + "</em>");
+        box.exec();
     }
 }
 
     }
 }
 
@@ -941,25 +938,22 @@ void MainWin::hideCurrentBuffer()
 
 void MainWin::showNotificationsDlg()
 {
 
 void MainWin::showNotificationsDlg()
 {
-    auto dlg = new SettingsPageDlg(new NotificationsSettingsPage(this), this);
-    dlg->setAttribute(Qt::WA_DeleteOnClose);
-    dlg->exec();
+    SettingsPageDlg dlg(new NotificationsSettingsPage(this), this);
+    dlg.exec();
 }
 
 
 void MainWin::on_actionConfigureNetworks_triggered()
 {
 }
 
 
 void MainWin::on_actionConfigureNetworks_triggered()
 {
-    auto dlg = new SettingsPageDlg(new NetworksSettingsPage(this), this);
-    dlg->setAttribute(Qt::WA_DeleteOnClose);
-    dlg->exec();
+    SettingsPageDlg dlg(new NetworksSettingsPage(this), this);
+    dlg.exec();
 }
 
 
 void MainWin::on_actionConfigureViews_triggered()
 {
 }
 
 
 void MainWin::on_actionConfigureViews_triggered()
 {
-    auto dlg = new SettingsPageDlg(new BufferViewSettingsPage(this), this);
-    dlg->setAttribute(Qt::WA_DeleteOnClose);
-    dlg->exec();
+    SettingsPageDlg dlg(new BufferViewSettingsPage(this), this);
+    dlg.exec();
 }
 
 
 }
 
 
@@ -1395,31 +1389,28 @@ void MainWin::setDisconnectedState()
 void MainWin::userAuthenticationRequired(CoreAccount *account, bool *valid, const QString &errorMessage)
 {
     Q_UNUSED(errorMessage)
 void MainWin::userAuthenticationRequired(CoreAccount *account, bool *valid, const QString &errorMessage)
 {
     Q_UNUSED(errorMessage)
-    auto dlg = new CoreConnectAuthDlg(account, this);
-    dlg->setAttribute(Qt::WA_DeleteOnClose);
-    *valid = (dlg->exec() == QDialog::Accepted);
+    CoreConnectAuthDlg dlg(account, this);
+    *valid = (dlg.exec() == QDialog::Accepted);
 }
 
 
 void MainWin::handleNoSslInClient(bool *accepted)
 {
 }
 
 
 void MainWin::handleNoSslInClient(bool *accepted)
 {
-    auto box = new QMessageBox(QMessageBox::Warning, tr("Unencrypted Connection"), tr("<b>Your client does not support SSL encryption</b>"),
-                               QMessageBox::Ignore|QMessageBox::Cancel, this);
-    box->setInformativeText(tr("Sensitive data, like passwords, will be transmitted unencrypted to your Quassel core."));
-    box->setDefaultButton(QMessageBox::Ignore);
-    box->setAttribute(Qt::WA_DeleteOnClose);
-    *accepted = (box->exec() == QMessageBox::Ignore);
+    QMessageBox box(QMessageBox::Warning, tr("Unencrypted Connection"), tr("<b>Your client does not support SSL encryption</b>"),
+        QMessageBox::Ignore|QMessageBox::Cancel, this);
+    box.setInformativeText(tr("Sensitive data, like passwords, will be transmitted unencrypted to your Quassel core."));
+    box.setDefaultButton(QMessageBox::Ignore);
+    *accepted = box.exec() == QMessageBox::Ignore;
 }
 
 
 void MainWin::handleNoSslInCore(bool *accepted)
 {
 }
 
 
 void MainWin::handleNoSslInCore(bool *accepted)
 {
-    auto box = new QMessageBox(QMessageBox::Warning, tr("Unencrypted Connection"), tr("<b>Your core does not support SSL encryption</b>"),
-                               QMessageBox::Ignore|QMessageBox::Cancel, this);
-    box->setInformativeText(tr("Sensitive data, like passwords, will be transmitted unencrypted to your Quassel core."));
-    box->setDefaultButton(QMessageBox::Ignore);
-    box->setAttribute(Qt::WA_DeleteOnClose);
-    *accepted = (box->exec() == QMessageBox::Ignore);
+    QMessageBox box(QMessageBox::Warning, tr("Unencrypted Connection"), tr("<b>Your core does not support SSL encryption</b>"),
+        QMessageBox::Ignore|QMessageBox::Cancel, this);
+    box.setInformativeText(tr("Sensitive data, like passwords, will be transmitted unencrypted to your Quassel core."));
+    box.setDefaultButton(QMessageBox::Ignore);
+    *accepted = box.exec() == QMessageBox::Ignore;
 }
 
 
 }
 
 
@@ -1432,38 +1423,35 @@ void MainWin::handleSslErrors(const QSslSocket *socket, bool *accepted, bool *pe
     errorString += QString("<li>%1</li>").arg(error.errorString());
     errorString += "</ul>";
 
     errorString += QString("<li>%1</li>").arg(error.errorString());
     errorString += "</ul>";
 
-    auto box = new QMessageBox(QMessageBox::Warning,
-                               tr("Untrusted Security Certificate"),
-                               tr("<b>The SSL certificate provided by the core at %1 is untrusted for the following reasons:</b>").arg(socket->peerName()),
-                               QMessageBox::Cancel, this);
-    box->setInformativeText(errorString);
-    box->addButton(tr("Continue"), QMessageBox::AcceptRole);
-    box->setDefaultButton(box->addButton(tr("Show Certificate"), QMessageBox::HelpRole));
-    box->setAttribute(Qt::WA_DeleteOnClose);
+    QMessageBox box(QMessageBox::Warning,
+        tr("Untrusted Security Certificate"),
+        tr("<b>The SSL certificate provided by the core at %1 is untrusted for the following reasons:</b>").arg(socket->peerName()),
+        QMessageBox::Cancel, this);
+    box.setInformativeText(errorString);
+    box.addButton(tr("Continue"), QMessageBox::AcceptRole);
+    box.setDefaultButton(box.addButton(tr("Show Certificate"), QMessageBox::HelpRole));
 
     QMessageBox::ButtonRole role;
     do {
 
     QMessageBox::ButtonRole role;
     do {
-        box->exec();
-        role = box->buttonRole(box->clickedButton());
+        box.exec();
+        role = box.buttonRole(box.clickedButton());
         if (role == QMessageBox::HelpRole) {
         if (role == QMessageBox::HelpRole) {
-            auto dlg = new SslInfoDlg(socket, this);
-            dlg->setAttribute(Qt::WA_DeleteOnClose);
-            dlg->exec();
+            SslInfoDlg dlg(socket, this);
+            dlg.exec();
         }
     }
     while (role == QMessageBox::HelpRole);
 
     *accepted = role == QMessageBox::AcceptRole;
     if (*accepted) {
         }
     }
     while (role == QMessageBox::HelpRole);
 
     *accepted = role == QMessageBox::AcceptRole;
     if (*accepted) {
-        auto box2 = new QMessageBox(QMessageBox::Warning,
-                                    tr("Untrusted Security Certificate"),
-                                    tr("Would you like to accept this certificate forever without being prompted?"),
-                                    nullptr, this);
-        box2->setDefaultButton(box2->addButton(tr("Current Session Only"), QMessageBox::NoRole));
-        box2->addButton(tr("Forever"), QMessageBox::YesRole);
-        box2->setAttribute(Qt::WA_DeleteOnClose);
-        box2->exec();
-        *permanently = (box2->buttonRole(box2->clickedButton()) == QMessageBox::YesRole);
+        QMessageBox box2(QMessageBox::Warning,
+            tr("Untrusted Security Certificate"),
+            tr("Would you like to accept this certificate forever without being prompted?"),
+            0, this);
+        box2.setDefaultButton(box2.addButton(tr("Current Session Only"), QMessageBox::NoRole));
+        box2.addButton(tr("Forever"), QMessageBox::YesRole);
+        box2.exec();
+        *permanently =  box2.buttonRole(box2.clickedButton()) == QMessageBox::YesRole;
     }
 }
 
     }
 }
 
@@ -1478,10 +1466,9 @@ void MainWin::handleCoreConnectionError(const QString &error)
 
 void MainWin::showCoreConnectionDlg()
 {
 
 void MainWin::showCoreConnectionDlg()
 {
-    auto dlg = new CoreConnectDlg(this);
-    dlg->setAttribute(Qt::WA_DeleteOnClose);
-    if (dlg->exec() == QDialog::Accepted) {
-        AccountId accId = dlg->selectedAccount();
+    CoreConnectDlg dlg(this);
+    if (dlg.exec() == QDialog::Accepted) {
+        AccountId accId = dlg.selectedAccount();
         if (accId.isValid())
             Client::coreConnection()->connectToCore(accId);
     }
         if (accId.isValid())
             Client::coreConnection()->connectToCore(accId);
     }
@@ -1505,12 +1492,11 @@ void MainWin::showChannelList(NetworkId netId, const QString &channelFilters, bo
         if (!netId.isValid()) {
             // We still haven't found a valid network, probably no network selected, e.g. "/list"
             // on the client homescreen when no networks are connected.
         if (!netId.isValid()) {
             // We still haven't found a valid network, probably no network selected, e.g. "/list"
             // on the client homescreen when no networks are connected.
-            auto box = new QMessageBox(QMessageBox::Information, tr("No network selected"),
-                                       QString("<b>%1</b>").arg(tr("No network selected")),
-                                       QMessageBox::Ok, this);
-            box->setInformativeText(tr("Select a network before trying to view the channel list."));
-            box->setAttribute(Qt::WA_DeleteOnClose);
-            box->exec();
+            QMessageBox box(QMessageBox::Information, tr("No network selected"),
+                            QString("<b>%1</b>").arg(tr("No network selected")),
+                            QMessageBox::Ok, this);
+            box.setInformativeText(tr("Select a network before trying to view the channel list."));
+            box.exec();
             return;
         }
     }
             return;
         }
     }
@@ -1530,30 +1516,26 @@ void MainWin::showChannelList(NetworkId netId, const QString &channelFilters, bo
 
 void MainWin::showNetworkConfig(NetworkId netId)
 {
 
 void MainWin::showNetworkConfig(NetworkId netId)
 {
-    auto dlg = new SettingsPageDlg(new NetworksSettingsPage(this), this);
-    dlg->setAttribute(Qt::WA_DeleteOnClose);
+    SettingsPageDlg dlg(new NetworksSettingsPage(this), this);
     if (netId.isValid())
     if (netId.isValid())
-        qobject_cast<NetworksSettingsPage *>(dlg->currentPage())->bufferList_Open(netId);
-    dlg->exec();
+        qobject_cast<NetworksSettingsPage *>(dlg.currentPage())->bufferList_Open(netId);
+    dlg.exec();
 }
 
 
 void MainWin::showIgnoreList(QString newRule)
 {
 }
 
 
 void MainWin::showIgnoreList(QString newRule)
 {
-    auto dlg = new SettingsPageDlg(new IgnoreListSettingsPage(this), this);
-    dlg->setAttribute(Qt::WA_DeleteOnClose);
+    SettingsPageDlg dlg(new IgnoreListSettingsPage(this), this);
     // prepare config dialog for new rule
     if (!newRule.isEmpty())
     // prepare config dialog for new rule
     if (!newRule.isEmpty())
-        qobject_cast<IgnoreListSettingsPage *>(dlg->currentPage())->editIgnoreRule(newRule);
-    dlg->exec();
+        qobject_cast<IgnoreListSettingsPage *>(dlg.currentPage())->editIgnoreRule(newRule);
+    dlg.exec();
 }
 
 
 void MainWin::showCoreInfoDlg()
 {
 }
 
 
 void MainWin::showCoreInfoDlg()
 {
-    auto dlg = new CoreInfoDlg(this);
-    dlg->setAttribute(Qt::WA_DeleteOnClose);
-    dlg->exec();
+    CoreInfoDlg(this).exec();
 }
 
 
 }
 
 
@@ -1579,7 +1561,6 @@ void MainWin::awayLogDestroyed()
 void MainWin::showSettingsDlg()
 {
     SettingsDlg *dlg = new SettingsDlg();
 void MainWin::showSettingsDlg()
 {
     SettingsDlg *dlg = new SettingsDlg();
-    dlg->setAttribute(Qt::WA_DeleteOnClose);
 
     //Category: Interface
     dlg->registerSettingsPage(new AppearanceSettingsPage(dlg));
 
     //Category: Interface
     dlg->registerSettingsPage(new AppearanceSettingsPage(dlg));
@@ -1618,25 +1599,20 @@ void MainWin::showSettingsDlg()
 
 void MainWin::showAboutDlg()
 {
 
 void MainWin::showAboutDlg()
 {
-    auto dlg = new AboutDlg(this);
-    dlg->setAttribute(Qt::WA_DeleteOnClose);
-    dlg->exec();
+    AboutDlg(this).exec();
 }
 
 
 void MainWin::showShortcutsDlg()
 {
 #ifdef HAVE_KDE
 }
 
 
 void MainWin::showShortcutsDlg()
 {
 #ifdef HAVE_KDE
-    auto dlg = new KShortcutsDialog(KShortcutsEditor::AllActions, KShortcutsEditor::LetterShortcutsDisallowed, this);
-    foreach(KActionCollection *coll, QtUi::actionCollections()) {
-        dlg->addCollection(coll, coll->property("Category").toString());
-    }
-    dlg->setAttribute(Qt::WA_DeleteOnClose);
-    dlg->configure(true);
+    KShortcutsDialog dlg(KShortcutsEditor::AllActions, KShortcutsEditor::LetterShortcutsDisallowed, this);
+    foreach(KActionCollection *coll, QtUi::actionCollections())
+    dlg.addCollection(coll, coll->property("Category").toString());
+    dlg.configure(true);
 #else
 #else
-    auto dlg = new SettingsPageDlg(new ShortcutsSettingsPage(QtUi::actionCollections(), this), this);
-    dlg->setAttribute(Qt::WA_DeleteOnClose);
-    dlg->exec();
+    SettingsPageDlg dlg(new ShortcutsSettingsPage(QtUi::actionCollections(), this), this);
+    dlg.exec();
 #endif
 }
 
 #endif
 }
 
index d773d72..9be56bd 100644 (file)
@@ -36,7 +36,6 @@ SettingsPage::SettingsPage(const QString &category, const QString &title, QWidge
     _changed(false),
     _autoWidgetsChanged(false)
 {
     _changed(false),
     _autoWidgetsChanged(false)
 {
-    setAttribute(Qt::WA_DeleteOnClose);
 }
 
 
 }