1 
2 #ifndef PLUGIN_H
3 #define PLUGIN_H
4 #include <gmodule.h>
5 
6 
7 #include <gtk/gtk.h>
8 #include <gdk/gdk.h>
9 #include <stdio.h>
10 #include "panel.h"
11 
12 extern struct _plugin_instance *stam;
13 
14 typedef struct {
15     /* common */
16     char *fname;
17     int count;
18     GModule *gmodule;
19 
20     int dynamic : 1;
21     int invisible : 1;
22     /* these fields are pointers to the data within loaded dll */
23     char *type;
24     char *name;
25     char *version;
26     char *description;
27     int priv_size;
28 
29     int (*constructor)(struct _plugin_instance *this);
30     void (*destructor)(struct _plugin_instance *this);
31     void (*save_config)(struct _plugin_instance *this, FILE *fp);
32     GtkWidget *(*edit_config)(struct _plugin_instance *this);
33 } plugin_class;
34 
35 #define PLUGIN_CLASS(class) ((plugin_class *) class)
36 
37 typedef struct _plugin_instance{
38     plugin_class *class;
39     panel        *panel;
40     xconf        *xc;
41     GtkWidget    *pwid;
42     int           expand;
43     int           padding;
44     int           border;
45 } plugin_instance;
46 
47 void class_put(char *name);
48 gpointer class_get(char *name);
49 /* if plugin_instance is external it will load its dll */
50 plugin_instance * plugin_load(char *type);
51 void plugin_put(plugin_instance *this);
52 int plugin_start(plugin_instance *this);
53 void plugin_stop(plugin_instance *this);
54 GtkWidget *default_plugin_instance_edit_config(plugin_instance *pl);
55 
56 void class_register(plugin_class *p);
57 void class_unregister(plugin_class *p);
58 
59 #ifdef PLUGIN
60 static plugin_class *class_ptr;
61 static void ctor(void) __attribute__ ((constructor));
ctor(void)62 static void ctor(void) { class_register(class_ptr); }
63 static void dtor(void) __attribute__ ((destructor));
dtor(void)64 static void dtor(void) { class_unregister(class_ptr); }
65 #endif
66 
67 #endif
68