File indexing completed on 2024-05-12 16:23:40

0001 /*
0002     SPDX-FileCopyrightText: 2019 Jonah BrĂ¼chert <jbb.prv@gmx.de>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include <QApplication>
0008 #include <QCommandLineOption>
0009 #include <QCommandLineParser>
0010 #include <QIcon>
0011 #include <QQmlApplicationEngine>
0012 #include <QQuickStyle>
0013 #include <QUrl>
0014 #include <QtQml>
0015 #include <QtWebEngineQuick>
0016 
0017 #include <KAboutData>
0018 #include <KDesktopFile>
0019 #include <KLocalizedContext>
0020 #include <KLocalizedString>
0021 
0022 #include "angelfishsettings.h"
0023 #include "angelfishwebprofile.h"
0024 #include "bookmarkshistorymodel.h"
0025 #include "browsermanager.h"
0026 #include "iconimageprovider.h"
0027 #include "tabsmodel.h"
0028 #include "urlutils.h"
0029 #include "useragent.h"
0030 
0031 constexpr auto APPLICATION_ID = "org.kde.angelfish";
0032 
0033 QString desktopFileDirectory()
0034 {
0035     if (!QStandardPaths::locate(QStandardPaths::RuntimeLocation, QStringLiteral("flatpak-info")).isEmpty()) {
0036         return qEnvironmentVariable("HOME") % u"/.local/share/applications/";
0037     }
0038     return QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation);
0039 }
0040 
0041 Q_DECL_EXPORT int main(int argc, char *argv[])
0042 {
0043     // set default style and icon theme
0044     QIcon::setFallbackThemeName(QStringLiteral("breeze"));
0045     if (qEnvironmentVariableIsEmpty("QT_QUICK_CONTROLS_STYLE") && QQuickStyle::name().isEmpty()) {
0046         QQuickStyle::setStyle(QStringLiteral("org.kde.desktop"));
0047     }
0048     QGuiApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
0049 
0050     KLocalizedString::setApplicationDomain("angelfish");
0051 
0052     // Setup QtWebEngine
0053     qputenv("QTWEBENGINE_DIALOG_SET", "QtQuickControls2");
0054     QString chromiumFlags;
0055     if (AngelfishSettings::self()->webSmoothScrollingEnabled()) {
0056         chromiumFlags.append(QStringLiteral(" --enable-smooth-scrolling"));
0057     }
0058     if (AngelfishSettings::self()->webDarkModeEnabled()) {
0059         chromiumFlags.append(QStringLiteral(" --blink-settings=forceDarkModeEnabled=true"));
0060     }
0061     qputenv("QTWEBENGINE_CHROMIUM_FLAGS", chromiumFlags.toUtf8());
0062     QtWebEngineQuick::initialize();
0063 
0064     QApplication app(argc, argv);
0065     // QCoreApplication::setOrganizationName("KDE");
0066     // QCoreApplication::setOrganizationDomain("mobile.kde.org");
0067     // QCoreApplication::setApplicationName("angelfish");
0068 
0069     // Command line parser
0070     QCommandLineParser parser;
0071     parser.addPositionalArgument(QStringLiteral("desktopfile"), i18n("desktop file to open"), QStringLiteral("[file]"));
0072     parser.addHelpOption();
0073     parser.process(app);
0074 
0075     // QML loading
0076     QQmlApplicationEngine engine;
0077     engine.rootContext()->setContextObject(new KLocalizedContext(&engine));
0078 
0079     engine.addImageProvider(IconImageProvider::providerId(), new IconImageProvider());
0080 
0081     if (parser.positionalArguments().isEmpty()) {
0082         return 1;
0083     }
0084 
0085     const QString fileName = parser.positionalArguments().constFirst();
0086     const QString path = desktopFileDirectory() % QDir::separator() % fileName;
0087     const KDesktopFile desktopFile(path);
0088     if (desktopFile.readUrl().isEmpty()) {
0089         qDebug() << "Failed to find url in" << path;
0090         return 2;
0091     }
0092     const QUrl initialUrl = QUrl::fromUserInput(desktopFile.readUrl());
0093 
0094     const QString appName = desktopFile.readName().toLower().replace(QLatin1Char(' '), QLatin1Char('-')) + QStringLiteral("-angelfish-webapp");
0095     KAboutData aboutData(appName.toLower(),
0096                          desktopFile.readName(),
0097                          QStringLiteral("0.1"),
0098                          i18n("Angelfish Web App runtime"),
0099                          KAboutLicense::GPL,
0100                          i18n("Copyright 2020 Angelfish developers"));
0101     QApplication::setWindowIcon(QIcon::fromTheme(desktopFile.readIcon()));
0102     aboutData.addAuthor(i18n("Marco Martin"), QString(), QStringLiteral("mart@kde.org"));
0103 
0104     KAboutData::setApplicationData(aboutData);
0105 
0106     // Exported types
0107     qmlRegisterType<BookmarksHistoryModel>(APPLICATION_ID, 1, 0, "BookmarksHistoryModel");
0108     qmlRegisterType<UserAgent>(APPLICATION_ID, 1, 0, "UserAgentGenerator");
0109     qmlRegisterType<TabsModel>(APPLICATION_ID, 1, 0, "TabsModel");
0110     qmlRegisterType<AngelfishWebProfile>(APPLICATION_ID, 1, 0, "AngelfishWebProfile");
0111 
0112     // URL utils
0113     qmlRegisterSingletonType<UrlUtils>(APPLICATION_ID, 1, 0, "UrlUtils", [](QQmlEngine *, QJSEngine *) -> QObject * {
0114         return new UrlUtils();
0115     });
0116 
0117     BrowserManager::instance()->setInitialUrl(initialUrl);
0118 
0119     // Browser Manager
0120     qmlRegisterSingletonType<BrowserManager>(APPLICATION_ID, 1, 0, "BrowserManager", [](QQmlEngine *, QJSEngine *) -> QObject * {
0121         return BrowserManager::instance();
0122     });
0123 
0124     // Settings are read from WebView which we use as super class for WebAppView
0125     qmlRegisterSingletonInstance<AngelfishSettings>(APPLICATION_ID, 1, 0, "Settings", AngelfishSettings::self());
0126 
0127     Q_INIT_RESOURCE(resources_angelfish_generated);
0128 
0129     // Load QML
0130     engine.load(QUrl(QStringLiteral("qrc:///webapp.qml")));
0131 
0132     // Error handling
0133     if (engine.rootObjects().isEmpty()) {
0134         return -1;
0135     }
0136 
0137     return app.exec();
0138 }