diff --git a/src/plasma/applet.cpp b/src/plasma/applet.cpp --- a/src/plasma/applet.cpp +++ b/src/plasma/applet.cpp @@ -95,15 +95,21 @@ Applet::Applet(QObject *parentObject, const QVariantList &args) : QObject(0), - d(new AppletPrivate(KPluginMetaData(), args.count() > 1 ? args[1].toInt() : 0, this)) + d(new AppletPrivate(KPluginMetaData(), args.count() > 2 ? args[2].toInt() : 0, this)) { setParent(parentObject); if (args.count() > 0) { const QVariant first = args.first(); - if (first.canConvert()) { - d->appletDescription = KPluginMetaData(first.toString()); - } else if (first.canConvert()) { - auto metadata = first.toMap().value(QStringLiteral("MetaData")).toMap(); + if (first.canConvert()) { + d->package = first.value(); + } + } + if (args.count() > 1) { + const QVariant second = args[1]; + if (second.canConvert()) { + d->appletDescription = KPluginMetaData(second.toString()); + } else if (second.canConvert()) { + auto metadata = second.toMap().value(QStringLiteral("MetaData")).toMap(); d->appletDescription = KPluginMetaData(QJsonObject::fromVariantMap(metadata), {}); } } @@ -115,7 +121,7 @@ // WARNING: do not access config() OR globalConfig() in this method! // that requires a scene, which is not available at this point - d->init(QString(), args.mid(2)); + d->init(QString(), args.mid(3)); d->setupPackage(); } @@ -291,7 +297,7 @@ KConfigLoader *Applet::configScheme() const { if (!d->configLoader) { - const QString xmlPath = d->package ? d->package->filePath("mainconfigxml") : QString(); + const QString xmlPath = d->package.isValid() ? d->package.filePath("mainconfigxml") : QString(); KConfigGroup cfg = config(); if (xmlPath.isEmpty()) { d->configLoader = new KConfigLoader(cfg, 0); @@ -308,15 +314,13 @@ Package Applet::package() const { Package p; - if (d->package) { - p.d->internalPackage = new KPackage::Package(*d->package); - } + p.d->internalPackage = new KPackage::Package(d->package); return p; } KPackage::Package Applet::kPackage() const { - return d->package ? *d->package : KPackage::Package(); + return d->package; } void Applet::updateConstraints(Plasma::Types::Constraints constraints) diff --git a/src/plasma/pluginloader.cpp b/src/plasma/pluginloader.cpp --- a/src/plasma/pluginloader.cpp +++ b/src/plasma/pluginloader.cpp @@ -195,29 +195,30 @@ plugins = KPluginLoader::findPlugins(QString(), filter); } + const KPackage::Package p = KPackage::PackageLoader::self()->loadPackage(QStringLiteral("Plasma/Applet"), name); + if (!plugins.isEmpty()) { KPluginLoader loader(plugins.first().fileName()); if (!isPluginVersionCompatible(loader)) { return 0; } KPluginFactory *factory = loader.factory(); if (factory) { QVariantList allArgs; - allArgs << loader.metaData().toVariantMap() << appletId << args; + allArgs << QVariant::fromValue(p) << loader.metaData().toVariantMap() << appletId << args; applet = factory->create(0, allArgs); } } if (applet) { return applet; } - const KPackage::Package p = KPackage::PackageLoader::self()->loadPackage(QStringLiteral("Plasma/Applet"), name); if (!applet) { //qCDebug(LOG_PLASMA) << name << "not a C++ applet: Falling back to an empty one"; QVariantList allArgs; - allArgs << p.metadata().fileName() << appletId << args; + allArgs << QVariant::fromValue(p) << p.metadata().fileName() << appletId << args; if (p.metadata().serviceTypes().contains(QStringLiteral("Plasma/Containment"))) { applet = new Containment(0, allArgs); diff --git a/src/plasma/private/applet_p.h b/src/plasma/private/applet_p.h --- a/src/plasma/private/applet_p.h +++ b/src/plasma/private/applet_p.h @@ -93,7 +93,7 @@ // sripting and package stuff AppletScript *script; - KPackage::Package *package; + KPackage::Package package; KConfigLoader *configLoader; // actions stuff; put activationAction into actions? diff --git a/src/plasma/private/applet_p.cpp b/src/plasma/private/applet_p.cpp --- a/src/plasma/private/applet_p.cpp +++ b/src/plasma/private/applet_p.cpp @@ -106,8 +106,6 @@ delete script; script = 0; - delete package; - package = 0; delete configLoader; configLoader = 0; delete mainConfig; @@ -147,23 +145,23 @@ return; } - const QString packagePath = _packagePath.isEmpty() && !appletDescription.metaDataFileName().isEmpty() ? QFileInfo(appletDescription.metaDataFileName()).dir().path() : _packagePath; - QString path = appletDescription.rawData().value(QStringLiteral("X-Plasma-RootPath")).toString(); - if (path.isEmpty()) { - path = packagePath.isEmpty() ? appletDescription.pluginId() : packagePath; - } - Plasma::Package p = PluginLoader::self()->loadPackage(QStringLiteral("Plasma/Applet"), api); - p.setPath(path); + //A constructor may have set a valid package already + if (!package.isValid()) { + const QString packagePath = _packagePath.isEmpty() && !appletDescription.metaDataFileName().isEmpty() ? QFileInfo(appletDescription.metaDataFileName()).dir().path() : _packagePath; + QString path = appletDescription.rawData().value(QStringLiteral("X-Plasma-RootPath")).toString(); + if (path.isEmpty()) { + path = packagePath.isEmpty() ? appletDescription.pluginId() : packagePath; + } - package = new KPackage::Package(*p.d->internalPackage); + package = KPackage::PackageLoader::self()->loadPackage(QStringLiteral("Plasma/Applet")); + package.setPath(path); - if (!package->isValid()) { - delete package; - package = 0; - q->setLaunchErrorMessage(i18nc("Package file, name of the widget", - "Could not open the %1 package required for the %2 widget.", - appletDescription.pluginId(), appletDescription.name())); - return; + if (!package.isValid()) { + q->setLaunchErrorMessage(i18nc("Package file, name of the widget", + "Could not open the %1 package required for the %2 widget.", + appletDescription.pluginId(), appletDescription.name())); + return; + } } // now we try and set up the script engine. @@ -175,12 +173,10 @@ if (script) { //use the absolute path of the in-package icon as icon name if (appletDescription.iconName().startsWith(QLatin1Char('/'))) { - icon = package->filePath({}, appletDescription.iconName()); + icon = package.filePath({}, appletDescription.iconName()); } //package not valid, get rid of it } else { - delete package; - package = 0; q->setLaunchErrorMessage( i18nc("API or programming language the widget was written in, name of the widget", "Could not create a %1 ScriptEngine for the %2 widget.", @@ -461,7 +457,7 @@ // package exists and that we have a script engine void AppletPrivate::setupPackage() { - if (!package) { + if (!package.isValid()) { return; } @@ -476,7 +472,7 @@ // KGlobal::dirs()->addResourceDir("locale", translationsPath); // } - if (!package->filePath("mainconfigui").isEmpty()) { + if (!package.filePath("mainconfigui").isEmpty()) { q->setHasConfigurationInterface(true); } }