File indexing completed on 2024-05-05 05:37:14

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 <QQmlApplicationEngine>
0012 #include <QQmlContext>
0013 #include <QSessionManager>
0014 #include <QSurfaceFormat>
0015 #include <QWindow>
0016 
0017 #include <KAboutData>
0018 #include <KDBusService>
0019 #include <KLocalizedString>
0020 #include <KWindowSystem>
0021 
0022 #include "CommandLineArguments.h"
0023 #include "Configuration.h"
0024 #include "ToolsModel.h"
0025 
0026 class SessionManager : public QObject
0027 {
0028     Q_OBJECT
0029 public:
0030     explicit SessionManager(QObject *parent);
0031 
0032 private:
0033     QString m_pageId;
0034 };
0035 
0036 SessionManager::SessionManager(QObject *parent)
0037     : QObject(parent)
0038 {
0039     connect(qApp, &QGuiApplication::saveStateRequest, this, [this](QSessionManager &manager) {
0040         QString lastPageId = Configuration::globalConfig()->lastPage();
0041         if (lastPageId.isEmpty()) {
0042             return;
0043         }
0044         QStringList args;
0045         args << qApp->applicationName();
0046         args << QStringLiteral("--page-id") << lastPageId;
0047         args << QStringLiteral("-session") << manager.sessionId();
0048         manager.setRestartCommand(args);
0049     });
0050 }
0051 
0052 int main(int argc, char **argv)
0053 {
0054     auto format = QSurfaceFormat::defaultFormat();
0055     format.setOption(QSurfaceFormat::ResetNotification);
0056     QSurfaceFormat::setDefaultFormat(format);
0057 
0058     QApplication app(argc, argv);
0059     app.setWindowIcon(QIcon::fromTheme(QStringLiteral("utilities-system-monitor")));
0060 
0061     KLocalizedString::setApplicationDomain(QByteArrayLiteral("plasma-systemmonitor"));
0062 
0063     KAboutData aboutData{/* componentName */ QStringLiteral("plasma-systemmonitor"),
0064                          /* displayName */ i18n("System Monitor"),
0065                          /* version */ PROJECT_VERSION,
0066                          /* shortDescription */ i18n("An application for monitoring system resources"),
0067                          /* licenseType */ KAboutLicense::GPL,
0068                          /* copyrightStatement */ i18n("© 2020 Plasma Development Team"),
0069                          /* otherText */ QString{},
0070                          /* homePageAddress */ QString{}};
0071     aboutData.setDesktopFileName(QStringLiteral("org.kde.plasma-systemmonitor"));
0072     aboutData.setProgramLogo(app.windowIcon());
0073 
0074     aboutData.addAuthor(i18n("Arjen Hiemstra"), i18n("Development"), QStringLiteral("ahiemstra@heimr.nl"));
0075     aboutData.addAuthor(i18n("Uri Herrera"), i18n("Design"), QStringLiteral("uri_herrera@nxos.org"));
0076     aboutData.addAuthor(i18n("Nate Graham"), i18n("Design and Quality Assurance"), QStringLiteral("nate@kde.org"));
0077     aboutData.addAuthor(i18n("David Redondo"), i18n("Development"), QStringLiteral("kde@david-redondo.de"));
0078     aboutData.addAuthor(i18n("Noah Davis"), i18n("Design and Quality Assurance"), QStringLiteral("noahadvs@gmail.com"));
0079     aboutData.addAuthor(i18n("Marco Martin"), i18n("Development"), QStringLiteral("notmart@gmail.com"));
0080     aboutData.addAuthor(i18n("David Edmundson"), i18n("Development"), QStringLiteral("david@davidedmundson.co.uk"));
0081 
0082     aboutData.setTranslator(i18ndc(nullptr, "NAME OF TRANSLATORS", "Your names"), i18ndc(nullptr, "EMAIL OF TRANSLATORS", "Your emails"));
0083 
0084     aboutData.setBugAddress("https://bugs.kde.org/enter_bug.cgi?product=plasma-systemmonitor");
0085     KAboutData::setApplicationData(aboutData);
0086 
0087     KDBusService service(KDBusService::Unique);
0088 
0089     auto parser = std::make_shared<QCommandLineParser>();
0090     aboutData.setupCommandLine(parser.get());
0091     parser->addOption({QStringLiteral("page-id"), QStringLiteral("Start with the specified page ID shown"), QStringLiteral("page-id")});
0092     parser->addOption({QStringLiteral("page-name"), QStringLiteral("Start with the specified page name shown"), QStringLiteral("page-name")});
0093     parser->process(app);
0094     aboutData.processCommandLine(parser.get());
0095     CommandLineArguments::setCommandLineParser(parser);
0096 
0097     auto sessionManager = new SessionManager(&app);
0098 
0099     QQmlApplicationEngine engine;
0100     engine.rootContext()->setContextObject(new KLocalizedContext(&engine));
0101     if (Configuration::globalConfig()->maximized()) {
0102         engine.setInitialProperties({{"visibility", QWindow::Maximized}});
0103     }
0104     engine.loadFromModule("org.kde.systemmonitor", "Main");
0105 
0106     QObject::connect(&service, &KDBusService::activateRequested, &engine, []() {
0107         if (!qApp->topLevelWindows().isEmpty()) {
0108             QWindow *win = qApp->topLevelWindows().first();
0109             KWindowSystem::updateStartupId(win);
0110             KWindowSystem::activateWindow(win);
0111         }
0112     });
0113     // QDBusConnectionInterface::StartService is blocking so we do it manually
0114     const auto busInterface = QDBusConnection::sessionBus().interface();
0115     busInterface->asyncCall(QStringLiteral("StartServiceByName"), QStringLiteral("org.kde.ksystemstats"), 0u);
0116     return app.exec();
0117 }
0118 
0119 #include "main.moc"