File indexing completed on 2024-12-01 08:02:56

0001 // SPDX-FileCopyrightText: 2019-2020 Jonah Brüchert <jbb@kaidan.im>
0002 // SPDX-FileCopyrightText: 2022 Devin Lin <devin@kde.org>
0003 // SPDX-License-Identifier: GPL-2.0-or-later
0004 
0005 #include <QApplication>
0006 #include <QCommandLineParser>
0007 #include <QIcon>
0008 #include <QQmlApplicationEngine>
0009 #include <QUrl>
0010 #include <QtQml>
0011 
0012 #include <KAboutData>
0013 #include <KLocalizedContext>
0014 #include <KLocalizedString>
0015 
0016 #include "fontlistmodel.h"
0017 #include "savedcommandsmodel.h"
0018 #include "shellcommand.h"
0019 #include "terminalsettings.h"
0020 #include "terminaltabmodel.h"
0021 #include "util.h"
0022 #include "version.h"
0023 
0024 #include <KonsoleQML.h>
0025 
0026 constexpr auto URI = "org.kde.qmlkonsole";
0027 
0028 Q_DECL_EXPORT int main(int argc, char *argv[])
0029 {
0030     QApplication app(argc, argv);
0031 
0032     KLocalizedString::setApplicationDomain("qmlkonsole");
0033     KAboutData aboutData(QStringLiteral("qmlkonsole"),
0034                          QStringLiteral("QMLKonsole"),
0035                          QStringLiteral(QMLKONSOLE_VERSION_STRING),
0036                          QStringLiteral("Mobile terminal application"),
0037                          KAboutLicense::GPL,
0038                          i18n("© 2020-2022 KDE Community"));
0039     aboutData.setBugAddress("https://bugs.kde.org/enter_bug.cgi?product=QMLKonsole");
0040     aboutData.addAuthor(i18n("Jonah Brüchert"), QString(), QStringLiteral("jbb@kaidan.im"));
0041     aboutData.addAuthor(i18n("Devin Lin"), QString(), QStringLiteral("devin@kde.org"));
0042     KAboutData::setApplicationData(aboutData);
0043 
0044     qmlRegisterSingletonInstance<TerminalSettings>(URI, 1, 0, "TerminalSettings", TerminalSettings::self());
0045     qmlRegisterSingletonType<ShellCommand>(URI, 1, 0, "ShellCommand", [](QQmlEngine *, QJSEngine *) {
0046         return new ShellCommand();
0047     });
0048 
0049     KonsoleQML::registerTypes("org.kde.konsoleqml");
0050 
0051     QObject::connect(TerminalSettings::self(), &TerminalSettings::configChanged, QApplication::instance(), [] {
0052         TerminalSettings::self()->save();
0053         qDebug() << "saving config";
0054     });
0055 
0056     QQmlApplicationEngine engine;
0057     engine.rootContext()->setContextObject(new KLocalizedContext(&engine));
0058 
0059     Util util;
0060     {
0061         QCommandLineParser parser;
0062         parser.addOption(QCommandLineOption(QStringLiteral("e"), i18n("Command to execute"), QStringLiteral("command")));
0063         parser.addOption(QCommandLineOption(QStringLiteral("workdir"), i18n("Set the initial working directory to 'dir'"), QStringLiteral("dir")));
0064         parser.addVersionOption();
0065         parser.addHelpOption();
0066         parser.process(app);
0067 
0068         QString initialCommand = parser.isSet(QStringLiteral("e")) ? parser.value(QStringLiteral("e")) : "";
0069         QString initialWorkDir = parser.isSet(QStringLiteral("workdir")) ? parser.value(QStringLiteral("workdir")) : QDir::currentPath();
0070         util.setInitialCommand(std::move(initialCommand));
0071         util.setInitialWorkDir(std::move(initialWorkDir));
0072     }
0073 
0074     qmlRegisterSingletonType<SavedCommandsModel>(URI, 1, 0, "SavedCommandsModel", [](QQmlEngine *, QJSEngine *) -> QObject * {
0075         const auto self = SavedCommandsModel::self();
0076         QQmlEngine::setObjectOwnership(self, QQmlEngine::CppOwnership);
0077         return self;
0078     });
0079     qmlRegisterSingletonType<TerminalTabModel>(URI, 1, 0, "TerminalTabModel", [](QQmlEngine *, QJSEngine *) -> QObject * {
0080         const auto self = TerminalTabModel::self();
0081         QQmlEngine::setObjectOwnership(self, QQmlEngine::CppOwnership);
0082         return self;
0083     });
0084     qmlRegisterSingletonType<FontListSearchModel>(URI, 1, 0, "FontListSearchModel", [](QQmlEngine *, QJSEngine *) -> QObject * {
0085         const auto self = FontListSearchModel::self();
0086         QQmlEngine::setObjectOwnership(self, QQmlEngine::CppOwnership);
0087         return self;
0088     });
0089     qmlRegisterSingletonInstance(URI, 1, 0, "Util", &util);
0090     qmlRegisterSingletonType(URI, 1, 0, "About", [](QQmlEngine *, QJSEngine *engine) {
0091         return engine->toScriptValue(KAboutData::applicationData());
0092     });
0093 
0094     engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
0095 
0096     if (engine.rootObjects().isEmpty()) {
0097         return -1;
0098     }
0099 
0100     // required for X11
0101     app.setWindowIcon(QIcon::fromTheme(QStringLiteral("org.kde.qmlkonsole")));
0102 
0103     return app.exec();
0104 }