diff options
author | Konstantinos Sideris <sideris.konstantin@gmail.com> | 2018-07-17 16:37:25 +0300 |
---|---|---|
committer | Konstantinos Sideris <sideris.konstantin@gmail.com> | 2018-07-17 16:37:25 +0300 |
commit | 0e814da91c8e041897a4c3f7e6e9234bbc7c6f7a (patch) | |
tree | 21f655d30630fe77ba48d07e4b357e2b6c6a5730 /src/main.cpp | |
parent | Merge pull request #372 from bebehei/notification (diff) | |
download | nheko-0e814da91c8e041897a4c3f7e6e9234bbc7c6f7a.tar.xz |
Move all files under src/
Diffstat (limited to 'src/main.cpp')
-rw-r--r-- | src/main.cpp | 213 |
1 files changed, 213 insertions, 0 deletions
diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 00000000..d8bf30ce --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,213 @@ +/* + * nheko Copyright (C) 2017 Konstantinos Sideris <siderisk@auth.gr> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <QApplication> +#include <QCommandLineParser> +#include <QDesktopWidget> +#include <QDir> +#include <QFile> +#include <QFontDatabase> +#include <QLabel> +#include <QLayout> +#include <QLibraryInfo> +#include <QPalette> +#include <QPoint> +#include <QPushButton> +#include <QSettings> +#include <QStandardPaths> +#include <QTranslator> + +#include "Config.h" +#include "Logging.h" +#include "MainWindow.h" +#include "MatrixClient.h" +#include "RunGuard.h" +#include "ui/RaisedButton.h" +#include "version.h" + +#if defined(Q_OS_LINUX) +#include <boost/stacktrace.hpp> +#include <signal.h> + +void +stacktraceHandler(int signum) +{ + std::signal(signum, SIG_DFL); + boost::stacktrace::safe_dump_to("./nheko-backtrace.dump"); + std::raise(SIGABRT); +} + +void +registerSignalHandlers() +{ + std::signal(SIGSEGV, &stacktraceHandler); + std::signal(SIGABRT, &stacktraceHandler); +} + +#else + +// No implementation for systems with no stacktrace support. +void +registerSignalHandlers() +{} + +#endif + +QPoint +screenCenter(int width, int height) +{ + QRect screenGeometry = QApplication::desktop()->screenGeometry(); + + int x = (screenGeometry.width() - width) / 2; + int y = (screenGeometry.height() - height) / 2; + + return QPoint(x, y); +} + +void +createCacheDirectory() +{ + auto dir = QStandardPaths::writableLocation(QStandardPaths::CacheLocation); + + if (!QDir().mkpath(dir)) { + throw std::runtime_error( + ("Unable to create state directory:" + dir).toStdString().c_str()); + } +} + +int +main(int argc, char *argv[]) +{ + RunGuard guard("run_guard"); + + if (!guard.tryToRun()) { + QApplication a(argc, argv); + + QFont font; + font.setPointSize(15); + font.setWeight(60); + + QWidget widget; + QVBoxLayout layout(&widget); + layout.setContentsMargins(20, 10, 20, 20); + layout.setSpacing(0); + + QHBoxLayout btnLayout; + + QLabel msg("Another instance of nheko is currently running."); + msg.setWordWrap(true); + msg.setFont(font); + + QPalette pal; + + RaisedButton submitBtn("OK"); + submitBtn.setBackgroundColor(pal.color(QPalette::Button)); + submitBtn.setForegroundColor(pal.color(QPalette::ButtonText)); + submitBtn.setMinimumSize(120, 35); + submitBtn.setFontSize(conf::btn::fontSize); + submitBtn.setCornerRadius(conf::btn::cornerRadius); + + btnLayout.addStretch(1); + btnLayout.addWidget(&submitBtn); + + layout.addWidget(&msg); + layout.addLayout(&btnLayout); + + widget.setFixedSize(480, 180); + widget.move(screenCenter(widget.width(), widget.height())); + widget.show(); + + QObject::connect(&submitBtn, &QPushButton::clicked, &widget, &QWidget::close); + + return a.exec(); + } + + QApplication app(argc, argv); + QCoreApplication::setApplicationName("nheko"); + QCoreApplication::setApplicationVersion(nheko::version); + QCoreApplication::setOrganizationName("nheko"); + QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); + + QCommandLineParser parser; + parser.addHelpOption(); + parser.addVersionOption(); + parser.process(app); + + QFontDatabase::addApplicationFont(":/fonts/fonts/OpenSans/OpenSans-Regular.ttf"); + QFontDatabase::addApplicationFont(":/fonts/fonts/OpenSans/OpenSans-Italic.ttf"); + QFontDatabase::addApplicationFont(":/fonts/fonts/OpenSans/OpenSans-Bold.ttf"); + QFontDatabase::addApplicationFont(":/fonts/fonts/OpenSans/OpenSans-Semibold.ttf"); + QFontDatabase::addApplicationFont(":/fonts/fonts/EmojiOne/emojione-android.ttf"); + + app.setWindowIcon(QIcon(":/logos/nheko.png")); + + http::init(); + + createCacheDirectory(); + + registerSignalHandlers(); + + try { + nhlog::init(QString("%1/nheko.log") + .arg(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)) + .toStdString()); + } catch (const spdlog::spdlog_ex &ex) { + std::cout << "Log initialization failed: " << ex.what() << std::endl; + std::exit(1); + } + + QSettings settings; + + // Set the default if a value has not been set. + if (settings.value("font/size").toInt() == 0) + settings.setValue("font/size", 12); + + QFont font("Open Sans", settings.value("font/size").toInt()); + app.setFont(font); + + QString lang = QLocale::system().name(); + + QTranslator qtTranslator; + qtTranslator.load("qt_" + lang, QLibraryInfo::location(QLibraryInfo::TranslationsPath)); + app.installTranslator(&qtTranslator); + + QTranslator appTranslator; + appTranslator.load("nheko_" + lang, ":/translations"); + app.installTranslator(&appTranslator); + + MainWindow w; + + // Move the MainWindow to the center + w.move(screenCenter(w.width(), w.height())); + + if (!settings.value("user/window/start_in_tray", false).toBool() || + !settings.value("user/window/tray", true).toBool()) + w.show(); + + QObject::connect(&app, &QApplication::aboutToQuit, &w, [&w]() { + w.saveCurrentWindowSize(); + if (http::client() != nullptr) { + nhlog::net()->debug("shutting down all I/O threads & open connections"); + http::client()->close(true); + nhlog::net()->debug("bye"); + } + }); + + nhlog::ui()->info("starting nheko {}", nheko::version); + + return app.exec(); +} |