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
)