diff options
author | Reuben Thomas <rrt@sc3d.org> | 2016-12-07 21:39:20 +0000 |
---|---|---|
committer | Reuben Thomas <rrt@sc3d.org> | 2016-12-20 21:52:30 +0000 |
commit | 854316a78f47c91aceb8da35777166c259ad88e2 (patch) | |
tree | b9fbe3da3acdcbafa6306d2009c4f6006ff21980 /src/enchant.c | |
parent | f43dd19648047957d0285ccbe96e2ce824ab035c (diff) | |
download | enchant-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.c | 50 |
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); } |