2 #include "plugins/obconf_interface.h"
9 typedef struct ConfigPlugin {
15 PluginStartupFunc start;
16 PluginShutdownFunc stop;
17 PluginInterfaceVersionFunc interface;
18 PluginNameFunc getname;
19 PluginPluginNameFunc getpname;
21 PluginToplevelWidgetFunc toplevel;
22 PluginEditedFunc edited;
27 GSList *plugins_list = NULL;
29 static gpointer load_sym(GModule *module, char *name, char *symbol,
33 if (!g_module_symbol(module, symbol, &var)) {
35 g_warning("Failed to load symbol '%s' from plugin '%s'",
42 static void add_plugin(ConfigPlugin *p)
46 gtk_list_store_append(obconf_sections_store, &it);
47 gtk_list_store_set(obconf_sections_store, &it, 0, p->name, -1);
48 gtk_notebook_append_page(obconf_options, p->toplevel(), NULL);
51 void load_dir(char *path)
61 suffix = g_strconcat("-config.", G_MODULE_SUFFIX, NULL);
63 if (!(dir = opendir(path)))
65 while ((dirp = readdir(dir))) {
66 if (g_strrstr(dirp->d_name, suffix)) {
67 /* look for duplicates */
68 for (it = plugins_list; it; it = it->next)
69 if (!strcmp(((ConfigPlugin*)it->data)->fname, dirp->d_name))
72 fpath = g_build_filename(path, dirp->d_name, NULL);
74 if ((mod = g_module_open(fpath, 0))) {
75 p = g_new(ConfigPlugin, 1);
77 p->fname = g_strdup(dirp->d_name);
79 p->interface = (PluginInterfaceVersionFunc)
80 load_sym(p->module, p->fname,
81 "plugin_interface_version",
83 p->start = (PluginStartupFunc)
84 load_sym(p->module, p->fname, "plugin_startup", FALSE);
85 p->stop = (PluginShutdownFunc)
86 load_sym(p->module, p->fname, "plugin_shutdown",FALSE);
87 p->getname = (PluginNameFunc)
88 load_sym(p->module, p->fname, "plugin_name", FALSE);
89 p->getpname = (PluginNameFunc)
90 load_sym(p->module, p->fname, "plugin_plugin_name",
92 p->icon = (PluginIconFunc)
93 load_sym(p->module, p->fname, "plugin_icon", FALSE);
94 p->toplevel = (PluginToplevelWidgetFunc)
95 load_sym(p->module, p->fname, "plugin_toplevel_widget",
97 p->edited = (PluginEditedFunc)
98 load_sym(p->module, p->fname, "plugin_edited", FALSE);
99 p->load = (PluginLoadFunc)
100 load_sym(p->module, p->fname, "plugin_load", FALSE);
101 p->save = (PluginSaveFunc)
102 load_sym(p->module, p->fname, "plugin_save", FALSE);
113 g_module_close(p->module);
118 p->name = p->getname();
119 p->plugin_name = p->getpname();
120 plugins_list = g_slist_append(plugins_list, p);
122 add_plugin(p); /* add to the gui */
137 path = g_build_filename(g_get_home_dir(), ".openbox", "plugins", NULL);
144 gboolean plugins_edited(ConfigPlugin *p)
149 void plugins_load_settings(ConfigPlugin *p, xmlDocPtr doc, xmlNodePtr root)
154 void plugins_save_settings(ConfigPlugin *p, xmlDocPtr doc, xmlNodePtr root)