qtui: Fix initialization order after switching to PMF connects
authorManuel Nickschas <sputnick@quassel-irc.org>
Thu, 13 Sep 2018 21:35:29 +0000 (23:35 +0200)
committerManuel Nickschas <sputnick@quassel-irc.org>
Sun, 18 Nov 2018 10:06:43 +0000 (11:06 +0100)
Seems like switching to PMF connections has changed the order signals
are processed in, resulting in the UI being initialized after the
session manager asks for saving the UI state (for whatever reason).

Make this less fragile (and avoid a crash when using KDE) by
connecting to the session manager only after initializing the UI, and
replace the initUi() slot by a lambda while we're at it.

src/qtui/qtuiapplication.cpp
src/qtui/qtuiapplication.h

index cb4f91c..9eea3c6 100644 (file)
@@ -34,9 +34,6 @@
 QtUiApplication::QtUiApplication(int &argc, char **argv)
     : QApplication(argc, argv)
 {
-    connect(this, &QGuiApplication::commitDataRequest, this, &QtUiApplication::commitData, Qt::DirectConnection);
-    connect(this, &QGuiApplication::saveStateRequest, this, &QtUiApplication::saveState, Qt::DirectConnection);
-
 #if QT_VERSION >= 0x050600
     QGuiApplication::setFallbackSessionManagementEnabled(false);
 #endif
@@ -53,19 +50,16 @@ void QtUiApplication::init()
     _client = std::make_unique<Client>(std::make_unique<QtUi>());
 
     // Init UI only after the event loop has started
-    // TODO Qt5: Make this a lambda
-    QTimer::singleShot(0, this, &QtUiApplication::initUi);
-}
-
-
-void QtUiApplication::initUi()
-{
-    QtUi::instance()->init();
+    QTimer::singleShot(0, this, [this]() {
+        QtUi::instance()->init();
+        connect(this, &QGuiApplication::commitDataRequest, this, &QtUiApplication::commitData, Qt::DirectConnection);
+        connect(this, &QGuiApplication::saveStateRequest, this, &QtUiApplication::saveState, Qt::DirectConnection);
 
-    // Needs to happen after UI init, so the MainWin quit handler is registered first
-    Quassel::registerQuitHandler(quitHandler());
+        // Needs to happen after UI init, so the MainWin quit handler is registered first
+        Quassel::registerQuitHandler(quitHandler());
 
-    resumeSessionIfPossible();
+        resumeSessionIfPossible();
+    });
 }
 
 
index 39eea07..ad978ac 100644 (file)
@@ -75,9 +75,6 @@ private:
      */
     bool applySettingsMigration(QtUiSettings settings, const uint newVersion);
 
-private slots:
-    void initUi();
-
 protected:
     std::unique_ptr<Client> _client;