diff options
author | Sergey Udaltsov <svu@gnome.org> | 2008-04-22 23:32:37 +0000 |
---|---|---|
committer | Sergey Udaltsov <svu@gnome.org> | 2008-04-22 23:32:37 +0000 |
commit | ffe7952abc64aa376b3c531fec2167395226bfa4 (patch) | |
tree | a60b69fc0b420880d1dd4c4527cd43049e5e4acc | |
parent | 068422e3a7a0aae5983cde5d57ce18e4fb5fa560 (diff) | |
download | libxklavier-ffe7952abc64aa376b3c531fec2167395226bfa4.tar.gz |
more iso-related stuff
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | libxklavier/xkl_config_registry.h | 30 | ||||
-rw-r--r-- | libxklavier/xklavier_config.c | 2 | ||||
-rw-r--r-- | libxklavier/xklavier_config_iso.c | 89 | ||||
-rw-r--r-- | libxklavier/xklavier_private.h | 36 |
5 files changed, 132 insertions, 31 deletions
@@ -1,3 +1,9 @@ +2008-04-23 svu + + * libxklavier/xkl_config_registry.h, libxklavier/xklavier_config.c, + libxklavier/xklavier_config_iso.c, libxklavier/xklavier_private.h: + more ISO-related functionality + 2008-04-21 svu * configure.in, libxklavier/Makefile.am, diff --git a/libxklavier/xkl_config_registry.h b/libxklavier/xkl_config_registry.h index 28e27c5..e9a029a 100644 --- a/libxklavier/xkl_config_registry.h +++ b/libxklavier/xkl_config_registry.h @@ -106,6 +106,22 @@ extern "C" { gpointer data); /** + * TwoConfigItemsProcessFunc: + * @config: the config registry + * @item: the item from registry + * @subitem: the item from registry + * @data: anything which can be stored into the pointer + * + * Callback type used for enumerating layouts/variants for countries/languages + */ + typedef void (*TwoConfigItemsProcessFunc) (XklConfigRegistry * + config, + const XklConfigItem * + item, + const XklConfigItem * + subitem, gpointer data); + +/** * xkl_config_registry_foreach_model: * @config: the config registry * @func: callback to call for every model @@ -295,7 +311,7 @@ extern "C" { config, const gchar * country_code, - ConfigItemProcessFunc + TwoConfigItemsProcessFunc func, gpointer data); /** @@ -324,12 +340,12 @@ extern "C" { * from the XML configuration registry */ extern void - xkl_config_registry_foreach_country_variant(XklConfigRegistry * - config, - const gchar * - language_code, - ConfigItemProcessFunc - func, gpointer data); + xkl_config_registry_foreach_language_variant(XklConfigRegistry * + config, + const gchar * + language_code, + TwoConfigItemsProcessFunc + func, gpointer data); #ifdef __cplusplus } diff --git a/libxklavier/xklavier_config.c b/libxklavier/xklavier_config.c index 661b58e..d5d1193 100644 --- a/libxklavier/xklavier_config.c +++ b/libxklavier/xklavier_config.c @@ -141,7 +141,7 @@ xkl_item_populate_optional_array(XklConfigItem * item, xmlNodePtr ptr, return TRUE; } -static gboolean +gboolean xkl_read_config_item(XklConfigRegistry * config, xmlNodePtr iptr, XklConfigItem * item) { diff --git a/libxklavier/xklavier_config_iso.c b/libxklavier/xklavier_config_iso.c index 04434ab..e453fb2 100644 --- a/libxklavier/xklavier_config_iso.c +++ b/libxklavier/xklavier_config_iso.c @@ -202,7 +202,7 @@ xkl_config_registry_foreach_iso_code(XklConfigRegistry * config, ConfigItemProcessFunc func, const gchar * xpath_exprs[], DescriptionGetterFunc dgf, - gpointer data) + gboolean to_upper, gpointer data) { GHashTable *code_pairs; GHashTableIter iter; @@ -227,11 +227,17 @@ xkl_config_registry_foreach_iso_code(XklConfigRegistry * config, if (nodes != NULL) { xmlNodePtr *pnode = nodes->nodeTab; for (ni = nodes->nodeNr; --ni >= 0;) { - const gchar *iso_code = - (const gchar *) (*pnode)-> + gchar *iso_code = + (gchar *) (*pnode)-> children->content; - const gchar *description = - dgf(iso_code); + const gchar *description; + iso_code = + to_upper ? + g_ascii_strup(iso_code, + -1) : + g_strdup(iso_code); + description = dgf(iso_code); +/* If there is a mapping to some ISO description - consider it as ISO code (well, it is just an assumption) */ if (description) g_hash_table_insert (code_pairs, @@ -239,6 +245,7 @@ xkl_config_registry_foreach_iso_code(XklConfigRegistry * config, (iso_code), g_strdup (description)); + g_free(iso_code); pnode++; } } @@ -272,7 +279,8 @@ xkl_config_registry_foreach_country(XklConfigRegistry * }; xkl_config_registry_foreach_iso_code(config, func, xpath_exprs, - get_country_iso_code, data); + get_country_iso_code, TRUE, + data); } void @@ -287,5 +295,72 @@ xkl_config_registry_foreach_language(XklConfigRegistry * }; xkl_config_registry_foreach_iso_code(config, func, xpath_exprs, - get_language_iso_code, data); + get_language_iso_code, FALSE, + data); +} + +void +xkl_config_registry_foreach_country_variant(XklConfigRegistry * + config, + const gchar * + country_code, + TwoConfigItemsProcessFunc + func, gpointer data) +{ + const gchar *xpath_exprs[] = { + XKBCR_LAYOUT_PATH "[configItem/name = '%s']", + XKBCR_LAYOUT_PATH + "[configItem/countryList/iso3166Id = '%s']", + NULL + }; + const gboolean are_low_ids[] = { TRUE, FALSE }; + + + xmlXPathObjectPtr xpath_obj; + const gchar **xpath_expr; + const gboolean *is_low_id = are_low_ids; + + if (!xkl_config_registry_is_initialized(config)) + return; + + for (xpath_expr = xpath_exprs; *xpath_expr; + xpath_expr++, is_low_id++) { + gchar *acc = + *is_low_id ? g_ascii_strdown(country_code, + -1) : g_strdup(country_code); + gchar *xpe = g_strdup_printf(*xpath_expr, acc); + g_free(acc); + xpath_obj = + xmlXPathEval((unsigned char *) xpe, + xkl_config_registry_priv(config, + xpath_context)); + if (xpath_obj != NULL) { + xmlNodeSetPtr nodes = xpath_obj->nodesetval; + if (nodes != NULL) { + gint ni; + xmlNodePtr *pnode = nodes->nodeTab; + XklConfigItem *ci = xkl_config_item_new(); + for (ni = nodes->nodeNr; --ni >= 0;) { + if (xkl_read_config_item + (config, *pnode, ci)) + func(config, ci, NULL, + data); + pnode++; + } + g_object_unref(G_OBJECT(ci)); + } + xmlXPathFreeObject(xpath_obj); + } + g_free(xpe); + } +} + +void +xkl_config_registry_foreach_language_variant(XklConfigRegistry * + config, + const gchar * + language_code, + TwoConfigItemsProcessFunc + func, gpointer data) +{ } diff --git a/libxklavier/xklavier_private.h b/libxklavier/xklavier_private.h index df3baab..228412c 100644 --- a/libxklavier/xklavier_private.h +++ b/libxklavier/xklavier_private.h @@ -397,8 +397,9 @@ extern gchar *xkl_locale_from_utf8(XklConfigRegistry * config, const gchar * utf8string); extern gboolean xkl_config_registry_load_helper(XklConfigRegistry * config, - const char default_ruleset[], - const char base_dir[]); + const char + default_ruleset[], + const char base_dir[]); #define XKLAVIER_STATE_PROP_LENGTH 2 @@ -432,20 +433,23 @@ extern gboolean xkl_config_registry_load_helper(XklConfigRegistry * config, #define XML_TAG_ISO3166ID "iso3166Id" #define XML_TAG_ISO639ID "iso639Id" -extern void xkl_config_registry_foreach_in_xpath_with_param(XklConfigRegistry - * config, - const gchar * - format, - const gchar * - value, - ConfigItemProcessFunc - func, gpointer data); - -extern void xkl_config_registry_foreach_in_xpath(XklConfigRegistry * config, - xmlXPathCompExprPtr - xpath_comp_expr, - ConfigItemProcessFunc func, - gpointer data); +extern void +xkl_config_registry_foreach_in_xpath_with_param(XklConfigRegistry * config, + const gchar * format, + const gchar * value, + ConfigItemProcessFunc func, + gpointer data); + +extern void xkl_config_registry_foreach_in_xpath(XklConfigRegistry * + config, + xmlXPathCompExprPtr + xpath_comp_expr, + ConfigItemProcessFunc + func, gpointer data); + +extern gboolean xkl_read_config_item(XklConfigRegistry * config, + xmlNodePtr iptr, + XklConfigItem * item); extern gint xkl_debug_level; |