#endif
#include "chatviewsettings.h"
-#include "client.h"
#include "cliparser.h"
+#include "logmessage.h"
#include "mainwin.h"
#include "qtui.h"
#include "qtuisettings.h"
+#include "types.h"
QtUiApplication::QtUiApplication(int &argc, char **argv)
#ifdef HAVE_KDE4
#endif /* HAVE_KDE4 */
-#if defined(HAVE_KDE4) || defined(Q_OS_MAC)
- Quassel::disableCrashHandler();
-#endif /* HAVE_KDE4 || Q_OS_MAC */
-
Quassel::setRunMode(Quassel::ClientOnly);
-#if QT_VERSION < 0x050000
- qInstallMsgHandler(Client::logMessage);
-#else
- qInstallMessageHandler(Client::logMessage);
+#if QT_VERSION >= 0x050000
connect(this, &QGuiApplication::commitDataRequest, this, &QtUiApplication::commitData, Qt::DirectConnection);
connect(this, &QGuiApplication::saveStateRequest, this, &QtUiApplication::saveState, Qt::DirectConnection);
#endif
}
-bool QtUiApplication::init()
+void QtUiApplication::init()
{
- if (Quassel::init()) {
- // Settings upgrade/downgrade handling
- if (!migrateSettings()) {
- qCritical() << "Could not load or upgrade client settings, terminating!";
- return false;
- }
-
- Client::init(new QtUi());
-
- // Init UI only after the event loop has started
- // TODO Qt5: Make this a lambda
- QTimer::singleShot(0, this, SLOT(initUi()));
-
- Quassel::registerQuitHandler([]() {
- QtUi::mainWindow()->quit();
- });
+ if (!Quassel::init()) {
+ throw ExitException{EXIT_FAILURE, tr("Could not initialize Quassel!")};
+ }
- return true;
+ // Settings upgrade/downgrade handling
+ if (!migrateSettings()) {
+ throw ExitException{EXIT_FAILURE, tr("Could not load or upgrade client settings!")};
}
- return false;
-}
+ _client.reset(new Client(std::unique_ptr<QtUi>(new QtUi()))); // TODO C++14: std::make_unique
-QtUiApplication::~QtUiApplication()
-{
- Client::destroy();
- Quassel::destroy();
+ // Init UI only after the event loop has started
+ // TODO Qt5: Make this a lambda
+ QTimer::singleShot(0, this, SLOT(initUi()));
}
void QtUiApplication::initUi()
{
QtUi::instance()->init();
+
+ // Needs to happen after UI init, so the MainWin quit handler is registered first
+ Quassel::registerQuitHandler(quitHandler());
+
resumeSessionIfPossible();
}
+Quassel::QuitHandler QtUiApplication::quitHandler()
+{
+ // Wait until the Client instance is destroyed before quitting the event loop
+ return [this]() {
+ quInfo() << "Client shutting down...";
+ connect(_client.get(), SIGNAL(destroyed()), QCoreApplication::instance(), SLOT(quit()));
+ _client.release()->deleteLater();
+ };
+}
+
+
bool QtUiApplication::migrateSettings()
{
// --------