diff options
-rw-r--r-- | mcompositor/main.cpp | 6 | ||||
-rw-r--r-- | src/mcompositemanager.cpp | 41 | ||||
-rw-r--r-- | src/mcompositemanager.h | 10 | ||||
-rw-r--r-- | src/mcompositemanager_p.h | 4 |
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 ®ularPluginDir) { - 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 ®ularPluginDir); /*! * 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); |