summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Endrodi <ext-adam.endrodi@nokia.com>2011-01-05 15:26:42 +0200
committerAdam Endrodi <ext-adam.endrodi@nokia.com>2011-01-05 15:26:42 +0200
commitbf2d2bbb4d48bae9f426332a1c26c2d253fce1ef (patch)
treedbb841f861517e7c969cda947afae4451b5b95ac
parentfdb8066eafe119604743a32aaed00c01698059e6 (diff)
make it possible to specify the plugin to load on the command line
...and don't load those in the hardwired location. This is useful when you're experimenting with different plugins and you want to switch betweehn them. * src/mcompositemanager.h: changed MCompositeManagerPrivate::loadPlugins() -- to take a file and a directory path -- to load the file if specified -- to check if the directory exists -- to warn if it does but no plugins could be loaded from there * src/mcompositemanager.cpp: changed MCompositeManagerPrivate::loadPlugins(): -- to take a directory path -- to skip non-library files in the path * src/mcompositemanager_p.h: added MCompositeManagerPrivate::loadPlugin() * src/mcompositor/main.cpp: pass app.arguments to loadPlugins()
-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);