diff --git a/src/lib/adblock/adblockplugin.cpp b/src/lib/adblock/adblockplugin.cpp index 0c6ec4d9..03af2a69 100644 --- a/src/lib/adblock/adblockplugin.cpp +++ b/src/lib/adblock/adblockplugin.cpp @@ -1,131 +1,126 @@ /* ============================================================ * Falkon - Qt web browser * Copyright (C) 2018 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "adblockplugin.h" #include "adblockmanager.h" #include "adblockicon.h" #include "scripts.h" #include "webpage.h" #include "pluginproxy.h" #include "browserwindow.h" #include "navigationbar.h" #include "mainapplication.h" #include "statusbar.h" #include "desktopfile.h" AdBlockPlugin::AdBlockPlugin() : QObject() { } -DesktopFile AdBlockPlugin::metaData() const -{ - return DesktopFile(QSL(":adblock/metadata.desktop")); -} - void AdBlockPlugin::init(InitState state, const QString &settingsPath) { Q_UNUSED(settingsPath) connect(mApp, &MainApplication::aboutToQuit, AdBlockManager::instance(), &AdBlockManager::save); connect(mApp->plugins(), &PluginProxy::webPageCreated, this, &AdBlockPlugin::webPageCreated); connect(mApp->plugins(), &PluginProxy::webPageDeleted, this, &AdBlockPlugin::webPageDeleted); connect(mApp->plugins(), &PluginProxy::mainWindowCreated, this, &AdBlockPlugin::mainWindowCreated); connect(mApp->plugins(), &PluginProxy::mainWindowDeleted, this, &AdBlockPlugin::mainWindowDeleted); if (state == LateInitState) { const auto windows = mApp->windows(); for (BrowserWindow *window : windows) { mainWindowCreated(window); } } } void AdBlockPlugin::unload() { const auto windows = mApp->windows(); for (BrowserWindow *window : windows) { mainWindowDeleted(window); } } bool AdBlockPlugin::testPlugin() { return true; } void AdBlockPlugin::showSettings(QWidget *parent) { AdBlockManager::instance()->showDialog(parent); } void AdBlockPlugin::webPageCreated(WebPage *page) { connect(page, &WebPage::loadFinished, this, [=]() { AdBlockManager *manager = AdBlockManager::instance(); if (!manager->isEnabled()) { return; } // Apply global element hiding rules const QString elementHiding = manager->elementHidingRules(page->url()); if (!elementHiding.isEmpty()) { page->runJavaScript(Scripts::setCss(elementHiding), WebPage::SafeJsWorld); } // Apply domain-specific element hiding rules const QString siteElementHiding = manager->elementHidingRulesForDomain(page->url()); if (!siteElementHiding.isEmpty()) { page->runJavaScript(Scripts::setCss(siteElementHiding), WebPage::SafeJsWorld); } }); } void AdBlockPlugin::webPageDeleted(WebPage *page) { AdBlockManager::instance()->clearBlockedRequestsForUrl(page->url()); } void AdBlockPlugin::mainWindowCreated(BrowserWindow *window) { AdBlockIcon *icon = new AdBlockIcon(window); m_icons[window] = icon; window->statusBar()->addButton(icon); window->navigationBar()->addToolButton(icon); } void AdBlockPlugin::mainWindowDeleted(BrowserWindow *window) { AdBlockIcon *icon = m_icons.take(window); window->statusBar()->removeButton(icon); window->navigationBar()->removeToolButton(icon); delete icon; } bool AdBlockPlugin::acceptNavigationRequest(WebPage *page, const QUrl &url, QWebEnginePage::NavigationType type, bool isMainFrame) { Q_UNUSED(type) AdBlockManager *manager = AdBlockManager::instance(); if (isMainFrame) { manager->clearBlockedRequestsForUrl(page->url()); } if (url.scheme() == QL1S("abp") && AdBlockManager::instance()->addSubscriptionFromUrl(url)) { return false; } return true; } diff --git a/src/lib/adblock/adblockplugin.h b/src/lib/adblock/adblockplugin.h index 533c309e..a16a412e 100644 --- a/src/lib/adblock/adblockplugin.h +++ b/src/lib/adblock/adblockplugin.h @@ -1,49 +1,48 @@ /* ============================================================ * Falkon - Qt web browser * Copyright (C) 2018 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #pragma once #include "plugininterface.h" class WebPage; class BrowserWindow; class AdBlockIcon; class AdBlockPlugin : public QObject, public PluginInterface { Q_OBJECT Q_INTERFACES(PluginInterface) Q_PLUGIN_METADATA(IID "Falkon.Browser.plugin.AdBlock") public: explicit AdBlockPlugin(); - DesktopFile metaData() const override; void init(InitState state, const QString &settingsPath) override; void unload() override; bool testPlugin() override; void showSettings(QWidget *parent = nullptr) override; private: void webPageCreated(WebPage *page); void webPageDeleted(WebPage *page); void mainWindowCreated(BrowserWindow *window); void mainWindowDeleted(BrowserWindow *window); bool acceptNavigationRequest(WebPage *page, const QUrl &url, QWebEnginePage::NavigationType type, bool isMainFrame) override; QHash m_icons; }; diff --git a/src/lib/plugins/plugininterface.h b/src/lib/plugins/plugininterface.h index c4f49031..54799873 100644 --- a/src/lib/plugins/plugininterface.h +++ b/src/lib/plugins/plugininterface.h @@ -1,71 +1,70 @@ /* ============================================================ * Falkon - Qt web browser * Copyright (C) 2010-2016 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef PLUGININTERFACE_H #define PLUGININTERFACE_H #include #include #include "qzcommon.h" #include "webhittestresult.h" class QMenu; class QMouseEvent; class QKeyEvent; class QWheelEvent; class WebView; class WebPage; class DesktopFile; class PluginInterface { public: enum InitState { StartupInitState, LateInitState }; virtual ~PluginInterface() { } - virtual DesktopFile metaData() const = 0; virtual void init(InitState state, const QString &settingsPath) = 0; virtual void unload() = 0; virtual bool testPlugin() = 0; virtual void showSettings(QWidget* parent = 0) { Q_UNUSED(parent) } virtual void populateWebViewMenu(QMenu* menu, WebView* view, const WebHitTestResult &r) { Q_UNUSED(menu) Q_UNUSED(view) Q_UNUSED(r) } virtual void populateExtensionsMenu(QMenu *menu) { Q_UNUSED(menu) } virtual bool mouseDoubleClick(Qz::ObjectName type, QObject* obj, QMouseEvent* event) { Q_UNUSED(type) Q_UNUSED(obj) Q_UNUSED(event) return false; } virtual bool mousePress(Qz::ObjectName type, QObject* obj, QMouseEvent* event) { Q_UNUSED(type) Q_UNUSED(obj) Q_UNUSED(event) return false; } virtual bool mouseRelease(Qz::ObjectName type, QObject* obj, QMouseEvent* event) { Q_UNUSED(type) Q_UNUSED(obj) Q_UNUSED(event) return false; } virtual bool mouseMove(Qz::ObjectName type, QObject* obj, QMouseEvent* event) { Q_UNUSED(type) Q_UNUSED(obj) Q_UNUSED(event) return false; } virtual bool wheelEvent(Qz::ObjectName type, QObject* obj, QWheelEvent* event) { Q_UNUSED(type) Q_UNUSED(obj) Q_UNUSED(event) return false; } virtual bool keyPress(Qz::ObjectName type, QObject* obj, QKeyEvent* event) { Q_UNUSED(type) Q_UNUSED(obj) Q_UNUSED(event) return false; } virtual bool keyRelease(Qz::ObjectName type, QObject* obj, QKeyEvent* event) { Q_UNUSED(type) Q_UNUSED(obj) Q_UNUSED(event) return false; } virtual bool acceptNavigationRequest(WebPage *page, const QUrl &url, QWebEnginePage::NavigationType type, bool isMainFrame) { Q_UNUSED(page); Q_UNUSED(url); Q_UNUSED(type); Q_UNUSED(isMainFrame); return true; } }; -Q_DECLARE_INTERFACE(PluginInterface, "Falkon.Browser.PluginInterface/2.3") +Q_DECLARE_INTERFACE(PluginInterface, "Falkon.Browser.PluginInterface/2.4") #endif // PLUGININTERFACE_H diff --git a/src/lib/plugins/plugins.cpp b/src/lib/plugins/plugins.cpp index 46840df1..03f42264 100644 --- a/src/lib/plugins/plugins.cpp +++ b/src/lib/plugins/plugins.cpp @@ -1,489 +1,510 @@ /* ============================================================ * Falkon - Qt web browser * Copyright (C) 2010-2018 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "pluginproxy.h" #include "plugininterface.h" #include "mainapplication.h" #include "speeddial.h" #include "settings.h" #include "datapaths.h" #include "adblock/adblockplugin.h" #include "../config.h" #include "desktopfile.h" #include "qml/qmlplugins.h" #include "qml/qmlplugin.h" #include #include #include #include #include #include +#include bool Plugins::Plugin::isLoaded() const { return instance; } bool Plugins::Plugin::isRemovable() const { return !pluginPath.isEmpty() && QFileInfo(pluginPath).isWritable(); } bool Plugins::Plugin::operator==(const Plugin &other) const { return type == other.type && pluginId == other.pluginId; } Plugins::Plugins(QObject* parent) : QObject(parent) , m_pluginsLoaded(false) , m_speedDial(new SpeedDial(this)) { loadSettings(); if (!MainApplication::isTestModeEnabled()) { loadPythonSupport(); } } QList Plugins::availablePlugins() { loadAvailablePlugins(); return m_availablePlugins; } bool Plugins::loadPlugin(Plugins::Plugin* plugin) { if (plugin->isLoaded()) { return true; } if (!initPlugin(PluginInterface::LateInitState, plugin)) { return false; } m_availablePlugins.removeOne(*plugin); m_availablePlugins.prepend(*plugin); refreshLoadedPlugins(); return plugin->isLoaded(); } void Plugins::unloadPlugin(Plugins::Plugin* plugin) { if (!plugin->isLoaded()) { return; } plugin->instance->unload(); emit pluginUnloaded(plugin->instance); plugin->instance = nullptr; m_availablePlugins.removeOne(*plugin); m_availablePlugins.append(*plugin); refreshLoadedPlugins(); } void Plugins::removePlugin(Plugins::Plugin *plugin) { if (!plugin->isRemovable()) { return; } if (plugin->isLoaded()) { unloadPlugin(plugin); } bool result = false; QFileInfo info(plugin->pluginPath); if (info.isDir()) { result = QDir(plugin->pluginPath).removeRecursively(); } else if (info.isFile()) { result = QFile::remove(plugin->pluginPath); } if (!result) { qWarning() << "Failed to remove" << plugin->pluginSpec.name; return; } m_availablePlugins.removeOne(*plugin); emit availablePluginsChanged(); } bool Plugins::addPlugin(const QString &id) { Plugin plugin = loadPlugin(id); if (plugin.type == Plugin::Invalid) { return false; } if (plugin.pluginSpec.name.isEmpty()) { qWarning() << "Invalid plugin spec of" << id << "plugin"; return false; } registerAvailablePlugin(plugin); emit availablePluginsChanged(); return true; } void Plugins::loadSettings() { QStringList defaultAllowedPlugins = { QSL("internal:adblock") }; // Enable KDE Frameworks Integration when running inside KDE session if (qgetenv("KDE_FULL_SESSION") == QByteArray("true")) { defaultAllowedPlugins.append(QSL("lib:KDEFrameworksIntegration.so")); } Settings settings; settings.beginGroup("Plugin-Settings"); m_allowedPlugins = settings.value("AllowedPlugins", defaultAllowedPlugins).toStringList(); settings.endGroup(); } void Plugins::shutdown() { foreach (PluginInterface* iPlugin, m_loadedPlugins) { iPlugin->unload(); } } +PluginSpec Plugins::createSpec(const QJsonObject &metaData) +{ + const QString tempIcon = DataPaths::path(DataPaths::Temp) + QL1S("/icon"); + const QString tempMetadata = DataPaths::path(DataPaths::Temp) + QL1S("/metadata.desktop"); + QFile::remove(tempIcon); + QFile::remove(tempMetadata); + QSettings settings(tempMetadata, QSettings::IniFormat); + settings.beginGroup(QSL("Desktop Entry")); + for (auto it = metaData.begin(); it != metaData.end(); ++it) { + const QString value = it.value().toString(); + if (it.key() == QL1S("Icon") && value.startsWith(QL1S("base64:"))) { + QFile file(tempIcon); + if (file.open(QFile::WriteOnly)) { + file.write(QByteArray::fromBase64(value.mid(7).toUtf8())); + settings.setValue(it.key(), tempIcon); + } + } else { + settings.setValue(it.key(), it.value().toString()); + } + } + settings.sync(); + return createSpec(DesktopFile(tempMetadata)); +} + PluginSpec Plugins::createSpec(const DesktopFile &metaData) { PluginSpec spec; spec.name = metaData.name(); spec.description = metaData.comment(); spec.version = metaData.value(QSL("X-Falkon-Version")).toString(); spec.author = QSL("%1 <%2>").arg(metaData.value(QSL("X-Falkon-Author")).toString(), metaData.value(QSL("X-Falkon-Email")).toString()); spec.hasSettings = metaData.value(QSL("X-Falkon-Settings")).toBool(); const QString iconName = metaData.icon(); if (!iconName.isEmpty()) { if (QFileInfo::exists(iconName)) { spec.icon = QIcon(iconName).pixmap(32); } else { const QString relativeFile = QFileInfo(metaData.fileName()).dir().absoluteFilePath(iconName); if (QFileInfo::exists(relativeFile)) { spec.icon = QIcon(relativeFile).pixmap(32); } else { spec.icon = QIcon::fromTheme(iconName).pixmap(32); } } } return spec; } void Plugins::loadPlugins() { QDir settingsDir(DataPaths::currentProfilePath() + "/extensions/"); if (!settingsDir.exists()) { settingsDir.mkdir(settingsDir.absolutePath()); } foreach (const QString &pluginId, m_allowedPlugins) { Plugin plugin = loadPlugin(pluginId); if (plugin.type == Plugin::Invalid) { continue; } if (plugin.pluginSpec.name.isEmpty()) { qWarning() << "Invalid plugin spec of" << pluginId << "plugin"; continue; } if (!initPlugin(PluginInterface::StartupInitState, &plugin)) { qWarning() << "Failed to init" << pluginId << "plugin"; continue; } registerAvailablePlugin(plugin); } refreshLoadedPlugins(); std::cout << "Falkon: " << m_loadedPlugins.count() << " extensions loaded" << std::endl; } void Plugins::loadAvailablePlugins() { if (m_pluginsLoaded) { return; } m_pluginsLoaded = true; const QStringList dirs = DataPaths::allPaths(DataPaths::Plugins); // InternalPlugin registerAvailablePlugin(loadInternalPlugin(QSL("adblock"))); for (const QString &dir : dirs) { const auto files = QDir(dir).entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot); for (const QFileInfo &info : files) { Plugin plugin; const QString pluginPath = info.absoluteFilePath(); - if (info.isFile()) { + if (info.isFile() && QLibrary::isLibrary(pluginPath)) { // SharedLibraryPlugin if (info.baseName() != QL1S("PyFalkon")) { plugin = loadSharedLibraryPlugin(pluginPath); } } else if (info.isDir()) { const DesktopFile metaData(QDir(pluginPath).filePath(QSL("metadata.desktop"))); const QString type = metaData.value(QSL("X-Falkon-Type")).toString(); if (type == QL1S("Extension/Python")) { // PythonPlugin plugin = loadPythonPlugin(pluginPath); } else if (type == QL1S("Extension/Qml")) { // QmlPlugin plugin = QmlPlugin::loadPlugin(pluginPath); } else { qWarning() << "Invalid type" << type << "of" << pluginPath << "plugin"; } } if (plugin.type == Plugin::Invalid) { continue; } if (plugin.pluginSpec.name.isEmpty()) { qWarning() << "Invalid plugin spec of" << pluginPath << "plugin"; continue; } registerAvailablePlugin(plugin); } } } void Plugins::registerAvailablePlugin(const Plugin &plugin) { if (!m_availablePlugins.contains(plugin)) { m_availablePlugins.append(plugin); } } void Plugins::refreshLoadedPlugins() { m_loadedPlugins.clear(); foreach (const Plugin &plugin, m_availablePlugins) { if (plugin.isLoaded()) { m_loadedPlugins.append(plugin.instance); } } emit availablePluginsChanged(); } void Plugins::loadPythonSupport() { const QStringList dirs = DataPaths::allPaths(DataPaths::Plugins); for (const QString &dir : dirs) { const auto files = QDir(dir).entryInfoList({QSL("PyFalkon*")}, QDir::Files); for (const QFileInfo &info : files) { m_pythonPlugin = new QLibrary(info.absoluteFilePath(), this); m_pythonPlugin->setLoadHints(QLibrary::ExportExternalSymbolsHint); if (!m_pythonPlugin->load()) { qWarning() << "Failed to load python support plugin" << m_pythonPlugin->errorString(); delete m_pythonPlugin; m_pythonPlugin = nullptr; } else { std::cout << "Falkon: Python plugin support initialized" << std::endl; return; } } } } Plugins::Plugin Plugins::loadPlugin(const QString &id) { QString name; Plugin::Type type = Plugin::Invalid; const int colon = id.indexOf(QL1C(':')); if (colon > -1) { const auto t = id.leftRef(colon); if (t == QL1S("internal")) { type = Plugin::InternalPlugin; } else if (t == QL1S("lib")) { type = Plugin::SharedLibraryPlugin; } else if (t == QL1S("python")) { type = Plugin::PythonPlugin; } else if (t == QL1S("qml")) { type = Plugin::QmlPlugin; } name = id.mid(colon + 1); } else { name = id; type = Plugin::SharedLibraryPlugin; } switch (type) { case Plugin::InternalPlugin: return loadInternalPlugin(name); case Plugin::SharedLibraryPlugin: return loadSharedLibraryPlugin(name); case Plugin::PythonPlugin: return loadPythonPlugin(name); case Plugin::QmlPlugin: return QmlPlugin::loadPlugin(name); default: return Plugin(); } } Plugins::Plugin Plugins::loadInternalPlugin(const QString &name) { if (name == QL1S("adblock")) { Plugin plugin; plugin.type = Plugin::InternalPlugin; plugin.pluginId = QSL("internal:adblock"); plugin.internalInstance = new AdBlockPlugin(); - plugin.pluginSpec = createSpec(plugin.internalInstance->metaData()); + plugin.pluginSpec = createSpec(DesktopFile(QSL(":adblock/metadata.desktop"))); return plugin; } else { return Plugin(); } } Plugins::Plugin Plugins::loadSharedLibraryPlugin(const QString &name) { QString fullPath; if (QFileInfo(name).isAbsolute()) { fullPath = name; } else { fullPath = DataPaths::locate(DataPaths::Plugins, name); if (fullPath.isEmpty()) { qWarning() << "Library plugin" << name << "not found"; return Plugin(); } } - QPluginLoader *loader = new QPluginLoader(fullPath); - PluginInterface *iPlugin = qobject_cast(loader->instance()); - - if (!iPlugin) { - qWarning() << "Loading" << fullPath << "failed:" << loader->errorString(); - return Plugin(); - } - Plugin plugin; plugin.type = Plugin::SharedLibraryPlugin; plugin.pluginId = QSL("lib:%1").arg(QFileInfo(fullPath).fileName()); plugin.pluginPath = fullPath; - plugin.pluginLoader = loader; - plugin.pluginSpec = createSpec(iPlugin->metaData()); + plugin.pluginLoader = new QPluginLoader(fullPath); + plugin.pluginSpec = createSpec(plugin.pluginLoader->metaData().value(QSL("MetaData")).toObject()); return plugin; } Plugins::Plugin Plugins::loadPythonPlugin(const QString &name) { if (!m_pythonPlugin) { qWarning() << "Python support plugin is not loaded"; return Plugin(); } auto f = (Plugin(*)(const QString &)) m_pythonPlugin->resolve("pyfalkon_load_plugin"); if (!f) { qWarning() << "Failed to resolve" << "pyfalkon_load_plugin"; return Plugin(); } return f(name); } bool Plugins::initPlugin(PluginInterface::InitState state, Plugin *plugin) { if (!plugin) { return false; } switch (plugin->type) { case Plugin::InternalPlugin: initInternalPlugin(plugin); break; case Plugin::SharedLibraryPlugin: initSharedLibraryPlugin(plugin); break; case Plugin::PythonPlugin: initPythonPlugin(plugin); break; case Plugin::QmlPlugin: QmlPlugin::initPlugin(plugin); break; default: return false; } if (!plugin->instance) { return false; } // DataPaths::currentProfilePath() + QL1S("/extensions") is duplicated in qmlsettings.cpp // If you change this, please change it there too. plugin->instance->init(state, DataPaths::currentProfilePath() + QL1S("/extensions")); if (!plugin->instance->testPlugin()) { emit pluginUnloaded(plugin->instance); plugin->instance = nullptr; return false; } return true; } void Plugins::initInternalPlugin(Plugin *plugin) { Q_ASSERT(plugin->type == Plugin::InternalPlugin); plugin->instance = plugin->internalInstance; } void Plugins::initSharedLibraryPlugin(Plugin *plugin) { Q_ASSERT(plugin->type == Plugin::SharedLibraryPlugin); plugin->instance = qobject_cast(plugin->pluginLoader->instance()); + + if (!plugin->instance) { + qWarning() << "Loading" << plugin->pluginPath << "failed:" << plugin->pluginLoader->errorString(); + } } void Plugins::initPythonPlugin(Plugin *plugin) { Q_ASSERT(plugin->type == Plugin::PythonPlugin); if (!m_pythonPlugin) { qWarning() << "Python support plugin is not loaded"; return; } auto f = (void(*)(Plugin *)) m_pythonPlugin->resolve("pyfalkon_init_plugin"); if (!f) { qWarning() << "Failed to resolve" << "pyfalkon_init_plugin"; return; } f(plugin); } diff --git a/src/lib/plugins/plugins.h b/src/lib/plugins/plugins.h index 45b61a89..7481c2df 100644 --- a/src/lib/plugins/plugins.h +++ b/src/lib/plugins/plugins.h @@ -1,139 +1,140 @@ /* ============================================================ * Falkon - Qt web browser * Copyright (C) 2010-2018 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef PLUGINLOADER_H #define PLUGINLOADER_H #include #include #include #include "qzcommon.h" #include "plugininterface.h" class QLibrary; class QPluginLoader; class SpeedDial; struct PluginSpec { QString name; QString description; QString author; QString version; QPixmap icon; bool hasSettings = false; bool operator==(const PluginSpec &other) const { return (this->name == other.name && this->description == other.description && this->author == other.author && this->version == other.version); } }; class FALKON_EXPORT Plugins : public QObject { Q_OBJECT public: struct Plugin { enum Type { Invalid = 0, InternalPlugin, SharedLibraryPlugin, PythonPlugin, QmlPlugin }; Type type = Invalid; QString pluginId; QString pluginPath; PluginSpec pluginSpec; PluginInterface *instance = nullptr; // InternalPlugin PluginInterface *internalInstance = nullptr; // SharedLibraryPlugin QPluginLoader *pluginLoader = nullptr; // Other QVariant data; bool isLoaded() const; bool isRemovable() const; bool operator==(const Plugin &other) const; }; explicit Plugins(QObject* parent = 0); QList availablePlugins(); bool loadPlugin(Plugin* plugin); void unloadPlugin(Plugin* plugin); void removePlugin(Plugin *plugin); bool addPlugin(const QString &id); void shutdown(); // SpeedDial SpeedDial* speedDial() { return m_speedDial; } + static PluginSpec createSpec(const QJsonObject &metaData); static PluginSpec createSpec(const DesktopFile &metaData); public Q_SLOTS: void loadSettings(); void loadPlugins(); protected: QList m_loadedPlugins; Q_SIGNALS: void pluginUnloaded(PluginInterface* plugin); void availablePluginsChanged(); private: void loadPythonSupport(); Plugin loadPlugin(const QString &id); Plugin loadInternalPlugin(const QString &name); Plugin loadSharedLibraryPlugin(const QString &name); Plugin loadPythonPlugin(const QString &name); bool initPlugin(PluginInterface::InitState state, Plugin *plugin); void initInternalPlugin(Plugin *plugin); void initSharedLibraryPlugin(Plugin *plugin); void initPythonPlugin(Plugin *plugin); void registerAvailablePlugin(const Plugin &plugin); void refreshLoadedPlugins(); void loadAvailablePlugins(); QList m_availablePlugins; QStringList m_allowedPlugins; bool m_pluginsLoaded; SpeedDial* m_speedDial; QList m_internalPlugins; QLibrary *m_pythonPlugin = nullptr; }; Q_DECLARE_METATYPE(Plugins::Plugin) #endif // PLUGINLOADER_H diff --git a/src/lib/plugins/qml/qmlplugininterface.cpp b/src/lib/plugins/qml/qmlplugininterface.cpp index 2f5213c4..9363d15e 100644 --- a/src/lib/plugins/qml/qmlplugininterface.cpp +++ b/src/lib/plugins/qml/qmlplugininterface.cpp @@ -1,395 +1,390 @@ /* ============================================================ * Falkon - Qt web browser * Copyright (C) 2018 Anmol Gautam * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "qmlplugininterface.h" #include "mainapplication.h" #include "pluginproxy.h" #include "statusbar.h" #include "browserwindow.h" #include "navigationbar.h" #include "sidebar.h" #include "api/menus/qmlmenu.h" #include "api/menus/qmlwebhittestresult.h" #include "api/events/qmlqzobjects.h" #include "api/events/qmlmouseevent.h" #include "api/events/qmlwheelevent.h" #include "api/events/qmlkeyevent.h" #include "api/tabs/qmltab.h" #include "webpage.h" #include "qztools.h" #include "qml/qmlengine.h" #include #include #include #include QmlPluginInterface::QmlPluginInterface() : m_qmlReusableTab(new QmlTab()) { } QmlPluginInterface::~QmlPluginInterface() { m_qmlReusableTab->deleteLater(); } void QmlPluginInterface::init(InitState state, const QString &settingsPath) { if (!m_init.isCallable()) { qWarning() << "Unable to call" << __FUNCTION__ << "on" << m_name << "plugin"; return; } QJSValueList args; args.append(state); args.append(settingsPath); m_init.call(args); } -DesktopFile QmlPluginInterface::metaData() const -{ - return DesktopFile(); -} - void QmlPluginInterface::unload() { if (!m_unload.isCallable()) { qWarning() << "Unable to call" << __FUNCTION__ << "on" << m_name << "plugin"; return; } m_unload.call(); for (QObject *childItem : qAsConst(m_childItems)) { childItem->deleteLater(); } emit qmlPluginUnloaded(); } bool QmlPluginInterface::testPlugin() { if (!m_testPlugin.isCallable()) { qWarning() << "Unable to call" << __FUNCTION__ << "on" << m_name << "plugin"; return false; } QJSValue ret = m_testPlugin.call(); return ret.toBool(); } void QmlPluginInterface::populateWebViewMenu(QMenu *menu, WebView *webview, const WebHitTestResult &webHitTestResult) { Q_UNUSED(webview) if (!m_populateWebViewMenu.isCallable()) { return; } QmlMenu *qmlMenu = new QmlMenu(menu, m_engine); QmlWebHitTestResult *qmlWebHitTestResult = new QmlWebHitTestResult(webHitTestResult); QJSValueList args; args.append(m_engine->newQObject(qmlMenu)); args.append(m_engine->newQObject(qmlWebHitTestResult)); m_populateWebViewMenu.call(args); menu->addSeparator(); } void QmlPluginInterface::showSettings(QWidget *parent) { if (!m_settingsWindow) { qWarning() << "No dialog to show"; return; } QQuickWidget *widget = new QQuickWidget(); widget->setContent(m_settingsWindow->url(), m_settingsWindow, m_settingsWindow->create(m_settingsWindow->creationContext())); widget->show(); QzTools::centerWidgetToParent(widget, parent); } bool QmlPluginInterface::mouseDoubleClick(Qz::ObjectName type, QObject *obj, QMouseEvent *event) { Q_UNUSED(obj) if (!m_mouseDoubleClick.isCallable()) { return false; } auto qmlMouseEvent = new QmlMouseEvent(event); QJSValueList args; args.append(QmlQzObjects::ObjectName(type)); args.append(m_engine->newQObject(qmlMouseEvent)); m_mouseDoubleClick.call(args); qmlMouseEvent->clear(); return false; } bool QmlPluginInterface::mousePress(Qz::ObjectName type, QObject *obj, QMouseEvent *event) { Q_UNUSED(obj) if (!m_mousePress.isCallable()) { return false; } auto qmlMouseEvent = new QmlMouseEvent(event); QJSValueList args; args.append(QmlQzObjects::ObjectName(type)); args.append(m_engine->newQObject(qmlMouseEvent)); m_mousePress.call(args); qmlMouseEvent->clear(); return false; } bool QmlPluginInterface::mouseRelease(Qz::ObjectName type, QObject *obj, QMouseEvent *event) { Q_UNUSED(obj) if (!m_mouseRelease.isCallable()) { return false; } auto qmlMouseEvent = new QmlMouseEvent(event); QJSValueList args; args.append(QmlQzObjects::ObjectName(type)); args.append(m_engine->newQObject(qmlMouseEvent)); m_mouseRelease.call(args); qmlMouseEvent->clear(); return false; } bool QmlPluginInterface::mouseMove(Qz::ObjectName type, QObject *obj, QMouseEvent *event) { Q_UNUSED(obj) if (!m_mouseMove.isCallable()) { return false; } auto qmlMouseEvent = new QmlMouseEvent(event); QJSValueList args; args.append(QmlQzObjects::ObjectName(type)); args.append(m_engine->newQObject(qmlMouseEvent)); m_mouseMove.call(args); qmlMouseEvent->clear(); return false; } bool QmlPluginInterface::wheelEvent(Qz::ObjectName type, QObject *obj, QWheelEvent *event) { Q_UNUSED(obj) if (!m_wheelEvent.isCallable()) { return false; } auto qmlWheelEvent = new QmlWheelEvent(event); QJSValueList args; args.append(QmlQzObjects::ObjectName(type)); args.append(m_engine->newQObject(qmlWheelEvent)); m_wheelEvent.call(args); qmlWheelEvent->clear(); return false; } bool QmlPluginInterface::keyPress(Qz::ObjectName type, QObject *obj, QKeyEvent *event) { Q_UNUSED(obj) if (!m_keyPress.isCallable()) { return false; } auto qmlKeyEvent = new QmlKeyEvent(event); QJSValueList args; args.append(QmlQzObjects::ObjectName(type)); args.append(m_engine->newQObject(qmlKeyEvent)); m_keyPress.call(args); qmlKeyEvent->clear(); return false; } bool QmlPluginInterface::keyRelease(Qz::ObjectName type, QObject *obj, QKeyEvent *event) { Q_UNUSED(obj) if (!m_keyRelease.isCallable()) { return false; } auto qmlKeyEvent = new QmlKeyEvent(event); QJSValueList args; args.append(QmlQzObjects::ObjectName(type)); args.append(m_engine->newQObject(qmlKeyEvent)); m_keyRelease.call(args); qmlKeyEvent->clear(); return false; } bool QmlPluginInterface::acceptNavigationRequest(WebPage *page, const QUrl &url, QWebEnginePage::NavigationType type, bool isMainFrame) { if (!m_acceptNavigationRequest.isCallable()) { return true; } m_qmlReusableTab->setWebPage(page); QJSValueList args; args.append(m_engine->newQObject(m_qmlReusableTab)); args.append(QString::fromUtf8(url.toEncoded())); args.append(type); args.append(isMainFrame); return m_acceptNavigationRequest.call(args).toBool(); } QJSValue QmlPluginInterface::readInit() const { return m_init; } void QmlPluginInterface::setInit(const QJSValue &init) { m_init = init; } QJSValue QmlPluginInterface::readUnload() const { return m_unload; } void QmlPluginInterface::setUnload(const QJSValue &unload) { m_unload = unload; } QJSValue QmlPluginInterface::readTestPlugin() const { return m_testPlugin; } void QmlPluginInterface::setTestPlugin(const QJSValue &testPlugin) { m_testPlugin = testPlugin; } void QmlPluginInterface::setEngine(QQmlEngine *engine) { m_engine = engine; } void QmlPluginInterface::setName(const QString &name) { m_name = name; } QJSValue QmlPluginInterface::readPopulateWebViewMenu() const { return m_populateWebViewMenu; } void QmlPluginInterface::setPopulateWebViewMenu(const QJSValue &value) { m_populateWebViewMenu = value; } QQmlComponent *QmlPluginInterface::settingsWindow() const { return m_settingsWindow; } void QmlPluginInterface::setSettingsWindow(QQmlComponent *settingsWindow) { m_settingsWindow = settingsWindow; } QJSValue QmlPluginInterface::readMouseDoubleClick() const { return m_mouseDoubleClick; } void QmlPluginInterface::setMouseDoubleClick(const QJSValue &mouseDoubleClick) { m_mouseDoubleClick = mouseDoubleClick; mApp->plugins()->registerAppEventHandler(PluginProxy::MouseDoubleClickHandler, this); } QJSValue QmlPluginInterface::readMousePress() const { return m_mousePress; } void QmlPluginInterface::setMousePress(const QJSValue &mousePress) { m_mousePress = mousePress; mApp->plugins()->registerAppEventHandler(PluginProxy::MousePressHandler, this); } QJSValue QmlPluginInterface::readMouseRelease() const { return m_mouseRelease; } void QmlPluginInterface::setMouseRelease(const QJSValue &mouseRelease) { m_mouseRelease = mouseRelease; mApp->plugins()->registerAppEventHandler(PluginProxy::MouseReleaseHandler, this); } QJSValue QmlPluginInterface::readMouseMove() const { return m_mouseMove; } void QmlPluginInterface::setMouseMove(const QJSValue &mouseMove) { m_mouseMove = mouseMove; mApp->plugins()->registerAppEventHandler(PluginProxy::MouseMoveHandler, this); } QJSValue QmlPluginInterface::readWheelEvent() const { return m_wheelEvent; } void QmlPluginInterface::setWheelEvent(const QJSValue &wheelEvent) { m_wheelEvent = wheelEvent; mApp->plugins()->registerAppEventHandler(PluginProxy::WheelEventHandler, this); } QJSValue QmlPluginInterface::readKeyPress() const { return m_keyPress; } void QmlPluginInterface::setKeyPress(const QJSValue &keyPress) { m_keyPress = keyPress; mApp->plugins()->registerAppEventHandler(PluginProxy::KeyPressHandler, this); } QJSValue QmlPluginInterface::readKeyRelease() const { return m_keyRelease; } void QmlPluginInterface::setKeyRelease(const QJSValue &keyRelease) { m_keyRelease = keyRelease; mApp->plugins()->registerAppEventHandler(PluginProxy::KeyReleaseHandler, this); } QJSValue QmlPluginInterface::readAcceptNavigationRequest() const { return m_acceptNavigationRequest; } void QmlPluginInterface::setAcceptNavigationRequest(const QJSValue &acceptNavigationRequest) { m_acceptNavigationRequest = acceptNavigationRequest; } QQmlListProperty QmlPluginInterface::childItems() { return QQmlListProperty(this, m_childItems); } diff --git a/src/lib/plugins/qml/qmlplugininterface.h b/src/lib/plugins/qml/qmlplugininterface.h index 09c85747..bc2251f0 100644 --- a/src/lib/plugins/qml/qmlplugininterface.h +++ b/src/lib/plugins/qml/qmlplugininterface.h @@ -1,122 +1,121 @@ /* ============================================================ * Falkon - Qt web browser * Copyright (C) 2018 Anmol Gautam * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #pragma once #include #include #include #include "desktopfile.h" #include "plugininterface.h" class QmlTab; class QmlPluginInterface : public QObject, public PluginInterface { Q_OBJECT Q_INTERFACES(PluginInterface) Q_ENUM(InitState) Q_PROPERTY(QJSValue init READ readInit WRITE setInit) Q_PROPERTY(QJSValue unload READ readUnload WRITE setUnload) Q_PROPERTY(QJSValue testPlugin READ readTestPlugin WRITE setTestPlugin) Q_PROPERTY(QJSValue populateWebViewMenu READ readPopulateWebViewMenu WRITE setPopulateWebViewMenu) Q_PROPERTY(QQmlComponent* settingsWindow READ settingsWindow WRITE setSettingsWindow) Q_PROPERTY(QJSValue mouseDoubleClick READ readMouseDoubleClick WRITE setMouseDoubleClick) Q_PROPERTY(QJSValue mousePress READ readMousePress WRITE setMousePress) Q_PROPERTY(QJSValue mouseRelease READ readMouseRelease WRITE setMouseRelease) Q_PROPERTY(QJSValue mouseMove READ readMouseMove WRITE setMouseMove) Q_PROPERTY(QJSValue wheelEvent READ readWheelEvent WRITE setWheelEvent) Q_PROPERTY(QJSValue keyPress READ readKeyPress WRITE setKeyPress) Q_PROPERTY(QJSValue keyRelease READ readKeyRelease WRITE setKeyRelease) Q_PROPERTY(QJSValue acceptNavigationRequest READ readAcceptNavigationRequest WRITE setAcceptNavigationRequest) Q_PROPERTY(QQmlListProperty childItems READ childItems) Q_CLASSINFO("DefaultProperty", "childItems") public: explicit QmlPluginInterface(); ~QmlPluginInterface() override; - DesktopFile metaData() const override; void init(InitState state, const QString &settingsPath) override; void unload() override; bool testPlugin() override; void setEngine(QQmlEngine *engine); void setName(const QString &name); void populateWebViewMenu(QMenu *menu, WebView *webview, const WebHitTestResult &webHitTestResult) override; void showSettings(QWidget *parent = nullptr) override; bool mouseDoubleClick(Qz::ObjectName type, QObject *obj, QMouseEvent *event) override; bool mousePress(Qz::ObjectName type, QObject *obj, QMouseEvent *event) override; bool mouseRelease(Qz::ObjectName type, QObject *obj, QMouseEvent *event) override; bool mouseMove(Qz::ObjectName type, QObject *obj, QMouseEvent *event) override; bool wheelEvent(Qz::ObjectName type, QObject *obj, QWheelEvent *event) override; bool keyPress(Qz::ObjectName type, QObject *obj, QKeyEvent *event) override; bool keyRelease(Qz::ObjectName type, QObject *obj, QKeyEvent *event) override; bool acceptNavigationRequest(WebPage *page, const QUrl &url, QWebEnginePage::NavigationType type, bool isMainFrame) override; Q_SIGNALS: void qmlPluginUnloaded(); private: QQmlEngine *m_engine = nullptr; QString m_name; QJSValue m_init; QJSValue m_unload; QJSValue m_testPlugin; QJSValue m_populateWebViewMenu; QQmlComponent *m_settingsWindow = nullptr; QJSValue m_mouseDoubleClick; QJSValue m_mousePress; QJSValue m_mouseRelease; QJSValue m_mouseMove; QJSValue m_wheelEvent; QJSValue m_keyPress; QJSValue m_keyRelease; QJSValue m_acceptNavigationRequest; QList m_childItems; QmlTab *m_qmlReusableTab = nullptr; QJSValue readInit() const; void setInit(const QJSValue &init); QJSValue readUnload() const; void setUnload(const QJSValue &unload); QJSValue readTestPlugin() const; void setTestPlugin(const QJSValue &testPlugin); QJSValue readPopulateWebViewMenu() const; void setPopulateWebViewMenu(const QJSValue &value); QQmlComponent *settingsWindow() const; void setSettingsWindow(QQmlComponent *settingsWindow); QJSValue readMouseDoubleClick() const; void setMouseDoubleClick(const QJSValue &mouseDoubleClick); QJSValue readMousePress() const; void setMousePress(const QJSValue &mousePress); QJSValue readMouseRelease() const; void setMouseRelease(const QJSValue &mouseRelease); QJSValue readMouseMove() const; void setMouseMove(const QJSValue &mouseMove); QJSValue readWheelEvent() const; void setWheelEvent(const QJSValue &wheelEvent); QJSValue readKeyPress() const; void setKeyPress(const QJSValue &keyPress); QJSValue readKeyRelease() const; void setKeyRelease(const QJSValue &keyRelease); QJSValue readAcceptNavigationRequest() const; void setAcceptNavigationRequest(const QJSValue &acceptNavigationRequest); QQmlListProperty childItems(); }; diff --git a/src/plugins/AutoScroll/autoscroll.json b/src/plugins/AutoScroll/autoscroll.json new file mode 100644 index 00000000..55021506 --- /dev/null +++ b/src/plugins/AutoScroll/autoscroll.json @@ -0,0 +1,55 @@ +{ + "Comment": "Provides support for autoscroll with middle mouse button", + "Comment[ca@valencia]": "Proporciona suport per al desplaçament automàtic amb el botó del mig del ratolí", + "Comment[ca]": "Proporciona suport per al desplaçament automàtic amb el botó del mig del ratolí", + "Comment[cs]": "Poskytuje podporu pro automatický posun pomocí prostředního tlačítka", + "Comment[da]": "Giver understøttelse af autorul med den midterste museknap", + "Comment[de]": "Automatisches Blättern mit der mittleren Maustaste", + "Comment[en_GB]": "Provides support for autoscroll with middle mouse button", + "Comment[es]": "Implementa ell desplazamiento automático con el botón medio del ratón", + "Comment[fi]": "Tarjoaa automaattivieritystuen hiiren keskipainikkeelle", + "Comment[fr]": "Prise en charge du défilement automatique à l'aide du bouton central de la souris", + "Comment[gl]": "Fornece a funcionalidade de desprazamento automático co botón central", + "Comment[id]": "Menyediakan dukungan untuk gulir otomatis dengan tombol tengah mouse", + "Comment[it]": "Fornisce il supporto allo scorrimento automatico con il pulsante centrale del mouse", + "Comment[nl]": "Bied ondersteuning voor auto-schuiven met middelste muisknop", + "Comment[nn]": "Gjev støtte for autorulling med midtknappen på musa", + "Comment[pl]": "Umożliwia automatyczne przewijanie przy pomocy środkowego przycisku myszy", + "Comment[pt]": "Oferece o suporte para o deslocamento automático com o botão do meio do rato", + "Comment[pt_BR]": "Fornece suporte para rolagem automática com o botão do meio do mouse", + "Comment[sk]": "Poskytuje podporu pre Automatické posúvanie so stredným tlačidlom myši", + "Comment[sv]": "Tillhandahåller stöd för automatisk rullning med musens mittenknapp", + "Comment[uk]": "Забезпечує підтримку автогортання середньою кнопкою миші", + "Comment[x-test]": "xxProvides support for autoscroll with middle mouse buttonxx", + "Comment[zh_CN]": "为鼠标中键滚动提供支持", + "Comment[zh_TW]": "提供使用滑鼠中鍵自動捲動的支援", + "Icon": "base64:iVBORw0KGgoAAAANSUhEUgAAACEAAAAhCAYAAABX5MJvAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QEbCTcPpN0dgwAABUJJREFUWMPtVn9oU1cU/l7SJLb5ga+xJZ0iZRm4LrMrKzhsYcgYRZBGuxmcbQ1rQUVox0TRrMxtgUnGREqoYtfBQgdi5spog1b/qMLKpEpXDZamtinpEmlJ06Qm6ctLzUt694c3XeqmW6MWNnbgwPt1zv3u98537gH+t/+IMQBENpttDQARvV91ADnRaLRxcXFRCAaDNQDEqw1EXFdXp0omk7+1tbURQRBGS0tL5ZSRVWNB6vf7D/f395Pq6moyNDREfD7fhwAk2bCRDXLRrl278vLz8z++ePEiAODChQvQaDQmnU4nyyanKAsWxO3t7Q03b97c6PV6AQBjY2MYHh7edOXKld3ZFOlKQYgMBkNuJgtpS7NRWloqfZEgGACM2WzeMjc3t1Emk4FhHq3FMAzEYjE4jtvU0dHx6ouSLENdUlxcvNbtdn/CcdyvMzMzKafTSQKBQCoajQ6MjY0dBqAEkJMR83waksFgkLpcriJa/XkA1AA2HD16dGtnZ2dNc3PzFgAbAOQDyAUguXfv3kvl5eWSZ2GFASDetm3bmmAwWJ9KpUZisVjS5/O9DUAGQNzf31+0sLDwlSAIl3ieP+10OtfThiWbnZ3Vx2IxIgjCnVAo9L5Op5OupJktW1wQBNfIyAhpaWkhVquVcBxnAyDv7e3dwD9MTnd1dRGj0Ui6uroIl0gG+vr6XgYg53n+p5MnT5Jjx44Rp9NJBEG4EwgEdlMwf2KGeRxAKBR6T6VSfTE+Pl5y/vx5DA8PAwDkcjk6OztDOp2uZHBw8NNr16595HA4loL1ej2qqqq+bWpqMp87d85tNBpzE4kEAKCkpAS1tbXQ6XTOcDj8WUFBQS+ARQDkcXUwd+/efUWhUPxgsVhKTCbTEgAAiMVimJmZUR84cGC9RCLRZQIAAIfDgZycnM07d+7U+ny+JQAAMDo6ihMnTqC1tbWMZdmey5cvF2QSsAyEwWCYCofDp48cOcIbjUaoVKqll1KpFGq1Ot7d3T3P8/ykXq9fBkKv14Pnec/169dDhYWFKZHoj9Qsy2L//v1obm6Ozs7Ofrljx47ok+pDRCtbffDgwTe8Xm87z/Ocw+EgRqORWCwWMjc3dwlAkcViKZ9/KIQzayLyMDl/5syZrQCK5ufnf25paSH19fWP6oXjoh6Px1pXV/caVdCaJ/Uohuo7FwALoKihoeHNycnJb2KxWGxqaorcvn27kSbJP3Xq1Ft+v9/OcdxQIBD4sa2trZJKN9/lch2+f/8+icfjEY/HYzUYDJsBaACspflznqYUhkpJCkBOwWgOHTpUeuPGjQ+USqWaPlcAWMey7MZ9+/a9DmA9BSAHINdqtYW3bt2qpTvX0DxymndlUqVBeQBUtBPmApBNTEy8E41GOxKJhN/v9xNBEKYikcjZiYmJCtpH0jEqev3UxZm/AYIMXTMA4PV6tygUil/sdjsGBgYQiUTAsiwqKiqwd+9eMjk5ubmsrGycxhLqS3Jc6QGWTpCingQAu93ulcvlkcHBQUQiEQDAgwcPMDQ0BJlMFrBarQEal8yIJc/jFE0nIcePH48Gg8Hvampqln2wZ88eTE9Pn7XZbAt/EffcjvI0M0mz2dxeVVUVVavVAACNRoPKysrZpqam7+nOF/8pgKznSwCsz+dr7enpIdXV1aSvr4+43e7PqQSlWIWpWwxA3tjYuCkej0dMJhOJx+OB7du3F1MliFdt2gbAer3er+PxOHG73S2ryUImG3larbbw6tWr7yqVynW0h4iz3VXWQw+dtEQZEk5lU5DMM/6WtJMM/3fa78jUV/gAdoYYAAAAAElFTkSuQmCC", + "Name": "AutoScroll", + "Name[ca@valencia]": "Desplaçament automàtic", + "Name[ca]": "Desplaçament automàtic", + "Name[cs]": "Automatické posouvání", + "Name[da]": "Autorul", + "Name[de]": "Automatischer Bildlauf", + "Name[en_GB]": "AutoScroll", + "Name[es]": "Desplazamiento automático", + "Name[fi]": "Automaattivieritys", + "Name[fr]": "AutoScroll", + "Name[gl]": "Desprazamento automático", + "Name[id]": "AutoScroll", + "Name[it]": "Scorrimento automatico", + "Name[nl]": "Auto-schuiven", + "Name[nn]": "Autorulling", + "Name[pl]": "Automatyczne przewijanie", + "Name[pt]": "Deslocamento Automático", + "Name[pt_BR]": "AutoScroll", + "Name[sk]": "Automatické posúvanie", + "Name[sv]": "Rulla automatiskt", + "Name[uk]": "Автогортання", + "Name[x-test]": "xxAutoScrollxx", + "Name[zh_CN]": "自动滚动", + "Name[zh_TW]": "AutoScroll", + "X-Falkon-Author": "David Rosca", + "X-Falkon-Email": "nowrep@gmail.com", + "X-Falkon-Settings": "true", + "X-Falkon-Version": "1.0.1" +} diff --git a/src/plugins/AutoScroll/autoscroll.qrc b/src/plugins/AutoScroll/autoscroll.qrc index 076dbfd4..cc33d3a5 100644 --- a/src/plugins/AutoScroll/autoscroll.qrc +++ b/src/plugins/AutoScroll/autoscroll.qrc @@ -1,11 +1,10 @@ - metadata.desktop data/scroll_all.png data/scroll_all@2x.png data/scroll_horizontal.png data/scroll_horizontal@2x.png data/scroll_vertical.png data/scroll_vertical@2x.png diff --git a/src/plugins/AutoScroll/autoscrollplugin.cpp b/src/plugins/AutoScroll/autoscrollplugin.cpp index 19366605..8512ec31 100644 --- a/src/plugins/AutoScroll/autoscrollplugin.cpp +++ b/src/plugins/AutoScroll/autoscrollplugin.cpp @@ -1,105 +1,99 @@ /* ============================================================ * AutoScroll - Autoscroll for Falkon * Copyright (C) 2014-2017 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "autoscrollplugin.h" #include "autoscrollsettings.h" #include "autoscroller.h" #include "browserwindow.h" #include "pluginproxy.h" #include "mainapplication.h" #include "../config.h" -#include "desktopfile.h" AutoScrollPlugin::AutoScrollPlugin() : QObject() , m_scroller(0) { } -DesktopFile AutoScrollPlugin::metaData() const -{ - return DesktopFile(QSL(":autoscroll/metadata.desktop")); -} - void AutoScrollPlugin::init(InitState state, const QString &settingsPath) { Q_UNUSED(state) m_scroller = new AutoScroller(settingsPath + QL1S("/extensions.ini"), this); mApp->plugins()->registerAppEventHandler(PluginProxy::MouseMoveHandler, this); mApp->plugins()->registerAppEventHandler(PluginProxy::MousePressHandler, this); mApp->plugins()->registerAppEventHandler(PluginProxy::MouseReleaseHandler, this); mApp->plugins()->registerAppEventHandler(PluginProxy::WheelEventHandler, this); } void AutoScrollPlugin::unload() { m_scroller->deleteLater(); } bool AutoScrollPlugin::testPlugin() { // Require the version that the plugin was built with return (Qz::VERSION == QLatin1String(FALKON_VERSION)); } void AutoScrollPlugin::showSettings(QWidget* parent) { if (!m_settings) { m_settings = new AutoScrollSettings(m_scroller, parent); } m_settings.data()->show(); m_settings.data()->raise(); } bool AutoScrollPlugin::mouseMove(Qz::ObjectName type, QObject* obj, QMouseEvent* event) { if (type == Qz::ON_WebView) { return m_scroller->mouseMove(obj, event); } return false; } bool AutoScrollPlugin::mousePress(Qz::ObjectName type, QObject* obj, QMouseEvent* event) { if (type == Qz::ON_WebView) { return m_scroller->mousePress(obj, event); } return false; } bool AutoScrollPlugin::mouseRelease(Qz::ObjectName type, QObject* obj, QMouseEvent* event) { if (type == Qz::ON_WebView) { return m_scroller->mouseRelease(obj, event); } return false; } bool AutoScrollPlugin::wheelEvent(Qz::ObjectName type, QObject *obj, QWheelEvent *event) { if (type == Qz::ON_WebView) { return m_scroller->wheel(obj, event); } return false; } diff --git a/src/plugins/AutoScroll/autoscrollplugin.h b/src/plugins/AutoScroll/autoscrollplugin.h index ba9cdb20..3a106e34 100644 --- a/src/plugins/AutoScroll/autoscrollplugin.h +++ b/src/plugins/AutoScroll/autoscrollplugin.h @@ -1,51 +1,50 @@ /* ============================================================ * AutoScroll - Autoscroll for Falkon * Copyright (C) 2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef AUTOSCROLLPLUGIN_H #define AUTOSCROLLPLUGIN_H #include "plugininterface.h" class AutoScroller; class AutoScrollSettings; class AutoScrollPlugin : public QObject, public PluginInterface { Q_OBJECT Q_INTERFACES(PluginInterface) - Q_PLUGIN_METADATA(IID "Falkon.Browser.plugin.AutoScroll") + Q_PLUGIN_METADATA(IID "Falkon.Browser.plugin.AutoScroll" FILE "autoscroll.json") public: explicit AutoScrollPlugin(); - DesktopFile metaData() const override; void init(InitState state, const QString &settingsPath) override; void unload() override; bool testPlugin() override; void showSettings(QWidget *parent) override; bool mouseMove(Qz::ObjectName type, QObject *obj, QMouseEvent *event) override; bool mousePress(Qz::ObjectName type, QObject *obj, QMouseEvent *event) override; bool mouseRelease(Qz::ObjectName type, QObject *obj, QMouseEvent *event) override; bool wheelEvent(Qz::ObjectName type, QObject *obj, QWheelEvent *event) override; private: AutoScroller* m_scroller; QPointer m_settings; }; #endif // TESTPLUGIN_H diff --git a/src/plugins/FlashCookieManager/fcm_plugin.cpp b/src/plugins/FlashCookieManager/fcm_plugin.cpp index 2bda706e..7603a87f 100644 --- a/src/plugins/FlashCookieManager/fcm_plugin.cpp +++ b/src/plugins/FlashCookieManager/fcm_plugin.cpp @@ -1,464 +1,458 @@ /* ============================================================ * FlashCookieManager plugin for Falkon * Copyright (C) 2014-2018 S. Razi Alavizadeh * Copyright (C) 2017-2018 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "fcm_plugin.h" #include "browserwindow.h" #include "pluginproxy.h" #include "mainapplication.h" #include "fcm_dialog.h" #include "abstractbuttoninterface.h" #include "tabbedwebview.h" #include "fcm_notification.h" #include "datapaths.h" #include "../config.h" #include "statusbar.h" #include "navigationbar.h" -#include "desktopfile.h" #include #include #include #include #if defined(Q_OS_WIN) || defined(Q_OS_OS2) #include #endif const int refreshInterval = 60 * 1000; class FCM_Button : public AbstractButtonInterface { public: explicit FCM_Button(QObject *parent = nullptr) : AbstractButtonInterface(parent) { } QString id() const override { return QSL("fcm-icon"); } QString name() const override { return tr("Flash Cookie Manager button"); } }; FCM_Plugin::FCM_Plugin() : QObject() { } -DesktopFile FCM_Plugin::metaData() const -{ - return DesktopFile(QSL(":flashcookiemanager/metadata.desktop")); -} - void FCM_Plugin::init(InitState state, const QString &settingsPath) { m_settingsPath = settingsPath; connect(mApp->plugins(), &PluginProxy::mainWindowCreated, this, &FCM_Plugin::mainWindowCreated); connect(mApp->plugins(), &PluginProxy::mainWindowDeleted, this, &FCM_Plugin::mainWindowDeleted); m_timer = new QTimer(this); m_timer->setInterval(refreshInterval); connect(m_timer, &QTimer::timeout, this, &FCM_Plugin::autoRefresh); // start timer if needed startStopTimer(); if (state == StartupInitState && readSettings().value(QL1S("deleteAllOnStartExit")).toBool()) { loadFlashCookies(); removeAllButWhitelisted(); } if (state == LateInitState) { foreach (BrowserWindow* window, mApp->windows()) { mainWindowCreated(window); } } } void FCM_Plugin::unload() { if (m_fcmDialog) { m_fcmDialog->close(); } if (mApp->isClosing() && readSettings().value(QL1S("deleteAllOnStartExit")).toBool()) { removeAllButWhitelisted(); } foreach (BrowserWindow* window, mApp->windows()) { mainWindowDeleted(window); } delete m_fcmDialog; } bool FCM_Plugin::testPlugin() { return (Qz::VERSION == QLatin1String(FALKON_VERSION)); } void FCM_Plugin::showSettings(QWidget* parent) { Q_UNUSED(parent) showFlashCookieManager(); m_fcmDialog->showPage(2); } void FCM_Plugin::populateExtensionsMenu(QMenu* menu) { QAction* showFCM = new QAction(QIcon(":/flashcookiemanager/data/flash-cookie-manager.png"), tr("Flash Cookie Manager"), menu); connect(showFCM, &QAction::triggered, this, &FCM_Plugin::showFlashCookieManager); menu->addAction(showFCM); } void FCM_Plugin::setFlashCookies(const QList &flashCookies) { m_flashCookies = flashCookies; } QList FCM_Plugin::flashCookies() { if (m_flashCookies.isEmpty()) { loadFlashCookies(); } return m_flashCookies; } QStringList FCM_Plugin::newCookiesList() { return m_newCookiesList; } void FCM_Plugin::clearNewOrigins() { m_newCookiesList.clear(); } void FCM_Plugin::clearCache() { m_flashCookies.clear(); } bool FCM_Plugin::isBlacklisted(const FlashCookie &flashCookie) { return readSettings().value(QL1S("flashCookiesBlacklist")).toStringList().contains(flashCookie.origin); } bool FCM_Plugin::isWhitelisted(const FlashCookie &flashCookie) { return readSettings().value(QL1S("flashCookiesWhitelist")).toStringList().contains(flashCookie.origin); } void FCM_Plugin::removeAllButWhitelisted() { foreach (const FlashCookie &flashCookie, m_flashCookies) { if (isWhitelisted(flashCookie)) { continue; } removeCookie(flashCookie); } } QString FCM_Plugin::sharedObjectDirName() const { if (flashPlayerDataPath().contains(QL1S("macromedia"), Qt::CaseInsensitive) || !flashPlayerDataPath().contains(QL1S("/.gnash"), Qt::CaseInsensitive)) { return QLatin1String(QL1S("/#SharedObjects/")); } else { return QLatin1String(QL1S("/SharedObjects/")); } } QString FCM_Plugin::flashPlayerDataPath() const { return DataPaths::currentProfilePath() + QSL("/Pepper Data/Shockwave Flash/WritableRoot/"); } QVariantHash FCM_Plugin::readSettings() const { if (m_settingsHash.isEmpty()) { m_settingsHash.insert(QL1S("autoMode"), QVariant(false)); m_settingsHash.insert(QL1S("deleteAllOnStartExit"), QVariant(false)); m_settingsHash.insert(QL1S("notification"), QVariant(false)); m_settingsHash.insert(QL1S("flashCookiesWhitelist"), QVariant()); m_settingsHash.insert(QL1S("flashCookiesBlacklist"), QVariant()); QSettings settings(m_settingsPath + QL1S("/extensions.ini"), QSettings::IniFormat); settings.beginGroup(QL1S("FlashCookieManager")); QVariantHash::iterator i = m_settingsHash.begin(); while (i != m_settingsHash.end()) { *i = settings.value(i.key(), i.value()); ++i; } settings.endGroup(); } return m_settingsHash; } void FCM_Plugin::writeSettings(const QVariantHash &hashSettings) { m_settingsHash = hashSettings; QSettings settings(m_settingsPath + QL1S(QL1S("/extensions.ini")), QSettings::IniFormat); settings.beginGroup(QL1S("FlashCookieManager")); QVariantHash::const_iterator i = m_settingsHash.constBegin(); while (i != m_settingsHash.constEnd()) { settings.setValue(i.key(), i.value()); ++i; } settings.endGroup(); startStopTimer(); } void FCM_Plugin::removeCookie(const FlashCookie &flashCookie) { if (m_flashCookies.contains(flashCookie)) { m_flashCookies.removeOne(flashCookie); if (QFile(flashCookie.path + QL1C('/') + flashCookie.name).remove()) { QDir dir(flashCookie.path); dir.rmpath(flashCookie.path); } } } void FCM_Plugin::autoRefresh() { if (m_fcmDialog && m_fcmDialog->isVisible()) { return; } QList oldflashCookies = m_flashCookies; loadFlashCookies(); QStringList newCookieList; foreach (const FlashCookie &flashCookie, m_flashCookies) { if (isBlacklisted(flashCookie)) { removeCookie(flashCookie); continue; } if (isWhitelisted(flashCookie)) { continue; } bool newCookie = true; foreach (const FlashCookie &oldFlashCookie, oldflashCookies) { if (QString(oldFlashCookie.path + oldFlashCookie.name) == QString(flashCookie.path + flashCookie.name)) { newCookie = false; break; } } if (newCookie) { newCookieList << flashCookie.path + QL1C('/') + flashCookie.name; } } if (!newCookieList.isEmpty() && readSettings().value(QL1S("notification")).toBool()) { m_newCookiesList << newCookieList; BrowserWindow* window = mApp->getWindow(); if (!window) { return; } TabbedWebView* weView = window->weView(); if (!weView) { return; } FCM_Notification* notif = new FCM_Notification(this, newCookieList.size()); weView->addNotification(notif); } } void FCM_Plugin::showFlashCookieManager() { if (!m_fcmDialog) { m_fcmDialog = new FCM_Dialog(this); } m_fcmDialog->refreshView(); m_fcmDialog->showPage(0); m_fcmDialog->show(); m_fcmDialog->raise(); } void FCM_Plugin::mainWindowCreated(BrowserWindow *window) { window->statusBar()->addButton(createStatusBarIcon(window)); window->navigationBar()->addToolButton(createStatusBarIcon(window)); } void FCM_Plugin::mainWindowDeleted(BrowserWindow *window) { if (!window) { return; } if (m_fcmDialog && m_fcmDialog->parent() == window) { m_fcmDialog->setParent(0); } window->statusBar()->removeButton(m_statusBarIcons.value(window)); window->navigationBar()->removeToolButton(m_statusBarIcons.value(window)); delete m_statusBarIcons.value(window); m_statusBarIcons.remove(window); } void FCM_Plugin::startStopTimer() { if (readSettings().value(QL1S("autoMode")).toBool()) { if (!m_timer->isActive()) { if (m_flashCookies.isEmpty()) { loadFlashCookies(); } m_timer->start(); } } else { m_timer->stop(); } } AbstractButtonInterface* FCM_Plugin::createStatusBarIcon(BrowserWindow* mainWindow) { if (m_statusBarIcons.contains(mainWindow)) { return m_statusBarIcons.value(mainWindow); } FCM_Button* icon = new FCM_Button(this); icon->setIcon(QIcon(QSL(":/flashcookiemanager/data/flash-cookie-manager.png"))); icon->setTitle(tr("Flash Cookie Manager")); icon->setToolTip(tr("Show Flash Cookie Manager")); connect(icon, &AbstractButtonInterface::clicked, this, &FCM_Plugin::showFlashCookieManager); m_statusBarIcons.insert(mainWindow, icon); return icon; } void FCM_Plugin::loadFlashCookies() { m_flashCookies.clear(); loadFlashCookies(flashPlayerDataPath()); } void FCM_Plugin::loadFlashCookies(QString path) { QDir solDir(path); QStringList entryList = solDir.entryList(); entryList.removeAll(QL1S(".")); entryList.removeAll(QL1S("..")); foreach(QString entry, entryList) { if (path.endsWith(QL1S("#SharedObjects")) && entry == QL1S("#AppContainer")) { // specific to IE and Windows continue; } path.replace(QL1C('\\'), QL1C('/')); QFileInfo entryInfo(path + QL1C('/') + entry); if (entryInfo.isDir()) { loadFlashCookies(entryInfo.filePath()); } else if (entryInfo.isFile() && entryInfo.suffix() == QL1S("sol")) { insertFlashCookie(entryInfo.filePath()); } } } void FCM_Plugin::insertFlashCookie(const QString &path) { QFile solFile(path); if (!solFile.open(QFile::ReadOnly)) { return; } QByteArray file = solFile.readAll(); for (int i = 0; i < file.size(); ++i) { if (!((file.at(i) >= 'a' && file.at(i) <= 'z') || (file.at(i) >= 'A' && file.at(i) <= 'Z') || (file.at(i) >= '0' && file.at(i) <= '9'))) { file[i] = ' '; } } QString fileStr = QString(file); fileStr = fileStr.split(QL1C('.'), QString::SkipEmptyParts).join(QL1S("\n")); QFileInfo solFileInfo(solFile); FlashCookie flashCookie; flashCookie.contents = fileStr; flashCookie.name = solFileInfo.fileName(); flashCookie.path = solFileInfo.canonicalPath(); flashCookie.size = (int)solFile.size(); flashCookie.lastModification = solFileInfo.lastModified(); flashCookie.origin = extractOriginFrom(path); m_flashCookies << flashCookie; } QString FCM_Plugin::extractOriginFrom(const QString &path) { QString origin = path; if (path.startsWith(flashPlayerDataPath() + sharedObjectDirName())) { origin.remove(flashPlayerDataPath() + sharedObjectDirName()); if (origin.indexOf(QL1C('/')) != -1) { origin.remove(0, origin.indexOf(QL1C('/')) + 1); } } else if (path.startsWith(flashPlayerDataPath() + QL1S("/macromedia.com/support/flashplayer/sys/"))) { origin.remove(flashPlayerDataPath() + QL1S("/macromedia.com/support/flashplayer/sys/")); if (origin == QL1S("settings.sol")) { return tr("!default"); } else if (origin.startsWith(QL1C('#'))) { origin.remove(0, 1); } } else { origin.clear(); } int index = origin.indexOf(QL1C('/')); if (index == -1) { return tr("!other"); } origin = origin.remove(index, origin.size()); if (origin == QL1S("localhost") || origin == QL1S("local")) { origin = QL1S("!localhost"); } return origin; } diff --git a/src/plugins/FlashCookieManager/fcm_plugin.h b/src/plugins/FlashCookieManager/fcm_plugin.h index afe92a6d..056bcb02 100644 --- a/src/plugins/FlashCookieManager/fcm_plugin.h +++ b/src/plugins/FlashCookieManager/fcm_plugin.h @@ -1,108 +1,107 @@ /* ============================================================ * FlashCookieManager plugin for Falkon * Copyright (C) 2014 S. Razi Alavizadeh * Copyright (C) 2018 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef FLASHCOOKIEMANAGER_H #define FLASHCOOKIEMANAGER_H #include "plugininterface.h" #include #include class BrowserWindow; class FCM_Dialog; class QTimer; class AbstractButtonInterface; struct FlashCookie { QString name; QString origin; int size; QString path; QString contents; QDateTime lastModification; bool operator ==(const FlashCookie &other) { return (this->name == other.name && this->path == other.path); } }; class FCM_Plugin : public QObject, public PluginInterface { Q_OBJECT Q_INTERFACES(PluginInterface) - Q_PLUGIN_METADATA(IID "Falkon.Browser.plugin.FlashCookieManager") + Q_PLUGIN_METADATA(IID "Falkon.Browser.plugin.FlashCookieManager" FILE "flashcookiemanager.json") public: explicit FCM_Plugin(); - DesktopFile metaData() const override; void init(InitState state, const QString &settingsPath) override; void unload() override; bool testPlugin() override; void showSettings(QWidget *parent) override; void populateExtensionsMenu(QMenu *menu) override; void setFlashCookies(const QList &flashCookies); QList flashCookies(); QStringList newCookiesList(); void clearNewOrigins(); void clearCache(); QString flashPlayerDataPath() const; QVariantHash readSettings() const; void writeSettings(const QVariantHash &hashSettings); void removeCookie(const FlashCookie &flashCookie); private Q_SLOTS: void autoRefresh(); void showFlashCookieManager(); void mainWindowCreated(BrowserWindow* window); void mainWindowDeleted(BrowserWindow* window); void startStopTimer(); private: AbstractButtonInterface* createStatusBarIcon(BrowserWindow* mainWindow); void loadFlashCookies(); void loadFlashCookies(QString path); void insertFlashCookie(const QString &path); QString extractOriginFrom(const QString &path); bool isBlacklisted(const FlashCookie &flashCookie); bool isWhitelisted(const FlashCookie &flashCookie); void removeAllButWhitelisted(); QString sharedObjectDirName() const; QHash m_statusBarIcons; QPointer m_fcmDialog; QString m_settingsPath; QList m_flashCookies; QTimer* m_timer; mutable QVariantHash m_settingsHash; bool m_autoMode; bool m_deleteOnClose; bool m_enableNotification; QStringList m_blacklist; QStringList m_whitelist; QStringList m_newCookiesList; }; Q_DECLARE_METATYPE(FlashCookie); #endif // FLASHCOOKIEMANAGER_H diff --git a/src/plugins/FlashCookieManager/flashcookiemanager.json b/src/plugins/FlashCookieManager/flashcookiemanager.json new file mode 100644 index 00000000..50120cae --- /dev/null +++ b/src/plugins/FlashCookieManager/flashcookiemanager.json @@ -0,0 +1,54 @@ +{ + "Comment": "You can easily view/delete flash cookies stored on your computer. This is a solution for having more privacy.", + "Comment[ca@valencia]": "Podeu veure/eliminar fàcilment les galetes Flash emmagatzemades a l'ordinador. Aquesta és una solució per a tindre més privacitat.", + "Comment[ca]": "Podeu veure/eliminar fàcilment les galetes Flash emmagatzemades a l'ordinador. Aquesta és una solució per a tenir més privacitat.", + "Comment[cs]": "Můžete snadno prohlížet/mazat cookies pro flash uložené na vašem počítači. Toto je řešení pro větší soukromí.", + "Comment[da]": "Du kan let vise/slette flash-cookies som er lagret på din computer. En løsning til mere privatliv.", + "Comment[de]": "Flash-Cookies auf Ihrem Rechner können angezeigt oder gelöscht werden, damit wird Ihre Privatsphäre gesichert.", + "Comment[en_GB]": "You can easily view/delete flash cookies stored on your computer. This is a solution for having more privacy.", + "Comment[es]": "Usted puede ver/borrar fácilmente las cookies de flash guardadas en su equipo. Esta es una solución para disponer de más confidencialidad.", + "Comment[fi]": "Voit helposti tarkastella ja poistaa tietokoneelle tallennettuja Flash-evästeitä. Ratkaisu parantaa yksityisyytesi suojaa.", + "Comment[fr]": "Affichage et suppression facile des cookies stockés sur votre ordinateur. Une solution idéale pour gérer votre confidentialité.", + "Comment[gl]": "Pode ver e eliminar facilmente cookies flash almacenadas no seu computador. Isto é unha solución para ter máis intimidade.", + "Comment[id]": "Kamu bisa menampilkan/menghapus cookies flash yang tersimpan pada komputermu. Ini adalah sebuah solusi untuk membuat lebih privasi.", + "Comment[it]": "Puoi vedere o cancellare in maniera semplice i cookie in flash immagazzinati nel tuo computer. È una soluzione per avere una maggior privacy.", + "Comment[nl]": "U kunt gemakkelijk cookies van flash opgeslagen op uw computer bekijken/verwijderen. Dit is een oplossing om meer privacy te hebben.", + "Comment[nn]": "Du kan visa og sletta lagra Flash-infokapslar. Dette styrkjer personvernet.", + "Comment[pl]": "Możesz łatwo obejrzeć/usunąć ciasteczka Flash przechowywane na twoim komputerze. To rozwiązanie daje ci więcej prywatności.", + "Comment[pt]": "Poderá ver/apagar facilmente os 'cookies' do Flash gravados no seu computador. Esta é uma solução para ter mais privacidade.", + "Comment[pt_BR]": "Você pode facilmente ver/excluir cookies flash armazenados em seu computador. Isto é uma solução para ter mais privacidade.", + "Comment[sk]": "Tu môžete jednoducho prezerať/vymazať flassh cookies uložené na vašom počítači. Toto riešenie poskytuje viac súkromia.", + "Comment[sv]": "Det går enkelt att titta på eller ta bort Flash kakor lagrade på datorn. Det är en lösning på integritetsproblem.", + "Comment[uk]": "Спрощує перегляд і вилучення кук flash, які зберігаються на вашому комп'ютері. Це засіб для поліпшення захисту системи.", + "Comment[x-test]": "xxYou can easily view/delete flash cookies stored on your computer. This is a solution for having more privacy.xx", + "Comment[zh_CN]": "您可以轻松地查看/删除存储在您的计算机上的 Flash cookie。这是一个更注重隐私的解决方案。", + "Icon": "base64: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", + "Name": "Flash Cookie Manager", + "Name[ca@valencia]": "Gestor de les galetes Flash", + "Name[ca]": "Gestor de les galetes Flash", + "Name[cs]": "Správce cookies pro Flash", + "Name[da]": "Håndtering af flash-cookie", + "Name[de]": "Flash-Cookie-Verwaltung", + "Name[en_GB]": "Flash Cookie Manager", + "Name[es]": "Gestor de cookies de Flash", + "Name[fi]": "Flash-evästeiden hallinta", + "Name[fr]": "Gestionnaire de cookies Flash", + "Name[gl]": "Xestor de cookies flash", + "Name[id]": "Flash Cookie Manager", + "Name[it]": "Gestore dei cookie in flash", + "Name[nl]": "Cookiebeheerder van Flash", + "Name[nn]": "Handsamar for Flash-infokapslar", + "Name[pl]": "Zarządzanie ciasteczkami Flash", + "Name[pt]": "Gestor de 'Cookies' do Flash", + "Name[pt_BR]": "Gerenciador de cookies Flash", + "Name[sk]": "Správca pre Flash Cookie", + "Name[sv]": "Flash kakhanterare", + "Name[uk]": "Керування куками Flash", + "Name[x-test]": "xxFlash Cookie Managerxx", + "Name[zh_CN]": "Flash Cookie 管理器", + "Name[zh_TW]": "Flash Cookie 管理員", + "X-Falkon-Author": "Razi Alavizadeh", + "X-Falkon-Email": "s.r.alavizadeh@gmail.com", + "X-Falkon-Settings": "true", + "X-Falkon-Version": "0.3.0" +} diff --git a/src/plugins/FlashCookieManager/flashcookiemanager.qrc b/src/plugins/FlashCookieManager/flashcookiemanager.qrc index 08f939ad..a7a90750 100644 --- a/src/plugins/FlashCookieManager/flashcookiemanager.qrc +++ b/src/plugins/FlashCookieManager/flashcookiemanager.qrc @@ -1,6 +1,5 @@ - metadata.desktop data/flash-cookie-manager.png diff --git a/src/plugins/FlashCookieManager/metadata.desktop b/src/plugins/FlashCookieManager/metadata.desktop deleted file mode 100644 index 1cf50a92..00000000 --- a/src/plugins/FlashCookieManager/metadata.desktop +++ /dev/null @@ -1,56 +0,0 @@ -[Desktop Entry] -Name=Flash Cookie Manager -Name[ca]=Gestor de les galetes Flash -Name[ca@valencia]=Gestor de les galetes Flash -Name[cs]=Správce cookies pro Flash -Name[da]=Håndtering af flash-cookie -Name[de]=Flash-Cookie-Verwaltung -Name[en_GB]=Flash Cookie Manager -Name[es]=Gestor de cookies de Flash -Name[fi]=Flash-evästeiden hallinta -Name[fr]=Gestionnaire de cookies Flash -Name[gl]=Xestor de cookies flash -Name[id]=Flash Cookie Manager -Name[it]=Gestore dei cookie in flash -Name[nl]=Cookiebeheerder van Flash -Name[nn]=Handsamar for Flash-infokapslar -Name[pl]=Zarządzanie ciasteczkami Flash -Name[pt]=Gestor de 'Cookies' do Flash -Name[pt_BR]=Gerenciador de cookies Flash -Name[sk]=Správca pre Flash Cookie -Name[sv]=Flash kakhanterare -Name[uk]=Керування куками Flash -Name[x-test]=xxFlash Cookie Managerxx -Name[zh_CN]=Flash Cookie 管理器 -Name[zh_TW]=Flash Cookie 管理員 -Comment=You can easily view/delete flash cookies stored on your computer. This is a solution for having more privacy. -Comment[ca]=Podeu veure/eliminar fàcilment les galetes Flash emmagatzemades a l'ordinador. Aquesta és una solució per a tenir més privacitat. -Comment[ca@valencia]=Podeu veure/eliminar fàcilment les galetes Flash emmagatzemades a l'ordinador. Aquesta és una solució per a tindre més privacitat. -Comment[cs]=Můžete snadno prohlížet/mazat cookies pro flash uložené na vašem počítači. Toto je řešení pro větší soukromí. -Comment[da]=Du kan let vise/slette flash-cookies som er lagret på din computer. En løsning til mere privatliv. -Comment[de]=Flash-Cookies auf Ihrem Rechner können angezeigt oder gelöscht werden, damit wird Ihre Privatsphäre gesichert. -Comment[en_GB]=You can easily view/delete flash cookies stored on your computer. This is a solution for having more privacy. -Comment[es]=Usted puede ver/borrar fácilmente las cookies de flash guardadas en su equipo. Esta es una solución para disponer de más confidencialidad. -Comment[fi]=Voit helposti tarkastella ja poistaa tietokoneelle tallennettuja Flash-evästeitä. Ratkaisu parantaa yksityisyytesi suojaa. -Comment[fr]=Affichage et suppression facile des cookies stockés sur votre ordinateur. Une solution idéale pour gérer votre confidentialité. -Comment[gl]=Pode ver e eliminar facilmente cookies flash almacenadas no seu computador. Isto é unha solución para ter máis intimidade. -Comment[id]=Kamu bisa menampilkan/menghapus cookies flash yang tersimpan pada komputermu. Ini adalah sebuah solusi untuk membuat lebih privasi. -Comment[it]=Puoi vedere o cancellare in maniera semplice i cookie in flash immagazzinati nel tuo computer. È una soluzione per avere una maggior privacy. -Comment[nl]=U kunt gemakkelijk cookies van flash opgeslagen op uw computer bekijken/verwijderen. Dit is een oplossing om meer privacy te hebben. -Comment[nn]=Du kan visa og sletta lagra Flash-infokapslar. Dette styrkjer personvernet. -Comment[pl]=Możesz łatwo obejrzeć/usunąć ciasteczka Flash przechowywane na twoim komputerze. To rozwiązanie daje ci więcej prywatności. -Comment[pt]=Poderá ver/apagar facilmente os 'cookies' do Flash gravados no seu computador. Esta é uma solução para ter mais privacidade. -Comment[pt_BR]=Você pode facilmente ver/excluir cookies flash armazenados em seu computador. Isto é uma solução para ter mais privacidade. -Comment[sk]=Tu môžete jednoducho prezerať/vymazať flassh cookies uložené na vašom počítači. Toto riešenie poskytuje viac súkromia. -Comment[sv]=Det går enkelt att titta på eller ta bort Flash kakor lagrade på datorn. Det är en lösning på integritetsproblem. -Comment[uk]=Спрощує перегляд і вилучення кук flash, які зберігаються на вашому комп'ютері. Це засіб для поліпшення захисту системи. -Comment[x-test]=xxYou can easily view/delete flash cookies stored on your computer. This is a solution for having more privacy.xx -Comment[zh_CN]=您可以轻松地查看/删除存储在您的计算机上的 Flash cookie。这是一个更注重隐私的解决方案。 - -Icon=:flashcookiemanager/data/flash-cookie-manager.png -Type=Service - -X-Falkon-Author=Razi Alavizadeh -X-Falkon-Email=s.r.alavizadeh@gmail.com -X-Falkon-Version=0.3.0 -X-Falkon-Settings=true diff --git a/src/plugins/GnomeKeyringPasswords/CMakeLists.txt b/src/plugins/GnomeKeyringPasswords/CMakeLists.txt index bc27ee23..269da928 100644 --- a/src/plugins/GnomeKeyringPasswords/CMakeLists.txt +++ b/src/plugins/GnomeKeyringPasswords/CMakeLists.txt @@ -1,18 +1,13 @@ add_definitions(${GNOME_KEYRING_CFLAGS} ${GNOME_KEYRING_CFLAGS_OTHER}) set( GnomeKeyringPasswords_SRCS gnomekeyringplugin.cpp gnomekeyringpasswordbackend.cpp ) ecm_create_qm_loader( GnomeKeyringPasswords_SRCS falkon_gnomekeyringpasswords_qt ) -set( GnomeKeyringPasswords_RSCS - gnomekeyringpasswords.qrc - ) -qt5_add_resources(RSCS ${GnomeKeyringPasswords_RSCS}) - add_library(GnomeKeyringPasswords MODULE ${GnomeKeyringPasswords_SRCS} ${RSCS}) install(TARGETS GnomeKeyringPasswords DESTINATION ${FALKON_INSTALL_PLUGINDIR}) target_link_libraries(GnomeKeyringPasswords PkgConfig::GNOME_KEYRING FalkonPrivate) diff --git a/src/plugins/GnomeKeyringPasswords/data/icon.png b/src/plugins/GnomeKeyringPasswords/data/icon.png deleted file mode 100644 index 88395d45..00000000 Binary files a/src/plugins/GnomeKeyringPasswords/data/icon.png and /dev/null differ diff --git a/src/plugins/GnomeKeyringPasswords/gnomekeyringpasswords.json b/src/plugins/GnomeKeyringPasswords/gnomekeyringpasswords.json new file mode 100644 index 00000000..aaea2993 --- /dev/null +++ b/src/plugins/GnomeKeyringPasswords/gnomekeyringpasswords.json @@ -0,0 +1,54 @@ +{ + "Comment": "Provides support for storing passwords in gnome-keyring", + "Comment[ca@valencia]": "Proporciona suport per emmagatzemar les contrasenyes a l'anell de claus de Gnome", + "Comment[ca]": "Proporciona suport per emmagatzemar les contrasenyes a l'anell de claus de Gnome", + "Comment[cs]": "Poskytuje podporu pro ukládání hesel pomocí gnome-keyring", + "Comment[da]": "Giver understøttelse af lagring af adgangskoder i gnome-nøglring", + "Comment[de]": "Unterstützung für die Speicherung von Passwörtern in gnome-keyring", + "Comment[en_GB]": "Provides support for storing passwords in gnome-keyring", + "Comment[es]": "Implementa el almacenamiento de contraseñas en el anillo de claves de Gnome", + "Comment[fi]": "Tarjoaa tuen salasanojen tallentamiseksi Gnomen avainrenkaaseen", + "Comment[fr]": "Prise en charge de l'enregistrement de mots de passe au sein de gnome-keyring", + "Comment[gl]": "Permite almacenar contrasinais en gnome-keyring", + "Comment[id]": "Menyediakan dukungan untuk menyimpan sandi dalam gnome-keyring", + "Comment[it]": "Fornisce un supporto all'immagazzinamento delle password nel portachiavi di Gnome", + "Comment[nl]": "Biedt ondersteuning voor opslaan van GNOME-sleutelbos wachtwoorden", + "Comment[nn]": "Gjev støtte for lagring av passord i Gnome-nøkkelringen", + "Comment[pl]": "Zapewnia obsługę przechowywania haseł w pęku kluczy gnome", + "Comment[pt]": "Oferece o suporte para gravar as senhas no 'gnome-keyring'", + "Comment[pt_BR]": "Fornece suporte para armazenar senhas no gnome-keyring", + "Comment[sk]": "Poskytuje podporu pre ukladanie hesiel do Gnome kľúčenky", + "Comment[sv]": "Tillhandahåller stöd för att lagra lösenord i Gnome-nyckelring", + "Comment[uk]": "Забезпечує підтримку зберігання паролів у gnome-keyring", + "Comment[x-test]": "xxProvides support for storing passwords in gnome-keyringxx", + "Comment[zh_CN]": "提供在 gnome-keyring 中保存密码的支持", + "Icon": "base64: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", + "Name": "Gnome Keyring Passwords", + "Name[ca@valencia]": "Contrasenyes a l'anell de claus de Gnome", + "Name[ca]": "Contrasenyes a l'anell de claus de Gnome", + "Name[cs]": "Hesla z klíčenky Gnome", + "Name[da]": "Adgangskoder til Gnome-nøglering", + "Name[de]": "Passwörter für Gnome Keyring", + "Name[en_GB]": "Gnome Keyring Passwords", + "Name[es]": "Anillo de contraseñas de Gnome", + "Name[fi]": "Gnomen avainrenkaan salasankaat", + "Name[fr]": "Trousseau de clés de GNOME", + "Name[gl]": "Contrasinais do chaveiro de Gnome", + "Name[id]": "Gnome Keyring Passwords", + "Name[it]": "Portachiavi per le chiavi di Gnome", + "Name[nl]": "GNOME-sleutelbos wachtwoorden", + "Name[nn]": "Passord for Gnome-nøkkelring", + "Name[pl]": "Hasła pęku kluczy Gnome", + "Name[pt]": "Senhas no Porta-Chaves do Gnome", + "Name[pt_BR]": "Senhas do chaveiro do GNOME", + "Name[sk]": "Heslá Gnome kľúčenky", + "Name[sv]": "Gnome-nyckelring lösenord", + "Name[uk]": "Паролі сховища ключів Gnome", + "Name[x-test]": "xxGnome Keyring Passwordsxx", + "Name[zh_CN]": "Gnome 钥匙链密码", + "Name[zh_TW]": "GNOME 鑰匙圈密碼", + "X-Falkon-Author": "David Rosca", + "X-Falkon-Email": "nowrep@gmail.com", + "X-Falkon-Settings": "false", + "X-Falkon-Version": "0.1.0" +} diff --git a/src/plugins/GnomeKeyringPasswords/gnomekeyringpasswords.qrc b/src/plugins/GnomeKeyringPasswords/gnomekeyringpasswords.qrc deleted file mode 100644 index 30337978..00000000 --- a/src/plugins/GnomeKeyringPasswords/gnomekeyringpasswords.qrc +++ /dev/null @@ -1,6 +0,0 @@ - - - metadata.desktop - data/icon.png - - diff --git a/src/plugins/GnomeKeyringPasswords/gnomekeyringplugin.cpp b/src/plugins/GnomeKeyringPasswords/gnomekeyringplugin.cpp index 671b48ff..0e5acb89 100644 --- a/src/plugins/GnomeKeyringPasswords/gnomekeyringplugin.cpp +++ b/src/plugins/GnomeKeyringPasswords/gnomekeyringplugin.cpp @@ -1,58 +1,52 @@ /* ============================================================ * GnomeKeyringPasswords - gnome-keyring support plugin for Falkon * Copyright (C) 2013-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "gnomekeyringplugin.h" #include "gnomekeyringpasswordbackend.h" #include "pluginproxy.h" #include "browserwindow.h" #include "../config.h" #include "mainapplication.h" #include "autofill.h" #include "passwordmanager.h" -#include "desktopfile.h" GnomeKeyringPlugin::GnomeKeyringPlugin() : QObject() , m_backend(0) { } -DesktopFile GnomeKeyringPlugin::metaData() const -{ - return DesktopFile(QSL(":gkp/metadata.desktop")); -} - void GnomeKeyringPlugin::init(InitState state, const QString &settingsPath) { Q_UNUSED(state); Q_UNUSED(settingsPath); m_backend = new GnomeKeyringPasswordBackend; mApp->autoFill()->passwordManager()->registerBackend(QSL("GnomeKeyring"), m_backend); } void GnomeKeyringPlugin::unload() { mApp->autoFill()->passwordManager()->unregisterBackend(m_backend); delete m_backend; } bool GnomeKeyringPlugin::testPlugin() { // Require the version that the plugin was built with return (Qz::VERSION == QLatin1String(FALKON_VERSION)); } diff --git a/src/plugins/GnomeKeyringPasswords/gnomekeyringplugin.h b/src/plugins/GnomeKeyringPasswords/gnomekeyringplugin.h index c8c3486b..9e6dab68 100644 --- a/src/plugins/GnomeKeyringPasswords/gnomekeyringplugin.h +++ b/src/plugins/GnomeKeyringPasswords/gnomekeyringplugin.h @@ -1,45 +1,43 @@ /* ============================================================ * GnomeKeyringPasswords - gnome-keyring support plugin for Falkon * Copyright (C) 2013-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef GNOMEKEYRINGPLUGIN_H #define GNOMEKEYRINGPLUGIN_H #include "plugininterface.h" class GnomeKeyringPasswordBackend; class GnomeKeyringPlugin : public QObject, public PluginInterface { Q_OBJECT Q_INTERFACES(PluginInterface) - Q_PLUGIN_METADATA(IID "Falkon.Browser.plugin.GnomeKeyringPasswords") + Q_PLUGIN_METADATA(IID "Falkon.Browser.plugin.GnomeKeyringPasswords" FILE "gnomekeyringpasswords.json") public: explicit GnomeKeyringPlugin(); - DesktopFile metaData() const override; - void init(InitState state, const QString &settingsPath); void unload(); bool testPlugin(); private: GnomeKeyringPasswordBackend* m_backend; }; #endif // GNOMEKEYRINGPLUGIN_H diff --git a/src/plugins/GnomeKeyringPasswords/metadata.desktop b/src/plugins/GnomeKeyringPasswords/metadata.desktop deleted file mode 100644 index cfb340fb..00000000 --- a/src/plugins/GnomeKeyringPasswords/metadata.desktop +++ /dev/null @@ -1,56 +0,0 @@ -[Desktop Entry] -Name=Gnome Keyring Passwords -Name[ca]=Contrasenyes a l'anell de claus de Gnome -Name[ca@valencia]=Contrasenyes a l'anell de claus de Gnome -Name[cs]=Hesla z klíčenky Gnome -Name[da]=Adgangskoder til Gnome-nøglering -Name[de]=Passwörter für Gnome Keyring -Name[en_GB]=Gnome Keyring Passwords -Name[es]=Anillo de contraseñas de Gnome -Name[fi]=Gnomen avainrenkaan salasankaat -Name[fr]=Trousseau de clés de GNOME -Name[gl]=Contrasinais do chaveiro de Gnome -Name[id]=Gnome Keyring Passwords -Name[it]=Portachiavi per le chiavi di Gnome -Name[nl]=GNOME-sleutelbos wachtwoorden -Name[nn]=Passord for Gnome-nøkkelring -Name[pl]=Hasła pęku kluczy Gnome -Name[pt]=Senhas no Porta-Chaves do Gnome -Name[pt_BR]=Senhas do chaveiro do GNOME -Name[sk]=Heslá Gnome kľúčenky -Name[sv]=Gnome-nyckelring lösenord -Name[uk]=Паролі сховища ключів Gnome -Name[x-test]=xxGnome Keyring Passwordsxx -Name[zh_CN]=Gnome 钥匙链密码 -Name[zh_TW]=GNOME 鑰匙圈密碼 -Comment=Provides support for storing passwords in gnome-keyring -Comment[ca]=Proporciona suport per emmagatzemar les contrasenyes a l'anell de claus de Gnome -Comment[ca@valencia]=Proporciona suport per emmagatzemar les contrasenyes a l'anell de claus de Gnome -Comment[cs]=Poskytuje podporu pro ukládání hesel pomocí gnome-keyring -Comment[da]=Giver understøttelse af lagring af adgangskoder i gnome-nøglring -Comment[de]=Unterstützung für die Speicherung von Passwörtern in gnome-keyring -Comment[en_GB]=Provides support for storing passwords in gnome-keyring -Comment[es]=Implementa el almacenamiento de contraseñas en el anillo de claves de Gnome -Comment[fi]=Tarjoaa tuen salasanojen tallentamiseksi Gnomen avainrenkaaseen -Comment[fr]=Prise en charge de l'enregistrement de mots de passe au sein de gnome-keyring -Comment[gl]=Permite almacenar contrasinais en gnome-keyring -Comment[id]=Menyediakan dukungan untuk menyimpan sandi dalam gnome-keyring -Comment[it]=Fornisce un supporto all'immagazzinamento delle password nel portachiavi di Gnome -Comment[nl]=Biedt ondersteuning voor opslaan van GNOME-sleutelbos wachtwoorden -Comment[nn]=Gjev støtte for lagring av passord i Gnome-nøkkelringen -Comment[pl]=Zapewnia obsługę przechowywania haseł w pęku kluczy gnome -Comment[pt]=Oferece o suporte para gravar as senhas no 'gnome-keyring' -Comment[pt_BR]=Fornece suporte para armazenar senhas no gnome-keyring -Comment[sk]=Poskytuje podporu pre ukladanie hesiel do Gnome kľúčenky -Comment[sv]=Tillhandahåller stöd för att lagra lösenord i Gnome-nyckelring -Comment[uk]=Забезпечує підтримку зберігання паролів у gnome-keyring -Comment[x-test]=xxProvides support for storing passwords in gnome-keyringxx -Comment[zh_CN]=提供在 gnome-keyring 中保存密码的支持 - -Icon=:gkp/data/icon.png -Type=Service - -X-Falkon-Author=David Rosca -X-Falkon-Email=nowrep@gmail.com -X-Falkon-Version=0.1.0 -X-Falkon-Settings=false diff --git a/src/plugins/GreaseMonkey/gm_plugin.cpp b/src/plugins/GreaseMonkey/gm_plugin.cpp index 43379f6c..4ff73f47 100644 --- a/src/plugins/GreaseMonkey/gm_plugin.cpp +++ b/src/plugins/GreaseMonkey/gm_plugin.cpp @@ -1,82 +1,76 @@ /* ============================================================ * GreaseMonkey plugin for Falkon * Copyright (C) 2012-2018 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "gm_plugin.h" #include "gm_manager.h" #include "browserwindow.h" #include "webpage.h" #include "pluginproxy.h" #include "mainapplication.h" #include "tabwidget.h" #include "webtab.h" #include "../config.h" -#include "desktopfile.h" GM_Plugin::GM_Plugin() : QObject() , m_manager(0) { } -DesktopFile GM_Plugin::metaData() const -{ - return DesktopFile(QSL(":gm/metadata.desktop")); -} - void GM_Plugin::init(InitState state, const QString &settingsPath) { m_manager = new GM_Manager(settingsPath, this); connect(mApp->plugins(), &PluginProxy::mainWindowCreated, m_manager, &GM_Manager::mainWindowCreated); connect(mApp->plugins(), &PluginProxy::mainWindowDeleted, m_manager, &GM_Manager::mainWindowDeleted); // Make sure userscripts works also with already created WebPages if (state == LateInitState) { foreach (BrowserWindow *window, mApp->windows()) { m_manager->mainWindowCreated(window); } } } void GM_Plugin::unload() { m_manager->unloadPlugin(); delete m_manager; } bool GM_Plugin::testPlugin() { // Require the version that the plugin was built with return (Qz::VERSION == QLatin1String(FALKON_VERSION)); } void GM_Plugin::showSettings(QWidget* parent) { m_manager->showSettings(parent); } bool GM_Plugin::acceptNavigationRequest(WebPage *page, const QUrl &url, QWebEnginePage::NavigationType type, bool isMainFrame) { Q_UNUSED(page) Q_UNUSED(isMainFrame) if (type == QWebEnginePage::NavigationTypeLinkClicked && url.toString().endsWith(QLatin1String(".user.js"))) { m_manager->downloadScript(url); return false; } return true; } diff --git a/src/plugins/GreaseMonkey/gm_plugin.h b/src/plugins/GreaseMonkey/gm_plugin.h index 5c0c1237..a4c0a2a6 100644 --- a/src/plugins/GreaseMonkey/gm_plugin.h +++ b/src/plugins/GreaseMonkey/gm_plugin.h @@ -1,46 +1,45 @@ /* ============================================================ * GreaseMonkey plugin for Falkon * Copyright (C) 2012-2017 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef GM_PLUGIN_H #define GM_PLUGIN_H #include "plugininterface.h" class WebPage; class GM_Manager; class GM_Plugin : public QObject, public PluginInterface { Q_OBJECT Q_INTERFACES(PluginInterface) - Q_PLUGIN_METADATA(IID "Falkon.Browser.plugin.GreaseMonkey") + Q_PLUGIN_METADATA(IID "Falkon.Browser.plugin.GreaseMonkey" FILE "greasemonkey.json") public: explicit GM_Plugin(); - DesktopFile metaData() const override; void init(InitState state, const QString &settingsPath) override; void unload() override; bool testPlugin() override; void showSettings(QWidget* parent = 0) override; bool acceptNavigationRequest(WebPage *page, const QUrl &url, QWebEnginePage::NavigationType type, bool isMainFrame) override; private: GM_Manager* m_manager; }; #endif // GM_PLUGIN_H diff --git a/src/plugins/GreaseMonkey/greasemonkey.json b/src/plugins/GreaseMonkey/greasemonkey.json new file mode 100644 index 00000000..37132b1f --- /dev/null +++ b/src/plugins/GreaseMonkey/greasemonkey.json @@ -0,0 +1,54 @@ +{ + "Comment": "Provides support for userscripts", + "Comment[ca@valencia]": "Proporciona suport per als scripts d'usuari", + "Comment[ca]": "Proporciona suport per als scripts d'usuari", + "Comment[cs]": "Poskytuje podporu pro uživatelské skripty", + "Comment[da]": "Giver understøttelse af brugerscripts", + "Comment[de]": "Unterstützung für Benutzerskripte", + "Comment[en_GB]": "Provides support for userscripts", + "Comment[es]": "Implementa guiones de usuario", + "Comment[fi]": "Tarjoaa käyttäjäskriptien tuen", + "Comment[fr]": "Prise en charge des scripts utilisateur.", + "Comment[gl]": "Permite scripts de usuario", + "Comment[id]": "Menyediakan dukungan untuk skrip pengguna", + "Comment[it]": "Fornisce un supporto agli script utente", + "Comment[nl]": "Biedt ondersteuning voor scripts van gebruikers", + "Comment[nn]": "Gjev støtte for brukarskript", + "Comment[pl]": "Zapewnia obsługę skryptów użytkownika", + "Comment[pt]": "Oferece o suporte para programas do utilizador", + "Comment[pt_BR]": "Fornece suporte para scripts do usuário", + "Comment[sk]": "Poskytuje podporu pre userscripts", + "Comment[sv]": "Tillhandahåller stöd för användarskript", + "Comment[uk]": "Забезпечує підтримку скриптів користувача", + "Comment[x-test]": "xxProvides support for userscriptsxx", + "Comment[zh_CN]": "为用户脚本提供支持", + "Icon": "base64:PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgo8c3ZnIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIiB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIiBpZD0ic3ZnMiIgdmVyc2lvbj0iMS4xIiBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkxIHIiIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDMyIDMyIiBzb2RpcG9kaTpkb2NuYW1lPSJHcmVhc2Vtb25rZXkyLnN2ZyI+CiAgPG1ldGFkYXRhIGlkPSJtZXRhZGF0YTgiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIi8+CiAgICAgICAgPGRjOnRpdGxlLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGRlZnMgaWQ9ImRlZnM2Ij4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ2MDI2IiBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPgogICAgICA8c3RvcCBpZD0ic3RvcDYwMjgiIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6I2Y0ZTNjMTtzdG9wLW9wYWNpdHk6MCIvPgogICAgICA8c3RvcCBpZD0ic3RvcDYwMzAiIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I2MyOWM0ZjtzdG9wLW9wYWNpdHk6MSIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQ1NzI2IiBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiPgogICAgICA8c3RvcCBpZD0ic3RvcDU3NTQiIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzVlMmYwMDtzdG9wLW9wYWNpdHk6MSIvPgogICAgICA8c3RvcCBpZD0ic3RvcDU3NTYiIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzkxNDkwMDtzdG9wLW9wYWNpdHk6MSIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIGlkPSJsaW5lYXJHcmFkaWVudDU3MTAiPgogICAgICA8c3RvcCBzdHlsZT0ic3RvcC1jb2xvcjojOTk0ZDAwO3N0b3Atb3BhY2l0eToxOyIgb2Zmc2V0PSIwIiBpZD0ic3RvcDU3MTIiLz4KICAgICAgPHN0b3Agc3R5bGU9InN0b3AtY29sb3I6Izk5NGQwMDtzdG9wLW9wYWNpdHk6MDsiIG9mZnNldD0iMSIgaWQ9InN0b3A1NzE0Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgaWQ9ImxpbmVhckdyYWRpZW50NTcwMCI+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiNmNGUzYzE7c3RvcC1vcGFjaXR5OjEiIG9mZnNldD0iMCIgaWQ9InN0b3A1NzAyIi8+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiNlYWNhODg7c3RvcC1vcGFjaXR5OjEiIG9mZnNldD0iMSIgaWQ9InN0b3A1NzA0Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudDU2NzYiIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyI+CiAgICAgIDxzdG9wIGlkPSJzdG9wNTY3OCIgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojNDdhZDI3O3N0b3Atb3BhY2l0eToxIi8+CiAgICAgIDxzdG9wIGlkPSJzdG9wNTY4MCIgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgaWQ9ImxpbmVhckdyYWRpZW50NTY2MiI+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiM0N2FlMjc7c3RvcC1vcGFjaXR5OjEiIG9mZnNldD0iMCIgaWQ9InN0b3A1NjY0Ii8+CiAgICAgIDxzdG9wIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjAiIG9mZnNldD0iMSIgaWQ9InN0b3A1NjY2Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPHJhZGlhbEdyYWRpZW50IGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTY3NiIgaWQ9InJhZGlhbEdyYWRpZW50NTY3MiIgY3g9IjYzLjI4NjY3MSIgY3k9IjIwLjM4NTgyMiIgZng9IjYzLjI4NjY3MSIgZnk9IjIwLjM4NTgyMiIgcj0iMi44MjMxMDc3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuMTQ1MzI4NSwtMS44ODg5NzA3ZS04LDIuNDA3MDc1MmUtOCwyLjczMzc0NjUsLTExMy4wMDczMywtMzYuOTcyODUyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiLz4KICAgIDxyYWRpYWxHcmFkaWVudCBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDU2NjIiIGlkPSJyYWRpYWxHcmFkaWVudDU2NzQiIGN4PSI1NC41ODA0MjUiIGN5PSIyMC4zODU4MjIiIGZ4PSI1NC41ODA0MjUiIGZ5PSIyMC4zODU4MjIiIHI9IjIuODIzMTA3NyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgyLjA3NDY5MzMsMCwwLDIuNTM1ODM5NSwtOTguMzgwMjc2LC0zMi45MzgzNTUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIvPgogICAgPHJhZGlhbEdyYWRpZW50IGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTcwMCIgaWQ9InJhZGlhbEdyYWRpZW50NTcwNiIgY3g9IjYwLjEyNzA3MSIgY3k9IjI0LjgwNDkyIiBmeD0iNjAuMTI3MDcxIiBmeT0iMjQuODA0OTIiIHI9IjEzLjg1NjQ0NSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjAzODI3NDUsMS4wNjE2NTNlLTgsMCwwLjk3NzE4MzY4LC00Mi42MTc0OTYsLTAuMzU3NjYxNTMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIvPgogICAgPHJhZGlhbEdyYWRpZW50IGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTcxMCIgaWQ9InJhZGlhbEdyYWRpZW50NTcxNiIgY3g9IjU5Ljg5OTkyNSIgY3k9IjE0Ljk1MDQ0NSIgZng9IjU5Ljg5OTkyNSIgZnk9IjE0Ljk1MDQ0NSIgcj0iMTYuNTg5ODQ0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDIuOTcyNTYyNSw2Ljc2MDk1NjhlLTgsLTQuODAzOTEwNmUtOCwyLjExMjExNTksLTE1Ny45OTU0OCwtMTkuNTExNDM3KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiLz4KICAgIDxsaW5lYXJHcmFkaWVudCBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDU3MjYiIGlkPSJsaW5lYXJHcmFkaWVudDU3MzIiIHgxPSI0NS41OTk0OTkiIHkxPSIyNi41MjA3NzciIHgyPSI0NC44MDQwMDUiIHkyPSIxMy4xNzQxMzciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC00MC4zMTYxNjIsLTAuOTIzNjE3MzgpIi8+CiAgICA8bGluZWFyR3JhZGllbnQgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIiB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ1NzI2IiBpZD0ibGluZWFyR3JhZGllbnQ1NzQyIiB4MT0iLTczLjcwMjI0IiB5MT0iMjUuNjIwMjA1IiB4Mj0iLTc2LjY3NjY2NiIgeTI9IjE3Ljc0NTIwNSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDAuMzE2MTYyLC0wLjkyMzYxNzM4KSIvPgogICAgPGxpbmVhckdyYWRpZW50IGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NjAyNiIgaWQ9ImxpbmVhckdyYWRpZW50NjAxOCIgeDE9IjE5LjI5MjIyNSIgeTE9IjI4LjYwMjA5NyIgeDI9IjE5LjI5MjIyNSIgeTI9IjM4Ljk0MzUzMSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtMC45MjM2MTczOCkiLz4KICA8L2RlZnM+CiAgPHNvZGlwb2RpOm5hbWVkdmlldyBwYWdlY29sb3I9IiNmZmZmZmYiIGJvcmRlcmNvbG9yPSIjNjY2NjY2IiBib3JkZXJvcGFjaXR5PSIxIiBvYmplY3R0b2xlcmFuY2U9IjEwIiBncmlkdG9sZXJhbmNlPSIxMCIgZ3VpZGV0b2xlcmFuY2U9IjEwIiBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxMDI0IiBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI3MTYiIGlkPSJuYW1lZHZpZXc0IiBzaG93Z3JpZD0iZmFsc2UiIGlua3NjYXBlOm9iamVjdC1wYXRocz0idHJ1ZSIgaW5rc2NhcGU6c25hcC1nbG9iYWw9ImZhbHNlIiBpbmtzY2FwZTpvYmplY3Qtbm9kZXM9InRydWUiIGlua3NjYXBlOnpvb209IjUuNjU2ODU0MyIgaW5rc2NhcGU6Y3g9IjEyLjkzOTM1MSIgaW5rc2NhcGU6Y3k9IjExLjgzMDUxOSIgaW5rc2NhcGU6d2luZG93LXg9IjAiIGlua3NjYXBlOndpbmRvdy15PSIwIiBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIiBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJzdmcyIi8+CiAgPGcgaWQ9Imc2MDUxIiB0cmFuc2Zvcm09Im1hdHJpeCgwLjc0MTIzNjQyLC0wLjA3MzcwMDcyLDAuMDcwMjQxOTEsMC43MDY0NDk5NywtMC4yMjYyMDY5NiwzLjMyOTQzMTMpIj4KICAgIDxlbGxpcHNlIHJ5PSI3LjAyNjg3MzYiIHJ4PSIzLjEzNzc4NjQiIGN5PSIxOS4zMjE1ODciIGN4PSI0LjAwMTcwOSIgaWQ9InBhdGg0MTY0IiBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNsaW5lYXJHcmFkaWVudDU3MzIpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIvPgogICAgPGVsbGlwc2Ugc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiNlYWNiOGI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuNTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIiBpZD0iZWxsaXBzZTQxNjYiIGN4PSI0LjYyNjcwOSIgY3k9IjE5LjMyMTU4NyIgcng9IjIuMzg3Nzg2NCIgcnk9IjUuMzQ3Mjk2MiIvPgogICAgPGVsbGlwc2UgdHJhbnNmb3JtPSJzY2FsZSgtMSwxKSIgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ1NzQyKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC41O3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIGlkPSJlbGxpcHNlNDE2OCIgY3g9Ii0zNS45OTgyOTEiIGN5PSIxOS4zMjE1ODciIHJ4PSIzLjEzNzc4NjQiIHJ5PSI3LjAyNjg3MzYiLz4KICAgIDxlbGxpcHNlIHRyYW5zZm9ybT0ic2NhbGUoLTEsMSkiIHJ5PSI1LjM0NzI5NjIiIHJ4PSIyLjM4Nzc4NjQiIGN5PSIxOS4zMjE1ODciIGN4PSItMzUuMTIzMjkxIiBpZD0iZWxsaXBzZTQxNzAiIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojZWFjYjhiO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIvPgogICAgPHBhdGggc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiM3MDM4MDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuNTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIiBkPSJNIDI4LjE2MjM1NCwtMC40OTk3ODkyNiBDIDIzLjM4ODQ2NCwyLjU2MDgxNzEgMjAuODA1MzUyLDIuMTU2ODI0OCAxMS41ODIyNzYsNy44NzkxMTcgOS45MTI3OTIsOC41NzE0MjIgOC41ODY4Miw5LjQ2MzcxNjYgNi45MjI4ODEsMTEuMjQ1MTkzIGMgLTEuNjYzOTM5LDEuNzgxNDc2IC0yLjM2Myw0LjUwMjU1NyAtMi4zMzI3OTMsNi43Mzc0NCBsIDAuMDc0MjIsNS4zNzUgYyAtMS4zMzM5MzEsMS4wOTY3OTggLTEuNDQxNDQ2LDMuMDc4NjkxIC0xLjQ0MzM2LDUuMjIwNzAzIDAuODcwNzAzLDguMzYzMTQyIDcuMjQ0MzQsMTEuOTEzODY1IDE2LjU5OTYxLDExLjkxMjExIDkuMzU1MjY5LC0wLjAwMTggMTUuNzEwNjMxLC0zLjU2MTAyNSAxNi41ODAwNzgsLTExLjkxMjExIC0wLjAwMTksLTIuMTQyMDEyIC0wLjEwNzQ2OSwtNC4xMjM5MDUgLTEuNDQxNDA2LC01LjIyMDcwMyBsIDAuMDcyMjcsLTUuMzc1IGMgMC4wNDk2MywtMy42NzE2MiAtMS44NTAyMDgsLTguNjU2MjI5NCAtOC41MzkwNjIsLTEwLjY0ODQzNzkgMS4wMjI5MTQsLTIuMjc4NzA4MyAxLjQxMjgxOCwtNS45ODE5ODQ0IDEuNjY5OTE2LC03LjgzMzk4NDM2IHoiIGlkPSJwYXRoNTcyMiIgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NzY2NjY2MiLz4KICAgIDxwYXRoIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2Njc2NjY2NjIiBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiBpZD0icGF0aDQxNTIiIGQ9Ik0gMjguMTYyMzU0LC0wLjQ5OTc4OTI2IEMgMjMuMzg4NDY0LDIuNTYwODE3MSAyMC44MDUzNTIsMi4xNTY4MjQ4IDExLjU4MjI3Niw3Ljg3OTExNyA5LjkxMjc5Miw4LjU3MTQyMiA4LjU4NjgyLDkuNDYzNzE2NiA2LjkyMjg4MSwxMS4yNDUxOTMgYyAtMS42NjM5MzksMS43ODE0NzYgLTIuMzYzLDQuNTAyNTU3IC0yLjMzMjc5Myw2LjczNzQ0IGwgMC4wNzQyMiw1LjM3NSBjIC0xLjMzMzkzMSwxLjA5Njc5OCAtMS40NDE0NDYsMy4wNzg2OTEgLTEuNDQzMzYsNS4yMjA3MDMgMC44NzA3MDMsOC4zNjMxNDIgNy4yNDQzNCwxMS45MjMyMDggMTYuNTk5NjEsMTEuOTIxNDUzIDkuMzU1MjY5LC0wLjAwMTggMTUuNzEwNjMxLC0zLjU3MDM2OCAxNi41ODAwNzgsLTExLjkyMTQ1MyAtMC4wMDE5LC0yLjE0MjAxMiAtMC4xMDc0NjksLTQuMTIzOTA1IC0xLjQ0MTQwNiwtNS4yMjA3MDMgbCAwLjA3MjI3LC01LjM3NSBjIDAuMDQ5NjMsLTMuNjcxNjIgLTEuODUwMjA4LC04LjY1NjIyOTQgLTguNTM5MDYyLC0xMC42NDg0Mzc5IDEuMDIyOTE0LC0yLjI3ODcwODMgMS40MTI4MTgsLTUuOTgxOTg0NCAxLjY2OTkxNiwtNy44MzM5ODQzNiB6IiBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDU3MTYpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIvPgogICAgPHBhdGggc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjY2NjY2NjY2MiIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIGlkPSJwYXRoNDEzOCIgZD0ibSAxMy43MzE4MDUsMTEuNTE3Nzg5IGMgLTQuMTE4NzE2LDAuMDA0NyAtNi42ODU3MDgsMy41MjM5NTQgLTYuNjMyODEyLDcuNDM3NSBsIDAuMDYwNTUsNC40ODgyODIgYyAtMS4xMTQxMTMsMC45MTYwNTcgLTEuNzAzNDc5LDMuODIyMjk4IC0xLjcwNTA3OCw1LjYxMTMyOCAwLjcyNzIyLDYuOTg0OTggNi41NTAyODMsOS4xMjg4ODYgMTQuMzYzODk4LDkuMTI3NDIgNy44MTM2MTUsLTAuMDAxNSAxMy42ODUzMjEsLTIuMTUyNTEgMTQuNDExNDkyLC05LjEyNzQyIC0wLjAwMTYsLTEuNzg5MDMgLTAuNjUzNDYsLTQuNjk1MjcxIC0xLjc2NzU3OCwtNS42MTEzMjggbCAwLjA2MDU1LC00LjQ4ODI4MiBjIDAuMDUyOSwtMy45MTM1NDYgLTIuNTE0MDk3LC03LjQzMjggLTYuNjMyODEyLC03LjQzNzUgLTIuNTA1NDQ5LDIuMjFlLTQgLTQuMDI5MzcsMS4zOTk0NjggLTUuNDU1MDc5LDMuNDA2MjUgLTAuNzIyMzE2LDAuOTA4NjgzIC0wLjYxNTEzMSwwLjkwNTUgLTEuMjQ4MDQ3LDAgLTEuNTAzMDQ3LC0yLjExMjc0MyAtMi45NDk2MjUsLTMuNDA2MDI5IC01LjQ1NTA4NCwtMy40MDYyNSB6IiBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDU3MDYpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIvPgogICAgPHJlY3Qgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiMxZjRkMTE7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuNTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIiBpZD0icmVjdDU2ODIiIHdpZHRoPSI0Ljg0MTk3NTIiIGhlaWdodD0iNy40NTAwNjMyIiB4PSIxMy41OTgyNDgiIHk9IjE3Ljk0NTEwMSIgcnk9IjIuNDIwOTg3NiIvPgogICAgPHBhdGggc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NjIiBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiBpZD0icGF0aDQxNjAiIGQ9Ik0gMjguMTU4NTAxLC0wLjQ5OTI4NjA2IEMgMjUuMjgwODg0LDMuNDUzNjE5MiAyMC43NjQ4NDcsNC42NTc2MDU0IDE5LjAwODQ2NCw4Ljc4ODQwNjMgMjIuMDIzMTk0LDguMTY0NjkyNSAyNC4zMzUwNTUsOC42NDg0NDc2IDI2Ljc4NDk0OSw2Ljc4MjA5NiAyNy44NDQ0NDQsNC4zNTQ5Njg2IDI3LjgyMjcsMS45Mjc4NDEzIDI4LjE1ODUwMSwtMC40OTkyODYwNiBaIiBzdHlsZT0iZmlsbDojNzAzODAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIvPgogICAgPHBhdGggc29kaXBvZGk6bm9kZXR5cGVzPSJjY2MiIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIGlkPSJwYXRoNDE1OCIgZD0iTSAxOC40NjQ3ODksOC45MDY4OTExIEMgMjMuODgxNDEyLDguMDE5ODMxMSAyNi40NzA0OTEsNi44Njk5MDY5IDMyLjQ1OTM2OCw0LjYyMTIwNzMgMjguODc4MjA3LDEyLjc2MDk2NCAyOC4zNjAyMDUsOS4xMzg2MjE2IDE4LjQ2NDc4OSw4LjkwNjg5MTEgWiIgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiM5OTRkMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIi8+CiAgICA8cGF0aCBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2MiIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIGlkPSJwYXRoNDE2MiIgZD0ibSAzMi40NTkzNjgsNC42MjEyMDczIC0zLjk5Mzc1LDQuNTI0ODI1MyBjIDAuNTIzNDk3LC0wLjAyNiAxLjA0Njk5NCwwLjAwMzMgMS41NzA0OTEsLTAuMjYwMTc5NyAxLjEzMjQ3NCwtMS4zNTkyMDI0IDEuNzc0NTY1LC0yLjgxMjc5MDMgMi40MjMyNTksLTQuMjY0NjQ1NiB6IiBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6IzcwMzgwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiLz4KICAgIDxyZWN0IHJ5PSIyLjQyMDk4NzYiIHk9IjE3Ljk0NTEwMSIgeD0iMTMuNTk4MjQ4IiBoZWlnaHQ9IjcuNDUwMDYzMiIgd2lkdGg9IjQuODQxOTc1MiIgaWQ9InJlY3Q0MTc0IiBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDU2NzQpO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIvPgogICAgPHJlY3Qgcnk9IjIuNDIwOTg3NiIgeT0iMTcuOTQ1MTAxIiB4PSIyMS41MDQyNjEiIGhlaWdodD0iNy40NTAwNjMyIiB3aWR0aD0iNC44NDE5NzUyIiBpZD0icmVjdDU2ODQiIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojMWY0ZDExO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIvPgogICAgPHJlY3Qgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQ1NjcyKTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC41O3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIGlkPSJyZWN0NDE3NiIgd2lkdGg9IjQuODQxOTc1MiIgaGVpZ2h0PSI3LjQ1MDA2MzIiIHg9IjIxLjUwNDI2MSIgeT0iMTcuOTQ1MTAxIiByeT0iMi40MjA5ODc2Ii8+CiAgICA8cGF0aCBzb2RpcG9kaTpub2RldHlwZXM9InNzc3NzIiBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiBpZD0icGF0aDU2ODYiIGQ9Im0gMTUuNjM3MjQ5LDIwLjMzMzY1NiBjIC0wLjIxNTIxOSwwLjY3Nzk1OCAtMC4yOTg3NzQsMS4yMzU4ODQgLTAuNjMyMDA4LDEuMTMwMDk5IC0wLjMzMzIzMSwtMC4xMDU3ODcgLTAuNDI4OSwtMC43NDExMzQgLTAuMjEzNjgxLC0xLjQxOTA5IDAuMjE1MjE5LC0wLjY3Nzk1NSAwLjY1OTgyNiwtMS4xNDE3ODkgMC45OTMwNTgsLTEuMDM2MDA2IDAuMzMzMjMzLDAuMTA1Nzg1IDAuMDY3ODIsMC42NDcwNDYgLTAuMTQ3MzY5LDEuMzI0OTk3IHoiIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjU7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIvPgogICAgPHBhdGggc3R5bGU9Im9wYWNpdHk6MTtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ2MDE4KTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC41O3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIGQ9Im0gMTMuNzMxODA1LDExLjUxNzc4OSBjIC00LjExODcxNiwwLjAwNDcgLTYuNjg1NzA4LDMuNTIzOTU0IC02LjYzMjgxMiw3LjQzNzUgbCAwLjA2MDU1LDQuNDg4MjgyIGMgLTEuMTE0MTEzLDAuOTE2MDU3IC0xLjcwMzQ3OSwzLjgyMjI5OCAtMS43MDUwNzgsNS42MTEzMjggMC43MjcyMiw2Ljk4NDk4IDYuNTUwMjgzLDkuMTI4ODg2IDE0LjM2Mzg5OCw5LjEyNzQyIDcuODEzNjE1LC0wLjAwMTUgMTMuNjg1MzIxLC0yLjE1MjUxIDE0LjQxMTQ5MiwtOS4xMjc0MiAtMC4wMDE2LC0xLjc4OTAzIC0wLjY1MzQ2LC00LjY5NTI3MSAtMS43Njc1NzgsLTUuNjExMzI4IGwgMC4wNjA1NSwtNC40ODgyODIgYyAwLjA1MjksLTMuOTEzNTQ2IC0yLjUxNDA5NywtNy40MzI4IC02LjYzMjgxMiwtNy40Mzc1IC0yLjUwNTQ0OSwyLjIxZS00IC00LjAyOTM3LDEuMzk5NDY4IC01LjQ1NTA3OSwzLjQwNjI1IC0wLjcyMjMxNiwwLjkwODY4MyAtMC42MTUxMzEsMC45MDU1IC0xLjI0ODA0NywwIC0xLjUwMzA0NywtMi4xMTI3NDMgLTIuOTQ5NjI1LC0zLjQwNjAyOSAtNS40NTUwODQsLTMuNDA2MjUgeiIgaWQ9InBhdGg2MDE2IiBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjY2NjYyIvPgogICAgPHBhdGggc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjAuNTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIiBkPSJtIDIzLjUxNDU1NiwyMC4zMzM2NTYgYyAtMC4yMTUyMTksMC42Nzc5NTggLTAuMjk4Nzc0LDEuMjM1ODg0IC0wLjYzMjAwOCwxLjEzMDA5OSAtMC4zMzMyMzEsLTAuMTA1Nzg3IC0wLjQyODksLTAuNzQxMTM0IC0wLjIxMzY4MSwtMS40MTkwOSAwLjIxNTIxOCwtMC42Nzc5NTUgMC42NTk4MjUsLTEuMTQxNzg5IDAuOTkzMDU4LC0xLjAzNjAwNiAwLjMzMzIzMywwLjEwNTc4NSAwLjA2NzgyLDAuNjQ3MDQ2IC0wLjE0NzM2OSwxLjMyNDk5NyB6IiBpZD0icGF0aDU2ODkiIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIHNvZGlwb2RpOm5vZGV0eXBlcz0ic3Nzc3MiLz4KICAgIDxwYXRoIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2MiIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIGlkPSJwYXRoNTY5MSIgZD0ibSA5Ljg3NDU1NiwyNy43NTAxMTEgYyAwLDUuNjEzODI1IDIwLjEwODM0OSw1LjU0MTE4MyAyMC4xMDgzNDksLTAuMjY1MTY1IiBzdHlsZT0iZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojNTgwNTA0O3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIvPgogICAgPHBhdGggc3R5bGU9ImZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6I2E4MDkwODtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiIGQ9Im0gOS44NzQ1NTYsMjcuMjUwMTExIGMgMCw1LjYxMzgyNSAyMC4xMDgzNDksNS41NDExODMgMjAuMTA4MzQ5LC0wLjI2NTE2NSIgaWQ9InBhdGg1Njk3IiBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiBzb2RpcG9kaTpub2RldHlwZXM9ImNjIi8+CiAgPC9nPgo8L3N2Zz4=", + "Name": "GreaseMonkey", + "Name[ca@valencia]": "GreaseMonkey", + "Name[ca]": "GreaseMonkey", + "Name[cs]": "GreaseMonkey", + "Name[da]": "GreaseMonkey", + "Name[de]": "GreaseMonkey", + "Name[en_GB]": "GreaseMonkey", + "Name[es]": "GreaseMonkey", + "Name[fi]": "GreaseMonkey", + "Name[fr]": "GreaseMonkey", + "Name[gl]": "GreaseMonkey", + "Name[id]": "GreaseMonkey", + "Name[it]": "GreaseMonkey", + "Name[nl]": "GreaseMonkey", + "Name[nn]": "GreaseMonkey", + "Name[pl]": "GreaseMonkey", + "Name[pt]": "GreaseMonkey", + "Name[pt_BR]": "GreaseMonkey", + "Name[sk]": "GreaseMonkey", + "Name[sv]": "GreaseMonkey", + "Name[uk]": "GreaseMonkey", + "Name[x-test]": "xxGreaseMonkeyxx", + "Name[zh_CN]": "油猴", + "Name[zh_TW]": "GreaseMonkey", + "X-Falkon-Author": "David Rosca", + "X-Falkon-Email": "nowrep@gmail.com", + "X-Falkon-Settings": "true", + "X-Falkon-Version": "0.9.4" +} diff --git a/src/plugins/GreaseMonkey/greasemonkey.qrc b/src/plugins/GreaseMonkey/greasemonkey.qrc index 5ff8fab5..38ebd468 100644 --- a/src/plugins/GreaseMonkey/greasemonkey.qrc +++ b/src/plugins/GreaseMonkey/greasemonkey.qrc @@ -1,8 +1,7 @@ - metadata.desktop data/bootstrap.min.js data/values.min.js data/icon.svg diff --git a/src/plugins/GreaseMonkey/metadata.desktop b/src/plugins/GreaseMonkey/metadata.desktop deleted file mode 100644 index 6bc98545..00000000 --- a/src/plugins/GreaseMonkey/metadata.desktop +++ /dev/null @@ -1,56 +0,0 @@ -[Desktop Entry] -Name=GreaseMonkey -Name[ca]=GreaseMonkey -Name[ca@valencia]=GreaseMonkey -Name[cs]=GreaseMonkey -Name[da]=GreaseMonkey -Name[de]=GreaseMonkey -Name[en_GB]=GreaseMonkey -Name[es]=GreaseMonkey -Name[fi]=GreaseMonkey -Name[fr]=GreaseMonkey -Name[gl]=GreaseMonkey -Name[id]=GreaseMonkey -Name[it]=GreaseMonkey -Name[nl]=GreaseMonkey -Name[nn]=GreaseMonkey -Name[pl]=GreaseMonkey -Name[pt]=GreaseMonkey -Name[pt_BR]=GreaseMonkey -Name[sk]=GreaseMonkey -Name[sv]=GreaseMonkey -Name[uk]=GreaseMonkey -Name[x-test]=xxGreaseMonkeyxx -Name[zh_CN]=油猴 -Name[zh_TW]=GreaseMonkey -Comment=Provides support for userscripts -Comment[ca]=Proporciona suport per als scripts d'usuari -Comment[ca@valencia]=Proporciona suport per als scripts d'usuari -Comment[cs]=Poskytuje podporu pro uživatelské skripty -Comment[da]=Giver understøttelse af brugerscripts -Comment[de]=Unterstützung für Benutzerskripte -Comment[en_GB]=Provides support for userscripts -Comment[es]=Implementa guiones de usuario -Comment[fi]=Tarjoaa käyttäjäskriptien tuen -Comment[fr]=Prise en charge des scripts utilisateur. -Comment[gl]=Permite scripts de usuario -Comment[id]=Menyediakan dukungan untuk skrip pengguna -Comment[it]=Fornisce un supporto agli script utente -Comment[nl]=Biedt ondersteuning voor scripts van gebruikers -Comment[nn]=Gjev støtte for brukarskript -Comment[pl]=Zapewnia obsługę skryptów użytkownika -Comment[pt]=Oferece o suporte para programas do utilizador -Comment[pt_BR]=Fornece suporte para scripts do usuário -Comment[sk]=Poskytuje podporu pre userscripts -Comment[sv]=Tillhandahåller stöd för användarskript -Comment[uk]=Забезпечує підтримку скриптів користувача -Comment[x-test]=xxProvides support for userscriptsxx -Comment[zh_CN]=为用户脚本提供支持 - -Icon=:gm/data/icon.svg -Type=Service - -X-Falkon-Author=David Rosca -X-Falkon-Email=nowrep@gmail.com -X-Falkon-Version=0.9.4 -X-Falkon-Settings=true diff --git a/src/plugins/KDEFrameworksIntegration/kdeframeworksintegration.json b/src/plugins/KDEFrameworksIntegration/kdeframeworksintegration.json new file mode 100644 index 00000000..c8a7641f --- /dev/null +++ b/src/plugins/KDEFrameworksIntegration/kdeframeworksintegration.json @@ -0,0 +1,54 @@ +{ + "Comment": "Provides support for KIO and storing passwords in KWallet", + "Comment[ca@valencia]": "Proporciona suport pel KIO i per emmagatzemar les contrasenyes al KWallet", + "Comment[ca]": "Proporciona suport pel KIO i per emmagatzemar les contrasenyes al KWallet", + "Comment[cs]": "Poskytuje podporu pro KIO a ukládání hesel v Kwallet", + "Comment[da]": "Giver understøttelse af KIO og lagring af adgangskoder i KWallet", + "Comment[de]": "Unterstützung für KIO und die Speicherung von Passwörtern in KWallet", + "Comment[en_GB]": "Provides support for KIO and storing passwords in KWallet", + "Comment[es]": "Implementa KIO y almacenamiento de contraseñas en KWallet", + "Comment[fi]": "Tarjoaa KIO-tuen sekä salasanojen tallentamisen KWalletiin", + "Comment[fr]": "Prise en charge de KIO et de l'enregistrement de mots de passe dans KWallet", + "Comment[gl]": "Fornece compatibilidade con KIO e permite almacenar contrasinais en KWallet", + "Comment[id]": "Menyediakan dukungan untuk KIO dan menyimpan sandi dalam KWallet", + "Comment[it]": "Fornisce un supporto per KIO e per l'immagazzinamento delle password in KWallet", + "Comment[nl]": "Biedt ondersteuning voor KIO en opslaan van wachtwoorden in KWallet", + "Comment[nn]": "Gjev støtte for KIO og lagring av passord i KWallet", + "Comment[pl]": "Zapewnia obsługę KIO i przechowywania haseł w KPortfelu", + "Comment[pt]": "Oferece o suporte para o KIO e para guardar as senhas no KWallet", + "Comment[pt_BR]": "Fornece suporte ao KIO e armazenamento de senhas no KWallet", + "Comment[sk]": "Poskytuje podporu pre KIO a ukladanie hesiel do KWalletu", + "Comment[sv]": "Tillhandahåller stöd KIO och för att lagra lösenord i plånboken", + "Comment[uk]": "Забезпечує підтримку засобів введення-виведення KIO і зберігання паролів у KWallet", + "Comment[x-test]": "xxProvides support for KIO and storing passwords in KWalletxx", + "Comment[zh_CN]": "提供在 KWallet 中保存密码以及 KIO 的支持", + "Icon": "base64:PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCiAgIHdpZHRoPSI0OCIKICAgaGVpZ2h0PSI0OCIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0ic3ZnMiIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC45MSByMTM3MjUiCiAgIHNvZGlwb2RpOmRvY25hbWU9ImtkZWFwcC5zdmciPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQ5Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEiCiAgICAgb2JqZWN0dG9sZXJhbmNlPSIxMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMCIKICAgICBndWlkZXRvbGVyYW5jZT0iMTAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEzNjAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iNzE3IgogICAgIGlkPSJuYW1lZHZpZXc0NyIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6em9vbT0iNC45MTY2NjY3IgogICAgIGlua3NjYXBlOmN4PSIyNCIKICAgICBpbmtzY2FwZTpjeT0iMjQiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjI2IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMiIgLz4KICA8ZGVmcwogICAgIGlkPSJkZWZzNCI+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQyNTIiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDciIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wOSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQyNTIiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MjYwIgogICAgICAgeDE9IjE3IgogICAgICAgeTE9IjEwIgogICAgICAgeDI9IjM1Ljk0MiIKICAgICAgIHkyPSIyOC45NDIiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEsMSkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJjLTUiCiAgICAgICB5MT0iLS44ODMiCiAgICAgICB4MT0iLTQxLjI2IgogICAgICAgeTI9IjM3Ljk1NiIKICAgICAgIHgyPSItMi45OTQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMS4wNDU0NDIxLDAsMCwxLjAyOTg4NDIsNDYuMDc2ODQzLDMuODU2ODQyKSI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0b3AtY29sb3I9IiMyMWM5ZmIiCiAgICAgICAgIGlkPSJzdG9wMTMiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgc3RvcC1jb2xvcj0iIzFhODZmMiIKICAgICAgICAgaWQ9InN0b3AxNSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQyNTIiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MjI1IgogICAgICAgeDE9IjMxLjAyMSIKICAgICAgIHkxPSItOS44OTYiCiAgICAgICB4Mj0iNDMuMTA0IgogICAgICAgeTI9Ii05Ljg5NiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjcwNzEwNjc4LDAuNzA3MTA2NzgsLTAuNzA3MTA2NzgsMC43MDcxMDY3OCwwLDApIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0MjUyIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDIzNiIKICAgICAgIHgxPSIyMy43MTYiCiAgICAgICB5MT0iMTMuMjE5IgogICAgICAgeDI9IjI2LjM0OCIKICAgICAgIHkyPSIxNS44NTEiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz4KICA8L2RlZnM+CiAgPHBhdGgKICAgICBzdHlsZT0iZmlsbDp1cmwoI2MtNSk7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVqb2luOmJldmVsIgogICAgIGQ9Ik0gOS40NjEwNTI4LDQgQyA2LjQzNTc4OTYsNCA0LjA5MTU3OTEsNi40MDEwNTMgNC4wMDAwMDAxLDkuMzggbCAwLDI5LjM1Njg0MiBDIDQuMDAwMDAwMSw0MS42NTI2MzEgNi4zODMxNTgsNDQgOS4zNDMxNTc2LDQ0IEwgMzguNTM4OTQ4LDQ0IEMgNDEuNTY0MjExLDQ0IDQ0LDQxLjYgNDQsMzguNjIgTCA0NCw5LjI2MzE1OCBDIDQ0LDYuMzQ3MzY5IDQxLjYxNjg0Myw0IDM4LjY1Njg0Myw0IFoiCiAgICAgaWQ9InBhdGgxOSIgLz4KICA8cGF0aAogICAgIHN0eWxlPSJvcGFjaXR5OjAuMjtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ0MjYwKTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICBkPSJtIDIyLjE2MjEwOSwxOC43MjY1NjIgLTIuMTkzMzU5LC0yLjE5MzM1OSAtMi4zMDQ2ODgsMS40NTUwNzggLTAuODY3MTg3LDEuOTkyMTg4IC02Ljc1LDYuNzUgNC42MDc0MjIsNC42MDc0MjIgLTEuOTY0ODQ0LDEuNzQ4MDQ3IEwgMjIuNjAzNTE2LDQzIDM2LjgxMjUsNDMgQyAzOS42ODY1NjUsNDMgNDIsNDAuNzE5Njc5IDQyLDM3Ljg4ODY3MiAzMy41MDM3MTYsMjcuNDA2NTkxIDI0LDE2IDIyLjE2MjEwOSwxOC43MjY1NjIgWiIKICAgICBpZD0icGF0aDM1IiAvPgogIDxwYXRoCiAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWpvaW46YmV2ZWw7ZmlsbC1vcGFjaXR5OjE7b3BhY2l0eTowLjE1IgogICAgIGQ9Ik0gNDQgMzcuNjE5MTQxIEMgNDQgNDAuNTk5MTQxIDQxLjU2NDMyNiA0MyAzOC41MzkwNjIgNDMgTCA5LjM0Mzc1IDQzIEMgNi4zODM3NTA0IDQzIDQgNDAuNjUyMTE3IDQgMzcuNzM2MzI4IEwgNCAzOC43MzYzMjggQyA0IDQxLjY1MjExNyA2LjM4Mzc1MDQgNDQgOS4zNDM3NSA0NCBMIDM4LjUzOTA2MiA0NCBDIDQxLjU2NDMyNiA0NCA0NCA0MS41OTkxNDEgNDQgMzguNjE5MTQxIEwgNDQgMzcuNjE5MTQxIHoiCiAgICAgaWQ9InBhdGgzNyIgLz4KICA8cGF0aAogICAgIHN0eWxlPSJvcGFjaXR5OjAuMjtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ0MjI1KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6NDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgIGQ9Ik0gMzYuOTcwNzAzIDEwLjk4ODI4MSBMIDMyLjYwMTU2MiAxMi4xNjYwMTYgTCAyOC4wODIwMzEgMjEuNjY2MDE2IEwgMzIgMjkuOTk0MTQxIEwgNDMuMjg1MTU2IDQxLjI3OTI5NyBDIDQzLjczNzQzNiA0MC40OTUwOTcgNDQgMzkuNTg4OTEgNDQgMzguNjE5MTQxIEwgNDQgMTguMDE3NTc4IEwgMzYuOTcwNzAzIDEwLjk4ODI4MSB6IgogICAgIGlkPSJwYXRoMzkiIC8+CiAgPHBhdGgKICAgICBkPSJtIDI2LjAwMDgwNCw5Ljk5NTM5MTggNC41MzEzMTQsNC41MzEzMTQyIC0zLjE0MjI1NCw2LjY1NTMyNiAtNi4yODc4NSwtNi4yODc4NSB6IgogICAgIHN0eWxlPSJvcGFjaXR5OjAuMjtmaWxsOnVybCgjbGluZWFyR3JhZGllbnQ0MjM2KTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6NDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxIgogICAgIGlkPSJwYXRoNDEiIC8+CiAgPHBhdGgKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICBkPSJtIDE1LjIwODk4NCwxNC42MTcxODggYyAtMC4xMjMwNjIsLTAuMDA1OSAtMC4yNDE5MDksMC4wMzA5NyAtMC4zMzk4NDMsMC4xMjg5MDYgbCAtMi4xMjMwNDcsMi4xMjMwNDcgYyAtMC4xOTU4NjksMC4xOTU4NjkgLTAuMTk1ODY5LDAuNTExMTYyIDAsMC43MDcwMzEgbCAyLjE5MzM1OSwzLjQ0NTMxMiBjIC0wLjE3NTU0OSwwLjM1NDE5MyAtMC4zMjc1NzEsMC43MTk1NjggLTAuNDU1MDc4LDEuMDkzNzUgTCAxMC41LDIzIEMgMTAuMjIzLDIzIDEwLDIzLjIyMyAxMCwyMy41IGwgMCwzIGMgMCwwLjI3NyAwLjIyOTU5NiwwLjQzOTkxIDAuNSwwLjUgbCAzLjk4NjMyOCwwLjg4NjcxOSBjIDAuMTIzNDYsMC4zNzA1MjMgMC4yNzA5MDcsMC43MzI2MTYgMC40NDE0MDYsMS4wODM5ODQgbCAtMi4xOTcyNjUsMy40NTMxMjUgYyAtMC4xNDg3MTUsMC4yMzM2OTUgLTAuMTk1ODY5LDAuNTExMTYyIDAsMC43MDcwMzEgbCAyLjEyMTA5MywyLjEyMzA0NyBjIDAuMTk1ODcsMC4xOTU4NjkgMC41MTExNjMsMC4xOTU4NjkgMC43MDcwMzIsMCBsIDMuNDUzMTI1LC0yLjE5OTIxOCBjIDAuMzU3MjEyLDAuMTc3OTQyIDAuNzI1ODY0LDAuMzMxOTI3IDEuMTAzNTE1LDAuNDYwOTM3IEwgMjEsMzcuNSBjIDAsMC4yNzcgMC4yMjMsMC41IDAuNSwwLjUgbCAzLDAgYyAwLjI3NywwIDAuNDM5OTEsLTAuMjI5NTk2IDAuNSwtMC41IGwgMC44ODY3MTksLTMuOTg2MzI4IGMgMC4zNzYwMjksLTAuMTI1MzYyIDAuNzQzMzY1LC0wLjI3NTQyOCAxLjA5OTYwOSwtMC40NDkyMTkgbCAzLjQzNzUsMi4xODk0NTMgYyAwLjE5NTg2OSwwLjE5NTg2OSAwLjUxMTE2MiwwLjE5NTg2OSAwLjcwNzAzMSwwIGwgMi4xMjMwNDcsLTIuMTIzMDQ3IGMgMC4xOTU4NjksLTAuMTk1ODY5IDAuMTQ4NzE1LC0wLjQ3MzMzNiAwLC0wLjcwNzAzMSBsIC0wLjkzNzUsLTEuNDcyNjU2IC0wLjY5OTIxOCwwLjI3OTI5NyAtMi4yNDAyMzUsLTMuMzU5Mzc1IEMgMjguMjQ3OTc0LDMwLjM4MTQ3MyAyNS43NTI1NjEsMzEuOTk3MTg2IDIzLDMyIGMgLTMuODY1OTkzLDAgLTcsLTMuMTM0MDA3IC03LC03IDAuMDAzMSwtMi43MDA4MjcgMS41NTk3NzksLTUuMTU4OTEgNCwtNi4zMTY0MDYgbCAwLC0yLjE1MjM0NCBjIC0wLjMzNjQ3NSwwLjExNTE2IC0wLjY2NTgyOSwwLjI1MDE2MiAtMC45ODYzMjgsMC40MDQyOTcgbCAtMy40Mzc1LC0yLjE4OTQ1MyBjIC0wLjExNjg0OCwtMC4wNzQzNiAtMC4yNDQxMjUsLTAuMTIzMDEyIC0wLjM2NzE4OCwtMC4xMjg5MDYgeiIKICAgICBpZD0icGF0aDQzIiAvPgogIDxwYXRoCiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgZD0iTSAyNiwxMCAyMSwxMC40NjI4OTEgMjEsMzAgbCA1LC0xIDAsLTggNiw5IDUsLTIgTCAzMC41LDE5LjU4NTkzOCAzNy4wMDM5MDYsMTEgMzEuNzY3NTc4LDEwIDI2LDE4LjUgWiIKICAgICBpZD0icGF0aDQ1IiAvPgo8L3N2Zz4K", + "Name": "KDE Frameworks Integration", + "Name[ca@valencia]": "Integració amb els Frameworks del KDE", + "Name[ca]": "Integració amb els Frameworks del KDE", + "Name[cs]": "Integrace KDE Frameworks", + "Name[da]": "KDE Frameworks integration", + "Name[de]": "KDE-Frameworks-Integration", + "Name[en_GB]": "KDE Frameworks Integration", + "Name[es]": "Integración con la infraestructura de KDE", + "Name[fi]": "KDE Frameworks -integrointi", + "Name[fr]": "Intégration à KDE Frameworks", + "Name[gl]": "Integración coas infraestruturas de KDE", + "Name[id]": "KDE Frameworks Integration", + "Name[it]": "Integrazione con KDE Frameworks", + "Name[nl]": "KDE Frameworks integratie", + "Name[nn]": "Integrering med KDE Frameworks", + "Name[pl]": "Integracja ze Szkieletami KDE", + "Name[pt]": "Integração com as Plataformas do KDE", + "Name[pt_BR]": "Integração com o KDE Frameworks", + "Name[sk]": "KDE Frameworks Integrácia", + "Name[sv]": "Integration med KDE Ramverk", + "Name[uk]": "Інтерграція із KDE Frameworks", + "Name[x-test]": "xxKDE Frameworks Integrationxx", + "Name[zh_CN]": "KDE 框架集成", + "Name[zh_TW]": "KDE Frameworks 整合", + "X-Falkon-Author": "David Rosca", + "X-Falkon-Email": "nowrep@gmail.com", + "X-Falkon-Settings": "false", + "X-Falkon-Version": "0.3.0" +} diff --git a/src/plugins/KDEFrameworksIntegration/kdeframeworksintegration.qrc b/src/plugins/KDEFrameworksIntegration/kdeframeworksintegration.qrc index b021aa21..dbab4166 100644 --- a/src/plugins/KDEFrameworksIntegration/kdeframeworksintegration.qrc +++ b/src/plugins/KDEFrameworksIntegration/kdeframeworksintegration.qrc @@ -1,6 +1,5 @@ - metadata.desktop data/icon.svg diff --git a/src/plugins/KDEFrameworksIntegration/kdeframeworksintegrationplugin.cpp b/src/plugins/KDEFrameworksIntegration/kdeframeworksintegrationplugin.cpp index d05b41cb..87587d21 100644 --- a/src/plugins/KDEFrameworksIntegration/kdeframeworksintegrationplugin.cpp +++ b/src/plugins/KDEFrameworksIntegration/kdeframeworksintegrationplugin.cpp @@ -1,117 +1,111 @@ /* ============================================================ * KDEFrameworksIntegration - KDE support plugin for Falkon * Copyright (C) 2013-2018 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "kdeframeworksintegrationplugin.h" #include "kwalletpasswordbackend.h" #include "pluginproxy.h" #include "browserwindow.h" #include "../config.h" #include "mainapplication.h" #include "autofill.h" #include "passwordmanager.h" -#include "desktopfile.h" #include "kioschemehandler.h" #include "webpage.h" #include "webview.h" #include #include #include #include #include #include #include KDEFrameworksIntegrationPlugin::KDEFrameworksIntegrationPlugin() : QObject() { } -DesktopFile KDEFrameworksIntegrationPlugin::metaData() const -{ - return DesktopFile(QSL(":kdeframeworksintegration/metadata.desktop")); -} - void KDEFrameworksIntegrationPlugin::init(InitState state, const QString &settingsPath) { Q_UNUSED(state); Q_UNUSED(settingsPath); m_backend = new KWalletPasswordBackend; mApp->autoFill()->passwordManager()->registerBackend(QSL("KWallet"), m_backend); // Enable KWallet password backend inside KDE session if (qgetenv("KDE_FULL_SESSION") == QByteArray("true")) { mApp->autoFill()->passwordManager()->switchBackend(QSL("KWallet")); } const auto protocols = KProtocolInfo::protocols(); for (const QString &protocol : protocols) { if (WebPage::internalSchemes().contains(protocol)) { continue; } KIOSchemeHandler *handler = new KIOSchemeHandler(protocol, this); m_kioSchemeHandlers.append(handler); mApp->webProfile()->installUrlSchemeHandler(protocol.toUtf8(), handler); WebPage::addSupportedScheme(protocol); } m_sharePageMenu = new Purpose::Menu(); m_sharePageMenu->setTitle(tr("Share page")); m_sharePageMenu->setIcon(QIcon::fromTheme(QStringLiteral("document-share"))); m_sharePageMenu->model()->setPluginType(QStringLiteral("ShareUrl")); KAboutData aboutData(QSL("falkon"), QSL("Falkon"), QCoreApplication::applicationVersion()); KAboutData::setApplicationData(aboutData); KCrash::initialize(); KCrash::setFlags(KCrash::KeepFDs); } void KDEFrameworksIntegrationPlugin::unload() { mApp->autoFill()->passwordManager()->unregisterBackend(m_backend); delete m_backend; delete m_sharePageMenu; for (KIOSchemeHandler *handler : qAsConst(m_kioSchemeHandlers)) { mApp->webProfile()->removeUrlSchemeHandler(handler); WebPage::removeSupportedScheme(handler->protocol()); delete handler; } m_kioSchemeHandlers.clear(); } void KDEFrameworksIntegrationPlugin::populateWebViewMenu(QMenu *menu, WebView *view, const WebHitTestResult &r) { Q_UNUSED(r) m_sharePageMenu->model()->setInputData(QJsonObject{ { QStringLiteral("urls"), QJsonValue(view->url().toString()) }, { QStringLiteral("title"), QJsonValue(view->title()) } }); m_sharePageMenu->reload(); menu->addAction(m_sharePageMenu->menuAction()); } bool KDEFrameworksIntegrationPlugin::testPlugin() { // Require the version that the plugin was built with return (Qz::VERSION == QLatin1String(FALKON_VERSION)); } diff --git a/src/plugins/KDEFrameworksIntegration/kdeframeworksintegrationplugin.h b/src/plugins/KDEFrameworksIntegration/kdeframeworksintegrationplugin.h index d09038b5..c9a66775 100644 --- a/src/plugins/KDEFrameworksIntegration/kdeframeworksintegrationplugin.h +++ b/src/plugins/KDEFrameworksIntegration/kdeframeworksintegrationplugin.h @@ -1,46 +1,45 @@ /* ============================================================ * KDEFrameworksIntegration - KDE support plugin for Falkon * Copyright (C) 2013-2018 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #pragma once #include "plugininterface.h" #include class KWalletPasswordBackend; class KIOSchemeHandler; class KDEFrameworksIntegrationPlugin : public QObject, public PluginInterface { Q_OBJECT Q_INTERFACES(PluginInterface) - Q_PLUGIN_METADATA(IID "Falkon.Browser.plugin.KDEFrameworksIntegration") + Q_PLUGIN_METADATA(IID "Falkon.Browser.plugin.KDEFrameworksIntegration" FILE "kdeframeworksintegration.json") public: explicit KDEFrameworksIntegrationPlugin(); - DesktopFile metaData() const override; void init(InitState state, const QString &settingsPath) override; void unload() override; bool testPlugin() override; void populateWebViewMenu(QMenu *menu, WebView *view, const WebHitTestResult &r) override; private: KWalletPasswordBackend *m_backend = nullptr; QVector m_kioSchemeHandlers; Purpose::Menu *m_sharePageMenu = nullptr; }; diff --git a/src/plugins/KDEFrameworksIntegration/metadata.desktop b/src/plugins/KDEFrameworksIntegration/metadata.desktop deleted file mode 100644 index 644ff8a1..00000000 --- a/src/plugins/KDEFrameworksIntegration/metadata.desktop +++ /dev/null @@ -1,56 +0,0 @@ -[Desktop Entry] -Name=KDE Frameworks Integration -Name[ca]=Integració amb els Frameworks del KDE -Name[ca@valencia]=Integració amb els Frameworks del KDE -Name[cs]=Integrace KDE Frameworks -Name[da]=KDE Frameworks integration -Name[de]=KDE-Frameworks-Integration -Name[en_GB]=KDE Frameworks Integration -Name[es]=Integración con la infraestructura de KDE -Name[fi]=KDE Frameworks -integrointi -Name[fr]=Intégration à KDE Frameworks -Name[gl]=Integración coas infraestruturas de KDE -Name[id]=KDE Frameworks Integration -Name[it]=Integrazione con KDE Frameworks -Name[nl]=KDE Frameworks integratie -Name[nn]=Integrering med KDE Frameworks -Name[pl]=Integracja ze Szkieletami KDE -Name[pt]=Integração com as Plataformas do KDE -Name[pt_BR]=Integração com o KDE Frameworks -Name[sk]=KDE Frameworks Integrácia -Name[sv]=Integration med KDE Ramverk -Name[uk]=Інтерграція із KDE Frameworks -Name[x-test]=xxKDE Frameworks Integrationxx -Name[zh_CN]=KDE 框架集成 -Name[zh_TW]=KDE Frameworks 整合 -Comment=Provides support for KIO and storing passwords in KWallet -Comment[ca]=Proporciona suport pel KIO i per emmagatzemar les contrasenyes al KWallet -Comment[ca@valencia]=Proporciona suport pel KIO i per emmagatzemar les contrasenyes al KWallet -Comment[cs]=Poskytuje podporu pro KIO a ukládání hesel v Kwallet -Comment[da]=Giver understøttelse af KIO og lagring af adgangskoder i KWallet -Comment[de]=Unterstützung für KIO und die Speicherung von Passwörtern in KWallet -Comment[en_GB]=Provides support for KIO and storing passwords in KWallet -Comment[es]=Implementa KIO y almacenamiento de contraseñas en KWallet -Comment[fi]=Tarjoaa KIO-tuen sekä salasanojen tallentamisen KWalletiin -Comment[fr]=Prise en charge de KIO et de l'enregistrement de mots de passe dans KWallet -Comment[gl]=Fornece compatibilidade con KIO e permite almacenar contrasinais en KWallet -Comment[id]=Menyediakan dukungan untuk KIO dan menyimpan sandi dalam KWallet -Comment[it]=Fornisce un supporto per KIO e per l'immagazzinamento delle password in KWallet -Comment[nl]=Biedt ondersteuning voor KIO en opslaan van wachtwoorden in KWallet -Comment[nn]=Gjev støtte for KIO og lagring av passord i KWallet -Comment[pl]=Zapewnia obsługę KIO i przechowywania haseł w KPortfelu -Comment[pt]=Oferece o suporte para o KIO e para guardar as senhas no KWallet -Comment[pt_BR]=Fornece suporte ao KIO e armazenamento de senhas no KWallet -Comment[sk]=Poskytuje podporu pre KIO a ukladanie hesiel do KWalletu -Comment[sv]=Tillhandahåller stöd KIO och för att lagra lösenord i plånboken -Comment[uk]=Забезпечує підтримку засобів введення-виведення KIO і зберігання паролів у KWallet -Comment[x-test]=xxProvides support for KIO and storing passwords in KWalletxx -Comment[zh_CN]=提供在 KWallet 中保存密码以及 KIO 的支持 - -Icon=:kdeframeworksintegration/data/icon.svg -Type=Service - -X-Falkon-Author=David Rosca -X-Falkon-Email=nowrep@gmail.com -X-Falkon-Version=0.3.0 -X-Falkon-Settings=false diff --git a/src/plugins/MouseGestures/metadata.desktop b/src/plugins/MouseGestures/metadata.desktop deleted file mode 100644 index 05677bd0..00000000 --- a/src/plugins/MouseGestures/metadata.desktop +++ /dev/null @@ -1,56 +0,0 @@ -[Desktop Entry] -Name=Mouse Gestures -Name[ca]=Gestos del ratolí -Name[ca@valencia]=Gestos del ratolí -Name[cs]=Gesta myší -Name[da]=Musebevægelser -Name[de]=Mausgesten -Name[en_GB]=Mouse Gestures -Name[es]=Gestos de ratón -Name[fi]=Hiirieleet -Name[fr]=Mouvements de souris -Name[gl]=Xestos do rato -Name[id]=Gestur Mouse -Name[it]=Gesti del mouse -Name[nl]=Muisgebaren -Name[nn]=Muserørsler -Name[pl]=Gesty myszy -Name[pt]=Gestos do Rato -Name[pt_BR]=Gestos do mouse -Name[sk]=Gestá myši -Name[sv]=Musgester -Name[uk]=Керування мишею -Name[x-test]=xxMouse Gesturesxx -Name[zh_CN]=鼠标手势 -Name[zh_TW]=滑鼠手勢 -Comment=Provides support for navigating in webpages by mouse gestures -Comment[ca]=Proporciona suport per a navegar per les pàgines web amb els gestos del ratolí -Comment[ca@valencia]=Proporciona suport per a navegar per les pàgines web amb els gestos del ratolí -Comment[cs]=Poskytuje podporu pro procházení webových stránek pomocí gest myší -Comment[da]=Giver understøttelse af navigering på websider med musebevægelser -Comment[de]=Unterstützung für die Navigation auf Webseiten durch Mausgesten -Comment[en_GB]=Provides support for navigating in webpages by mouse gestures -Comment[es]=Implementa la navegación en páginas web mediante gestos de ratón -Comment[fi]=Tarjoaa tuen verkkosivujen selaamiseksi hiirielein -Comment[fr]=Prise en charge de la navigation Internet à l'aide de mouvements de la souris -Comment[gl]=Permite navegar por páxinas web con acenos co rato -Comment[id]=Menyediakan dukungan untuk menavigasi dalam halaman web dengan gestur mouse -Comment[it]=Fornisce un supporto alla navigazione nelle pagine web per mezzo di gesti del mouse -Comment[nl]=Biedt ondersteuning voor navigeren in webpagina's door muisgebaren -Comment[nn]=Gjev støtte for muserørsler for nettsidenavigering -Comment[pl]=Zapewnia obsługę poruszania się po stronach przy użyciu gestów myszy -Comment[pt]=Oferece o suporte para navegar nas páginas Web com gestos do rato -Comment[pt_BR]=Fornece suporte para navegação em sites usando gestos do mouse -Comment[sk]=Poskytuje podporu pre navigovanie na webstránkach pomocou gest myši -Comment[sv]=Tillhandahåller stöd för att navigera på webbsidor med musgester -Comment[uk]=Забезпечує підтримку навігації сторінками за допомогою жестів вказівником миші -Comment[x-test]=xxProvides support for navigating in webpages by mouse gesturesxx -Comment[zh_CN]=提供使用鼠标笔势在网页中导航的支持 - -Icon=:mousegestures/data/icon.png -Type=Service - -X-Falkon-Author=David Rosca -X-Falkon-Email=nowrep@gmail.com -X-Falkon-Version=0.5.0 -X-Falkon-Settings=true diff --git a/src/plugins/MouseGestures/mousegestures.json b/src/plugins/MouseGestures/mousegestures.json new file mode 100644 index 00000000..56524585 --- /dev/null +++ b/src/plugins/MouseGestures/mousegestures.json @@ -0,0 +1,54 @@ +{ + "Comment": "Provides support for navigating in webpages by mouse gestures", + "Comment[ca@valencia]": "Proporciona suport per a navegar per les pàgines web amb els gestos del ratolí", + "Comment[ca]": "Proporciona suport per a navegar per les pàgines web amb els gestos del ratolí", + "Comment[cs]": "Poskytuje podporu pro procházení webových stránek pomocí gest myší", + "Comment[da]": "Giver understøttelse af navigering på websider med musebevægelser", + "Comment[de]": "Unterstützung für die Navigation auf Webseiten durch Mausgesten", + "Comment[en_GB]": "Provides support for navigating in webpages by mouse gestures", + "Comment[es]": "Implementa la navegación en páginas web mediante gestos de ratón", + "Comment[fi]": "Tarjoaa tuen verkkosivujen selaamiseksi hiirielein", + "Comment[fr]": "Prise en charge de la navigation Internet à l'aide de mouvements de la souris", + "Comment[gl]": "Permite navegar por páxinas web con acenos co rato", + "Comment[id]": "Menyediakan dukungan untuk menavigasi dalam halaman web dengan gestur mouse", + "Comment[it]": "Fornisce un supporto alla navigazione nelle pagine web per mezzo di gesti del mouse", + "Comment[nl]": "Biedt ondersteuning voor navigeren in webpagina's door muisgebaren", + "Comment[nn]": "Gjev støtte for muserørsler for nettsidenavigering", + "Comment[pl]": "Zapewnia obsługę poruszania się po stronach przy użyciu gestów myszy", + "Comment[pt]": "Oferece o suporte para navegar nas páginas Web com gestos do rato", + "Comment[pt_BR]": "Fornece suporte para navegação em sites usando gestos do mouse", + "Comment[sk]": "Poskytuje podporu pre navigovanie na webstránkach pomocou gest myši", + "Comment[sv]": "Tillhandahåller stöd för att navigera på webbsidor med musgester", + "Comment[uk]": "Забезпечує підтримку навігації сторінками за допомогою жестів вказівником миші", + "Comment[x-test]": "xxProvides support for navigating in webpages by mouse gesturesxx", + "Comment[zh_CN]": "提供使用鼠标笔势在网页中导航的支持", + "Icon": "base64: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", + "Name": "Mouse Gestures", + "Name[ca@valencia]": "Gestos del ratolí", + "Name[ca]": "Gestos del ratolí", + "Name[cs]": "Gesta myší", + "Name[da]": "Musebevægelser", + "Name[de]": "Mausgesten", + "Name[en_GB]": "Mouse Gestures", + "Name[es]": "Gestos de ratón", + "Name[fi]": "Hiirieleet", + "Name[fr]": "Mouvements de souris", + "Name[gl]": "Xestos do rato", + "Name[id]": "Gestur Mouse", + "Name[it]": "Gesti del mouse", + "Name[nl]": "Muisgebaren", + "Name[nn]": "Muserørsler", + "Name[pl]": "Gesty myszy", + "Name[pt]": "Gestos do Rato", + "Name[pt_BR]": "Gestos do mouse", + "Name[sk]": "Gestá myši", + "Name[sv]": "Musgester", + "Name[uk]": "Керування мишею", + "Name[x-test]": "xxMouse Gesturesxx", + "Name[zh_CN]": "鼠标手势", + "Name[zh_TW]": "滑鼠手勢", + "X-Falkon-Author": "David Rosca", + "X-Falkon-Email": "nowrep@gmail.com", + "X-Falkon-Settings": "true", + "X-Falkon-Version": "0.5.0" +} diff --git a/src/plugins/MouseGestures/mousegestures.qrc b/src/plugins/MouseGestures/mousegestures.qrc index 9eed5abb..12add1ab 100644 --- a/src/plugins/MouseGestures/mousegestures.qrc +++ b/src/plugins/MouseGestures/mousegestures.qrc @@ -1,17 +1,16 @@ - metadata.desktop data/icon.png data/down.gif data/down-left.gif data/down-right.gif data/down-up.gif data/left.gif data/right.gif data/up.gif data/up-down.gif data/up-left.gif data/up-right.gif data/copyright diff --git a/src/plugins/MouseGestures/mousegesturesplugin.cpp b/src/plugins/MouseGestures/mousegesturesplugin.cpp index 22e4c959..85bfccea 100644 --- a/src/plugins/MouseGestures/mousegesturesplugin.cpp +++ b/src/plugins/MouseGestures/mousegesturesplugin.cpp @@ -1,90 +1,84 @@ /* ============================================================ * Mouse Gestures plugin for Falkon * Copyright (C) 2012-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "mousegesturesplugin.h" #include "pluginproxy.h" #include "mousegestures.h" #include "mainapplication.h" #include "browserwindow.h" #include "../config.h" -#include "desktopfile.h" MouseGesturesPlugin::MouseGesturesPlugin() : QObject() , m_gestures(0) { } -DesktopFile MouseGesturesPlugin::metaData() const -{ - return DesktopFile(QSL(":mousegestures/metadata.desktop")); -} - void MouseGesturesPlugin::init(InitState state, const QString &settingsPath) { Q_UNUSED(state) m_gestures = new MouseGestures(settingsPath, this); mApp->plugins()->registerAppEventHandler(PluginProxy::MousePressHandler, this); mApp->plugins()->registerAppEventHandler(PluginProxy::MouseReleaseHandler, this); mApp->plugins()->registerAppEventHandler(PluginProxy::MouseMoveHandler, this); } void MouseGesturesPlugin::unload() { m_gestures->unloadPlugin(); m_gestures->deleteLater(); } bool MouseGesturesPlugin::testPlugin() { // Require the version that the plugin was built with return (Qz::VERSION == QLatin1String(FALKON_VERSION)); } void MouseGesturesPlugin::showSettings(QWidget* parent) { m_gestures->showSettings(parent); } bool MouseGesturesPlugin::mousePress(Qz::ObjectName type, QObject* obj, QMouseEvent* event) { if (type == Qz::ON_WebView) { m_gestures->mousePress(obj, event); } return false; } bool MouseGesturesPlugin::mouseRelease(Qz::ObjectName type, QObject* obj, QMouseEvent* event) { if (type == Qz::ON_WebView) { return m_gestures->mouseRelease(obj, event); } return false; } bool MouseGesturesPlugin::mouseMove(Qz::ObjectName type, QObject* obj, QMouseEvent* event) { if (type == Qz::ON_WebView) { m_gestures->mouseMove(obj, event); } return false; } diff --git a/src/plugins/MouseGestures/mousegesturesplugin.h b/src/plugins/MouseGestures/mousegesturesplugin.h index dfaf9609..ce6d1a74 100644 --- a/src/plugins/MouseGestures/mousegesturesplugin.h +++ b/src/plugins/MouseGestures/mousegesturesplugin.h @@ -1,48 +1,47 @@ /* ============================================================ * Mouse Gestures plugin for Falkon * Copyright (C) 2012-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef MOUSEGESTURESPLUGIN_H #define MOUSEGESTURESPLUGIN_H #include "plugininterface.h" class MouseGestures; class MouseGesturesPlugin : public QObject, public PluginInterface { Q_OBJECT Q_INTERFACES(PluginInterface) - Q_PLUGIN_METADATA(IID "Falkon.Browser.plugin.MouseGestures") + Q_PLUGIN_METADATA(IID "Falkon.Browser.plugin.MouseGestures" FILE "mousegestures.json") public: MouseGesturesPlugin(); - DesktopFile metaData() const override; void init(InitState state, const QString &settingsPath) override; void unload() override; bool testPlugin() override; void showSettings(QWidget *parent) override; bool mousePress(Qz::ObjectName type, QObject *obj, QMouseEvent *event) override; bool mouseRelease(Qz::ObjectName type, QObject *obj, QMouseEvent *event) override; bool mouseMove(Qz::ObjectName type, QObject *obj, QMouseEvent *event) override; private: MouseGestures* m_gestures; }; #endif // MOUSEGESTURESPLUGIN_H diff --git a/src/plugins/PIM/PIM.json b/src/plugins/PIM/PIM.json new file mode 100644 index 00000000..c39373a6 --- /dev/null +++ b/src/plugins/PIM/PIM.json @@ -0,0 +1,54 @@ +{ + "Comment": "Adds ability for Falkon to store some personal data", + "Comment[ca@valencia]": "Afig la possibilitat que el Falkon emmagatzeme diverses dades personals", + "Comment[ca]": "Afegeix la possibilitat que el Falkon emmagatzemi diverses dades personals", + "Comment[cs]": "Přidává Falkonu schopnost ukládat nějaká osobní data", + "Comment[da]": "Tilføjer mulighed for at Falkon kan lagre nogle personlige data", + "Comment[de]": "Falkon kann einige persönliche Daten speichern", + "Comment[en_GB]": "Adds ability for Falkon to store some personal data", + "Comment[es]": "Añade a Falkon la facultad de guardar datos personales", + "Comment[fi]": "Lisää Falkoniin kyvyn tallentaa henkilökohtaista tietoa", + "Comment[fr]": "Ajout d'une capacité de stockage de certaines données personnelles par Falkon", + "Comment[gl]": "Engade a posibilidade de que Falkon almacene algúns datos persoais", + "Comment[id]": "Menambah kemampuan terhadap Falkon untuk menyimpan beberapa data pribadi", + "Comment[it]": "Aggiunge a Falkon la capacità di immagazzinare alcuni dati personali", + "Comment[nl]": "Biedt mogelijkheid voor Falkon om enige persoonlijke gegevens op te slaan", + "Comment[nn]": "Gjer det mogleg for Falkon å lagra nokre persondata", + "Comment[pl]": "Dodaje możliwość przechowywania pewnych danych osobowych", + "Comment[pt]": "Adiciona ao Falkon a capacidade de guardar alguns dados pessoais", + "Comment[pt_BR]": "Adiciona a habilidade ao Falkon para armazenar alguns dados pessoais", + "Comment[sk]": "Pridáva do Falkonu podporu na ukladanie niektorých osobných údajov", + "Comment[sv]": "Lägger till möjlighet för Falkon att lagra viss personlig information", + "Comment[uk]": "Додає у Falkon можливість зберігати особисті дані", + "Comment[x-test]": "xxAdds ability for Falkon to store some personal dataxx", + "Comment[zh_CN]": "增加 Falkon 存储某些个人数据的能力", + "Icon": "base64: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", + "Name": "PIM", + "Name[ca@valencia]": "PIM", + "Name[ca]": "PIM", + "Name[cs]": "PIM", + "Name[da]": "PIM", + "Name[de]": "PIM", + "Name[en_GB]": "PIM", + "Name[es]": "PIM", + "Name[fi]": "Henkilökohtainen ajanhallinta", + "Name[fr]": "PIM", + "Name[gl]": "PIM", + "Name[id]": "PIM", + "Name[it]": "PIM", + "Name[nl]": "PIM", + "Name[nn]": "PIM", + "Name[pl]": "ZIO", + "Name[pt]": "PIM", + "Name[pt_BR]": "PIM", + "Name[sk]": "PIM", + "Name[sv]": "Personlig information", + "Name[uk]": "Керування інформацією", + "Name[x-test]": "xxPIMxx", + "Name[zh_CN]": "个人信息管理", + "Name[zh_TW]": "PIM", + "X-Falkon-Author": "Mladen Pejaković", + "X-Falkon-Email": "pejakm@autistici.org", + "X-Falkon-Settings": "true", + "X-Falkon-Version": "0.2.0" +} diff --git a/src/plugins/PIM/PIM_plugin.cpp b/src/plugins/PIM/PIM_plugin.cpp index dbef2277..d77e338c 100644 --- a/src/plugins/PIM/PIM_plugin.cpp +++ b/src/plugins/PIM/PIM_plugin.cpp @@ -1,81 +1,75 @@ /* ============================================================ * Personal Information Manager plugin for Falkon * Copyright (C) 2012-2014 David Rosca * Copyright (C) 2012-2014 Mladen Pejaković * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "PIM_plugin.h" #include "PIM_handler.h" #include "PIM_settings.h" #include "mainapplication.h" #include "pluginproxy.h" #include "browserwindow.h" #include "webview.h" #include "../config.h" -#include "desktopfile.h" PIM_Plugin::PIM_Plugin() : QObject() , m_handler(0) { } -DesktopFile PIM_Plugin::metaData() const -{ - return DesktopFile(QSL(":PIM/metadata.desktop")); -} - void PIM_Plugin::init(InitState state, const QString &settingsPath) { Q_UNUSED(state) m_handler = new PIM_Handler(settingsPath, this); mApp->plugins()->registerAppEventHandler(PluginProxy::KeyPressHandler, this); connect(mApp->plugins(), SIGNAL(webPageCreated(WebPage*)), m_handler, SLOT(webPageCreated(WebPage*))); } void PIM_Plugin::unload() { m_handler->unloadPlugin(); m_handler->deleteLater(); } bool PIM_Plugin::testPlugin() { // Require the version that the plugin was built with return (Qz::VERSION == QLatin1String(FALKON_VERSION)); } void PIM_Plugin::showSettings(QWidget* parent) { m_handler->showSettings(parent); } void PIM_Plugin::populateWebViewMenu(QMenu* menu, WebView* view, const WebHitTestResult &r) { m_handler->populateWebViewMenu(menu, view, r); } bool PIM_Plugin::keyPress(Qz::ObjectName type, QObject* obj, QKeyEvent* event) { if (type == Qz::ON_WebView) { WebView* view = qobject_cast(obj); return m_handler->keyPress(view, event); } return false; } diff --git a/src/plugins/PIM/PIM_plugin.h b/src/plugins/PIM/PIM_plugin.h index 757b2f3b..8bd23423 100644 --- a/src/plugins/PIM/PIM_plugin.h +++ b/src/plugins/PIM/PIM_plugin.h @@ -1,50 +1,49 @@ /* ============================================================ * Personal Information Manager plugin for Falkon * Copyright (C) 2012-2014 David Rosca * Copyright (C) 2012-2014 Mladen Pejaković * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef PIM_PLUGIN_H #define PIM_PLUGIN_H #include "plugininterface.h" class WebPage; class BrowserWindow; class PIM_Handler; class PIM_Plugin : public QObject, public PluginInterface { Q_OBJECT Q_INTERFACES(PluginInterface) - Q_PLUGIN_METADATA(IID "Falkon.Browser.plugin.PIM") + Q_PLUGIN_METADATA(IID "Falkon.Browser.plugin.PIM" FILE "PIM.json") public: PIM_Plugin(); - DesktopFile metaData() const override; void init(InitState state, const QString &settingsPath) override; void unload() override; bool testPlugin() override; void showSettings(QWidget *parent) override; void populateWebViewMenu(QMenu *menu, WebView *view, const WebHitTestResult &r) override; bool keyPress(Qz::ObjectName type, QObject *obj, QKeyEvent *event) override; private: PIM_Handler* m_handler; }; #endif // PIM_PLUGIN_H diff --git a/src/plugins/PIM/PIM_res.qrc b/src/plugins/PIM/PIM_res.qrc index 09289925..7aab324d 100644 --- a/src/plugins/PIM/PIM_res.qrc +++ b/src/plugins/PIM/PIM_res.qrc @@ -1,6 +1,5 @@ - metadata.desktop data/PIM.png diff --git a/src/plugins/PIM/metadata.desktop b/src/plugins/PIM/metadata.desktop deleted file mode 100644 index 29b6a1fd..00000000 --- a/src/plugins/PIM/metadata.desktop +++ /dev/null @@ -1,56 +0,0 @@ -[Desktop Entry] -Name=PIM -Name[ca]=PIM -Name[ca@valencia]=PIM -Name[cs]=PIM -Name[da]=PIM -Name[de]=PIM -Name[en_GB]=PIM -Name[es]=PIM -Name[fi]=Henkilökohtainen ajanhallinta -Name[fr]=PIM -Name[gl]=PIM -Name[id]=PIM -Name[it]=PIM -Name[nl]=PIM -Name[nn]=PIM -Name[pl]=ZIO -Name[pt]=PIM -Name[pt_BR]=PIM -Name[sk]=PIM -Name[sv]=Personlig information -Name[uk]=Керування інформацією -Name[x-test]=xxPIMxx -Name[zh_CN]=个人信息管理 -Name[zh_TW]=PIM -Comment=Adds ability for Falkon to store some personal data -Comment[ca]=Afegeix la possibilitat que el Falkon emmagatzemi diverses dades personals -Comment[ca@valencia]=Afig la possibilitat que el Falkon emmagatzeme diverses dades personals -Comment[cs]=Přidává Falkonu schopnost ukládat nějaká osobní data -Comment[da]=Tilføjer mulighed for at Falkon kan lagre nogle personlige data -Comment[de]=Falkon kann einige persönliche Daten speichern -Comment[en_GB]=Adds ability for Falkon to store some personal data -Comment[es]=Añade a Falkon la facultad de guardar datos personales -Comment[fi]=Lisää Falkoniin kyvyn tallentaa henkilökohtaista tietoa -Comment[fr]=Ajout d'une capacité de stockage de certaines données personnelles par Falkon -Comment[gl]=Engade a posibilidade de que Falkon almacene algúns datos persoais -Comment[id]=Menambah kemampuan terhadap Falkon untuk menyimpan beberapa data pribadi -Comment[it]=Aggiunge a Falkon la capacità di immagazzinare alcuni dati personali -Comment[nl]=Biedt mogelijkheid voor Falkon om enige persoonlijke gegevens op te slaan -Comment[nn]=Gjer det mogleg for Falkon å lagra nokre persondata -Comment[pl]=Dodaje możliwość przechowywania pewnych danych osobowych -Comment[pt]=Adiciona ao Falkon a capacidade de guardar alguns dados pessoais -Comment[pt_BR]=Adiciona a habilidade ao Falkon para armazenar alguns dados pessoais -Comment[sk]=Pridáva do Falkonu podporu na ukladanie niektorých osobných údajov -Comment[sv]=Lägger till möjlighet för Falkon att lagra viss personlig information -Comment[uk]=Додає у Falkon можливість зберігати особисті дані -Comment[x-test]=xxAdds ability for Falkon to store some personal dataxx -Comment[zh_CN]=增加 Falkon 存储某些个人数据的能力 - -Icon=:PIM/data/PIM.png -Type=Service - -X-Falkon-Author=Mladen Pejaković -X-Falkon-Email=pejakm@autistici.org -X-Falkon-Version=0.2.0 -X-Falkon-Settings=true diff --git a/src/plugins/StatusBarIcons/metadata.desktop b/src/plugins/StatusBarIcons/metadata.desktop deleted file mode 100644 index f6966916..00000000 --- a/src/plugins/StatusBarIcons/metadata.desktop +++ /dev/null @@ -1,56 +0,0 @@ -[Desktop Entry] -Name=StatusBar Icons -Name[ca]=Icones de la barra d'estat -Name[ca@valencia]=Icones de la barra d'estat -Name[cs]=Ikony stavové lišty -Name[da]=Statuslinjeikoner -Name[de]=Statusleisten-Symbole -Name[en_GB]=StatusBar Icons -Name[es]=Iconos de la barra de tareas -Name[fi]=Tilarivin kuvakkeet -Name[fr]=Icônes de la barre d'état -Name[gl]=Iconas da barra de estado -Name[id]=StatusBar Icons -Name[it]=Icone della barra di stato -Name[nl]=Pictogrammen op de statusbalk -Name[nn]=Statuslinje-ikon -Name[pl]=Ikony paska stanu -Name[pt]=Ícones da Barra de Estado -Name[pt_BR]=Ícones da barra de status -Name[sk]=StatusBar Ikony -Name[sv]=Ikoner i statusraden -Name[uk]=Піктограми смужки стану -Name[x-test]=xxStatusBar Iconsxx -Name[zh_CN]=状态栏图标 -Name[zh_TW]=StatusBar 圖示 -Comment=Adds additional icons and zoom widget to statusbar -Comment[ca]=Afegeix icones addicionals i un estri de zoom a la barra d'estat -Comment[ca@valencia]=Afig icones addicionals i un estri de zoom a la barra d'estat -Comment[cs]=Přidává dodatečné ikony a přibližovací widget do stavové lišty -Comment[da]=Tilføjer yderligere ikoner og zoomwidget til statuslinje -Comment[de]=Zusätzliche Symbole und Bedienelemente zum Vergrößern für die Statusleiste -Comment[en_GB]=Adds additional icons and zoom widget to statusbar -Comment[es]=Añade iconos adicionales y control de zum a la barra de estado -Comment[fi]=Lisää tilariville kuvakkeita ja lähennyssovelman -Comment[fr]=Ajout d'icônes supplémentaires et d'un composant graphique de zoom à la barre d'état -Comment[gl]=Engade iconas adicionais e un trebello de ampliación á barra de estado -Comment[id]=Menambah tambahan ikon dan zoom widget untuk bilah status -Comment[it]=Aggiunge alla barra di stato alcune icone aggiuntive ed uno strumento di ingrandimento -Comment[nl]=Voegt extra pictogrammen en zoomwidget toe aan de statusbalk -Comment[nn]=Leggjer til fleire ikon og sideforstørring via statuslinja -Comment[pl]=Dodaje różne ikony i widżet powiększania do pasku stanu -Comment[pt]=Adiciona ícones extra e um item de ampliação à barra de estado -Comment[pt_BR]=Adiciona ícones adicionais e widget de zoom na barra de status -Comment[sk]=Pridáva ďalšie ikony a priblíženie do stavovej lišty -Comment[sv]=Lägger till ytterligare ikoner och en zoomkomponent i statusraden -Comment[uk]=Додає піктограми і віджет масштабування на смужку стану -Comment[x-test]=xxAdds additional icons and zoom widget to statusbarxx -Comment[zh_CN]=向状态栏添加其他图标和缩放小部件 - -Icon=:sbi/data/icon.png -Type=Service - -X-Falkon-Author=David Rosca -X-Falkon-Email=nowrep@gmail.com -X-Falkon-Version=0.2.0 -X-Falkon-Settings=true diff --git a/src/plugins/StatusBarIcons/statusbaricons.json b/src/plugins/StatusBarIcons/statusbaricons.json new file mode 100644 index 00000000..f67b7f2c --- /dev/null +++ b/src/plugins/StatusBarIcons/statusbaricons.json @@ -0,0 +1,54 @@ +{ + "Comment": "Adds additional icons and zoom widget to statusbar", + "Comment[ca@valencia]": "Afig icones addicionals i un estri de zoom a la barra d'estat", + "Comment[ca]": "Afegeix icones addicionals i un estri de zoom a la barra d'estat", + "Comment[cs]": "Přidává dodatečné ikony a přibližovací widget do stavové lišty", + "Comment[da]": "Tilføjer yderligere ikoner og zoomwidget til statuslinje", + "Comment[de]": "Zusätzliche Symbole und Bedienelemente zum Vergrößern für die Statusleiste", + "Comment[en_GB]": "Adds additional icons and zoom widget to statusbar", + "Comment[es]": "Añade iconos adicionales y control de zum a la barra de estado", + "Comment[fi]": "Lisää tilariville kuvakkeita ja lähennyssovelman", + "Comment[fr]": "Ajout d'icônes supplémentaires et d'un composant graphique de zoom à la barre d'état", + "Comment[gl]": "Engade iconas adicionais e un trebello de ampliación á barra de estado", + "Comment[id]": "Menambah tambahan ikon dan zoom widget untuk bilah status", + "Comment[it]": "Aggiunge alla barra di stato alcune icone aggiuntive ed uno strumento di ingrandimento", + "Comment[nl]": "Voegt extra pictogrammen en zoomwidget toe aan de statusbalk", + "Comment[nn]": "Leggjer til fleire ikon og sideforstørring via statuslinja", + "Comment[pl]": "Dodaje różne ikony i widżet powiększania do pasku stanu", + "Comment[pt]": "Adiciona ícones extra e um item de ampliação à barra de estado", + "Comment[pt_BR]": "Adiciona ícones adicionais e widget de zoom na barra de status", + "Comment[sk]": "Pridáva ďalšie ikony a priblíženie do stavovej lišty", + "Comment[sv]": "Lägger till ytterligare ikoner och en zoomkomponent i statusraden", + "Comment[uk]": "Додає піктограми і віджет масштабування на смужку стану", + "Comment[x-test]": "xxAdds additional icons and zoom widget to statusbarxx", + "Comment[zh_CN]": "向状态栏添加其他图标和缩放小部件", + "Icon": "base64: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", + "Name": "StatusBar Icons", + "Name[ca@valencia]": "Icones de la barra d'estat", + "Name[ca]": "Icones de la barra d'estat", + "Name[cs]": "Ikony stavové lišty", + "Name[da]": "Statuslinjeikoner", + "Name[de]": "Statusleisten-Symbole", + "Name[en_GB]": "StatusBar Icons", + "Name[es]": "Iconos de la barra de tareas", + "Name[fi]": "Tilarivin kuvakkeet", + "Name[fr]": "Icônes de la barre d'état", + "Name[gl]": "Iconas da barra de estado", + "Name[id]": "StatusBar Icons", + "Name[it]": "Icone della barra di stato", + "Name[nl]": "Pictogrammen op de statusbalk", + "Name[nn]": "Statuslinje-ikon", + "Name[pl]": "Ikony paska stanu", + "Name[pt]": "Ícones da Barra de Estado", + "Name[pt_BR]": "Ícones da barra de status", + "Name[sk]": "StatusBar Ikony", + "Name[sv]": "Ikoner i statusraden", + "Name[uk]": "Піктограми смужки стану", + "Name[x-test]": "xxStatusBar Iconsxx", + "Name[zh_CN]": "状态栏图标", + "Name[zh_TW]": "StatusBar 圖示", + "X-Falkon-Author": "David Rosca", + "X-Falkon-Email": "nowrep@gmail.com", + "X-Falkon-Settings": "true", + "X-Falkon-Version": "0.2.0" +} diff --git a/src/plugins/StatusBarIcons/statusbaricons.qrc b/src/plugins/StatusBarIcons/statusbaricons.qrc index 8d7dbc5c..6053ac73 100644 --- a/src/plugins/StatusBarIcons/statusbaricons.qrc +++ b/src/plugins/StatusBarIcons/statusbaricons.qrc @@ -1,14 +1,13 @@ - metadata.desktop data/icon.png data/images.png data/javascript.png data/network-offline.png data/network-online.png data/network-unknown.png data/preferences-network.png data/add.png data/remove.png diff --git a/src/plugins/StatusBarIcons/statusbariconsplugin.cpp b/src/plugins/StatusBarIcons/statusbariconsplugin.cpp index 45308db3..91a41751 100644 --- a/src/plugins/StatusBarIcons/statusbariconsplugin.cpp +++ b/src/plugins/StatusBarIcons/statusbariconsplugin.cpp @@ -1,75 +1,69 @@ /* ============================================================ * StatusBarIcons - Extra icons in statusbar for Falkon * Copyright (C) 2013-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "statusbariconsplugin.h" #include "sbi_iconsmanager.h" #include "sbi_settingsdialog.h" #include "pluginproxy.h" #include "browserwindow.h" #include "../config.h" #include "mainapplication.h" -#include "desktopfile.h" StatusBarIconsPlugin::StatusBarIconsPlugin() : QObject() , m_manager(0) { } -DesktopFile StatusBarIconsPlugin::metaData() const -{ - return DesktopFile(QSL(":sbi/metadata.desktop")); -} - void StatusBarIconsPlugin::init(InitState state, const QString &settingsPath) { m_manager = new SBI_IconsManager(settingsPath); connect(mApp->plugins(), &PluginProxy::mainWindowCreated, m_manager, &SBI_IconsManager::mainWindowCreated); connect(mApp->plugins(), &PluginProxy::mainWindowDeleted, m_manager, &SBI_IconsManager::mainWindowDeleted); // Make sure icons are added also to already created windows if (state == LateInitState) { foreach (BrowserWindow* window, mApp->windows()) { m_manager->mainWindowCreated(window); } } } void StatusBarIconsPlugin::unload() { // Make sure icons are properly removed when unloading plugin (but not when closing app) if (!mApp->isClosing()) { foreach (BrowserWindow* window, mApp->windows()) { m_manager->mainWindowDeleted(window); } delete m_manager; } } bool StatusBarIconsPlugin::testPlugin() { // Require the version that the plugin was built with return (Qz::VERSION == QLatin1String(FALKON_VERSION)); } void StatusBarIconsPlugin::showSettings(QWidget* parent) { SBI_SettingsDialog* dialog = new SBI_SettingsDialog(m_manager, parent); dialog->open(); } diff --git a/src/plugins/StatusBarIcons/statusbariconsplugin.h b/src/plugins/StatusBarIcons/statusbariconsplugin.h index b251536d..06b1aaca 100644 --- a/src/plugins/StatusBarIcons/statusbariconsplugin.h +++ b/src/plugins/StatusBarIcons/statusbariconsplugin.h @@ -1,45 +1,44 @@ /* ============================================================ * StatusBarIcons - Extra icons in statusbar for Falkon * Copyright (C) 2013-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef STATUSBARICONSPLUGIN_H #define STATUSBARICONSPLUGIN_H #include "plugininterface.h" class SBI_IconsManager; class StatusBarIconsPlugin : public QObject, public PluginInterface { Q_OBJECT Q_INTERFACES(PluginInterface) - Q_PLUGIN_METADATA(IID "Falkon.Browser.plugin.StatusBarIcons") + Q_PLUGIN_METADATA(IID "Falkon.Browser.plugin.StatusBarIcons" FILE "statusbaricons.json") public: explicit StatusBarIconsPlugin(); - DesktopFile metaData() const override; void init(InitState state, const QString &settingsPath) override; void unload() override; bool testPlugin() override; void showSettings(QWidget *parent) override; private: SBI_IconsManager* m_manager; }; #endif // STATUSBARICONSPLUGIN_H diff --git a/src/plugins/TabManager/metadata.desktop b/src/plugins/TabManager/metadata.desktop deleted file mode 100644 index 9cff981a..00000000 --- a/src/plugins/TabManager/metadata.desktop +++ /dev/null @@ -1,56 +0,0 @@ -[Desktop Entry] -Name=Tab Manager -Name[ca]=Gestor de pestanyes -Name[ca@valencia]=Gestor de pestanyes -Name[cs]=Správce karet -Name[da]=Fanebladshåndtering -Name[de]=Unterfensterverwaltung -Name[en_GB]=Tab Manager -Name[es]=Gestor de pestañas -Name[fi]=Välilehtien hallinta -Name[fr]=Gestionnaire d'onglets -Name[gl]=Xestor de lapelas -Name[id]=Tab Manager -Name[it]=Gestore delle schede -Name[nl]=Tabbladbeheerder -Name[nn]=Fanehandsamar -Name[pl]=Zarządzanie kartami -Name[pt]=Gestor de Páginas -Name[pt_BR]=Gerenciador de guias -Name[sk]=Správca kariet -Name[sv]=Flikhanterare -Name[uk]=Керування вкладками -Name[x-test]=xxTab Managerxx -Name[zh_CN]=标签页管理器 -Name[zh_TW]=分頁管理器 -Comment=Adds ability to managing tabs and windows -Comment[ca]=Afegeix la possibilitat de gestionar les pestanyes i finestres -Comment[ca@valencia]=Afig la possibilitat de gestionar les pestanyes i finestres -Comment[cs]=Přidává schopnost správy karet a oken -Comment[da]=Tilføjer mulighed for at håndtere faneblade og vinduer -Comment[de]=Verwaltung von Unterfenstern und Fenstern -Comment[en_GB]=Adds ability to managing tabs and windows -Comment[es]=Añade la posibilidad de gestionar pestañas y ventanas -Comment[fi]=Lisää kyvyn hallita välilehtiä ja ikkunoita -Comment[fr]=Ajout d'une capacité de gestion des onglets et des fenêtres -Comment[gl]=Engade a posibilidade de xestionar lapelas e xanelas -Comment[id]=Menambah kemampuan untuk mengelola tab dan window -Comment[it]=Aggiunge la capacità di gestione delle schede e delle finestre -Comment[nl]=Voegt mogelijkheid toe om tabbladen en vensters te beheren -Comment[nn]=Gjer det mogleg å handtera faner og vindauge -Comment[pl]=Dodaje możliwość zarządzania kartami i oknami -Comment[pt]=Adiciona a capacidade para gerir páginas e janelas -Comment[pt_BR]=Adiciona a habilidade de gerenciar guias e janelas -Comment[sk]=Pridáva schopnosť spravovať karty a okná -Comment[sv]=Lägger till möjlighet att hantera flikar och fönster -Comment[uk]=Додає можливість керування вкладками і вікнами -Comment[x-test]=xxAdds ability to managing tabs and windowsxx -Comment[zh_CN]=添加管理标签页和窗口的功能 - -Icon=:tabmanager/data/tabmanager.png -Type=Service - -X-Falkon-Author=Razi Alavizadeh -X-Falkon-Email=s.r.alavizadeh@gmail.com -X-Falkon-Version=0.8.0 -X-Falkon-Settings=true diff --git a/src/plugins/TabManager/tabmanager.json b/src/plugins/TabManager/tabmanager.json new file mode 100644 index 00000000..1c33d72c --- /dev/null +++ b/src/plugins/TabManager/tabmanager.json @@ -0,0 +1,54 @@ +{ + "Comment": "Adds ability to managing tabs and windows", + "Comment[ca@valencia]": "Afig la possibilitat de gestionar les pestanyes i finestres", + "Comment[ca]": "Afegeix la possibilitat de gestionar les pestanyes i finestres", + "Comment[cs]": "Přidává schopnost správy karet a oken", + "Comment[da]": "Tilføjer mulighed for at håndtere faneblade og vinduer", + "Comment[de]": "Verwaltung von Unterfenstern und Fenstern", + "Comment[en_GB]": "Adds ability to managing tabs and windows", + "Comment[es]": "Añade la posibilidad de gestionar pestañas y ventanas", + "Comment[fi]": "Lisää kyvyn hallita välilehtiä ja ikkunoita", + "Comment[fr]": "Ajout d'une capacité de gestion des onglets et des fenêtres", + "Comment[gl]": "Engade a posibilidade de xestionar lapelas e xanelas", + "Comment[id]": "Menambah kemampuan untuk mengelola tab dan window", + "Comment[it]": "Aggiunge la capacità di gestione delle schede e delle finestre", + "Comment[nl]": "Voegt mogelijkheid toe om tabbladen en vensters te beheren", + "Comment[nn]": "Gjer det mogleg å handtera faner og vindauge", + "Comment[pl]": "Dodaje możliwość zarządzania kartami i oknami", + "Comment[pt]": "Adiciona a capacidade para gerir páginas e janelas", + "Comment[pt_BR]": "Adiciona a habilidade de gerenciar guias e janelas", + "Comment[sk]": "Pridáva schopnosť spravovať karty a okná", + "Comment[sv]": "Lägger till möjlighet att hantera flikar och fönster", + "Comment[uk]": "Додає можливість керування вкладками і вікнами", + "Comment[x-test]": "xxAdds ability to managing tabs and windowsxx", + "Comment[zh_CN]": "添加管理标签页和窗口的功能", + "Icon": "base64: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", + "Name": "Tab Manager", + "Name[ca@valencia]": "Gestor de pestanyes", + "Name[ca]": "Gestor de pestanyes", + "Name[cs]": "Správce karet", + "Name[da]": "Fanebladshåndtering", + "Name[de]": "Unterfensterverwaltung", + "Name[en_GB]": "Tab Manager", + "Name[es]": "Gestor de pestañas", + "Name[fi]": "Välilehtien hallinta", + "Name[fr]": "Gestionnaire d'onglets", + "Name[gl]": "Xestor de lapelas", + "Name[id]": "Tab Manager", + "Name[it]": "Gestore delle schede", + "Name[nl]": "Tabbladbeheerder", + "Name[nn]": "Fanehandsamar", + "Name[pl]": "Zarządzanie kartami", + "Name[pt]": "Gestor de Páginas", + "Name[pt_BR]": "Gerenciador de guias", + "Name[sk]": "Správca kariet", + "Name[sv]": "Flikhanterare", + "Name[uk]": "Керування вкладками", + "Name[x-test]": "xxTab Managerxx", + "Name[zh_CN]": "标签页管理器", + "Name[zh_TW]": "分頁管理器", + "X-Falkon-Author": "Razi Alavizadeh", + "X-Falkon-Email": "s.r.alavizadeh@gmail.com", + "X-Falkon-Settings": "true", + "X-Falkon-Version": "0.8.0" +} diff --git a/src/plugins/TabManager/tabmanagerplugin.cpp b/src/plugins/TabManager/tabmanagerplugin.cpp index 35fc6379..5912c644 100644 --- a/src/plugins/TabManager/tabmanagerplugin.cpp +++ b/src/plugins/TabManager/tabmanagerplugin.cpp @@ -1,224 +1,218 @@ /* ============================================================ * TabManager plugin for Falkon * Copyright (C) 2013-2017 S. Razi Alavizadeh * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "tabmanagerplugin.h" #include "tabmanagerwidgetcontroller.h" #include "tabmanagerwidget.h" #include "browserwindow.h" #include "pluginproxy.h" #include "mainapplication.h" #include "sidebar.h" #include "tabwidget.h" #include "tabbar.h" #include "tabmanagersettings.h" #include "../config.h" -#include "desktopfile.h" #include #include #include #include #include QString TabManagerPlugin::s_settingsPath; TabManagerPlugin::TabManagerPlugin() : QObject() , m_controller(0) , m_tabManagerWidget(0) , m_viewType(Undefined) , m_initState(false) , m_asTabBarReplacement(false) { } -DesktopFile TabManagerPlugin::metaData() const -{ - return DesktopFile(QSL(":tabmanager/metadata.desktop")); -} - void TabManagerPlugin::init(InitState state, const QString &settingsPath) { Q_UNUSED(state) m_controller = new TabManagerWidgetController(this); connect(mApp->plugins(), SIGNAL(mainWindowCreated(BrowserWindow*)), this, SLOT(mainWindowCreated(BrowserWindow*))); connect(mApp->plugins(), SIGNAL(mainWindowDeleted(BrowserWindow*)), m_controller, SLOT(mainWindowDeleted(BrowserWindow*))); connect(mApp->plugins(), SIGNAL(webPageCreated(WebPage*)), m_controller, SIGNAL(requestRefreshTree())); connect(mApp->plugins(), SIGNAL(webPageDeleted(WebPage*)), m_controller, SIGNAL(requestRefreshTree(WebPage*))); s_settingsPath = settingsPath + QL1S("/TabManager"); m_initState = true; // load settings QSettings settings(s_settingsPath + QL1S("/tabmanager.ini"), QSettings::IniFormat); settings.beginGroup("View"); m_controller->setGroupType(TabManagerWidget::GroupType(settings.value("GroupType", TabManagerWidget::GroupByWindow).toInt())); m_viewType = ViewType(settings.value("ViewType", ShowAsWindow).toInt()); m_asTabBarReplacement = settings.value("AsTabBarReplacement", false).toBool(); settings.endGroup(); setAsTabBarReplacement(m_asTabBarReplacement); insertManagerWidget(); } void TabManagerPlugin::unload() { saveSettings(); setTabBarVisible(true); removeManagerWidget(); delete m_controller; } bool TabManagerPlugin::testPlugin() { return (Qz::VERSION == QLatin1String(FALKON_VERSION)); } void TabManagerPlugin::showSettings(QWidget* parent) { TabManagerSettings* settings = new TabManagerSettings(this, parent); settings->exec(); } void TabManagerPlugin::populateExtensionsMenu(QMenu* menu) { if (viewType() == ShowAsWindow) { QAction* showAction = m_controller->createMenuAction(); showAction->setCheckable(false); connect(showAction, SIGNAL(triggered()), m_controller, SLOT(raiseTabManager())); menu->addAction(showAction); } } void TabManagerPlugin::insertManagerWidget() { if (viewType() == ShowAsSideBar) { SideBarManager::addSidebar("TabManager", m_controller); } else if (viewType() == ShowAsWindow) { if (!m_tabManagerWidget) { m_tabManagerWidget = m_controller->createTabManagerWidget(mApp->getWindow(), 0, true); m_tabManagerWidget->setWindowFlags(Qt::Window); } } if (m_initState) { foreach (BrowserWindow* window, mApp->windows()) { mainWindowCreated(window, false); } m_initState = false; } } void TabManagerPlugin::mainWindowCreated(BrowserWindow* window, bool refresh) { if (window) { window->tabWidget()->tabBar()->setForceHidden(m_asTabBarReplacement); if (m_viewType == ShowAsWindow) { m_controller->addStatusBarIcon(window); } connect(window->tabWidget(), SIGNAL(currentChanged(int)), m_controller, SIGNAL(requestRefreshTree())); connect(window->tabWidget(), SIGNAL(pinStateChanged(int,bool)), m_controller, SIGNAL(requestRefreshTree())); } if (refresh) { m_controller->emitRefreshTree(); } } void TabManagerPlugin::setTabBarVisible(bool visible) { foreach (BrowserWindow* window, mApp->windows()) { window->tabWidget()->tabBar()->setForceHidden(!visible); } } void TabManagerPlugin::removeManagerWidget() { if (viewType() == ShowAsSideBar) { SideBarManager::removeSidebar(m_controller); } else if (viewType() == ShowAsWindow) { // remove statusbar icon foreach (BrowserWindow* window, mApp->windows()) { m_controller->removeStatusBarIcon(window); } m_tabManagerWidget->close(); delete m_tabManagerWidget; m_tabManagerWidget = 0; } } TabManagerPlugin::ViewType TabManagerPlugin::viewType() { return m_viewType; } void TabManagerPlugin::setViewType(ViewType type) { if (m_viewType != type) { removeManagerWidget(); m_viewType = type; insertManagerWidget(); if (!m_initState) { if (m_viewType == ShowAsSideBar) { mApp->getWindow()->sideBarManager()->showSideBar("TabManager"); } else if (m_viewType == ShowAsWindow) { // add statusbar icon foreach (BrowserWindow* window, mApp->windows()) { m_controller->addStatusBarIcon(window); } } } } } QString TabManagerPlugin::settingsPath() { return s_settingsPath; } void TabManagerPlugin::saveSettings() { QSettings settings(s_settingsPath + QL1S("/tabmanager.ini"), QSettings::IniFormat); settings.beginGroup("View"); settings.setValue("GroupType", m_controller->groupType()); settings.setValue("ViewType", viewType()); settings.setValue("AsTabBarReplacement", asTabBarReplacement()); settings.endGroup(); } bool TabManagerPlugin::asTabBarReplacement() const { return m_asTabBarReplacement; } void TabManagerPlugin::setAsTabBarReplacement(bool yes) { m_asTabBarReplacement = yes; setTabBarVisible(!m_asTabBarReplacement); } diff --git a/src/plugins/TabManager/tabmanagerplugin.h b/src/plugins/TabManager/tabmanagerplugin.h index f7682019..7461191d 100644 --- a/src/plugins/TabManager/tabmanagerplugin.h +++ b/src/plugins/TabManager/tabmanagerplugin.h @@ -1,84 +1,83 @@ /* ============================================================ * TabManager plugin for Falkon * Copyright (C) 2013-2017 S. Razi Alavizadeh * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef TABMANAGERPLUGIN_H #define TABMANAGERPLUGIN_H #include "plugininterface.h" #include "tabmanagerwidgetcontroller.h" #include #include #include #include #include class TabManagerWidget; class TabManagerPlugin : public QObject, public PluginInterface { Q_OBJECT Q_INTERFACES(PluginInterface) - Q_PLUGIN_METADATA(IID "Falkon.Browser.plugin.TabManagerPlugin") + Q_PLUGIN_METADATA(IID "Falkon.Browser.plugin.TabManagerPlugin" FILE "tabmanager.json") public: explicit TabManagerPlugin(); - DesktopFile metaData() const override; void init(InitState state, const QString &settingsPath) override; void unload() override; bool testPlugin() override; void showSettings(QWidget *parent) override; void populateExtensionsMenu(QMenu *menu) override; enum ViewType { ShowAsSideBar = 0, ShowAsWindow = 1, Undefined = -1 }; void removeManagerWidget(); ViewType viewType(); void setViewType(ViewType type); static QString settingsPath(); void saveSettings(); bool asTabBarReplacement() const; void setAsTabBarReplacement(bool yes); public Q_SLOTS: void insertManagerWidget(); private Q_SLOTS: void mainWindowCreated(BrowserWindow* window, bool refresh = true); private: void setTabBarVisible(bool visible); TabManagerWidgetController* m_controller; TabManagerWidget* m_tabManagerWidget; static QString s_settingsPath; ViewType m_viewType; bool m_initState; bool m_asTabBarReplacement; }; #endif // TABMANAGERPLUGIN_H diff --git a/src/plugins/TabManager/tabmanagerplugin.qrc b/src/plugins/TabManager/tabmanagerplugin.qrc index 949502d6..97152bfb 100644 --- a/src/plugins/TabManager/tabmanagerplugin.qrc +++ b/src/plugins/TabManager/tabmanagerplugin.qrc @@ -1,14 +1,13 @@ - metadata.desktop data/tabmanager.png data/tab-close.png data/tab-bookmark.png data/tab-detach.png data/tab-loading.png data/tab-pinned.png data/side-by-side.png data/closetab.png data/addtab.png diff --git a/src/plugins/TestPlugin/CMakeLists.txt b/src/plugins/TestPlugin/CMakeLists.txt index 9b107dc2..e907ed83 100644 --- a/src/plugins/TestPlugin/CMakeLists.txt +++ b/src/plugins/TestPlugin/CMakeLists.txt @@ -1,16 +1,10 @@ set( TestPlugin_SRCS testplugin.cpp testplugin_sidebar.cpp ) - -set( TestPlugin_RSCS - testplugin.qrc -) -qt5_add_resources(RSCS ${TestPlugin_RSCS}) - ecm_create_qm_loader( TestPlugin_SRCS falkon_testplugin_qt ) add_library(TestPlugin MODULE ${TestPlugin_SRCS} ${RSCS}) install(TARGETS TestPlugin DESTINATION ${FALKON_INSTALL_PLUGINDIR}) target_link_libraries(TestPlugin FalkonPrivate) diff --git a/src/plugins/TestPlugin/metadata.desktop b/src/plugins/TestPlugin/metadata.desktop deleted file mode 100644 index d2776dad..00000000 --- a/src/plugins/TestPlugin/metadata.desktop +++ /dev/null @@ -1,57 +0,0 @@ -[Desktop Entry] -Name=Example Plugin -Name[ca]=Connector d'exemple -Name[ca@valencia]=Connector d'exemple -Name[cs]=Ukázkový modul -Name[da]=Eksempel plugin -Name[de]=Beispielmodul -Name[en_GB]=Example Plugin -Name[es]=Complemento de ejemplo -Name[fi]=Esimerkkiliitännäinen -Name[fr]=Exemple de module externe -Name[gl]=Complemento de exemplo -Name[id]=Example Plugin -Name[it]=Estensione di esempio -Name[nl]=Voorbeeld plug-in -Name[nn]=Eksempel-tillegg -Name[pl]=Przykładowa wtyczka -Name[pt]='Plugin' de Exemplo -Name[pt_BR]=Plugin de exemplo -Name[sk]=Ukážkový doplnok -Name[sv]=Exempelinsticksprogram -Name[uk]=Приклад додатка -Name[x-test]=xxExample Pluginxx -Name[zh_CN]=示例插件 -Name[zh_TW]=外掛程式範例 -Comment=Very simple minimal plugin example -Comment[ca]=Exemple molt senzill d'un connector mínim -Comment[ca@valencia]=Exemple molt senzill d'un connector mínim -Comment[cs]=Jednoduchá ukázka modulu -Comment[da]=Meget simpelt minimalt plugin eksempel -Comment[de]=Einfaches minimales Beispielmodul -Comment[en_GB]=Very simple minimal plugin example -Comment[es]=Complemento de ejemplo mínimo, muy sencillo -Comment[fi]=Hyvin yksinkertainen esimerkki minimaalisesta liitännäisestä -Comment[fr]=Exemple de module externe minimaliste très simple -Comment[gl]=Exemplo de complemento mínimo moi simple -Comment[id]=Contoh plugin minimal yang sangat sederhana -Comment[it]=Estensione di esempio molto semplice e minimale -Comment[nl]=Zeer eenvoudige minimaal voorbeeld voor plug-in -Comment[nn]=Veldig enkelt og lite eksempel-tillegg -Comment[pl]=Bardzo prosty i minimalny przykład wtyczki -Comment[pt]='Plugin' de exemplo muito simples e minimalista -Comment[pt_BR]=Um exemplo de plugin mínimo e simples -Comment[sk]=Veľmi jednoduchý príkladový doplnok -Comment[sv]=Mycket enkelt minimalt exempel på ett insticksprogram -Comment[uk]=Дуже простий мінімальний приклад додатка -Comment[x-test]=xxVery simple minimal plugin examplexx -Comment[zh_CN]=非常简单的最小化插件示范 -Comment[zh_TW]=非常簡單的最小外掛程式範例 - -Icon=configure -Type=Service - -X-Falkon-Author=David Rosca -X-Falkon-Email=nowrep@gmail.com -X-Falkon-Version=0.1.7 -X-Falkon-Settings=true diff --git a/src/plugins/TestPlugin/testplugin.cpp b/src/plugins/TestPlugin/testplugin.cpp index 5a475e0e..d884449d 100644 --- a/src/plugins/TestPlugin/testplugin.cpp +++ b/src/plugins/TestPlugin/testplugin.cpp @@ -1,163 +1,155 @@ /* ============================================================ * Falkon - Qt web browser * Copyright (C) 2010-2018 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "testplugin.h" #include "testplugin_sidebar.h" #include "browserwindow.h" #include "webview.h" #include "pluginproxy.h" #include "mainapplication.h" #include "sidebar.h" #include "webhittestresult.h" #include "../config.h" -#include "desktopfile.h" #include #include TestPlugin::TestPlugin() : QObject() , m_view(0) { - // Don't do anything expensive in constructor! - // It will be called even if user doesn't have the plugin allowed -} - -DesktopFile TestPlugin::metaData() const -{ - return DesktopFile(QSL(":testplugin/metadata.desktop")); } void TestPlugin::init(InitState state, const QString &settingsPath) { qDebug() << __FUNCTION__ << "called"; // This function is called right after plugin is loaded // it will be called even if we return false from testPlugin() // so it is recommended not to call any Falkon function here // Settings path is PROFILE/extensions (without trailign slash), // in this directory you can use global .ini file for QSettings // named "extensions.ini" or create new folder for your plugin // and save in it anything you want m_settingsPath = settingsPath; // State can be either StartupInitState or LateInitState, and it // indicates when the plugin have been loaded. // Currently, it can be from preferences, or automatically at startup. // Plugins are loaded before first BrowserWindow is created. Q_UNUSED(state) // Registering this plugin as a MousePressHandler. // Otherwise mousePress() function will never be called mApp->plugins()->registerAppEventHandler(PluginProxy::MousePressHandler, this); // Adding new sidebar into application m_sideBar = new TestPlugin_Sidebar(this); SideBarManager::addSidebar("testplugin-sidebar", m_sideBar); } void TestPlugin::unload() { qDebug() << __FUNCTION__ << "called"; // This function will be called when unloading plugin // it will be also called if we return false from testPlugin() // Removing sidebar from application SideBarManager::removeSidebar(m_sideBar); delete m_sideBar; // Deleting settings dialog if opened delete m_settings.data(); } bool TestPlugin::testPlugin() { // This function is called right after init() // There should be some testing if plugin is loaded correctly // If this function returns false, plugin is automatically unloaded return (Qz::VERSION == QLatin1String(FALKON_VERSION)); } void TestPlugin::showSettings(QWidget* parent) { // This function will be called from Preferences after clicking on Settings button. // Settings button will be enabled if PluginSpec.hasSettings == true if (!m_settings) { m_settings = new QDialog(parent); QPushButton* b = new QPushButton("Example Plugin v0.0.1"); QPushButton* closeButton = new QPushButton(tr("Close")); QLabel* label = new QLabel(); label->setPixmap(QPixmap(":icons/other/about.svg")); QVBoxLayout* l = new QVBoxLayout(m_settings.data()); l->addWidget(label); l->addWidget(b); l->addWidget(closeButton); m_settings.data()->setLayout(l); m_settings.data()->setAttribute(Qt::WA_DeleteOnClose); m_settings.data()->setWindowTitle(tr("Example Plugin Settings")); m_settings.data()->setWindowIcon(QIcon(":icons/falkon.svg")); connect(closeButton, SIGNAL(clicked()), m_settings.data(), SLOT(close())); } m_settings.data()->show(); m_settings.data()->raise(); } void TestPlugin::populateWebViewMenu(QMenu* menu, WebView* view, const WebHitTestResult &r) { Q_UNUSED(r) // Called from WebView when creating context menu m_view = view; QString title; if (!r.imageUrl().isEmpty()) { title += " on image"; } if (!r.linkUrl().isEmpty()) { title += " on link"; } if (r.isContentEditable()) { title += " on input"; } menu->addAction(tr("My first plugin action") + title, this, SLOT(actionSlot())); } bool TestPlugin::mousePress(Qz::ObjectName type, QObject* obj, QMouseEvent* event) { qDebug() << "mousePress" << type << obj << event; // Returning false means, that we don't want to block propagating this event // Returning true may affect behaviour of Falkon, so make sure you know what // you are doing! return false; } void TestPlugin::actionSlot() { QMessageBox::information(m_view, tr("Hello"), tr("First plugin action works :-)")); } diff --git a/src/plugins/TestPlugin/testplugin.h b/src/plugins/TestPlugin/testplugin.h index c4b6eec7..b0a141bb 100644 --- a/src/plugins/TestPlugin/testplugin.h +++ b/src/plugins/TestPlugin/testplugin.h @@ -1,60 +1,59 @@ /* ============================================================ * Falkon - Qt web browser * Copyright (C) 2010-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef TESTPLUGIN_H #define TESTPLUGIN_H // Include plugininterface.h for your version of Falkon #include "plugininterface.h" #include #include #include #include class TestPlugin_Sidebar; class TestPlugin : public QObject, public PluginInterface { Q_OBJECT Q_INTERFACES(PluginInterface) - Q_PLUGIN_METADATA(IID "Falkon.Browser.plugin.TestPlugin") + Q_PLUGIN_METADATA(IID "Falkon.Browser.plugin.TestPlugin" FILE "testplugin.json") public: explicit TestPlugin(); - DesktopFile metaData() const override; void init(InitState state, const QString &settingsPath) override; void unload() override; bool testPlugin() override; void showSettings(QWidget *parent) override; void populateWebViewMenu(QMenu *menu, WebView *view, const WebHitTestResult &r) override; bool mousePress(Qz::ObjectName type, QObject *obj, QMouseEvent *event) override; private Q_SLOTS: void actionSlot(); private: QPointer m_settings; WebView* m_view; QString m_settingsPath; TestPlugin_Sidebar *m_sideBar = nullptr; }; #endif // TESTPLUGIN_H diff --git a/src/plugins/TestPlugin/testplugin.json b/src/plugins/TestPlugin/testplugin.json new file mode 100644 index 00000000..0ecdf66a --- /dev/null +++ b/src/plugins/TestPlugin/testplugin.json @@ -0,0 +1,55 @@ +{ + "Comment": "Very simple minimal plugin example", + "Comment[ca@valencia]": "Exemple molt senzill d'un connector mínim", + "Comment[ca]": "Exemple molt senzill d'un connector mínim", + "Comment[cs]": "Jednoduchá ukázka modulu", + "Comment[da]": "Meget simpelt minimalt plugin eksempel", + "Comment[de]": "Einfaches minimales Beispielmodul", + "Comment[en_GB]": "Very simple minimal plugin example", + "Comment[es]": "Complemento de ejemplo mínimo, muy sencillo", + "Comment[fi]": "Hyvin yksinkertainen esimerkki minimaalisesta liitännäisestä", + "Comment[fr]": "Exemple de module externe minimaliste très simple", + "Comment[gl]": "Exemplo de complemento mínimo moi simple", + "Comment[id]": "Contoh plugin minimal yang sangat sederhana", + "Comment[it]": "Estensione di esempio molto semplice e minimale", + "Comment[nl]": "Zeer eenvoudige minimaal voorbeeld voor plug-in", + "Comment[nn]": "Veldig enkelt og lite eksempel-tillegg", + "Comment[pl]": "Bardzo prosty i minimalny przykład wtyczki", + "Comment[pt]": "'Plugin' de exemplo muito simples e minimalista", + "Comment[pt_BR]": "Um exemplo de plugin mínimo e simples", + "Comment[sk]": "Veľmi jednoduchý príkladový doplnok", + "Comment[sv]": "Mycket enkelt minimalt exempel på ett insticksprogram", + "Comment[uk]": "Дуже простий мінімальний приклад додатка", + "Comment[x-test]": "xxVery simple minimal plugin examplexx", + "Comment[zh_CN]": "非常简单的最小化插件示范", + "Comment[zh_TW]": "非常簡單的最小外掛程式範例", + "Icon": "configure", + "Name": "Example Plugin", + "Name[ca@valencia]": "Connector d'exemple", + "Name[ca]": "Connector d'exemple", + "Name[cs]": "Ukázkový modul", + "Name[da]": "Eksempel plugin", + "Name[de]": "Beispielmodul", + "Name[en_GB]": "Example Plugin", + "Name[es]": "Complemento de ejemplo", + "Name[fi]": "Esimerkkiliitännäinen", + "Name[fr]": "Exemple de module externe", + "Name[gl]": "Complemento de exemplo", + "Name[id]": "Example Plugin", + "Name[it]": "Estensione di esempio", + "Name[nl]": "Voorbeeld plug-in", + "Name[nn]": "Eksempel-tillegg", + "Name[pl]": "Przykładowa wtyczka", + "Name[pt]": "'Plugin' de Exemplo", + "Name[pt_BR]": "Plugin de exemplo", + "Name[sk]": "Ukážkový doplnok", + "Name[sv]": "Exempelinsticksprogram", + "Name[uk]": "Приклад додатка", + "Name[x-test]": "xxExample Pluginxx", + "Name[zh_CN]": "示例插件", + "Name[zh_TW]": "外掛程式範例", + "X-Falkon-Author": "David Rosca", + "X-Falkon-Email": "nowrep@gmail.com", + "X-Falkon-Settings": "true", + "X-Falkon-Version": "0.1.7" +} diff --git a/src/plugins/TestPlugin/testplugin.qrc b/src/plugins/TestPlugin/testplugin.qrc deleted file mode 100644 index f2a437ff..00000000 --- a/src/plugins/TestPlugin/testplugin.qrc +++ /dev/null @@ -1,5 +0,0 @@ - - - metadata.desktop - - diff --git a/src/plugins/VerticalTabs/metadata.desktop b/src/plugins/VerticalTabs/metadata.desktop deleted file mode 100644 index baa4e278..00000000 --- a/src/plugins/VerticalTabs/metadata.desktop +++ /dev/null @@ -1,56 +0,0 @@ -[Desktop Entry] -Name=Vertical Tabs -Name[ca]=Pestanyes verticals -Name[ca@valencia]=Pestanyes verticals -Name[cs]=Svislé karty -Name[da]=Lodrette faneblade -Name[de]=Senkrechte Unterfenster -Name[en_GB]=Vertical Tabs -Name[es]=Pestañas verticales -Name[fi]=Pystyvälilehdet -Name[fr]=Onglets verticaux -Name[gl]=Lapelas verticais -Name[id]=Vertical Tabs -Name[it]=Schede verticali -Name[nl]=Verticale tabbladen -Name[nn]=Loddrette faner -Name[pl]=Pionowe karty -Name[pt]=Páginas Verticais -Name[pt_BR]=Guias verticais -Name[sk]=Vertikálne karty -Name[sv]=Vertikala flikar -Name[uk]=Вертикальні вкладки -Name[x-test]=xxVertical Tabsxx -Name[zh_CN]=垂直标签页 -Name[zh_TW]=垂直分頁 -Comment=Adds ability to show tabs in sidebar -Comment[ca]=Afegeix la possibilitat de mostrar les pestanyes a la barra lateral -Comment[ca@valencia]=Afig la possibilitat de mostrar les pestanyes a la barra lateral -Comment[cs]=Přidává schopnost zobrazit karty v postranní liště -Comment[da]=Tilføjer mulighed for at vise faneblade i sidepanel -Comment[de]=Anzeige von Unterfenstern in der Seitenleiste -Comment[en_GB]=Adds ability to show tabs in sidebar -Comment[es]=Añade la posibilidad de mostrar pestañas en la barra lateral -Comment[fi]=Lisää kyvyn näyttää välilehdet sivupalkissa -Comment[fr]=Prise en charge de l'affichage des onglets dans le panneau latéral -Comment[gl]=Engade a posibilidade de mostrar lapelas na barra lateral -Comment[id]=Menambah kemampuan untuk menampilkan tab dalam bilah sisi -Comment[it]=Aggiunge la capacità di mostrare le schede nella barra laterale -Comment[nl]=Voegt mogelijkheid toe om tabbladen in de zijbalk te tonen -Comment[nn]=Gjer det mogleg å visa faner i sidestolpen -Comment[pl]=Dodaje możliwość pokazywania kart na pasku bocznym -Comment[pt]=Adiciona a capacidade de mostrar as páginas na barra lateral -Comment[pt_BR]=Adiciona a habilidade de mostrar guias na barra lateral -Comment[sk]=Pridáva schopnosť zobraziť karty v bočnom paneli -Comment[sv]=Lägger till möjlighet att visa flikar i sidorader -Comment[uk]=Додає можливість показу вкладок на бічній панелі -Comment[x-test]=xxAdds ability to show tabs in sidebarxx -Comment[zh_CN]=添加在边栏中显示标签页的功能 - -Icon=:verticaltabs/data/icon.svg -Type=Service - -X-Falkon-Author=David Rosca -X-Falkon-Email=nowrep@gmail.com -X-Falkon-Version=0.1.0 -X-Falkon-Settings=true diff --git a/src/plugins/VerticalTabs/verticaltabs.json b/src/plugins/VerticalTabs/verticaltabs.json new file mode 100644 index 00000000..ed5375cf --- /dev/null +++ b/src/plugins/VerticalTabs/verticaltabs.json @@ -0,0 +1,54 @@ +{ + "Comment": "Adds ability to show tabs in sidebar", + "Comment[ca@valencia]": "Afig la possibilitat de mostrar les pestanyes a la barra lateral", + "Comment[ca]": "Afegeix la possibilitat de mostrar les pestanyes a la barra lateral", + "Comment[cs]": "Přidává schopnost zobrazit karty v postranní liště", + "Comment[da]": "Tilføjer mulighed for at vise faneblade i sidepanel", + "Comment[de]": "Anzeige von Unterfenstern in der Seitenleiste", + "Comment[en_GB]": "Adds ability to show tabs in sidebar", + "Comment[es]": "Añade la posibilidad de mostrar pestañas en la barra lateral", + "Comment[fi]": "Lisää kyvyn näyttää välilehdet sivupalkissa", + "Comment[fr]": "Prise en charge de l'affichage des onglets dans le panneau latéral", + "Comment[gl]": "Engade a posibilidade de mostrar lapelas na barra lateral", + "Comment[id]": "Menambah kemampuan untuk menampilkan tab dalam bilah sisi", + "Comment[it]": "Aggiunge la capacità di mostrare le schede nella barra laterale", + "Comment[nl]": "Voegt mogelijkheid toe om tabbladen in de zijbalk te tonen", + "Comment[nn]": "Gjer det mogleg å visa faner i sidestolpen", + "Comment[pl]": "Dodaje możliwość pokazywania kart na pasku bocznym", + "Comment[pt]": "Adiciona a capacidade de mostrar as páginas na barra lateral", + "Comment[pt_BR]": "Adiciona a habilidade de mostrar guias na barra lateral", + "Comment[sk]": "Pridáva schopnosť zobraziť karty v bočnom paneli", + "Comment[sv]": "Lägger till möjlighet att visa flikar i sidorader", + "Comment[uk]": "Додає можливість показу вкладок на бічній панелі", + "Comment[x-test]": "xxAdds ability to show tabs in sidebarxx", + "Comment[zh_CN]": "添加在边栏中显示标签页的功能", + "Icon": "base64:PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMiAyMiI+CiAgPGRlZnMgaWQ9ImRlZnMzMDUxIj4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyIgaWQ9ImN1cnJlbnQtY29sb3Itc2NoZW1lIj4KICAgICAgLkNvbG9yU2NoZW1lLVRleHQgewogICAgICAgIGNvbG9yOiM0ZDRkNGQ7CiAgICAgIH0KICAgICAgPC9zdHlsZT4KICA8L2RlZnM+CiA8cGF0aCAKICAgIHN0eWxlPSJmaWxsOmN1cnJlbnRDb2xvcjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgCiAgICBkPSJNIDQuNSAzIEMgMy42NzE1NzkgMyAzLjAwMDAwOCAzLjY3MTU3IDMgNC41IEMgMy4wMDAwMDggNS4zMjg0MyAzLjY3MTU3OSA2IDQuNSA2IEMgNS4zMjg0MjEgNiA1Ljk5OTk5MiA1LjMyODQzIDYgNC41IEMgNS45OTk5OTIgMy42NzE1NyA1LjMyODQyMSAzIDQuNSAzIHogTSA3IDQgTCA3IDUgTCA4IDUgTCA4IDQgTCA3IDQgeiBNIDkgNCBMIDkgNSBMIDE5IDUgTCAxOSA0IEwgOSA0IHogTSA5IDYgTCA5IDcgTCAxMiA3IEwgMTIgNiBMIDkgNiB6IE0gNC41IDkgQyAzLjY3MTU3MyA4Ljk5OTk5OTkgMyA5LjY3MTU3MiAzIDEwLjUgQyAzIDExLjMyODQyOCAzLjY3MTU3MyAxMi4wMDAwMDEgNC41IDEyIEMgNS4zMjg0MjcgMTIgNiAxMS4zMjg0MjggNiAxMC41IEMgNiA5LjY3MTU3MiA1LjMyODQyNyA4Ljk5OTk5OSA0LjUgOSB6IE0gNyAxMCBMIDcgMTEgTCA4IDExIEwgOCAxMCBMIDcgMTAgeiBNIDkgMTAgTCA5IDExIEwgMTkgMTEgTCAxOSAxMCBMIDkgMTAgeiBNIDkgMTIgTCA5IDEzIEwgMTMgMTMgTCAxMyAxMiBMIDkgMTIgeiBNIDQuNSAxNSBDIDMuNjcxNTczIDE1IDMgMTUuNjcxNTcyIDMgMTYuNSBDIDMgMTcuMzI4NDI4IDMuNjcxNTczIDE4LjAwMDAwMSA0LjUgMTggQyA1LjMyODQyNyAxOCA2IDE3LjMyODQyOCA2IDE2LjUgQyA2IDE1LjY3MTU3MiA1LjMyODQyNyAxNC45OTk5OTkgNC41IDE1IHogTSA3IDE2IEwgNyAxNyBMIDggMTcgTCA4IDE2IEwgNyAxNiB6IE0gOSAxNiBMIDkgMTcgTCAxOSAxNyBMIDE5IDE2IEwgOSAxNiB6IE0gOSAxOCBMIDkgMTkgTCAxNiAxOSBMIDE2IDE4IEwgOSAxOCB6ICIKCWNsYXNzPSJDb2xvclNjaGVtZS1UZXh0IgogICAgLz4gIAo8L3N2Zz4K", + "Name": "Vertical Tabs", + "Name[ca@valencia]": "Pestanyes verticals", + "Name[ca]": "Pestanyes verticals", + "Name[cs]": "Svislé karty", + "Name[da]": "Lodrette faneblade", + "Name[de]": "Senkrechte Unterfenster", + "Name[en_GB]": "Vertical Tabs", + "Name[es]": "Pestañas verticales", + "Name[fi]": "Pystyvälilehdet", + "Name[fr]": "Onglets verticaux", + "Name[gl]": "Lapelas verticais", + "Name[id]": "Vertical Tabs", + "Name[it]": "Schede verticali", + "Name[nl]": "Verticale tabbladen", + "Name[nn]": "Loddrette faner", + "Name[pl]": "Pionowe karty", + "Name[pt]": "Páginas Verticais", + "Name[pt_BR]": "Guias verticais", + "Name[sk]": "Vertikálne karty", + "Name[sv]": "Vertikala flikar", + "Name[uk]": "Вертикальні вкладки", + "Name[x-test]": "xxVertical Tabsxx", + "Name[zh_CN]": "垂直标签页", + "Name[zh_TW]": "垂直分頁", + "X-Falkon-Author": "David Rosca", + "X-Falkon-Email": "nowrep@gmail.com", + "X-Falkon-Settings": "true", + "X-Falkon-Version": "0.1.0" +} diff --git a/src/plugins/VerticalTabs/verticaltabs.qrc b/src/plugins/VerticalTabs/verticaltabs.qrc index cff351ab..42fecc7e 100644 --- a/src/plugins/VerticalTabs/verticaltabs.qrc +++ b/src/plugins/VerticalTabs/verticaltabs.qrc @@ -1,15 +1,14 @@ - metadata.desktop data/icon.svg data/group.svg data/index.html data/group.html data/themes/default.css data/themes/windows.css data/themes/windows-tab-close.svg data/themes/windows-tab-close-a.svg data/themes/windows-tab-close-h.svg data/themes/simple.css diff --git a/src/plugins/VerticalTabs/verticaltabsplugin.cpp b/src/plugins/VerticalTabs/verticaltabsplugin.cpp index 73209254..c1cfac4f 100644 --- a/src/plugins/VerticalTabs/verticaltabsplugin.cpp +++ b/src/plugins/VerticalTabs/verticaltabsplugin.cpp @@ -1,221 +1,215 @@ /* ============================================================ * VerticalTabs plugin for Falkon * Copyright (C) 2018 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "verticaltabsplugin.h" #include "verticaltabssettings.h" #include "verticaltabscontroller.h" #include "verticaltabsschemehandler.h" #include "browserwindow.h" #include "pluginproxy.h" #include "mainapplication.h" #include "tabwidget.h" #include "tabbar.h" #include "sidebar.h" #include "networkmanager.h" #include "../config.h" -#include "desktopfile.h" #include VerticalTabsPlugin::VerticalTabsPlugin() : QObject() { } -DesktopFile VerticalTabsPlugin::metaData() const -{ - return DesktopFile(QSL(":verticaltabs/metadata.desktop")); -} - void VerticalTabsPlugin::init(InitState state, const QString &settingsPath) { m_settingsPath = settingsPath + QL1S("/extensions.ini"); QSettings settings(m_settingsPath, QSettings::IniFormat); settings.beginGroup(QSL("VerticalTabs")); m_viewType = static_cast(settings.value(QSL("ViewType"), TabListView).toInt()); m_replaceTabBar = settings.value(QSL("ReplaceTabBar"), false).toBool(); m_addChildBehavior = static_cast(settings.value(QSL("AddChildBehavior"), AppendChild).toInt()); m_theme = settings.value(QSL("Theme"), QSL(":verticaltabs/data/themes/default.css")).toString(); settings.endGroup(); m_controller = new VerticalTabsController(this); SideBarManager::addSidebar(QSL("VerticalTabs"), m_controller); m_schemeHandler = new VerticalTabsSchemeHandler(this); mApp->networkManager()->registerExtensionSchemeHandler(QSL("verticaltabs"), m_schemeHandler); mApp->plugins()->registerAppEventHandler(PluginProxy::KeyPressHandler, this); setWebTabBehavior(m_addChildBehavior); loadStyleSheet(m_theme); connect(mApp->plugins(), &PluginProxy::mainWindowCreated, this, &VerticalTabsPlugin::mainWindowCreated); if (state == LateInitState) { const auto windows = mApp->windows(); for (BrowserWindow *window : windows) { mainWindowCreated(window); if (window->sideBarManager()->activeSideBar().isEmpty()) { window->sideBarManager()->showSideBar(QSL("VerticalTabs")); } } } } void VerticalTabsPlugin::unload() { setTabBarVisible(true); SideBarManager::removeSidebar(m_controller); delete m_controller; m_controller = nullptr; mApp->networkManager()->unregisterExtensionSchemeHandler(m_schemeHandler); } bool VerticalTabsPlugin::testPlugin() { return (Qz::VERSION == QSL(FALKON_VERSION)); } void VerticalTabsPlugin::showSettings(QWidget *parent) { VerticalTabsSettings *settings = new VerticalTabsSettings(this, parent); settings->exec(); } bool VerticalTabsPlugin::keyPress(Qz::ObjectName type, QObject *obj, QKeyEvent *event) { if (type == Qz::ON_TabWidget) { return m_controller->handleKeyPress(event, static_cast(obj)); } return false; } VerticalTabsPlugin::ViewType VerticalTabsPlugin::viewType() const { return m_viewType; } void VerticalTabsPlugin::setViewType(ViewType type) { if (m_viewType == type) { return; } m_viewType = type; QSettings settings(m_settingsPath, QSettings::IniFormat); settings.setValue(QSL("VerticalTabs/ViewType"), m_viewType); emit viewTypeChanged(m_viewType); } bool VerticalTabsPlugin::replaceTabBar() const { return m_replaceTabBar; } void VerticalTabsPlugin::setReplaceTabBar(bool replace) { if (m_replaceTabBar == replace) { return; } m_replaceTabBar = replace; setTabBarVisible(!m_replaceTabBar); QSettings settings(m_settingsPath, QSettings::IniFormat); settings.setValue(QSL("VerticalTabs/ReplaceTabBar"), m_replaceTabBar); } VerticalTabsPlugin::AddChildBehavior VerticalTabsPlugin::addChildBehavior() const { return m_addChildBehavior; } void VerticalTabsPlugin::setAddChildBehavior(AddChildBehavior behavior) { if (m_addChildBehavior == behavior) { return; } m_addChildBehavior = behavior; setWebTabBehavior(m_addChildBehavior); QSettings settings(m_settingsPath, QSettings::IniFormat); settings.setValue(QSL("VerticalTabs/AddChildBehavior"), m_addChildBehavior); } QString VerticalTabsPlugin::theme() const { return m_theme; } void VerticalTabsPlugin::setTheme(const QString &theme) { if (theme.isEmpty()) { return; } // Don't check if same to allow live reloading stylesheet m_theme = theme; loadStyleSheet(m_theme); QSettings settings(m_settingsPath, QSettings::IniFormat); settings.setValue(QSL("VerticalTabs/Theme"), m_theme); } QString VerticalTabsPlugin::styleSheet() const { return m_styleSheet; } void VerticalTabsPlugin::mainWindowCreated(BrowserWindow *window) { Q_UNUSED(window) setTabBarVisible(!m_replaceTabBar); } void VerticalTabsPlugin::setTabBarVisible(bool visible) { const auto windows = mApp->windows(); for (BrowserWindow *window : windows) { window->tabWidget()->tabBar()->setForceHidden(!visible); } } void VerticalTabsPlugin::setWebTabBehavior(AddChildBehavior behavior) { WebTab::setAddChildBehavior(behavior == AppendChild ? WebTab::AppendChild : WebTab::PrependChild); } void VerticalTabsPlugin::loadStyleSheet(const QString &theme) { QFile file(theme); if (!file.open(QFile::ReadOnly)) { qWarning() << "Failed to open stylesheet file" << theme; file.setFileName(QSL(":verticaltabs/data/themes/default.css")); file.open(QFile::ReadOnly); } m_styleSheet = QString::fromUtf8(file.readAll()); emit styleSheetChanged(m_styleSheet); } diff --git a/src/plugins/VerticalTabs/verticaltabsplugin.h b/src/plugins/VerticalTabs/verticaltabsplugin.h index 995ca38b..bdd2dba6 100644 --- a/src/plugins/VerticalTabs/verticaltabsplugin.h +++ b/src/plugins/VerticalTabs/verticaltabsplugin.h @@ -1,85 +1,84 @@ /* ============================================================ * VerticalTabs plugin for Falkon * Copyright (C) 2018 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #pragma once #include "plugininterface.h" class BrowserWindow; class VerticalTabsController; class VerticalTabsSchemeHandler; class VerticalTabsPlugin : public QObject, public PluginInterface { Q_OBJECT Q_INTERFACES(PluginInterface) - Q_PLUGIN_METADATA(IID "Falkon.Browser.plugin.VerticalTabs") + Q_PLUGIN_METADATA(IID "Falkon.Browser.plugin.VerticalTabs" FILE "verticaltabs.json") public: explicit VerticalTabsPlugin(); - DesktopFile metaData() const override; void init(InitState state, const QString &settingsPath) override; void unload() override; bool testPlugin() override; void showSettings(QWidget *parent = nullptr) override; bool keyPress(Qz::ObjectName type, QObject *obj, QKeyEvent *event) override; enum ViewType { TabListView, TabTreeView }; ViewType viewType() const; void setViewType(ViewType type); bool replaceTabBar() const; void setReplaceTabBar(bool replace); enum AddChildBehavior { AppendChild, PrependChild }; AddChildBehavior addChildBehavior() const; void setAddChildBehavior(AddChildBehavior behavior); QString theme() const; void setTheme(const QString &theme); QString styleSheet() const; Q_SIGNALS: void viewTypeChanged(ViewType type); void styleSheetChanged(const QString &styleSheet); private: void mainWindowCreated(BrowserWindow *window); void setTabBarVisible(bool visible); void setWebTabBehavior(AddChildBehavior behavior); void loadStyleSheet(const QString &theme); QString m_settingsPath; VerticalTabsController *m_controller = nullptr; VerticalTabsSchemeHandler *m_schemeHandler = nullptr; ViewType m_viewType = TabListView; bool m_replaceTabBar = false; AddChildBehavior m_addChildBehavior = AppendChild; QString m_theme; QString m_styleSheet; }; diff --git a/src/scripts/CMakeLists.txt b/src/scripts/CMakeLists.txt index 70a3fa89..d3850122 100644 --- a/src/scripts/CMakeLists.txt +++ b/src/scripts/CMakeLists.txt @@ -1,24 +1,27 @@ function(install_python_script name) if (ENABLE_PYTHON_PLUGINS) install( DIRECTORY ${name} DESTINATION ${FALKON_INSTALL_PLUGINDIR} FILES_MATCHING PATTERN "*" PATTERN "Messages.sh" EXCLUDE ) install(FILES i18n.py DESTINATION "${FALKON_INSTALL_PLUGINDIR}/${name}") endif() endfunction() function(install_qml_script name) install( DIRECTORY ${name} DESTINATION ${FALKON_INSTALL_PLUGINDIR} FILES_MATCHING PATTERN "*" PATTERN "Messages.sh" EXCLUDE ) endfunction() -# install_python_script(hellopython) install_python_script(runaction) install_python_script(middleclickloader) -# install_qml_script(helloqml) +if (CMAKE_BUILD_TYPE STREQUAL "Debug") + install_python_script(hellopython) + install_qml_script(helloqml) +endif() +