00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef _COMPIZ_PLUGIN_H
00027 #define _COMPIZ_PLUGIN_H
00028
00029 #include <compiz.h>
00030 #include <core/option.h>
00031
00032 class CompScreen;
00033 extern CompScreen *screen;
00034
00035 #include <map>
00036
00037 #define HOME_PLUGINDIR ".compiz-1/plugins"
00038
00039 #define COMPIZ_PLUGIN_20090315(name, classname) \
00040 CompPlugin::VTable * name##VTable = NULL; \
00041 extern "C" { \
00042 CompPlugin::VTable * getCompPluginVTable20090315_##name () \
00043 { \
00044 if (!name##VTable) \
00045 { \
00046 name##VTable = new classname (); \
00047 name##VTable->initVTable (TOSTRING (name), &name##VTable);\
00048 return name##VTable; \
00049 } \
00050 else \
00051 return name##VTable; \
00052 } \
00053 }
00054
00055 class CompPlugin;
00056
00057 typedef bool (*LoadPluginProc) (CompPlugin *p,
00058 const char *path,
00059 const char *name);
00060
00061 typedef void (*UnloadPluginProc) (CompPlugin *p);
00062
00063 typedef CompStringList (*ListPluginsProc) (const char *path);
00064
00065 extern LoadPluginProc loaderLoadPlugin;
00066 extern UnloadPluginProc loaderUnloadPlugin;
00067 extern ListPluginsProc loaderListPlugins;
00068
00069 union CompPrivate {
00070 void *ptr;
00071 long val;
00072 unsigned long uval;
00073 void *(*fptr) (void);
00074 };
00075
00081 class CompPlugin {
00082 public:
00083 class VTable {
00084 public:
00085 VTable ();
00086 virtual ~VTable ();
00087
00088 void initVTable (CompString name,
00089 CompPlugin::VTable **self = NULL);
00090
00094 const CompString name () const;
00095
00096 virtual bool init () = 0;
00097
00098 virtual void fini ();
00099
00100 virtual bool initScreen (CompScreen *s);
00101
00102 virtual void finiScreen (CompScreen *s);
00103
00104 virtual bool initWindow (CompWindow *w);
00105
00106 virtual void finiWindow (CompWindow *w);
00107
00108 virtual CompOption::Vector & getOptions ();
00109
00110 virtual bool setOption (const CompString &name,
00111 CompOption::Value &value);
00112 private:
00113 CompString mName;
00114 VTable **mSelf;
00115 };
00116
00120 template <typename T, typename T2>
00121 class VTableForScreenAndWindow : public VTable {
00122 bool initScreen (CompScreen *s);
00123
00124 void finiScreen (CompScreen *s);
00125
00126 bool initWindow (CompWindow *w);
00127
00128 void finiWindow (CompWindow *w);
00129
00130 CompOption::Vector & getOptions ();
00131
00132 bool setOption (const CompString &name, CompOption::Value &value);
00133 };
00134
00138 template <typename T>
00139 class VTableForScreen : public VTable {
00140 bool initScreen (CompScreen *s);
00141
00142 void finiScreen (CompScreen *s);
00143
00144 CompOption::Vector & getOptions ();
00145
00146 bool setOption (const CompString &name, CompOption::Value &value);
00147 };
00148
00152 struct cmpStr
00153 {
00154 bool operator () (const char *a, const char *b) const
00155 {
00156 return strcmp (a, b) < 0;
00157 }
00158 };
00159
00160 typedef std::map<const char *, CompPlugin *, cmpStr> Map;
00161 typedef std::list<CompPlugin *> List;
00162
00163 public:
00164 CompPrivate devPrivate;
00165 CompString devType;
00166 VTable *vTable;
00167
00168 public:
00169
00170 static bool screenInitPlugins (CompScreen *s);
00171
00172 static void screenFiniPlugins (CompScreen *s);
00173
00174 static bool windowInitPlugins (CompWindow *w);
00175
00176 static void windowFiniPlugins (CompWindow *w);
00177
00181 static CompPlugin *find (const char *name);
00182
00187 static CompPlugin *load (const char *plugin);
00188
00194 static void unload (CompPlugin *p);
00195
00200 static bool push (CompPlugin *p);
00201
00206 static CompPlugin *pop (void);
00207
00212 static List & getPlugins ();
00213
00218 static std::list<CompString> availablePlugins ();
00219
00223 static int getPluginABI (const char *name);
00224
00229 static bool checkPluginABI (const char *name,
00230 int abi);
00231
00232 };
00233
00234
00235 template <typename T, typename T2>
00236 bool CompPlugin::VTableForScreenAndWindow<T,T2>::initScreen (CompScreen *s)
00237 {
00238 T * ps = new T (s);
00239 if (ps->loadFailed ())
00240 {
00241 delete ps;
00242 return false;
00243 }
00244 return true;
00245 }
00246
00247 template <typename T, typename T2>
00248 void CompPlugin::VTableForScreenAndWindow<T,T2>::finiScreen (CompScreen *s)
00249 {
00250 T * ps = T::get (s);
00251 delete ps;
00252 }
00253
00254 template <typename T, typename T2>
00255 bool CompPlugin::VTableForScreenAndWindow<T,T2>::initWindow (CompWindow *w)
00256 {
00257 T2 * pw = new T2 (w);
00258 if (pw->loadFailed ())
00259 {
00260 delete pw;
00261 return false;
00262 }
00263 return true;
00264 }
00265
00266 template <typename T, typename T2>
00267 void CompPlugin::VTableForScreenAndWindow<T,T2>::finiWindow (CompWindow *w)
00268 {
00269 T2 * pw = T2::get (w);
00270 delete pw;
00271 }
00272
00273 template <typename T, typename T2>
00274 CompOption::Vector & CompPlugin::VTableForScreenAndWindow<T,T2>::getOptions ()
00275 {
00276 CompOption::Class *oc = dynamic_cast<CompOption::Class *> (T::get (screen));
00277 if (!oc)
00278 return noOptions;
00279 return oc->getOptions ();
00280 }
00281
00282 template <typename T, typename T2>
00283 bool CompPlugin::VTableForScreenAndWindow<T,T2>::setOption (const CompString &name,
00284 CompOption::Value &value)
00285 {
00286 CompOption::Class *oc = dynamic_cast<CompOption::Class *> (T::get (screen));
00287 if (!oc)
00288 return false;
00289 return oc->setOption (name, value);
00290 }
00291
00292 template <typename T>
00293 bool CompPlugin::VTableForScreen<T>::initScreen (CompScreen *s)
00294 {
00295 T * ps = new T (s);
00296 if (ps->loadFailed ())
00297 {
00298 delete ps;
00299 return false;
00300 }
00301 return true;
00302 }
00303
00304 template <typename T>
00305 void CompPlugin::VTableForScreen<T>::finiScreen (CompScreen *s)
00306 {
00307 T * ps = T::get (s);
00308 delete ps;
00309 }
00310
00311 template <typename T>
00312 CompOption::Vector & CompPlugin::VTableForScreen<T>::getOptions ()
00313 {
00314 CompOption::Class *oc = dynamic_cast<CompOption::Class *> (T::get (screen));
00315 if (!oc)
00316 return noOptions;
00317 return oc->getOptions ();
00318 }
00319
00320 template <typename T>
00321 bool CompPlugin::VTableForScreen<T>::setOption (const CompString &name,
00322 CompOption::Value &value)
00323 {
00324 CompOption::Class *oc = dynamic_cast<CompOption::Class *> (T::get (screen));
00325 if (!oc)
00326 return false;
00327 return oc->setOption (name, value);
00328 }
00329
00330 typedef CompPlugin::VTable *(*PluginGetInfoProc) (void);
00331
00332 #endif