File indexing completed on 2024-05-19 05:21:23
0001 /* 0002 This file is part of KDE Kontact. 0003 0004 SPDX-FileCopyrightText: 2001 Matthias Hoelzer-Kluepfel <mhk@kde.org> 0005 SPDX-FileCopyrightText: 2002-2003 Daniel Molkentin <molkentin@kde.org> 0006 0007 SPDX-License-Identifier: GPL-2.0-or-later 0008 */ 0009 0010 // Use the kdepim version 0011 #include "kontact-version.h" 0012 0013 #include "kontact_debug.h" 0014 #include "mainwindow.h" 0015 #include "prefs.h" 0016 using namespace Kontact; 0017 0018 #include <KontactInterface/PimUniqueApplication> 0019 #include <KontactInterface/Plugin> 0020 #include <KontactInterface/UniqueAppHandler> 0021 0022 #include <KAboutData> 0023 #include <KCrash> 0024 #include <KLocalizedString> 0025 #include <KPluginMetaData> 0026 0027 #include <QCommandLineParser> 0028 #include <QDBusConnection> 0029 #include <QDBusConnectionInterface> 0030 #include <QPointer> 0031 #include <QWindow> 0032 0033 #include <iostream> 0034 0035 using namespace std; 0036 0037 static const char version[] = KONTACT_VERSION; 0038 0039 class KontactApp : public KontactInterface::PimUniqueApplication 0040 { 0041 Q_OBJECT 0042 public: 0043 KontactApp(int &argc, char **argv[]) 0044 : KontactInterface::PimUniqueApplication(argc, argv) 0045 , mMainWindow(nullptr) 0046 { 0047 KLocalizedString::setApplicationDomain(QByteArrayLiteral("kontact")); 0048 } 0049 0050 ~KontactApp() override = default; 0051 0052 int activate(const QStringList &arguments, const QString &workingDir) override; 0053 0054 void setMainWindow(MainWindow *window) 0055 { 0056 mMainWindow = window; 0057 KontactInterface::UniqueAppHandler::setMainWidget(window); 0058 } 0059 0060 void setSessionRestored(bool restored) 0061 { 0062 mSessionRestored = restored; 0063 } 0064 0065 private: 0066 QPointer<MainWindow> mMainWindow; 0067 bool mSessionRestored = false; 0068 }; 0069 0070 static void listPlugins() 0071 { 0072 const QList<KPluginMetaData> pluginMetaDatas = KPluginMetaData::findPlugins(QStringLiteral("pim6/kontact"), [](const KPluginMetaData &data) { 0073 return data.rawData().value(QStringLiteral("X-KDE-KontactPluginVersion")).toInt() == KONTACT_PLUGIN_VERSION; 0074 }); 0075 0076 for (const KPluginMetaData &plugin : pluginMetaDatas) { 0077 // skip summary only plugins 0078 if (plugin.rawData().contains(QLatin1StringView("X-KDE-KontactPluginHasPart"))) { 0079 bool var = plugin.rawData().value(QStringLiteral("X-KDE-KontactPluginHasPart")).toBool(); 0080 0081 if (!var) { 0082 continue; 0083 } 0084 } 0085 0086 cout << "Plugin name " << qPrintable(plugin.pluginId()) << endl; 0087 } 0088 } 0089 0090 static void loadCommandLineOptions(QCommandLineParser *parser) 0091 { 0092 parser->addOption(QCommandLineOption(QStringLiteral("module"), i18n("Start with a specific Kontact module"), QStringLiteral("module"))); 0093 parser->addOption(QCommandLineOption(QStringLiteral("iconify"), i18n("Start in iconified (minimized) mode"))); 0094 parser->addOption(QCommandLineOption(QStringLiteral("list"), i18n("List all possible modules and exit"))); 0095 } 0096 0097 int KontactApp::activate(const QStringList &args, const QString &workingDir) 0098 { 0099 Q_UNUSED(workingDir) 0100 0101 QCommandLineParser parser; 0102 loadCommandLineOptions(&parser); 0103 parser.process(args); 0104 0105 QString moduleName; 0106 if (Prefs::self()->forceStartupPlugin()) { 0107 moduleName = Prefs::self()->forcedStartupPlugin(); 0108 } 0109 if (parser.isSet(QStringLiteral("module"))) { 0110 moduleName = parser.value(QStringLiteral("module")); 0111 } 0112 if (!mSessionRestored) { 0113 if (!mMainWindow) { 0114 mMainWindow = new MainWindow(); 0115 if (!moduleName.isEmpty()) { 0116 mMainWindow->setInitialActivePluginModule(moduleName); 0117 } 0118 mMainWindow->show(); 0119 KontactInterface::UniqueAppHandler::setMainWidget(mMainWindow); 0120 // --iconify is needed in kontact, although kstart can do that too, 0121 // because kstart returns immediately so it's too early to talk D-Bus to the app. 0122 if (parser.isSet(QStringLiteral("iconify"))) { 0123 mMainWindow->windowHandle()->showMinimized(); 0124 } 0125 } else { 0126 if (!moduleName.isEmpty()) { 0127 mMainWindow->setInitialActivePluginModule(moduleName); 0128 } 0129 } 0130 } else if (!moduleName.isEmpty()) { 0131 mMainWindow->selectPlugin(moduleName); 0132 } 0133 0134 // Start KOrgac in case it's wasn't started on session start. 0135 QDBusConnection::sessionBus().interface()->startService(QStringLiteral("org.kde.korgac")); 0136 0137 // Handle startup notification and window activation 0138 // (The first time it will do nothing except note that it was called) 0139 return 0; 0140 } 0141 0142 int main(int argc, char **argv) 0143 { 0144 QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts); 0145 KontactApp app(argc, &argv); 0146 0147 KCrash::initialize(); 0148 KAboutData about(QStringLiteral("kontact"), 0149 i18n("Kontact"), 0150 QLatin1StringView(version), 0151 i18n("KDE personal information manager"), 0152 KAboutLicense::GPL, 0153 i18n("Copyright © 2001–%1 Kontact authors", QStringLiteral("2024")), 0154 QString(), 0155 QStringLiteral("https://userbase.kde.org/Kontact")); 0156 0157 about.addAuthor(i18n("Allen Winter"), QString(), QStringLiteral("winter@kde.org")); 0158 about.addAuthor(i18n("Rafael Fernández López"), QString(), QStringLiteral("ereslibre@kde.org")); 0159 about.addAuthor(i18n("Daniel Molkentin"), QString(), QStringLiteral("molkentin@kde.org")); 0160 about.addAuthor(i18n("Don Sanders"), QString(), QStringLiteral("sanders@kde.org")); 0161 about.addAuthor(i18n("Cornelius Schumacher"), QString(), QStringLiteral("schumacher@kde.org")); 0162 about.addAuthor(i18n("Tobias K\303\266nig"), QString(), QStringLiteral("tokoe@kde.org")); 0163 about.addAuthor(i18n("David Faure"), QString(), QStringLiteral("faure@kde.org")); 0164 about.addAuthor(i18n("Ingo Kl\303\266cker"), QString(), QStringLiteral("kloecker@kde.org")); 0165 about.addAuthor(i18n("Sven L\303\274ppken"), QString(), QStringLiteral("sven@kde.org")); 0166 about.addAuthor(i18n("Zack Rusin"), QString(), QStringLiteral("zack@kde.org")); 0167 about.addAuthor(i18n("Matthias Hoelzer-Kluepfel"), i18n("Original Author"), QStringLiteral("mhk@kde.org")); 0168 about.addCredit(i18n("Torgny Nyblom"), i18n("Git Migration"), QStringLiteral("nyblom@kde.org")); 0169 app.setAboutData(about); 0170 app.setWindowIcon(QIcon::fromTheme(QStringLiteral("kontact"))); 0171 app.setDesktopFileName(QStringLiteral("org.kde.kontact")); 0172 0173 QApplication::setWindowIcon(QIcon::fromTheme(QStringLiteral("kontact"))); 0174 0175 QCommandLineParser *cmdArgs = app.cmdArgs(); 0176 loadCommandLineOptions(cmdArgs); 0177 0178 const QStringList args = QApplication::arguments(); 0179 cmdArgs->process(args); 0180 about.processCommandLine(cmdArgs); 0181 0182 if (cmdArgs->isSet(QStringLiteral("list"))) { 0183 listPlugins(); 0184 return 0; 0185 } 0186 0187 if (!KontactApp::start(args)) { 0188 // Already running, brought to the foreground. 0189 qCDebug(KONTACT_LOG) << "Kontact already running, exiting."; 0190 return 0; 0191 } 0192 0193 if (!app.isSessionRestored()) { 0194 // There can only be one main window 0195 if (KMainWindow::canBeRestored(1)) { 0196 auto mainWindow = new MainWindow(); 0197 app.setMainWindow(mainWindow); 0198 app.setSessionRestored(true); 0199 mainWindow->show(); 0200 mainWindow->restore(1); 0201 } 0202 } 0203 0204 const int ret = app.exec(); 0205 qDeleteAll(KMainWindow::memberList()); 0206 0207 return ret; 0208 } 0209 0210 #include "main.moc"