ibus-m17n/ibus-m17n-default-xml-override.patch

622 lines
17 KiB
Diff
Raw Normal View History

2011-09-01 10:18:22 +00:00
From 736e3f89d3afe368bec030b1f01d36b417fcac5c Mon Sep 17 00:00:00 2001
From: Daiki Ueno <ueno@unixuser.org>
Date: Wed, 31 Aug 2011 11:44:46 +0900
Subject: [PATCH 1/5] Update the format of default.xml to allow override.
This patch allows value inheritance from the previous matches.
With the new format:
<engines>
<engine>
<name>*</name>
<rank>0</rank>
<preedit-highlight>FALSE</preedit-highlight>
</engine>
<engine>
<name>m17n:ja:*</name>
<rank>2</rank>
<preedit-highlight>TRUE</preedit-highlight>
</engine>
<engine>
<name>m17n:ja:anthy</name>
<rank>1</rank>
</engine>
</engines>
We will get preedit-highlight == TRUE and rank == 1 for m17n:ja:anthy.
---
src/Makefile.am | 3 +-
src/default.xml.in.in | 221 +++++++++++++++++++------------------------------
src/engine.c | 2 +
src/m17nutil.c | 68 +++++++---------
src/m17nutil.h | 1 +
src/test.c | 66 +++++++++++++++
6 files changed, 186 insertions(+), 175 deletions(-)
create mode 100644 src/test.c
diff --git a/src/Makefile.am b/src/Makefile.am
index 282128a..e354149 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -40,11 +40,10 @@ TESTS = \
test_m17n_SOURCES = \
- m17nutil.c \
+ test.c \
$(NULL)
test_m17n_CFLAGS = \
$(AM_CFLAGS) \
- -DDEBUG \
$(NULL)
test_m17n_LDADD = \
libm17ncommon.a \
diff --git a/src/default.xml.in.in b/src/default.xml.in.in
index 5c5d67d..dc93fd3 100644
--- a/src/default.xml.in.in
+++ b/src/default.xml.in.in
@@ -1,246 +1,197 @@
<?xml version="1.0" encoding="utf-8"?>
<engines>
<!-- This file defines the default config value for each
- engine. The "engine" elements below are checked in
- first-to-last order and a "name" element in an "engine"
- element allows wildcard patterns. Please keep more
- specific entries to appear first. -->
- <!-- Indic engines which represent languages. -->
+ engine. A "name" element in an "engine" element allows
+ wildcard patterns. "engine" elements are evaluated in
+ first-to-last order and the latter match may override the
+ existing default. -->
+ <!-- Default for other engines. -->
+ <engine>
+ <name>m17n:*</name>
+ <rank>0</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <!-- Indic engines should be selected by default:
+ https://bugzilla.redhat.com/show_bug.cgi?id=640896 -->
+ <engine>
+ <name>m17n:as:*</name>
+ <rank>1</rank>
+ </engine>
+ <engine>
+ <name>m17n:bn:*</name>
+ <rank>1</rank>
+ </engine>
+ <engine>
+ <name>m17n:gu:*</name>
+ <rank>1</rank>
+ </engine>
+ <engine>
+ <name>m17n:hi:*</name>
+ <rank>1</rank>
+ </engine>
+ <engine>
+ <name>m17n:kn:*</name>
+ <rank>1</rank>
+ </engine>
+ <engine>
+ <name>m17n:ks:*</name>
+ <rank>1</rank>
+ </engine>
+ <engine>
+ <name>m17n:mai:*</name>
+ <rank>1</rank>
+ </engine>
+ <engine>
+ <name>m17n:ml:*</name>
+ <rank>1</rank>
+ </engine>
+ <engine>
+ <name>m17n:mr:*</name>
+ <rank>1</rank>
+ </engine>
+ <engine>
+ <name>m17n:ne:*</name>
+ <rank>1</rank>
+ </engine>
+ <engine>
+ <name>m17n:or:*</name>
+ <rank>1</rank>
+ </engine>
+ <engine>
+ <name>m17n:pa:*</name>
+ <rank>1</rank>
+ </engine>
+ <engine>
+ <name>m17n:sa:*</name>
+ <rank>1</rank>
+ </engine>
+ <engine>
+ <name>m17n:sd:*</name>
+ <rank>1</rank>
+ </engine>
+ <engine>
+ <name>m17n:si:*</name>
+ <rank>1</rank>
+ </engine>
+ <engine>
+ <name>m17n:ta:*</name>
+ <rank>1</rank>
+ </engine>
+ <engine>
+ <name>m17n:te:*</name>
+ <rank>1</rank>
+ </engine>
+ <!-- Assign higher rank to Indic engines which represent each
+ language. -->
<engine>
<name>m17n:as:phonetic</name>
<rank>2</rank>
- <preedit-highlight>FALSE</preedit-highlight>
</engine>
<engine>
<name>m17n:bn:inscript</name>
<rank>2</rank>
- <preedit-highlight>FALSE</preedit-highlight>
</engine>
<engine>
<name>m17n:gu:inscript</name>
<rank>2</rank>
- <preedit-highlight>FALSE</preedit-highlight>
</engine>
<engine>
<name>m17n:hi:inscript</name>
<rank>2</rank>
- <preedit-highlight>FALSE</preedit-highlight>
</engine>
<engine>
<name>m17n:kn:kgp</name>
<rank>2</rank>
- <preedit-highlight>FALSE</preedit-highlight>
</engine>
<engine>
<name>m17n:ks:kbd</name>
<rank>2</rank>
- <preedit-highlight>FALSE</preedit-highlight>
</engine>
<engine>
<name>m17n:mai:inscript</name>
<rank>2</rank>
- <preedit-highlight>FALSE</preedit-highlight>
</engine>
<engine>
<name>m17n:ml:inscript</name>
<rank>2</rank>
- <preedit-highlight>FALSE</preedit-highlight>
</engine>
<engine>
<name>m17n:mr:inscript</name>
<rank>2</rank>
- <preedit-highlight>FALSE</preedit-highlight>
</engine>
<engine>
<name>m17n:ne:rom</name>
<rank>2</rank>
- <preedit-highlight>FALSE</preedit-highlight>
</engine>
<engine>
<name>m17n:or:inscript</name>
<rank>2</rank>
- <preedit-highlight>FALSE</preedit-highlight>
</engine>
<engine>
<name>m17n:pa:inscript</name>
<rank>2</rank>
- <preedit-highlight>FALSE</preedit-highlight>
</engine>
<engine>
<name>m17n:sa:harvard-kyoto</name>
<rank>2</rank>
- <preedit-highlight>FALSE</preedit-highlight>
</engine>
<engine>
<name>m17n:sd:inscript</name>
<rank>2</rank>
- <preedit-highlight>FALSE</preedit-highlight>
</engine>
<engine>
<name>m17n:si:wijesekera</name>
<rank>2</rank>
- <preedit-highlight>FALSE</preedit-highlight>
</engine>
<engine>
<name>m17n:ta:tamil99</name>
<rank>2</rank>
- <preedit-highlight>FALSE</preedit-highlight>
</engine>
<engine>
<name>m17n:te:inscript</name>
<rank>2</rank>
- <preedit-highlight>FALSE</preedit-highlight>
</engine>
- <!-- Samanala should have lower rank than other Sinhala
- engines since it is the only non-keyboard input method in
- Sinhala. -->
+ <!-- Assign lower rank to Sinhala Samanala since it is a
+ non-keyboard input method in Sinhala. -->
<engine>
<name>m17n:si:samanala</name>
<rank>0</rank>
- <preedit-highlight>FALSE</preedit-highlight>
- </engine>
- <!-- Chinese and Japanese engines which require preedit decoration. -->
- <engine>
- <name>m17n:ja:anthy</name>
- <rank>0</rank>
- <preedit-highlight>TRUE</preedit-highlight>
</engine>
+ <!-- Some CJK engines use preedit. -->
<engine>
<name>m17n:zh:cangjie</name>
- <rank>0</rank>
<preedit-highlight>TRUE</preedit-highlight>
</engine>
<engine>
<name>m17n:zh:py-b5</name>
- <rank>0</rank>
<preedit-highlight>TRUE</preedit-highlight>
</engine>
<engine>
<name>m17n:zh:py-gb</name>
- <rank>0</rank>
<preedit-highlight>TRUE</preedit-highlight>
</engine>
<engine>
<name>m17n:zh:py</name>
- <rank>0</rank>
<preedit-highlight>TRUE</preedit-highlight>
</engine>
<engine>
<name>m17n:zh:quick</name>
- <rank>0</rank>
<preedit-highlight>TRUE</preedit-highlight>
</engine>
<engine>
<name>m17n:zh:tonepy-b5</name>
- <rank>0</rank>
<preedit-highlight>TRUE</preedit-highlight>
</engine>
<engine>
<name>m17n:zh:tonepy-gb</name>
- <rank>0</rank>
<preedit-highlight>TRUE</preedit-highlight>
</engine>
<engine>
<name>m17n:zh:tonepy</name>
- <rank>0</rank>
<preedit-highlight>TRUE</preedit-highlight>
</engine>
<engine>
- <name>m17n:zh:util</name>
- <rank>0</rank>
+ <name>m17n:ja:anthy</name>
<preedit-highlight>TRUE</preedit-highlight>
</engine>
- <!-- Other Indic engines should be selected by default:
- https://bugzilla.redhat.com/show_bug.cgi?id=640896 -->
- <engine>
- <name>m17n:as:*</name>
- <rank>1</rank>
- <preedit-highlight>FALSE</preedit-highlight>
- </engine>
- <engine>
- <name>m17n:bn:*</name>
- <rank>1</rank>
- <preedit-highlight>FALSE</preedit-highlight>
- </engine>
- <engine>
- <name>m17n:gu:*</name>
- <rank>1</rank>
- <preedit-highlight>FALSE</preedit-highlight>
- </engine>
- <engine>
- <name>m17n:hi:*</name>
- <rank>1</rank>
- <preedit-highlight>FALSE</preedit-highlight>
- </engine>
- <engine>
- <name>m17n:kn:*</name>
- <rank>1</rank>
- <preedit-highlight>FALSE</preedit-highlight>
- </engine>
- <engine>
- <name>m17n:ks:*</name>
- <rank>1</rank>
- <preedit-highlight>FALSE</preedit-highlight>
- </engine>
- <engine>
- <name>m17n:mai:*</name>
- <rank>1</rank>
- <preedit-highlight>FALSE</preedit-highlight>
- </engine>
- <engine>
- <name>m17n:ml:*</name>
- <rank>1</rank>
- <preedit-highlight>FALSE</preedit-highlight>
- </engine>
- <engine>
- <name>m17n:mr:*</name>
- <rank>1</rank>
- <preedit-highlight>FALSE</preedit-highlight>
- </engine>
- <engine>
- <name>m17n:ne:*</name>
- <rank>1</rank>
- <preedit-highlight>FALSE</preedit-highlight>
- </engine>
- <engine>
- <name>m17n:or:*</name>
- <rank>1</rank>
- <preedit-highlight>FALSE</preedit-highlight>
- </engine>
- <engine>
- <name>m17n:pa:*</name>
- <rank>1</rank>
- <preedit-highlight>FALSE</preedit-highlight>
- </engine>
- <engine>
- <name>m17n:sa:*</name>
- <rank>1</rank>
- <preedit-highlight>FALSE</preedit-highlight>
- </engine>
- <engine>
- <name>m17n:sd:*</name>
- <rank>1</rank>
- <preedit-highlight>FALSE</preedit-highlight>
- </engine>
- <engine>
- <name>m17n:si:*</name>
- <rank>1</rank>
- <preedit-highlight>FALSE</preedit-highlight>
- </engine>
- <engine>
- <name>m17n:ta:*</name>
- <rank>1</rank>
- <preedit-highlight>FALSE</preedit-highlight>
- </engine>
- <engine>
- <name>m17n:te:*</name>
- <rank>1</rank>
- <preedit-highlight>FALSE</preedit-highlight>
- </engine>
- <!-- Default for other engines. -->
- <engine>
- <name>m17n:*</name>
- <rank>0</rank>
- <preedit-highlight>FALSE</preedit-highlight>
- </engine>
</engines>
diff --git a/src/engine.c b/src/engine.c
index b68b13e..f1e3068 100644
--- a/src/engine.c
+++ b/src/engine.c
@@ -290,6 +290,8 @@ ibus_m17n_engine_class_init (IBusM17NEngineClass *klass)
&klass->lookup_table_orientation))
klass->lookup_table_orientation = IBUS_ORIENTATION_SYSTEM;
+ ibus_m17n_engine_config_free (engine_config);
+
g_signal_connect (config, "value-changed",
G_CALLBACK(ibus_m17n_config_value_changed),
klass);
diff --git a/src/m17nutil.c b/src/m17nutil.c
index 1150cc4..00b7194 100644
--- a/src/m17nutil.c
+++ b/src/m17nutil.c
@@ -9,12 +9,18 @@ static MConverter *utf8_converter = NULL;
#define DEFAULT_XML (SETUPDIR "/default.xml")
-struct _IBusM17NEngineConfigNode {
+typedef enum {
+ ENGINE_CONFIG_RANK_MASK = 1 << 0,
+ ENGINE_CONFIG_PREEDIT_HIGHLIGHT_MASK = 1 << 1
+} EngineConfigMask;
+
+struct _EngineConfigNode {
gchar *name;
+ EngineConfigMask mask;
IBusM17NEngineConfig config;
};
-typedef struct _IBusM17NEngineConfigNode IBusM17NEngineConfigNode;
+typedef struct _EngineConfigNode EngineConfigNode;
static GSList *config_list = NULL;
@@ -253,20 +259,31 @@ ibus_m17n_list_engines (void)
IBusM17NEngineConfig *
ibus_m17n_get_engine_config (const gchar *engine_name)
{
+ IBusM17NEngineConfig *config = g_slice_new0 (IBusM17NEngineConfig);
GSList *p;
for (p = config_list; p != NULL; p = p->next) {
- IBusM17NEngineConfigNode *cnode = p->data;
+ EngineConfigNode *cnode = p->data;
- if (g_pattern_match_simple (cnode->name, engine_name))
- return &cnode->config;
+ if (g_pattern_match_simple (cnode->name, engine_name)) {
+ if (cnode->mask & ENGINE_CONFIG_RANK_MASK)
+ config->rank = cnode->config.rank;
+ if (cnode->mask & ENGINE_CONFIG_PREEDIT_HIGHLIGHT_MASK)
+ config->preedit_highlight = cnode->config.preedit_highlight;
+ }
}
- g_return_val_if_reached (NULL);
+ return config;
+}
+
+void
+ibus_m17n_engine_config_free (IBusM17NEngineConfig *config)
+{
+ g_slice_free (IBusM17NEngineConfig, config);
}
static gboolean
-ibus_m17n_engine_config_parse_xml_node (IBusM17NEngineConfigNode *cnode,
- XMLNode *node)
+ibus_m17n_engine_config_parse_xml_node (EngineConfigNode *cnode,
+ XMLNode *node)
{
GList *p;
@@ -280,6 +297,7 @@ ibus_m17n_engine_config_parse_xml_node (IBusM17NEngineConfigNode *cnode,
}
if (g_strcmp0 (sub_node->name , "rank") == 0) {
cnode->config.rank = atoi (sub_node->text);
+ cnode->mask |= ENGINE_CONFIG_RANK_MASK;
continue;
}
if (g_strcmp0 (sub_node->name , "preedit-highlight") == 0) {
@@ -288,6 +306,7 @@ ibus_m17n_engine_config_parse_xml_node (IBusM17NEngineConfigNode *cnode,
else if (g_ascii_strcasecmp ("FALSE", sub_node->text) != 0)
g_warning ("<%s> element contains invalid boolean value %s",
sub_node->name, sub_node->text);
+ cnode->mask |= ENGINE_CONFIG_PREEDIT_HIGHLIGHT_MASK;
continue;
}
g_warning ("<engine> element contains invalid element <%s>",
@@ -316,7 +335,7 @@ ibus_m17n_get_component (void)
if (node && g_strcmp0 (node->name, "engines") == 0) {
for (p = node->sub_nodes; p != NULL; p = p->next) {
XMLNode *sub_node = p->data;
- IBusM17NEngineConfigNode *cnode;
+ EngineConfigNode *cnode;
if (g_strcmp0 (sub_node->name, "engine") != 0) {
g_warning ("<engines> element contains invalid element <%s>",
@@ -324,9 +343,9 @@ ibus_m17n_get_component (void)
continue;
}
- cnode = g_slice_new0 (IBusM17NEngineConfigNode);
+ cnode = g_slice_new0 (EngineConfigNode);
if (!ibus_m17n_engine_config_parse_xml_node (cnode, sub_node)) {
- g_slice_free (IBusM17NEngineConfigNode, cnode);
+ g_slice_free (EngineConfigNode, cnode);
continue;
}
config_list = g_slist_prepend (config_list, cnode);
@@ -444,30 +463,3 @@ ibus_m17n_config_get_int (IBusConfig *config,
return FALSE;
#endif /* !IBUS_CHECK_VERSION(1,3,99) */
}
-
-#ifdef DEBUG
-#include <locale.h>
-
-int main ()
-{
- IBusComponent *component;
- GString *output;
-
- setlocale (LC_ALL, "");
- ibus_init ();
- ibus_m17n_init_common ();
-
- component = ibus_m17n_get_component ();
-
- output = g_string_new ("");
-
- ibus_component_output (component, output, 1);
-
- g_debug ("\n%s", output->str);
-
- g_string_free (output, TRUE);
- g_object_unref (component);
-
- return 0;
-}
-#endif
diff --git a/src/m17nutil.h b/src/m17nutil.h
index f083194..313e7bc 100644
--- a/src/m17nutil.h
+++ b/src/m17nutil.h
@@ -30,6 +30,7 @@ gunichar *ibus_m17n_mtext_to_ucs4 (MText *text,
guint ibus_m17n_parse_color (const gchar *hex);
IBusM17NEngineConfig
*ibus_m17n_get_engine_config (const gchar *engine_name);
+void ibus_m17n_engine_config_free (IBusM17NEngineConfig *config);
void ibus_m17n_config_set_string (IBusConfig *config,
const gchar *section,
const gchar *name,
diff --git a/src/test.c b/src/test.c
new file mode 100644
index 0000000..0908818
--- /dev/null
+++ b/src/test.c
@@ -0,0 +1,66 @@
+/* vim:set et sts=4: */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <ibus.h>
+#include <locale.h>
+#include "m17nutil.h"
+
+static void
+test_output_component (void)
+{
+ IBusComponent *component;
+ GString *output;
+
+ component = ibus_m17n_get_component ();
+
+ output = g_string_new ("");
+
+ ibus_component_output (component, output, 1);
+
+ g_debug ("\n%s", output->str);
+
+ g_string_free (output, TRUE);
+ g_object_unref (component);
+}
+
+static void
+test_engine_config (void)
+{
+ IBusM17NEngineConfig *config;
+
+ config = ibus_m17n_get_engine_config ("m17n:non:exsistent");
+ g_assert_cmpint (config->rank, ==, 0);
+ g_assert_cmpint (config->preedit_highlight, ==, 0);
+ ibus_m17n_engine_config_free (config);
+
+ config = ibus_m17n_get_engine_config ("m17n:si:wijesekera");
+ g_assert_cmpint (config->rank, ==, 2);
+ g_assert_cmpint (config->preedit_highlight, ==, 0);
+ ibus_m17n_engine_config_free (config);
+
+ config = ibus_m17n_get_engine_config ("m17n:si:phonetic-dynamic");
+ g_assert_cmpint (config->rank, ==, 1);
+ g_assert_cmpint (config->preedit_highlight, ==, 0);
+ ibus_m17n_engine_config_free (config);
+
+ config = ibus_m17n_get_engine_config ("m17n:si:samanala");
+ g_assert_cmpint (config->rank, ==, 0);
+ g_assert_cmpint (config->preedit_highlight, ==, 0);
+ ibus_m17n_engine_config_free (config);
+}
+
+int main (int argc, char **argv)
+{
+ setlocale (LC_ALL, "");
+ ibus_init ();
+ ibus_m17n_init_common ();
+
+ g_test_init (&argc, &argv, NULL);
+
+ g_test_add_func ("/test-m17n/output-component", test_output_component);
+ g_test_add_func ("/test-m17n/engine-config", test_engine_config);
+
+ return g_test_run ();
+}
--
1.7.6.1