4 typedef void (*PluginStartup)();
5 typedef void (*PluginShutdown)();
11 PluginStartup startup;
12 PluginShutdown shutdown;
15 static gpointer load_sym(GModule *module, char *name, char *symbol)
18 if (!g_module_symbol(module, symbol, &var))
19 g_warning("Failed to load symbol '%s' from plugin '%s'", symbol, name);
23 static Plugin *plugin_new(char *name)
30 path = g_build_filename(PLUGINDIR, name, NULL);
31 p->module = g_module_open(path, G_MODULE_BIND_LAZY);
34 if (p->module == NULL) {
35 path = g_build_filename(g_get_home_dir(), ".openbox", "plugins", name,
37 p->module = g_module_open(path, G_MODULE_BIND_LAZY);
41 if (p->module == NULL) {
46 p->startup = load_sym(p->module, name, "startup");
47 p->shutdown = load_sym(p->module, name, "shutdown");
49 if (p->startup == NULL || p->shutdown == NULL) {
50 g_module_close(p->module);
55 p->name = g_strdup(name);
59 static void plugin_free(Plugin *p)
64 g_module_close(p->module);
68 static GData *plugins = NULL;
72 g_datalist_init(&plugins);
75 void plugin_shutdown()
77 g_datalist_clear(&plugins);
80 gboolean plugin_open(char *name)
84 if (g_datalist_get_data(&plugins, name) != NULL) {
85 g_warning("plugin '%s' already loaded, can't load again", name);
91 g_warning("failed to load plugin '%s'", name);
95 g_datalist_set_data_full(&plugins, name, p, (GDestroyNotify) plugin_free);
100 void plugin_close(char *name)
102 g_datalist_remove_data(&plugins, name);