diff options
-rw-r--r-- | include/core/plugin.h | 33 | ||||
-rw-r--r-- | src/main.cpp | 2 | ||||
-rw-r--r-- | src/plugin.cpp | 93 | ||||
-rw-r--r-- | src/privatescreen.h | 3 |
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; |