summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mcompositor/main.cpp6
-rw-r--r--src/mcompositemanager.cpp41
-rw-r--r--src/mcompositemanager.h10
-rw-r--r--src/mcompositemanager_p.h4
4 files changed, 45 insertions, 16 deletions
diff --git a/mcompositor/main.cpp b/mcompositor/main.cpp
index 1c5db6c..0436f5b 100644
--- a/mcompositor/main.cpp
+++ b/mcompositor/main.cpp
@@ -87,9 +87,13 @@ int main(int argc, char *argv[])
w->makeCurrent();
view.show();
+ // The directory is hard-coded for now. could be moved this
+ // to $plugindir later.
app.prepareEvents();
app.redirectWindows();
- app.loadPlugins();
+ app.loadPlugins(app.arguments().count() > 1
+ ? app.arguments().at(1) : QString(),
+ "/usr/lib/mcompositor");
return app.exec();
}
diff --git a/src/mcompositemanager.cpp b/src/mcompositemanager.cpp
index 2e5f312..2adaa40 100644
--- a/src/mcompositemanager.cpp
+++ b/src/mcompositemanager.cpp
@@ -811,26 +811,33 @@ void MCompositeManagerPrivate::prepare()
prepared = true;
}
-void MCompositeManagerPrivate::loadPlugins()
+void MCompositeManagerPrivate::loadPlugin(const QString &fileName)
{
- // hard-coded for now. move this to plugindir later
-#define PDIR "/usr/lib/mcompositor"
- QDir pluginsDir = QDir(PDIR);
-
- foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
QObject *plugin;
MCompmgrExtensionFactory* factory;
-
- QPluginLoader loader(pluginsDir.absoluteFilePath(fileName));
+ QPluginLoader loader(fileName);
if (!(plugin = loader.instance()))
qFatal("couldn't load %s: %s",
- loader.fileName().toLatin1().constData(),
+ fileName.toLatin1().constData(),
loader.errorString().toLatin1().constData());
if (!(factory = qobject_cast<MCompmgrExtensionFactory *>(plugin)))
qFatal("%s is not a MCompmgrExtensionFactory",
- loader.fileName().toLatin1().constData());
+ fileName.toLatin1().constData());
factory->create();
- }
+}
+
+int MCompositeManagerPrivate::loadPlugins(const QDir &dir)
+{
+ int nloaded = 0;
+ foreach (QString fileName, dir.entryList(QDir::Files)) {
+ if (!QLibrary::isLibrary(fileName)) {
+ qWarning() << fileName << "doesn't look like a library, skipping";
+ continue;
+ }
+ loadPlugin(dir.absoluteFilePath(fileName));
+ nloaded++;
+ }
+ return nloaded;
}
bool MCompositeManagerPrivate::needDecoration(Window window,
@@ -4246,9 +4253,17 @@ void MCompositeManager::prepareEvents()
d->prepare();
}
-void MCompositeManager::loadPlugins()
+void MCompositeManager::loadPlugins(const QString &overridePluginPath,
+ const QString &regularPluginDir)
{
- d->loadPlugins();
+ if (!overridePluginPath.isEmpty()) {
+ d->loadPlugin(QString(overridePluginPath));
+ return;
+ }
+
+ QDir pluginDir = QDir(regularPluginDir);
+ if (pluginDir.exists() && !d->loadPlugins(pluginDir))
+ qWarning("no plugins loaded");
}
bool MCompositeManager::x11EventFilter(XEvent *event)
diff --git a/src/mcompositemanager.h b/src/mcompositemanager.h
index 25ccc70..3fd9096 100644
--- a/src/mcompositemanager.h
+++ b/src/mcompositemanager.h
@@ -22,6 +22,7 @@
#include <QApplication>
#include <QGLWidget>
+#include <QDir>
#include "mwindowpropertycache.h"
class QGraphicsScene;
@@ -99,7 +100,14 @@ public:
*/
void redirectWindows();
- void loadPlugins();
+ /*!
+ * Load @overridePluginPath if provided and abort if fails.
+ * Otherwise, if there's no @overridePluginPath loads plugins
+ * from @regularPluginDir but skips non-library files and
+ * does not abort if there aren't plugins.
+ */
+ void loadPlugins(const QString &overridePluginPath,
+ const QString &regularPluginDir);
/*!
* Returns whether a Window is redirected or not
diff --git a/src/mcompositemanager_p.h b/src/mcompositemanager_p.h
index 2c5a20e..e8f7c0c 100644
--- a/src/mcompositemanager_p.h
+++ b/src/mcompositemanager_p.h
@@ -24,6 +24,7 @@
#include <QHash>
#include <QPixmap>
#include <QTimer>
+#include <QDir>
#include <X11/Xutil.h>
#include <X11/Xlib.h>
@@ -71,7 +72,8 @@ public:
QGraphicsScene *scene();
void prepare();
- void loadPlugins();
+ void loadPlugin(const QString &fileName);
+ int loadPlugins(const QDir &dir);
void activateWindow(Window w, Time timestamp,
bool disableCompositing = true,
bool stacked = false);