summaryrefslogtreecommitdiff
path: root/libxklavier
diff options
context:
space:
mode:
authorSergey Udaltsov <svu@gnome.org>2011-01-29 00:42:34 +0000
committerSergey Udaltsov <svu@gnome.org>2011-01-29 00:42:34 +0000
commitd203797186e1b7debf743536b1d992e44fc98b6b (patch)
treedf83356708cbf9dfd4889fee44e53bf3912199c0 /libxklavier
parent47f2b9ba60f9fda2468f23923b1ba03e326cd111 (diff)
downloadlibxklavier-d203797186e1b7debf743536b1d992e44fc98b6b.tar.gz
New function: search layout/variants by pattern. Basic implementation
Diffstat (limited to 'libxklavier')
-rw-r--r--libxklavier/xkl_config_registry.h20
-rw-r--r--libxklavier/xklavier_config.c96
-rw-r--r--libxklavier/xklavier_config_iso.c8
-rw-r--r--libxklavier/xklavier_private.h4
4 files changed, 124 insertions, 4 deletions
diff --git a/libxklavier/xkl_config_registry.h b/libxklavier/xkl_config_registry.h
index 75356b9..f798377 100644
--- a/libxklavier/xkl_config_registry.h
+++ b/libxklavier/xkl_config_registry.h
@@ -354,6 +354,26 @@ extern "C" {
TwoConfigItemsProcessFunc
func, gpointer data);
+
+/**
+ * xkl_config_registry_search_by_pattern:
+ * @config: the config registry
+ * @pattern: pattern to search for
+ * @func: callback to call for every matching layout/variant
+ * @data: anything which can be stored into the pointer
+ *
+ * Enumerates keyboard layout/variants that match the pattern.
+ * The layout/variant is considered as matching if one of the following
+ * is true:
+ * 1. Country description (from the country list) contains pattern as substring
+ * 2. Language description (from the language list) contains pattern as substring
+ */
+ extern void
+ xkl_config_registry_search_by_pattern(XklConfigRegistry * config,
+ const gchar * pattern,
+ TwoConfigItemsProcessFunc
+ func, gpointer data);
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/libxklavier/xklavier_config.c b/libxklavier/xklavier_config.c
index f829cef..25d006e 100644
--- a/libxklavier/xklavier_config.c
+++ b/libxklavier/xklavier_config.c
@@ -48,6 +48,14 @@ enum {
PROP_ENGINE
};
+typedef struct {
+ const gchar *pattern;
+ TwoConfigItemsProcessFunc func;
+ gpointer data;
+ gboolean country_matched;
+ gboolean language_matched;
+} SearchParamType;
+
static gboolean
xkl_xml_find_config_item_child(xmlNodePtr iptr, xmlNodePtr * ptr)
{
@@ -774,6 +782,94 @@ xkl_config_registry_foreach_option(XklConfigRegistry * config,
func, data);
}
+static void
+xkl_config_registry_search_by_pattern_in_layout(XklConfigRegistry * config,
+ const XklConfigItem * item,
+ SearchParamType *
+ search_param)
+{
+ gchar *upper_name = g_ascii_strup(item->name, -1);
+ const gchar *country_desc, *language_desc;
+
+ xkl_debug(200, "Layout to check: [%s]\n", item->name);
+
+ country_desc = xkl_get_country_iso_code(upper_name);
+ xkl_debug(200, "Checking layout country: [%s]\n", country_desc);
+ search_param->country_matched = FALSE;
+ if ((country_desc != NULL)
+ && strcasestr(country_desc, search_param->pattern)) {
+ search_param->country_matched = TRUE;
+ (search_param->func) (config, item, NULL,
+ search_param->data);
+ } else {
+ gchar **countries = g_object_get_data(G_OBJECT(item),
+ XCI_PROP_COUNTRY_LIST);
+ for (; countries && *countries; countries++) {
+ country_desc =
+ xkl_get_country_iso_code(*countries);
+ xkl_debug(200, "Checking country: [%s][%s]\n",
+ *countries, country_desc);
+ if ((country_desc != NULL) && strcasestr
+ (country_desc, search_param->pattern)) {
+ search_param->country_matched = TRUE;
+ (search_param->func) (config, item, NULL,
+ search_param->data);
+ break;
+ }
+ }
+ }
+
+ if (!search_param->country_matched) {
+ language_desc = xkl_get_language_iso_code(item->name);
+ xkl_debug(200, "Checking layout language: [%s]\n",
+ language_desc);
+ search_param->language_matched = FALSE;
+ if ((language_desc != NULL)
+ && strcasestr(language_desc, search_param->pattern)) {
+ search_param->language_matched = TRUE;
+ (search_param->func) (config, item, NULL,
+ search_param->data);
+ } else {
+ gchar **languages =
+ g_object_get_data(G_OBJECT(item),
+ XCI_PROP_LANGUAGE_LIST);
+ for (; languages && *languages; languages++) {
+ language_desc =
+ xkl_get_language_iso_code(*languages);
+ xkl_debug(200,
+ "Checking language: [%s][%s]\n",
+ *languages, language_desc);
+ if ((language_desc != NULL)
+ && strcasestr(language_desc,
+ search_param->pattern)) {
+ search_param->language_matched =
+ TRUE;
+ (search_param->func) (config, item,
+ NULL,
+ search_param->
+ data);
+ break;
+ }
+ }
+ }
+ }
+
+ g_free(upper_name);
+}
+
+void
+xkl_config_registry_search_by_pattern(XklConfigRegistry * config,
+ const gchar * pattern,
+ TwoConfigItemsProcessFunc func,
+ gpointer data)
+{
+ xkl_debug(200, "Searching by pattern: [%s]\n", pattern);
+ SearchParamType search_param = { pattern, func, data };
+ xkl_config_registry_foreach_layout(config, (ConfigItemProcessFunc)
+ xkl_config_registry_search_by_pattern_in_layout,
+ &search_param);
+}
+
gboolean
xkl_config_registry_find_model(XklConfigRegistry * config,
XklConfigItem * pitem /* in/out */ )
diff --git a/libxklavier/xklavier_config_iso.c b/libxklavier/xklavier_config_iso.c
index e9911a9..fdc4f25 100644
--- a/libxklavier/xklavier_config_iso.c
+++ b/libxklavier/xklavier_config_iso.c
@@ -165,7 +165,7 @@ iso_code_names_init(LookupParams * params)
typedef const gchar *(*DescriptionGetterFunc) (const gchar * code);
const gchar *
-get_language_iso_code(const gchar * code)
+xkl_get_language_iso_code(const gchar * code)
{
const gchar *name;
@@ -182,7 +182,7 @@ get_language_iso_code(const gchar * code)
}
const gchar *
-get_country_iso_code(const gchar * code)
+xkl_get_country_iso_code(const gchar * code)
{
const gchar *name;
@@ -292,7 +292,7 @@ xkl_config_registry_foreach_country(XklConfigRegistry *
};
xkl_config_registry_foreach_iso_code(config, func, xpath_exprs,
- get_country_iso_code, TRUE,
+ xkl_get_country_iso_code, TRUE,
data);
}
@@ -309,7 +309,7 @@ xkl_config_registry_foreach_language(XklConfigRegistry *
};
xkl_config_registry_foreach_iso_code(config, func, xpath_exprs,
- get_language_iso_code, FALSE,
+ xkl_get_language_iso_code, FALSE,
data);
}
diff --git a/libxklavier/xklavier_private.h b/libxklavier/xklavier_private.h
index 35fc8a5..c4bf9d8 100644
--- a/libxklavier/xklavier_private.h
+++ b/libxklavier/xklavier_private.h
@@ -480,6 +480,10 @@ extern gboolean xkl_read_config_item(XklConfigRegistry * config,
gint doc_index, xmlNodePtr iptr,
XklConfigItem * item);
+extern const gchar * xkl_get_language_iso_code(const gchar * code);
+
+extern const gchar * xkl_get_country_iso_code(const gchar * code);
+
extern gint xkl_debug_level;
extern const gchar *xkl_last_error_message;