13#include <KConfigGroup>
14#include <KPluginFactory>
15#include <KPluginMetaData>
16#include <QPluginLoader>
21static const QString s_pluginDirectory = QStringLiteral(
"kwin/plugins");
23static QJsonValue readPluginInfo(
const QJsonObject &metadata,
const QString &key)
25 return metadata.value(QLatin1String(
"KPlugin")).toObject().value(key);
30 const KConfigGroup config(kwinApp()->config(), QStringLiteral(
"Plugins"));
32 auto checkEnabled = [&config](
const QString &pluginId,
const QJsonObject &metadata) {
33 const QString configKey = pluginId + QLatin1String(
"Enabled");
34 if (config.hasKey(configKey)) {
35 return config.readEntry(configKey,
false);
37 return readPluginInfo(metadata, QStringLiteral(
"EnabledByDefault")).toBool(
false);
40 const QList<KPluginMetaData> plugins = KPluginMetaData::findPlugins(s_pluginDirectory);
41 for (
const KPluginMetaData &metadata : plugins) {
42 if (m_plugins.find(metadata.pluginId()) != m_plugins.end()) {
43 qCWarning(KWIN_CORE) <<
"Conflicting plugin id" << metadata.pluginId();
46 if (checkEnabled(metadata.pluginId(), metadata.rawData())) {
59 ret.reserve(m_plugins.size());
60 for (
const auto &[key, _] : m_plugins) {
68 const QList<KPluginMetaData> plugins = KPluginMetaData::findPlugins(s_pluginDirectory);
71 ret.reserve(plugins.size());
73 for (
const KPluginMetaData &metadata : plugins) {
74 ret.append(metadata.pluginId());
82 if (m_plugins.find(pluginId) != m_plugins.end()) {
83 qCDebug(KWIN_CORE) <<
"Plugin with id" << pluginId <<
"is already loaded";
86 const KPluginMetaData metadata = KPluginMetaData::findPluginById(s_pluginDirectory, pluginId);
87 if (metadata.isValid()) {
97 if (!metadata.isValid()) {
98 qCDebug(KWIN_CORE) <<
"PluginManager::loadPlugin needs a valid plugin metadata";
102 const QString pluginId = metadata.pluginId();
103 QPluginLoader pluginLoader(metadata.fileName());
105 qCWarning(KWIN_CORE) << pluginId <<
"has mismatching plugin version";
109 std::unique_ptr<PluginFactory> factory(qobject_cast<PluginFactory *>(pluginLoader.instance()));
111 qCWarning(KWIN_CORE) <<
"Failed to get plugin factory for" << pluginId;
115 if (std::unique_ptr<Plugin> plugin = factory->create()) {
116 m_plugins[pluginId] = std::move(plugin);
125 auto it = m_plugins.find(pluginId);
126 if (it != m_plugins.end()) {
129 qCWarning(KWIN_CORE) <<
"No plugin with the specified id:" << pluginId;
135#include "moc_pluginmanager.cpp"
QStringList loadedPlugins() const
QStringList availablePlugins() const
~PluginManager() override
bool loadPlugin(const QString &pluginId)
void unloadPlugin(const QString &pluginId)
#define PluginFactory_iid