summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Udaltsov <svu@gnome.org>2009-06-23 23:18:33 +0000
committerSergey Udaltsov <svu@gnome.org>2009-06-23 23:18:33 +0000
commitf86e28f5dbfbf5e7cc014819ffc23d5528d726ef (patch)
tree18d27d9129b4c84585972dbc37d71b5357557075
parentc6638d30e9bc3fd1e32642d009c66dfd9b88c336 (diff)
downloadlibxklavier-f86e28f5dbfbf5e7cc014819ffc23d5528d726ef.tar.gz
exotic config items should have corresponding attribute set
-rw-r--r--libxklavier/xkl_config_item.h5
-rw-r--r--libxklavier/xklavier_config.c66
-rw-r--r--libxklavier/xklavier_config_iso.c6
-rw-r--r--libxklavier/xklavier_private.h3
-rw-r--r--tests/test_config.c21
5 files changed, 53 insertions, 48 deletions
diff --git a/libxklavier/xkl_config_item.h b/libxklavier/xkl_config_item.h
index 566e75f..57b371f 100644
--- a/libxklavier/xkl_config_item.h
+++ b/libxklavier/xkl_config_item.h
@@ -100,6 +100,11 @@ extern "C" {
#define XCI_PROP_LANGUAGE_LIST "languageList"
/**
+ * Extra property for the XklConfigItem, defining whether that item is exotic(extra)
+ */
+#define XCI_PROP_EXTRA_ITEM "extraItem"
+
+/**
* The XklConfigItem class, derived from GObject
*/
struct _XklConfigItemClass {
diff --git a/libxklavier/xklavier_config.c b/libxklavier/xklavier_config.c
index 5e16cc5..ad0af8f 100644
--- a/libxklavier/xklavier_config.c
+++ b/libxklavier/xklavier_config.c
@@ -76,7 +76,7 @@ xkl_xml_find_config_item_child(xmlNodePtr iptr, xmlNodePtr * ptr)
}
static xmlNodePtr
-xkl_find_nonlocalized_element(xmlNodePtr ptr, const gchar * tag_name)
+xkl_find_element(xmlNodePtr ptr, const gchar * tag_name)
{
xmlNodePtr found_element = NULL;
@@ -84,14 +84,9 @@ xkl_find_nonlocalized_element(xmlNodePtr ptr, const gchar * tag_name)
while (ptr != NULL) {
char *node_name = (char *) ptr->name;
if (ptr->type != XML_TEXT_NODE) {
- xmlChar *lang = xmlNodeGetLang(ptr);
-
- if (lang == NULL) { /* No language specified */
- if (!g_ascii_strcasecmp
- (node_name, tag_name)) {
- found_element = ptr;
- break;
- }
+ if (!g_ascii_strcasecmp(node_name, tag_name)) {
+ found_element = ptr;
+ break;
}
}
ptr = ptr->next;
@@ -106,7 +101,7 @@ xkl_item_populate_optional_array(XklConfigItem * item, xmlNodePtr ptr,
const gchar property_name[])
{
xmlNodePtr top_list_element =
- xkl_find_nonlocalized_element(ptr, list_tag), element_ptr;
+ xkl_find_element(ptr, list_tag), element_ptr;
gint n_elements, idx;
gchar **elements = NULL;
@@ -119,7 +114,7 @@ xkl_item_populate_optional_array(XklConfigItem * item, xmlNodePtr ptr,
element_ptr = top_list_element->children;
while (NULL !=
(element_ptr =
- xkl_find_nonlocalized_element(element_ptr, element_tag))) {
+ xkl_find_element(element_ptr, element_tag))) {
n_elements++;
element_ptr = element_ptr->next;
}
@@ -132,12 +127,11 @@ xkl_item_populate_optional_array(XklConfigItem * item, xmlNodePtr ptr,
element_ptr = top_list_element->children;
for (idx = 0;
NULL != (element_ptr =
- xkl_find_nonlocalized_element
- (element_ptr, element_tag));
+ xkl_find_element(element_ptr, element_tag));
element_ptr = element_ptr->next, idx++) {
elements[idx] =
- g_strdup((const char *) element_ptr->
- children->content);
+ g_strdup((const char *) element_ptr->children->
+ content);
}
g_object_set_data_full(G_OBJECT(item),
@@ -149,8 +143,8 @@ xkl_item_populate_optional_array(XklConfigItem * item, xmlNodePtr ptr,
#include "libxml/parserInternals.h"
gboolean
-xkl_read_config_item(XklConfigRegistry * config, xmlNodePtr iptr,
- XklConfigItem * item)
+xkl_read_config_item(XklConfigRegistry * config, gint doc_index,
+ xmlNodePtr iptr, XklConfigItem * item)
{
xmlNodePtr name_element, ptr;
xmlNodePtr desc_element = NULL, short_desc_element =
@@ -172,6 +166,9 @@ xkl_read_config_item(XklConfigRegistry * config, xmlNodePtr iptr,
if (!xkl_xml_find_config_item_child(iptr, &ptr))
return FALSE;
+ if (doc_index > 0)
+ g_object_set_data(G_OBJECT(item), XCI_PROP_EXTRA_ITEM, GINT_TO_POINTER(TRUE));
+
ptr = ptr->children;
if (ptr->type == XML_TEXT_NODE)
@@ -179,11 +176,9 @@ xkl_read_config_item(XklConfigRegistry * config, xmlNodePtr iptr,
name_element = ptr;
ptr = ptr->next;
- short_desc_element =
- xkl_find_nonlocalized_element(ptr, XML_TAG_SHORT_DESCR);
- desc_element = xkl_find_nonlocalized_element(ptr, XML_TAG_DESCR);
- vendor_element =
- xkl_find_nonlocalized_element(ptr, XML_TAG_VENDOR);
+ short_desc_element = xkl_find_element(ptr, XML_TAG_SHORT_DESCR);
+ desc_element = xkl_find_element(ptr, XML_TAG_DESCR);
+ vendor_element = xkl_find_element(ptr, XML_TAG_VENDOR);
if (name_element != NULL && name_element->children != NULL)
strncat(item->name,
@@ -240,8 +235,8 @@ xkl_read_config_item(XklConfigRegistry * config, xmlNodePtr iptr,
if (vendor_element != NULL && vendor_element->children != NULL) {
vendor =
- g_strdup((const char *) vendor_element->children->
- content);
+ g_strdup((const char *) vendor_element->
+ children->content);
g_object_set_data_full(G_OBJECT(item), XCI_PROP_VENDOR,
vendor, g_free);
}
@@ -258,7 +253,7 @@ xkl_read_config_item(XklConfigRegistry * config, xmlNodePtr iptr,
static void
xkl_config_registry_foreach_in_nodeset(XklConfigRegistry * config,
- xmlNodeSetPtr nodes,
+ gint doc_index, xmlNodeSetPtr nodes,
ConfigItemProcessFunc func,
gpointer data)
{
@@ -267,7 +262,8 @@ xkl_config_registry_foreach_in_nodeset(XklConfigRegistry * config,
xmlNodePtr *pnode = nodes->nodeTab;
XklConfigItem *ci = xkl_config_item_new();
for (i = nodes->nodeNr; --i >= 0;) {
- if (xkl_read_config_item(config, *pnode, ci))
+ if (xkl_read_config_item
+ (config, doc_index, *pnode, ci))
func(config, ci, data);
pnode++;
@@ -299,10 +295,9 @@ xkl_config_registry_foreach_in_xpath(XklConfigRegistry * config,
if (xpath_obj == NULL)
continue;
- xkl_config_registry_foreach_in_nodeset(config,
- xpath_obj->
- nodesetval, func,
- data);
+ xkl_config_registry_foreach_in_nodeset(config, i,
+ xpath_obj->nodesetval,
+ func, data);
xmlXPathFreeObject(xpath_obj);
}
}
@@ -336,10 +331,9 @@ xkl_config_registry_foreach_in_xpath_with_param(XklConfigRegistry
if (xpath_obj == NULL)
continue;
- xkl_config_registry_foreach_in_nodeset(config,
- xpath_obj->
- nodesetval, func,
- data);
+ xkl_config_registry_foreach_in_nodeset(config, i,
+ xpath_obj->nodesetval,
+ func, data);
xmlXPathFreeObject(xpath_obj);
}
}
@@ -377,7 +371,7 @@ xkl_config_registry_find_object(XklConfigRegistry * config,
nodes = xpath_obj->nodesetval;
if (nodes != NULL && nodes->nodeTab != NULL
&& nodes->nodeNr > 0) {
- rv = xkl_read_config_item(config,
+ rv = xkl_read_config_item(config, i,
nodes->nodeTab[0],
pitem);
if (pnode != NULL) {
@@ -703,7 +697,7 @@ xkl_config_registry_foreach_option_group(XklConfigRegistry *
ci = xkl_config_item_new();
for (j = nodes->nodeNr; --j >= 0;) {
- if (xkl_read_config_item(config, *pnode, ci)) {
+ if (xkl_read_config_item(config, i, *pnode, ci)) {
gboolean allow_multisel = TRUE;
xmlChar *sallow_multisel =
xmlGetProp(*pnode,
diff --git a/libxklavier/xklavier_config_iso.c b/libxklavier/xklavier_config_iso.c
index aac978a..dfbb7a7 100644
--- a/libxklavier/xklavier_config_iso.c
+++ b/libxklavier/xklavier_config_iso.c
@@ -363,7 +363,7 @@ xkl_config_registry_foreach_iso_variant(XklConfigRegistry *
XklConfigItem *ci = xkl_config_item_new();
for (ni = nodes->nodeNr; --ni >= 0;) {
if (xkl_read_config_item
- (config, *node, ci))
+ (config, i, *node, ci))
func(config, ci, NULL,
data);
node++;
@@ -400,9 +400,9 @@ xkl_config_registry_foreach_iso_variant(XklConfigRegistry *
XklConfigItem *pci = xkl_config_item_new();
for (ni = nodes->nodeNr; --ni >= 0;) {
if (xkl_read_config_item
- (config, *node, ci) &&
+ (config, i, *node, ci) &&
xkl_read_config_item
- (config,
+ (config, i,
(*node)->parent->parent, pci))
func(config, pci, ci,
data);
diff --git a/libxklavier/xklavier_private.h b/libxklavier/xklavier_private.h
index ddf5b38..4298a9a 100644
--- a/libxklavier/xklavier_private.h
+++ b/libxklavier/xklavier_private.h
@@ -438,6 +438,7 @@ extern gboolean xkl_config_registry_load_helper(XklConfigRegistry * config, cons
extern void
+
xkl_config_registry_foreach_in_xpath_with_param(XklConfigRegistry * config,
const gchar * format,
const gchar * value,
@@ -452,7 +453,7 @@ extern void xkl_config_registry_foreach_in_xpath(XklConfigRegistry *
func, gpointer data);
extern gboolean xkl_read_config_item(XklConfigRegistry * config,
- xmlNodePtr iptr,
+ gint doc_index, xmlNodePtr iptr,
XklConfigItem * item);
extern gint xkl_debug_level;
diff --git a/tests/test_config.c b/tests/test_config.c
index 8072dda..7c8cd71 100644
--- a/tests/test_config.c
+++ b/tests/test_config.c
@@ -97,13 +97,18 @@ static void
print_xci(XklConfigRegistry * config, const XklConfigItem * item,
gint indent)
{
+ gboolean is_extra =
+ (gboolean)
+ GPOINTER_TO_INT(g_object_get_data
+ (G_OBJECT(item), XCI_PROP_EXTRA_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);
+ printf("%*s[%s][%s][%s]%s\n", indent, "", item->name,
+ item->description, item->short_description,
+ is_extra ? ":extra" : "");
if (countries != NULL)
for (i = 0; i < g_strv_length(countries); i++)
printf("%*s country: [%s]\n", indent, "",
@@ -333,11 +338,11 @@ main(int argc, char *const argv[])
if (layouts != NULL) {
if (current_config->layouts != NULL)
- g_strfreev(current_config->
- layouts);
+ g_strfreev
+ (current_config->layouts);
if (current_config->variants != NULL)
- g_strfreev(current_config->
- variants);
+ g_strfreev
+ (current_config->variants);
current_config->layouts =
g_new0(char *, 2);
@@ -350,8 +355,8 @@ main(int argc, char *const argv[])
if (options != NULL) {
if (current_config->options != NULL)
- g_strfreev(current_config->
- options);
+ g_strfreev
+ (current_config->options);
current_config->options =
g_new0(char *, 2);