summaryrefslogtreecommitdiff
path: root/src/enchant.c
diff options
context:
space:
mode:
authorReuben Thomas <rrt@sc3d.org>2016-12-07 21:39:20 +0000
committerReuben Thomas <rrt@sc3d.org>2016-12-20 21:52:30 +0000
commit854316a78f47c91aceb8da35777166c259ad88e2 (patch)
treeb9fbe3da3acdcbafa6306d2009c4f6006ff21980 /src/enchant.c
parentf43dd19648047957d0285ccbe96e2ce824ab035c (diff)
downloadenchant-854316a78f47c91aceb8da35777166c259ad88e2.tar.gz
Fix enchant_broker_list_dicts
List the top priority dictionary for each language tag. Note that this lists real dictionaries, but may not list the provider and dictionary that would actually be used for a given tag: for example, if myspell is the preferred provider for tag “en”, and it has an “en_UK” dictionary, it would be used to check “en” even if aspell, say, provides exactly an “en” dictionary. However, the dictionary list would show the aspell dictionary. See issue #8 for more details.
Diffstat (limited to 'src/enchant.c')
-rw-r--r--src/enchant.c50
1 files changed, 38 insertions, 12 deletions
diff --git a/src/enchant.c b/src/enchant.c
index 5231d06..297d730 100644
--- a/src/enchant.c
+++ b/src/enchant.c
@@ -1918,6 +1918,8 @@ enchant_broker_list_dicts (EnchantBroker * broker,
{
GSList *list;
GHashTable *tags;
+ GHashTableIter iter;
+ gpointer key, value;
g_return_if_fail (broker);
g_return_if_fail (fn);
@@ -1929,37 +1931,61 @@ enchant_broker_list_dicts (EnchantBroker * broker,
for (list = broker->provider_list; list != NULL; list = g_slist_next (list))
{
EnchantProvider *provider;
- GModule *module;
provider = (EnchantProvider *) list->data;
- module = (GModule *) provider->enchant_private_data;
if (provider->list_dicts)
{
- const char * tag, * name, * desc, * file;
size_t n_dicts, i;
- char ** dicts;
+ char ** dicts;
dicts = (*provider->list_dicts) (provider, &n_dicts);
- name = (*provider->identify) (provider);
- desc = (*provider->describe) (provider);
- file = g_module_name (module);
for (i = 0; i < n_dicts; i++)
{
+ const char * tag;
+
tag = dicts[i];
- if(enchant_is_valid_dictionary_tag(tag) &&
- !g_hash_table_lookup (tags, tag))
- {
- g_hash_table_insert (tags, g_strdup (tag), GINT_TO_POINTER(TRUE));
- (*fn) (tag, name, desc, file, user_data);
+ if (enchant_is_valid_dictionary_tag (tag)) {
+ gpointer ptr;
+ GSList *providers;
+ gint this_priority;
+
+ providers = enchant_get_ordered_providers (broker, tag);
+ this_priority = g_slist_index (providers, provider);
+ if (this_priority != -1) {
+ gint min_priority;
+
+ min_priority = this_priority + 1;
+ ptr = g_hash_table_lookup (tags, tag);
+ if (ptr != NULL)
+ min_priority = g_slist_index (providers, ptr);
+ if (this_priority < min_priority)
+ g_hash_table_insert (tags, g_strdup (tag), provider);
}
+ }
}
enchant_provider_free_string_list (provider, dicts);
}
}
+ g_hash_table_iter_init (&iter, tags);
+ while (g_hash_table_iter_next (&iter, &key, &value))
+ {
+ const char * tag, * name, * desc, * file;
+ EnchantProvider * provider;
+ GModule *module;
+
+ tag = (const char *) key;
+ provider = (EnchantProvider *) value;
+ module = (GModule *) provider->enchant_private_data;
+ name = (*provider->identify) (provider);
+ desc = (*provider->describe) (provider);
+ file = g_module_name (module);
+ (*fn) (tag, name, desc, file, user_data);
+ }
+
g_hash_table_destroy (tags);
}