summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Udaltsov <svu@gnome.org>2008-04-22 23:32:37 +0000
committerSergey Udaltsov <svu@gnome.org>2008-04-22 23:32:37 +0000
commitffe7952abc64aa376b3c531fec2167395226bfa4 (patch)
treea60b69fc0b420880d1dd4c4527cd43049e5e4acc
parent068422e3a7a0aae5983cde5d57ce18e4fb5fa560 (diff)
downloadlibxklavier-ffe7952abc64aa376b3c531fec2167395226bfa4.tar.gz
more iso-related stuff
-rw-r--r--ChangeLog6
-rw-r--r--libxklavier/xkl_config_registry.h30
-rw-r--r--libxklavier/xklavier_config.c2
-rw-r--r--libxklavier/xklavier_config_iso.c89
-rw-r--r--libxklavier/xklavier_private.h36
5 files changed, 132 insertions, 31 deletions
diff --git a/ChangeLog b/ChangeLog
index 9851f78..e949192 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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;