yubioath-flutter/main.cpp

122 lines
4.7 KiB
C++
Raw Normal View History

#include <QApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <stdlib.h>
#include <QtGlobal>
#include <QtWidgets>
2017-03-30 15:52:13 +03:00
#include <QQuickWindow>
#include "screenshot.h"
#include "systemtray.h"
int main(int argc, char *argv[])
{
// Global menubar is broken for qt5 apps in Ubuntu Unity, see:
// https://bugs.launchpad.net/ubuntu/+source/appmenu-qt5/+bug/1323853
// This workaround enables a local menubar.
2017-03-16 15:32:32 +03:00
qputenv("UBUNTU_MENUPROXY","0");
2017-03-16 15:42:20 +03:00
// Don't write .pyc files.
2017-03-16 14:42:32 +03:00
qputenv("PYTHONDONTWRITEBYTECODE", "1");
QApplication app(argc, argv);
2018-02-22 11:26:12 +03:00
app.setApplicationName("Yubico Authenticator");
app.setOrganizationName("Yubico");
app.setOrganizationDomain("com.yubico");
2018-02-22 11:26:12 +03:00
// A lock file is used, to ensure only one running instance at the time.
QString tmpDir = QDir::tempPath();
QLockFile lockFile(tmpDir + "/yubioath-desktop.lock");
2018-02-21 18:21:41 +03:00
if(!lockFile.tryLock(100)){
QMessageBox msgBox;
msgBox.setIcon(QMessageBox::Warning);
2018-02-22 11:26:12 +03:00
msgBox.setText("Yubico Authenticator is already running.");
2018-02-21 18:21:41 +03:00
msgBox.exec();
return 1;
}
QString app_dir = app.applicationDirPath();
2017-03-19 00:24:38 +03:00
QString main_qml = "/qml/main.qml";
QString path_prefix;
QString url_prefix;
if (QFileInfo::exists(":" + main_qml)) {
// Embedded resources
path_prefix = ":";
url_prefix = "qrc://";
} else if (QFileInfo::exists(app_dir + main_qml)) {
// Try relative to executable
path_prefix = app_dir;
url_prefix = app_dir;
} else { //Assume qml/main.qml in cwd.
app_dir = ".";
path_prefix = ".";
url_prefix = ".";
}
ScreenShot screenshot;
QQmlApplicationEngine engine;
SystemTray *trayIcon = new SystemTray();
trayIcon->setIcon(QIcon(path_prefix + "/images/windowicon.png"));
engine.rootContext()->setContextProperty("appDir", app_dir);
engine.rootContext()->setContextProperty("urlPrefix", url_prefix);
engine.rootContext()->setContextProperty("appVersion", APP_VERSION);
engine.rootContext()->setContextProperty("ScreenShot", &screenshot);
engine.rootContext()->setContextProperty("SysTrayIcon", trayIcon);
engine.rootContext()->setContextProperty("app", &app);
engine.load(QUrl(url_prefix + main_qml));
2018-02-21 15:29:45 +03:00
2017-03-30 15:52:13 +03:00
QObject *root = engine.rootObjects().first();
2017-12-01 17:38:08 +03:00
if (argc > 2 && strcmp(argv[1], "--log-level") == 0) {
2018-01-31 20:58:48 +03:00
if (argc > 4 && strcmp(argv[3], "--log-file") == 0) {
QMetaObject::invokeMethod(root, "enableLoggingToFile", Q_ARG(QVariant, argv[2]), Q_ARG(QVariant, argv[4]));
} else {
QMetaObject::invokeMethod(root, "enableLogging", Q_ARG(QVariant, argv[2]));
}
} else {
QMetaObject::invokeMethod(root, "disableLogging");
2017-12-01 17:38:08 +03:00
}
2017-03-30 15:52:13 +03:00
QQuickWindow *qmlWindow = qobject_cast<QQuickWindow *>(root);
// Set icon in the window, doesn't effect desktop icons.
qmlWindow->setIcon(QIcon(path_prefix + "/images/windowicon.png"));
2017-10-23 20:02:33 +03:00
// Show root window unless explicitly hidden in settings.
2017-11-16 20:01:53 +03:00
if (qmlWindow->property("hideOnLaunch").toBool() == false) {
2017-10-23 20:02:33 +03:00
qmlWindow->show();
}
2018-02-21 15:29:45 +03:00
// This is the current system tray icon.
// Should probably be replaced by QML when all supported platforms are on > Qt 5.8
// See http://doc-snapshots.qt.io/qt5-5.8/qml-qt-labs-platform-systemtrayicon.html
2017-03-30 15:52:13 +03:00
QAction *showAction = new QAction(QObject::tr("&Show credentials"), qmlWindow);
// The call to hide doesn't make much sense but makes it work on macOS when hidden from the dock.
root->connect(showAction, &QAction::triggered, qmlWindow, &QQuickWindow::hide);
root->connect(showAction, &QAction::triggered, qmlWindow, &QQuickWindow::show);
2017-03-30 15:52:13 +03:00
root->connect(showAction, &QAction::triggered, qmlWindow, &QQuickWindow::raise);
root->connect(showAction, &QAction::triggered, qmlWindow, &QQuickWindow::requestActivate);
2017-03-30 15:52:13 +03:00
QAction *quitAction = new QAction(QObject::tr("&Quit"), qmlWindow);
root->connect(quitAction, &QAction::triggered, qApp, &QApplication::quit);
QMenu *trayIconMenu = new QMenu();
trayIconMenu->addAction(showAction);
trayIconMenu->addSeparator();
trayIconMenu->addAction(quitAction);
trayIcon->setContextMenu(trayIconMenu);
trayIcon->setToolTip("Yubico Authenticator");
#ifndef Q_OS_DARWIN
// Double-click should show credentials.
// Double-click in systemtray icons is not supported on macOS.
root->connect(trayIcon,SIGNAL(doubleClicked()), qmlWindow,SLOT(show()));
root->connect(trayIcon,SIGNAL(doubleClicked()), qmlWindow,SLOT(raise()));
2017-08-14 13:34:06 +03:00
root->connect(trayIcon,SIGNAL(doubleClicked()), qmlWindow,SLOT(requestActivate()));
#endif
2017-03-30 15:52:13 +03:00
2018-02-21 15:29:45 +03:00
// Explicitly hide trayIcon on exit
2017-11-22 17:04:42 +03:00
const int status = app.exec();
trayIcon->hide();
return status;
}