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