summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/core/plugin.h33
-rw-r--r--src/main.cpp2
-rw-r--r--src/plugin.cpp93
-rw-r--r--src/privatescreen.h3
4 files changed, 96 insertions, 35 deletions
diff --git a/include/core/plugin.h b/include/core/plugin.h
index d78a70f..d70c460 100644
--- a/include/core/plugin.h
+++ b/include/core/plugin.h
@@ -28,6 +28,7 @@
#include <compiz.h>
#include <core/option.h>
+#include <core/metadata.h>
#include <map>
@@ -53,6 +54,22 @@ bool setOption (const char *name, \
return false; \
}
+#define COMPIZ_PLUGIN_20081216(name, classname) \
+ CompPlugin::VTable * name##VTable = NULL; \
+ extern "C" { \
+ CompPlugin::VTable * getCompPluginVTable20081216_##name () \
+ { \
+ if (!name##VTable) \
+ { \
+ name##VTable = new classname (); \
+ name##VTable->initVTable (TOSTRING(name), &name##VTable); \
+ return name##VTable; \
+ } \
+ else \
+ return name##VTable; \
+ } \
+ }
+
class CompPlugin;
typedef bool (*LoadPluginProc) (CompPlugin *p,
@@ -71,15 +88,19 @@ class CompPlugin {
public:
class VTable {
public:
+ VTable ();
virtual ~VTable ();
-
- virtual const char * name () = 0;
- virtual CompMetadata * getMetadata ();
+ void initVTable (CompString name,
+ CompPlugin::VTable **self = NULL);
+
+ const CompString name () const;
+
+ CompMetadata * getMetadata () const;
virtual bool init () = 0;
- virtual void fini () = 0;
+ virtual void fini ();
virtual bool initScreen (CompScreen *screen);
@@ -93,6 +114,10 @@ class CompPlugin {
virtual bool setOption (const char *name,
CompOption::Value &value);
+ private:
+ CompString mName;
+ CompMetadata *mMetadata;
+ VTable **mSelf;
};
template <typename T, typename T2>
diff --git a/src/main.cpp b/src/main.cpp
index d9397fc..b9ba1c5 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -255,7 +255,7 @@ main (int argc, char **argv)
LIBXML_TEST_VERSION;
- coreMetadata = new CompMetadata ();
+ coreMetadata = getCoreVTable ()->getMetadata ();
if (!coreMetadata->addFromIO (readCoreXmlCallback, NULL, &ctx))
return 1;
diff --git a/src/plugin.cpp b/src/plugin.cpp
index e455251..60071a2 100644
--- a/src/plugin.cpp
+++ b/src/plugin.cpp
@@ -43,35 +43,30 @@ class CorePluginVTable : public CompPlugin::VTable
{
public:
- const char * name () { return "core"; };
-
- CompMetadata * getMetadata ();
-
bool init ();
- void fini ();
-
CompOption::Vector & getOptions ();
bool setOption (const char *name,
CompOption::Value &value);
};
-bool
-CorePluginVTable::init ()
-{
- return true;
-}
+COMPIZ_PLUGIN_20081216 (core, CorePluginVTable)
-void
-CorePluginVTable::fini ()
+CompPlugin::VTable * getCoreVTable ()
{
+ if (!coreVTable)
+ {
+ return getCompPluginVTable20081216_core ();
+ }
+
+ return coreVTable;
}
-CompMetadata *
-CorePluginVTable::getMetadata ()
+bool
+CorePluginVTable::init ()
{
- return coreMetadata;
+ return true;
}
CompOption::Vector &
@@ -87,8 +82,6 @@ CorePluginVTable::setOption (const char *name,
return screen->setOption (name, value);
}
-CorePluginVTable coreVTable;
-
static bool
cloaderLoadPlugin (CompPlugin *p,
const char *path,
@@ -97,10 +90,10 @@ cloaderLoadPlugin (CompPlugin *p,
if (path)
return false;
- if (strcmp (name, coreVTable.name ()))
+ if (strcmp (name, getCoreVTable ()->name ().c_str ()))
return false;
- p->vTable = &coreVTable;
+ p->vTable = getCoreVTable ();
p->devPrivate.ptr = NULL;
p->devType = "cloader";
@@ -120,7 +113,7 @@ cloaderListPlugins (const char *path)
if (path)
return CompStringList ();
- rv.push_back (CompString (coreVTable.name ()));
+ rv.push_back (CompString (getCoreVTable ()->name ()));
return rv;
}
@@ -147,11 +140,13 @@ dlloaderLoadPlugin (CompPlugin *p,
{
PluginGetInfoProc getInfo;
char *error;
+ char sym[1024];
dlerror ();
+ snprintf(sym, 1024, "getCompPluginVTable20081216_%s", name);
getInfo = (PluginGetInfoProc)
- dlsym (dlhand, "getCompPluginInfo20080805");
+ dlsym (dlhand, sym);
error = dlerror ();
if (error)
@@ -202,7 +197,10 @@ static void
dlloaderUnloadPlugin (CompPlugin *p)
{
if (p->devType.compare ("dlloader") == 0)
+ {
+ delete p->vTable;
dlclose (p->devPrivate.ptr);
+ }
else
cloaderUnloadPlugin (p);
}
@@ -263,7 +261,7 @@ initPlugin (CompPlugin *p)
if (!p->vTable->init ())
{
compLogMessage ("core", CompLogLevelError,
- "InitPlugin '%s' failed", p->vTable->name ());
+ "InitPlugin '%s' failed", p->vTable->name ().c_str ());
return false;
}
@@ -271,7 +269,7 @@ initPlugin (CompPlugin *p)
{
if (!p->vTable->initScreen (screen))
{
- compLogMessage (p->vTable->name (), CompLogLevelError,
+ compLogMessage (p->vTable->name ().c_str (), CompLogLevelError,
"initScreen failed");
p->vTable->fini ();
return false;
@@ -314,7 +312,7 @@ CompScreen::initPluginForScreen (CompPlugin *p)
w = *it;
if (!p->vTable->initWindow (w))
{
- compLogMessage (p->vTable->name (), CompLogLevelError,
+ compLogMessage (p->vTable->name ().c_str (), CompLogLevelError,
"initWindow failed");
fail = it;
status = false;
@@ -467,7 +465,7 @@ CompPlugin::load (const char *name)
bool
CompPlugin::push (CompPlugin *p)
{
- const char *name = p->vTable->name ();
+ const char *name = p->vTable->name ().c_str ();
std::pair<CompPlugin::Map::iterator, bool> insertRet =
pluginsMap.insert (std::pair<const char *, CompPlugin *> (name, p));
@@ -476,7 +474,7 @@ CompPlugin::push (CompPlugin *p)
{
compLogMessage ("core", CompLogLevelWarn,
"Plugin '%s' already active",
- p->vTable->name ());
+ p->vTable->name ().c_str ());
return false;
}
@@ -508,7 +506,7 @@ CompPlugin::pop (void)
if (!p)
return 0;
- pluginsMap.erase (p->vTable->name ());
+ pluginsMap.erase (p->vTable->name ().c_str ());
finiPlugin (p);
@@ -621,16 +619,51 @@ CompPlugin::checkPluginABI (const char *name,
return true;
}
+CompPlugin::VTable::VTable () :
+ mName (""),
+ mMetadata (NULL),
+ mSelf (NULL)
+{
+}
+
CompPlugin::VTable::~VTable ()
{
+ if (mSelf)
+ *mSelf = NULL;
+ if (mMetadata)
+ delete mMetadata;
+}
+
+void
+CompPlugin::VTable::initVTable (CompString name,
+ CompPlugin::VTable **self)
+{
+ mName = name;
+ if (self)
+ {
+ mSelf = self;
+ *mSelf = this;
+ }
+ if (!mMetadata)
+ mMetadata = new CompMetadata (name);
}
CompMetadata *
-CompPlugin::VTable::getMetadata ()
+CompPlugin::VTable::getMetadata () const
{
- return NULL;
+ return mMetadata;
+}
+
+const CompString
+CompPlugin::VTable::name () const
+{
+ return mName;
}
+void
+CompPlugin::VTable::fini ()
+{
+}
bool
CompPlugin::VTable::initScreen (CompScreen *)
diff --git a/src/privatescreen.h b/src/privatescreen.h
index d7018c8..f5699b1 100644
--- a/src/privatescreen.h
+++ b/src/privatescreen.h
@@ -33,6 +33,9 @@
#include <core/size.h>
#include <core/point.h>
#include <core/timer.h>
+#include <core/plugin.h>
+
+CompPlugin::VTable * getCoreVTable ();
extern bool shutDown;
extern bool restartSignal;