Mercurial > audlegacy
diff src/audacious/pluginenum.c @ 3437:3092a8b3fe34 trunk
Big plugin system changes (part 1 of who knows, it's still a big mess):
- remove plugin_matrix, replacing it with a mowgli.dictionary of all loaded plugins pointing back to their handles
- input_is_enabled() craq -> gboolean plugin::enabled (this craq was pointed out by ccr)
- consolidate a lot of crap in ui_preferences.c (a LOT more to come)
- introduce probably countless loads of bugs and SIGSEGVs.
- you WILL need to recompile plugins after this, and some which do not use C99-style struct initialisers will likely fail to build.
author | William Pitcock <nenolod@atheme.org> |
---|---|
date | Fri, 07 Sep 2007 03:20:28 -0500 |
parents | e21930ccd5a8 |
children | 7043b5c94a94 |
line wrap: on
line diff
--- a/src/audacious/pluginenum.c Fri Sep 07 02:02:53 2007 -0500 +++ b/src/audacious/pluginenum.c Fri Sep 07 03:20:28 2007 -0500 @@ -31,8 +31,6 @@ # define SHARED_SUFFIX G_MODULE_SUFFIX #endif -#include "pluginenum.h" - #include <glib.h> #include <gmodule.h> #include <glib/gprintf.h> @@ -51,15 +49,19 @@ #include "output.h" #include "visualization.h" #include "discovery.h" + +#include "pluginenum.h" + const gchar *plugin_dir_list[] = { PLUGINSUBS, NULL }; -GHashTable *plugin_matrix = NULL; GList *lowlevel_list = NULL; extern GList *vfs_transports; +mowgli_dictionary_t *plugin_dict = NULL; + static gint inputlist_compare_func(gconstpointer a, gconstpointer b) { @@ -123,45 +125,46 @@ static gboolean plugin_is_duplicate(const gchar * filename) { - GList *l; - const gchar *basename = g_basename(filename); - - /* FIXME: messy stuff */ - - for (l = ip_data.input_list; l; l = g_list_next(l)) - if (!strcmp(basename, g_basename(INPUT_PLUGIN(l->data)->filename))) - return TRUE; - - for (l = op_data.output_list; l; l = g_list_next(l)) - if (!strcmp(basename, g_basename(OUTPUT_PLUGIN(l->data)->filename))) - return TRUE; + gchar *base_filename = g_path_get_basename(filename); - for (l = ep_data.effect_list; l; l = g_list_next(l)) - if (!strcmp(basename, g_basename(EFFECT_PLUGIN(l->data)->filename))) - return TRUE; - - for (l = gp_data.general_list; l; l = g_list_next(l)) - if (!strcmp(basename, g_basename(GENERAL_PLUGIN(l->data)->filename))) - return TRUE; + if (mowgli_dictionary_retrieve(plugin_dict, base_filename) != NULL) + { + g_free(base_filename); + return TRUE; + } - for (l = vp_data.vis_list; l; l = g_list_next(l)) - if (!strcmp(basename, g_basename(VIS_PLUGIN(l->data)->filename))) - return TRUE; - - for (l = lowlevel_list; l; l = g_list_next(l)) - if (!strcmp(basename, g_basename(LOWLEVEL_PLUGIN(l->data)->filename))) - return TRUE; - - for (l = dp_data.discovery_list; l; l = g_list_next(l)) - if (!strcmp(basename, g_basename(DISCOVERY_PLUGIN(l->data)->filename))) - return TRUE; + g_free(base_filename); return FALSE; } +gboolean +plugin_is_enabled(const gchar *filename) +{ + Plugin *plugin = mowgli_dictionary_retrieve(plugin_dict, filename); -#define PLUGIN_GET_INFO(x) ((PluginGetInfoFunc)(x))() -typedef Plugin * (*PluginGetInfoFunc) (void); + if (!plugin) + return FALSE; + + return plugin->enabled; +} + +void +plugin_set_enabled(const gchar *filename, gboolean enabled) +{ + Plugin *plugin = mowgli_dictionary_retrieve(plugin_dict, filename); + + if (!plugin) + return; + + plugin->enabled = enabled; +} + +Plugin * +plugin_get_plugin(const gchar *filename) +{ + return mowgli_dictionary_retrieve(plugin_dict, filename); +} static void input_plugin_init(Plugin * plugin) @@ -180,8 +183,11 @@ ip_data.input_list = g_list_append(ip_data.input_list, p); - g_hash_table_replace(plugin_matrix, g_path_get_basename(p->filename), - GINT_TO_POINTER(1)); + p->enabled = TRUE; + + /* XXX: we need something better than p->filename if plugins + will eventually provide multiple plugins --nenolod */ + mowgli_dictionary_add(plugin_dict, g_basename(p->filename), p); } static void @@ -189,6 +195,8 @@ { OutputPlugin *p = OUTPUT_PLUGIN(plugin); op_data.output_list = g_list_append(op_data.output_list, p); + + mowgli_dictionary_add(plugin_dict, g_basename(p->filename), p); } static void @@ -196,6 +204,8 @@ { EffectPlugin *p = EFFECT_PLUGIN(plugin); ep_data.effect_list = g_list_append(ep_data.effect_list, p); + + mowgli_dictionary_add(plugin_dict, g_basename(p->filename), p); } static void @@ -203,6 +213,8 @@ { GeneralPlugin *p = GENERAL_PLUGIN(plugin); gp_data.general_list = g_list_append(gp_data.general_list, p); + + mowgli_dictionary_add(plugin_dict, g_basename(p->filename), p); } static void @@ -211,6 +223,8 @@ VisPlugin *p = VIS_PLUGIN(plugin); p->disable_plugin = vis_disable_plugin; vp_data.vis_list = g_list_append(vp_data.vis_list, p); + + mowgli_dictionary_add(plugin_dict, g_basename(p->filename), p); } static void @@ -218,6 +232,8 @@ { DiscoveryPlugin *p = DISCOVERY_PLUGIN(plugin); dp_data.discovery_list = g_list_append(dp_data.discovery_list, p); + + mowgli_dictionary_add(plugin_dict, g_basename(p->filename), p); } /*******************************************************************/ @@ -246,7 +262,6 @@ VisPlugin **vp_iter; DiscoveryPlugin **dp_iter; - if (header->magic != PLUGIN_MAGIC) return plugin2_dispose(module, "plugin <%s> discarded, invalid module magic", filename); @@ -406,8 +421,7 @@ return; } - plugin_matrix = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, - NULL); + plugin_dict = mowgli_dictionary_create(g_ascii_strcasecmp); #ifndef DISABLE_USER_PLUGIN_DIR scan_plugins(bmp_paths[BMP_PATH_USER_PLUGIN_DIR]); @@ -505,9 +519,9 @@ if (cfg.disabled_iplugins) { disabled = g_strsplit(cfg.disabled_iplugins, ":", 0); + while (disabled[i]) { - g_hash_table_replace(plugin_matrix, disabled[i], - GINT_TO_POINTER(FALSE)); + INPUT_PLUGIN(plugin_get_plugin(disabled))->enabled = FALSE; i++; } @@ -684,5 +698,5 @@ vfs_transports = NULL; } - g_hash_table_destroy( plugin_matrix ); + mowgli_dictionary_destroy(plugin_dict, NULL, NULL); }