diff options
author | Sergey Udaltsov <svu@gnome.org> | 2008-04-15 20:53:37 +0000 |
---|---|---|
committer | Sergey Udaltsov <svu@gnome.org> | 2008-04-15 20:53:37 +0000 |
commit | c2c6316f2f23e87f6f1d7335ac12dbbb16a404a2 (patch) | |
tree | 1308b2cc19c68adfea31bf87e2ab48997a619605 | |
parent | 3be5407e80f5cf3994af63f2f0478c4bb46a9484 (diff) | |
download | libxklavier-c2c6316f2f23e87f6f1d7335ac12dbbb16a404a2.tar.gz |
processing language lists
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | libxklavier/xkl_config_item.h | 7 | ||||
-rw-r--r-- | libxklavier/xklavier_config.c | 98 | ||||
-rw-r--r-- | tests/test_config.c | 6 |
4 files changed, 75 insertions, 41 deletions
@@ -1,3 +1,8 @@ +2008-04-15 svu + + * libxklavier/xkl_config_item.h, libxklavier/xklavier_config.c, + tests/test_config.c: processing the language lists + 2008-04-14 svu * configure.in, libxklavier/xkl_config_item.h, diff --git a/libxklavier/xkl_config_item.h b/libxklavier/xkl_config_item.h index 0e72579..6535b95 100644 --- a/libxklavier/xkl_config_item.h +++ b/libxklavier/xkl_config_item.h @@ -90,11 +90,16 @@ extern "C" { #define XCI_PROP_VENDOR "vendor" /** - * Extra property for the XklConfigItem, defining the list of countryes (used for layouts/variants) + * Extra property for the XklConfigItem, defining the list of countries (used for layouts/variants) */ #define XCI_PROP_COUNTRY_LIST "countryList" /** + * Extra property for the XklConfigItem, defining the list of languages (used for layouts/variants) + */ +#define XCI_PROP_LANGUAGE_LIST "languageList" + +/** * The XklConfigItem class, derived from GObject */ struct _XklConfigItemClass { diff --git a/libxklavier/xklavier_config.c b/libxklavier/xklavier_config.c index b961f90..3620066 100644 --- a/libxklavier/xklavier_config.c +++ b/libxklavier/xklavier_config.c @@ -46,7 +46,9 @@ static xmlXPathCompExprPtr option_groups_xpath; #define XML_TAG_SHORT_DESCR "shortDescription" #define XML_TAG_VENDOR "vendor" #define XML_TAG_COUNTRY_LIST "countryList" +#define XML_TAG_LANGUAGE_LIST "languageList" #define XML_TAG_ISO3166ID "iso3166Id" +#define XML_TAG_ISO639ID "iso639Id" // gettext domain for translations #define XKB_DOMAIN "xkeyboard-config" @@ -109,16 +111,61 @@ xkl_find_nonlocalized_element(xmlNodePtr ptr, const gchar * tag_name) } static gboolean +xkl_item_populate_optional_array(XklConfigItem * item, xmlNodePtr ptr, + const gchar list_tag[], + const gchar element_tag[], + const gchar property_name[]) +{ + xmlNodePtr top_list_element = + xkl_find_nonlocalized_element(ptr, list_tag), element_ptr; + gint n_elements, idx; + gchar **elements = NULL; + + if (top_list_element == NULL || top_list_element->children == NULL) + return FALSE; + + n_elements = 0; + + /* First, count countries */ + element_ptr = top_list_element->children; + while (NULL != + (element_ptr = + xkl_find_nonlocalized_element(element_ptr, element_tag))) { + n_elements++; + element_ptr = element_ptr->next; + } + + if (n_elements == 0) + return FALSE; + + elements = g_new0(gchar *, n_elements); + /* Then, actually, populate the list */ + element_ptr = top_list_element->children; + for (idx = 0; + NULL != (element_ptr = + xkl_find_nonlocalized_element + (element_ptr, element_tag)); + element_ptr = element_ptr->next, idx++) { + elements[idx] = + g_strdup((const char *) element_ptr-> + children->content); + } + + g_object_set_data_full(G_OBJECT(item), + property_name, elements, (GDestroyNotify) + g_strfreev); + return TRUE; +} + +static gboolean xkl_read_config_item(XklConfigRegistry * config, xmlNodePtr iptr, XklConfigItem * item) { xmlNodePtr name_element, ptr; xmlNodePtr desc_element = NULL, short_desc_element = - NULL, vendor_element = NULL, country_list_element = - NULL, country_ptr = NULL; + NULL, vendor_element = NULL; + gchar *vendor = NULL; - gchar **countries = NULL; - gint n_countries, idx = 0; *item->name = 0; *item->short_description = 0; @@ -126,6 +173,7 @@ xkl_read_config_item(XklConfigRegistry * config, xmlNodePtr iptr, g_object_set_data(G_OBJECT(item), XCI_PROP_VENDOR, NULL); g_object_set_data(G_OBJECT(item), XCI_PROP_COUNTRY_LIST, NULL); + g_object_set_data(G_OBJECT(item), XCI_PROP_LANGUAGE_LIST, NULL); if (!xkl_xml_find_config_item_child(iptr, &ptr)) return FALSE; @@ -142,8 +190,6 @@ xkl_read_config_item(XklConfigRegistry * config, xmlNodePtr iptr, desc_element = xkl_find_nonlocalized_element(ptr, XML_TAG_DESCR); vendor_element = xkl_find_nonlocalized_element(ptr, XML_TAG_VENDOR); - country_list_element = - xkl_find_nonlocalized_element(ptr, XML_TAG_COUNTRY_LIST); if (name_element != NULL && name_element->children != NULL) strncat(item->name, @@ -174,40 +220,12 @@ xkl_read_config_item(XklConfigRegistry * config, xmlNodePtr iptr, vendor, g_free); } - if (country_list_element != NULL - && country_list_element->children != NULL) { - n_countries = 0; - - /* First, count countries */ - country_ptr = country_list_element->children; - while (NULL != - (country_ptr = - xkl_find_nonlocalized_element(country_ptr, - XML_TAG_ISO3166ID))) - { - n_countries++; - country_ptr = country_ptr->next; - } - - if (n_countries != 0) { - countries = g_new0(gchar *, n_countries); - /* Then, actually, populate the list */ - country_ptr = country_list_element->children; - for (idx = 0; - NULL != (country_ptr = - xkl_find_nonlocalized_element - (country_ptr, XML_TAG_ISO3166ID)); - country_ptr = country_ptr->next, idx++) { - countries[idx] = - g_strdup((const char *) country_ptr-> - children->content); - } - g_object_set_data_full(G_OBJECT(item), - XCI_PROP_COUNTRY_LIST, - countries, (GDestroyNotify) - g_strfreev); - } - } + xkl_item_populate_optional_array(item, ptr, XML_TAG_COUNTRY_LIST, + XML_TAG_ISO3166ID, + XCI_PROP_COUNTRY_LIST); + xkl_item_populate_optional_array(item, ptr, XML_TAG_LANGUAGE_LIST, + XML_TAG_ISO639ID, + XCI_PROP_LANGUAGE_LIST); return TRUE; } diff --git a/tests/test_config.c b/tests/test_config.c index 76bc42f..2ef07b7 100644 --- a/tests/test_config.c +++ b/tests/test_config.c @@ -97,6 +97,8 @@ print_xci(XklConfigRegistry * config, const XklConfigItem * item, { gchar **countries = (gchar **) g_object_get_data(G_OBJECT(item), XCI_PROP_COUNTRY_LIST); + gchar **languages = (gchar **) g_object_get_data(G_OBJECT(item), + XCI_PROP_LANGUAGE_LIST); gint i; printf("%*s[%s][%s][%s]\n", indent, "", item->name, item->description, item->short_description); @@ -104,6 +106,10 @@ print_xci(XklConfigRegistry * config, const XklConfigItem * item, for (i = 0; i < g_strv_length(countries); i++) printf("%*s country: [%s]\n", indent, "", countries[i]); + if (languages != NULL) + for (i = 0; i < g_strv_length(languages); i++) + printf("%*s language: [%s]\n", indent, "", + languages[i]); } static void |