File indexing completed on 2024-04-28 16:53:05

0001 /*
0002  * SPDX-FileCopyrightText: 2019 Arjen Hiemstra <ahiemstra@heimr.nl>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005  */
0006 
0007 #include <QApplication>
0008 #include <QCommandLineParser>
0009 #include <QDBusConnection>
0010 #include <QDBusConnectionInterface>
0011 #include <QLoggingCategory>
0012 #include <QQmlApplicationEngine>
0013 #include <QQmlContext>
0014 #include <QSessionManager>
0015 #include <QSurfaceFormat>
0016 #include <QWindow>
0017 
0018 #include <KAboutData>
0019 #include <KDBusService>
0020 #include <KDeclarative/KDeclarative>
0021 #include <KLocalizedString>
0022 #include <KWindowSystem>
0023 
0024 #include "Configuration.h"
0025 #include "ToolsModel.h"
0026 
0027 static QLoggingCategory::CategoryFilter oldCategoryFilter;
0028 
0029 // Qt 5.14 introduces a new syntax for connections
0030 // framework code can't port away due to needing Qt5.12
0031 // this filters out the warnings
0032 // Remove this once we depend on Qt5.15 in frameworks
0033 void filterConnectionSyntaxWarning(QLoggingCategory *category)
0034 {
0035     if (qstrcmp(category->categoryName(), "qt.qml.connections") == 0) {
0036         category->setEnabled(QtWarningMsg, false);
0037     } else if (oldCategoryFilter) {
0038         oldCategoryFilter(category);
0039     }
0040 }
0041 
0042 class CommandLineArguments : public QObject
0043 {
0044     Q_OBJECT
0045     Q_PROPERTY(QString pageId MEMBER m_pageId CONSTANT)
0046     Q_PROPERTY(QString pageName MEMBER m_pageName CONSTANT)
0047     Q_PROPERTY(QVariant aboutData READ aboutData CONSTANT)
0048 
0049 public:
0050     CommandLineArguments(QCommandLineParser &parser)
0051         : QObject()
0052         , m_pageId(parser.value(QStringLiteral("page-id")))
0053         , m_pageName(parser.value(QStringLiteral("page-name")))
0054     {
0055     }
0056 
0057     QVariant aboutData() const
0058     {
0059         return QVariant::fromValue(KAboutData::applicationData());
0060     }
0061 
0062 private:
0063     QString m_pageId;
0064     QString m_pageName;
0065 };
0066 
0067 class SessionManager : public QObject
0068 {
0069     Q_OBJECT
0070 public:
0071     explicit SessionManager(QObject *parent);
0072 
0073 private:
0074     QString m_pageId;
0075 };
0076 
0077 SessionManager::SessionManager(QObject *parent)
0078     : QObject(parent)
0079 {
0080     connect(qApp, &QGuiApplication::saveStateRequest, this, [this](QSessionManager &manager) {
0081         QString lastPageId = Configuration::globalConfig()->lastPage();
0082         if (lastPageId.isEmpty()) {
0083             return;
0084         }
0085         QStringList args;
0086         args << qApp->applicationName();
0087         args << QStringLiteral("--page-id") << lastPageId;
0088         args << QStringLiteral("-session") << manager.sessionId();
0089         manager.setRestartCommand(args);
0090     });
0091 }
0092 
0093 int main(int argc, char **argv)
0094 {
0095     auto format = QSurfaceFormat::defaultFormat();
0096     format.setOption(QSurfaceFormat::ResetNotification);
0097     QSurfaceFormat::setDefaultFormat(format);
0098 
0099     QApplication app(argc, argv);
0100 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
0101     app.setAttribute(Qt::AA_UseHighDpiPixmaps, true);
0102 #endif
0103     app.setWindowIcon(QIcon::fromTheme(QStringLiteral("utilities-system-monitor")));
0104 
0105     oldCategoryFilter = QLoggingCategory::installFilter(filterConnectionSyntaxWarning);
0106 
0107     KLocalizedString::setApplicationDomain("plasma-systemmonitor");
0108 
0109     KAboutData aboutData{/* componentName */ QStringLiteral("plasma-systemmonitor"),
0110                          /* displayName */ i18n("System Monitor"),
0111                          /* version */ PROJECT_VERSION,
0112                          /* shortDescription */ i18n("An application for monitoring system resources"),
0113                          /* licenseType */ KAboutLicense::GPL,
0114                          /* copyrightStatement */ i18n("© 2020 Plasma Development Team"),
0115                          /* otherText */ QString{},
0116                          /* homePageAddress */ QString{}};
0117     aboutData.setDesktopFileName(QStringLiteral("org.kde.plasma-systemmonitor"));
0118     aboutData.setProgramLogo(app.windowIcon());
0119 
0120     aboutData.addAuthor(i18n("Arjen Hiemstra"), i18n("Development"), QStringLiteral("ahiemstra@heimr.nl"));
0121     aboutData.addAuthor(i18n("Uri Herrera"), i18n("Design"), QStringLiteral("uri_herrera@nxos.org"));
0122     aboutData.addAuthor(i18n("Nate Graham"), i18n("Design and Quality Assurance"), QStringLiteral("nate@kde.org"));
0123     aboutData.addAuthor(i18n("David Redondo"), i18n("Development"), QStringLiteral("kde@david-redondo.de"));
0124     aboutData.addAuthor(i18n("Noah Davis"), i18n("Design and Quality Assurance"), QStringLiteral("noahadvs@gmail.com"));
0125     aboutData.addAuthor(i18n("Marco Martin"), i18n("Development"), QStringLiteral("notmart@gmail.com"));
0126     aboutData.addAuthor(i18n("David Edmundson"), i18n("Development"), QStringLiteral("david@davidedmundson.co.uk"));
0127 
0128     aboutData.setTranslator(i18ndc(nullptr, "NAME OF TRANSLATORS", "Your names"), i18ndc(nullptr, "EMAIL OF TRANSLATORS", "Your emails"));
0129 
0130     aboutData.setBugAddress("https://bugs.kde.org/enter_bug.cgi?product=plasma-systemmonitor");
0131     KAboutData::setApplicationData(aboutData);
0132 
0133     KDBusService service(KDBusService::Unique);
0134 
0135     QCommandLineParser parser;
0136     aboutData.setupCommandLine(&parser);
0137     parser.addOption({QStringLiteral("page-id"), QStringLiteral("Start with the specified page ID shown"), QStringLiteral("page-id")});
0138     parser.addOption({QStringLiteral("page-name"), QStringLiteral("Start with the specified page name shown"), QStringLiteral("page-name")});
0139     parser.process(app);
0140     aboutData.processCommandLine(&parser);
0141 
0142     qmlRegisterAnonymousType<QAbstractItemModel>("org.kde.systemmonitor", 1);
0143     qmlRegisterType<ToolsModel>("org.kde.systemmonitor", 1, 0, "ToolsModel");
0144     qmlRegisterType<Configuration>("org.kde.systemmonitor", 1, 0, "Configuration");
0145     qmlRegisterSingletonType<CommandLineArguments>("org.kde.systemmonitor", 1, 0, "CommandLineArguments", [&parser](QQmlEngine *, QJSEngine *) {
0146         return new CommandLineArguments{parser};
0147     });
0148     auto sessionManager = new SessionManager(&app);
0149 
0150     QQmlApplicationEngine engine;
0151     engine.rootContext()->setContextObject(new KLocalizedContext(&engine));
0152     engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
0153 
0154     QObject::connect(&service, &KDBusService::activateRequested, &engine, []() {
0155         if (!qApp->topLevelWindows().isEmpty()) {
0156             QWindow *win = qApp->topLevelWindows().first();
0157             KWindowSystem::updateStartupId(win);
0158             KWindowSystem::activateWindow(win);
0159         }
0160     });
0161     // QDBusConnectionInterface::StartService is blocking so we do it manually
0162     const auto busInterface = QDBusConnection::sessionBus().interface();
0163     busInterface->asyncCall(QStringLiteral("StartServiceByName"), QStringLiteral("org.kde.ksystemstats"), 0u);
0164     return app.exec();
0165 }
0166 
0167 #include "main.moc"