diff options
author | Sergey Udaltsov <svu@gnome.org> | 2006-07-31 00:25:02 +0000 |
---|---|---|
committer | Sergey Udaltsov <svu@gnome.org> | 2006-07-31 00:25:02 +0000 |
commit | 05f3b8c07cd8352ce97e97063bc6a61fd22f4ebf (patch) | |
tree | 2e4434e572a2f0c1b52bd75e38f0aea7c01fbc12 /libxklavier/xklavier_config.c | |
parent | acc06580a498896c7e05e29eeb2f9b8bc7521738 (diff) | |
download | libxklavier-05f3b8c07cd8352ce97e97063bc6a61fd22f4ebf.tar.gz |
First bits of code for the runtime DOM cleanup
Diffstat (limited to 'libxklavier/xklavier_config.c')
-rw-r--r-- | libxklavier/xklavier_config.c | 91 |
1 files changed, 71 insertions, 20 deletions
diff --git a/libxklavier/xklavier_config.c b/libxklavier/xklavier_config.c index 5c03d29..2dfb695 100644 --- a/libxklavier/xklavier_config.c +++ b/libxklavier/xklavier_config.c @@ -14,6 +14,15 @@ static xmlXPathCompExprPtr models_xpath; static xmlXPathCompExprPtr layouts_xpath; static xmlXPathCompExprPtr option_groups_xpath; + +#define XKBCR_MODEL_PATH "/xkbConfigRegistry/modelList/model" +#define XKBCR_LAYOUT_PATH "/xkbConfigRegistry/layoutList/layout" +#define XKBCR_VARIANT_PATH XKBCR_LAYOUT_PATH "/variantList/variant" +#define XKBCR_GROUP_PATH "/xkbConfigRegistry/optionList/group" +#define XKBCR_OPTION_PATH XKBCR_GROUP_PATH "/option" + +#define LANG_ATTR "lang" + enum { PROP_0, PROP_ENGINE, @@ -26,7 +35,7 @@ static xmlChar * xkl_node_get_xml_lang_attr(xmlNodePtr nptr) { if (nptr->properties != NULL && - !g_ascii_strcasecmp("lang", (char *) nptr->properties[0].name) + !g_ascii_strcasecmp(LANG_ATTR, (char *) nptr->properties[0].name) && nptr->properties[0].ns != NULL && !g_ascii_strcasecmp("xml", (char *) nptr->properties[0].ns->prefix) @@ -145,10 +154,10 @@ xkl_read_config_item(XklConfigRegistry * config, xmlNodePtr iptr, } if (desc_element != NULL && desc_element->children != NULL) { - gchar *lmsg = - xkl_locale_from_utf8(config, - (const gchar *) desc_element-> - children->content); + gchar *lmsg = xkl_locale_from_utf8(config, + (const gchar *) + desc_element->children-> + content); strncat(item->description, lmsg, XKL_MAX_CI_DESC_LENGTH - 1); g_free(lmsg); @@ -351,6 +360,44 @@ xkl_config_registry_get_instance(XklEngine * engine) return config; } +static void +xkl_config_registry_clean_languages_in_xpath(XklConfigRegistry * config, + gchar * xpath_expr) +{ + xmlXPathObjectPtr xpath_obj = + xmlXPathEval((unsigned char *) xpath_expr, + xkl_config_registry_priv(config, + xpath_context)); + if (xpath_obj != NULL && xpath_obj->nodesetval != NULL) { + xmlNodePtr *pnode = xpath_obj->nodesetval->nodeTab; + gint i; + + for (i = xpath_obj->nodesetval->nodeNr; --i >= 0;) { + /* + * TODO - drop description subnodes + * for irrelevant languages + */ + pnode++; + } + xmlXPathFreeObject(xpath_obj); + } +} + +static void +xkl_config_registry_clean_languages(XklConfigRegistry * config) +{ + xkl_config_registry_clean_languages_in_xpath(config, + XKBCR_MODEL_PATH); + xkl_config_registry_clean_languages_in_xpath(config, + XKBCR_LAYOUT_PATH); + xkl_config_registry_clean_languages_in_xpath(config, + XKBCR_VARIANT_PATH); + xkl_config_registry_clean_languages_in_xpath(config, + XKBCR_GROUP_PATH); + xkl_config_registry_clean_languages_in_xpath(config, + XKBCR_OPTION_PATH); +} + gboolean xkl_config_registry_load_from_file(XklConfigRegistry * config, const gchar * file_name) @@ -360,11 +407,14 @@ xkl_config_registry_load_from_file(XklConfigRegistry * config, xkl_config_registry_priv(config, xpath_context) = NULL; xkl_last_error_message = "Could not parse XKB configuration registry"; - } else - xkl_config_registry_priv(config, xpath_context) = - xmlXPathNewContext(xkl_config_registry_priv - (config, doc)); - return xkl_config_registry_is_initialized(config); + return FALSE; + } + xkl_config_registry_priv(config, xpath_context) = + xmlXPathNewContext(xkl_config_registry_priv(config, doc)); + + xkl_config_registry_clean_languages(config); + + return TRUE; } void @@ -405,7 +455,7 @@ xkl_config_registry_foreach_layout_variant(XklConfigRegistry * config, { xkl_config_registry_foreach_in_xpath_with_param (config, - "/xkbConfigRegistry/layoutList/layout/variantList/variant[../../configItem/name = '%s']", + XKBCR_VARIANT_PATH "[../../configItem/name = '%s']", layout_name, func, data); } @@ -465,7 +515,7 @@ xkl_config_registry_foreach_option(XklConfigRegistry * config, { xkl_config_registry_foreach_in_xpath_with_param (config, - "/xkbConfigRegistry/optionList/group/option[../configItem/name = '%s']", + XKBCR_OPTION_PATH "[../configItem/name = '%s']", option_group_name, func, data); } @@ -476,7 +526,7 @@ xkl_config_registry_find_model(XklConfigRegistry * config, return xkl_config_registry_find_object (config, - "/xkbConfigRegistry/modelList/model[configItem/name = '%s%s']", + XKBCR_MODEL_PATH "[configItem/name = '%s%s']", "", pitem, NULL); } @@ -487,7 +537,7 @@ xkl_config_registry_find_layout(XklConfigRegistry * config, return xkl_config_registry_find_object (config, - "/xkbConfigRegistry/layoutList/layout[configItem/name = '%s%s']", + XKBCR_LAYOUT_PATH "[configItem/name = '%s%s']", "", pitem, NULL); } @@ -499,7 +549,7 @@ xkl_config_registry_find_variant(XklConfigRegistry * config, return xkl_config_registry_find_object (config, - "/xkbConfigRegistry/layoutList/layout/variantList/variant" + XKBCR_VARIANT_PATH "[../../configItem/name = '%s' and configItem/name = '%s']", layout_name, pitem, NULL); } @@ -510,7 +560,8 @@ xkl_config_registry_find_option_group(XklConfigRegistry * config, { xmlNodePtr node = NULL; gboolean rv = xkl_config_registry_find_object(config, - "/xkbConfigRegistry/optionList/group[configItem/name = '%s%s']", + XKBCR_GROUP_PATH + "[configItem/name = '%s%s']", "", pitem, &node); @@ -537,7 +588,7 @@ xkl_config_registry_find_option(XklConfigRegistry * config, { return xkl_config_registry_find_object - (config, "/xkbConfigRegistry/optionList/group/option" + (config, XKBCR_OPTION_PATH "[../configItem/name = '%s' and configItem/name = '%s']", option_group_name, pitem, NULL); } @@ -733,10 +784,10 @@ xkl_config_registry_class_init(XklConfigRegistryClass * klass) xmlXPathInit(); models_xpath = xmlXPathCompile((unsigned char *) - "/xkbConfigRegistry/modelList/model"); + XKBCR_MODEL_PATH); layouts_xpath = xmlXPathCompile((unsigned char *) - "/xkbConfigRegistry/layoutList/layout"); + XKBCR_LAYOUT_PATH); option_groups_xpath = xmlXPathCompile((unsigned char *) - "/xkbConfigRegistry/optionList/group"); + XKBCR_GROUP_PATH); xkl_i18n_init(); } |