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"