[Fedora-i18n-bugs] [ibus-m17n] Update to 1.3.2-11.

Daiki Ueno ueno at fedoraproject.org
Thu Sep 1 10:18:47 UTC 2011


commit 01b9e72fe7a2e31eb42a9169ae4414ac2c8d9ff0
Author: Daiki Ueno <ueno at unixuser.org>
Date:   Thu Sep 1 19:18:22 2011 +0900

    Update to 1.3.2-11.

 ibus-m17n-default-xml-override.patch |  621 ++++++++++++++++++++++++++++++++
 ibus-m17n-iok.patch                  |  100 ------
 ibus-m17n-virtkbd.patch              |  653 ++++++++++++++++++++++++++++++++++
 ibus-m17n-xkb-options.patch          |  186 ++++-------
 ibus-m17n-xx-icon-symbol.patch       |  495 +++++++-------------------
 ibus-m17n.spec                       |   21 +-
 6 files changed, 1484 insertions(+), 592 deletions(-)
---
diff --git a/ibus-m17n-default-xml-override.patch b/ibus-m17n-default-xml-override.patch
new file mode 100644
index 0000000..744e6a4
--- /dev/null
+++ b/ibus-m17n-default-xml-override.patch
@@ -0,0 +1,621 @@
+From 736e3f89d3afe368bec030b1f01d36b417fcac5c Mon Sep 17 00:00:00 2001
+From: Daiki Ueno <ueno at 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
+
diff --git a/ibus-m17n-virtkbd.patch b/ibus-m17n-virtkbd.patch
new file mode 100644
index 0000000..32c9830
--- /dev/null
+++ b/ibus-m17n-virtkbd.patch
@@ -0,0 +1,653 @@
+From 03557655071092e8135a6fc5c5f8cc2b2f692a83 Mon Sep 17 00:00:00 2001
+From: Daiki Ueno <ueno at unixuser.org>
+Date: Wed, 31 Aug 2011 18:28:48 +0900
+Subject: [PATCH 5/5] Support virtual keyboard.
+
+---
+ configure.ac          |   17 ++++
+ src/Makefile.am       |    7 ++
+ src/default.xml.in.in |  111 ++++++++++++++++++++++++
+ src/engine.c          |   44 ++++++++++
+ src/m17nutil.c        |   10 ++-
+ src/m17nutil.h        |    3 +
+ src/virtkbd.c         |  226 +++++++++++++++++++++++++++++++++++++++++++++++++
+ src/virtkbd.h         |   31 +++++++
+ 8 files changed, 448 insertions(+), 1 deletions(-)
+ create mode 100644 src/virtkbd.c
+ create mode 100644 src/virtkbd.h
+
+diff --git a/configure.ac b/configure.ac
+index 089aafb..ea1476c 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -88,6 +88,23 @@ fi
+ 
+ AM_CONDITIONAL([HAVE_GTK],[test x$with_gtk != xno])
+ 
++dnl check eekboard for virtual keyboard
++AC_MSG_CHECKING([whether you enable eekboard])
++AC_ARG_ENABLE(eekboard,
++              AS_HELP_STRING([--enable-eekboard=no/yes],
++                             [Enable eekboard default=yes]),
++              enable_eekboard=$enableval,
++              enable_eekboard=yes)
++
++if test x$enable_eekboard = xyes; then
++  PKG_CHECK_MODULES([EEKBOARD], [eekboard-0.90], , enable_xtest=no)
++  if test x$enable_eekboard = xyes; then
++    AC_DEFINE([HAVE_EEKBOARD], [1], [Define if eekboard is found])
++  fi
++fi
++AM_CONDITIONAL(ENABLE_EEKBOARD, [test x$enable_eekboard = xyes])
++AC_MSG_RESULT($enable_eekboard)
++
+ # check if minput_list, which is available in m17n-lib 1.6.2+ (CVS)
+ save_CFLAGS="$CFLAGS"
+ save_LIBS="$LIBS"
+diff --git a/src/Makefile.am b/src/Makefile.am
+index e354149..eac6629 100644
+--- a/src/Makefile.am
++++ b/src/Makefile.am
+@@ -64,11 +64,18 @@ ibus_engine_m17n_SOURCES = \
+ 	main.c \
+ 	engine.c \
+ 	engine.h \
++	virtkbd.c \
++	virtkbd.h \
++	$(NULL)
++ibus_engine_m17n_CFLAGS = \
++	@EEKBOARD_CFLAGS@ \
++	$(AM_CFLAGS) \
+ 	$(NULL)
+ ibus_engine_m17n_LDADD = \
+ 	libm17ncommon.a \
+ 	@IBUS_LIBS@ \
+ 	@M17N_LIBS@ \
++	@EEKBOARD_LIBS@ \
+ 	$(NULL)
+ 
+ if HAVE_GTK
+diff --git a/src/default.xml.in.in b/src/default.xml.in.in
+index 8192878..47053ae 100644
+--- a/src/default.xml.in.in
++++ b/src/default.xml.in.in
+@@ -12,6 +12,7 @@
+ 		<preedit-highlight>FALSE</preedit-highlight>
+ 		<symbol></symbol>
+ 		@IBUS_HOTKEYS_XML@
++		<virtual-keyboard>us</virtual-keyboard>
+ 	</engine>
+ 	<!-- Indic engines should be selected by default:
+ 	     https://bugzilla.redhat.com/show_bug.cgi?id=640896 -->
+@@ -410,4 +411,114 @@
+ 		<name>m17n:zh:tonepy*</name>
+ 		<symbol>调</symbol>
+ 	</engine>
++
++	<!-- Virtual keyboard. -->
++	<engine>
++		<name>m17n:ar:kbd</name>
++		<virtual-keyboard>ar,us</virtual-keyboard>
++	</engine>
++	<engine>
++		<name>m17n:be:kbd</name>
++		<virtual-keyboard>be,us</virtual-keyboard>
++	</engine>
++	<engine>
++		<name>m17n:fa:kbd</name>
++		<virtual-keyboard>fa,us</virtual-keyboard>
++	</engine>
++	<engine>
++		<name>m17n:he:kbd</name>
++		<virtual-keyboard>he,us</virtual-keyboard>
++	</engine>
++	<engine>
++		<name>m17n:kk:kbd</name>
++		<virtual-keyboard>kk,us</virtual-keyboard>
++	</engine>
++	<engine>
++		<name>m17n:ks:kbd</name>
++		<virtual-keyboard>ks,us</virtual-keyboard>
++	</engine>
++	<engine>
++		<name>m17n:my:kbd</name>
++		<virtual-keyboard>my,us</virtual-keyboard>
++	</engine>
++	<engine>
++		<name>m17n:ru:kbd</name>
++		<virtual-keyboard>ru,us</virtual-keyboard>
++	</engine>
++	<engine>
++		<name>m17n:ua:kbd</name>
++		<virtual-keyboard>ua,us</virtual-keyboard>
++	</engine>
++	<engine>
++		<name>m17n:ug:kbd</name>
++		<virtual-keyboard>ug,us</virtual-keyboard>
++	</engine>
++	<engine>
++		<name>m17n:be:kbd</name>
++		<virtual-keyboard>be,us</virtual-keyboard>
++	</engine>
++	<engine>
++		<name>m17n:th:*</name>
++		<virtual-keyboard>th,us</virtual-keyboard>
++	</engine>
++	<engine>
++		<name>m17n:zh:bopomofo</name>
++		<virtual-keyboard>zh-bopomofo,us</virtual-keyboard>
++	</engine>
++	<engine>
++		<name>m17n:as:inscript</name>
++		<virtual-keyboard>as-inscript,us</virtual-keyboard>
++	</engine>
++	<engine>
++		<name>m17n:bn:inscript</name>
++		<virtual-keyboard>bn-inscript,us</virtual-keyboard>
++	</engine>
++	<engine>
++		<name>m17n:gu:inscript</name>
++		<virtual-keyboard>gu-inscript,us</virtual-keyboard>
++	</engine>
++	<engine>
++		<name>m17n:hi:inscript</name>
++		<virtual-keyboard>hi-inscript,us</virtual-keyboard>
++	</engine>
++	<engine>
++		<name>m17n:kn:inscript</name>
++		<virtual-keyboard>kn-inscript,us</virtual-keyboard>
++	</engine>
++	<engine>
++		<name>m17n:ks:inscript</name>
++		<virtual-keyboard>kn-inscript,us</virtual-keyboard>
++	</engine>
++	<engine>
++		<name>m17n:mai:inscript</name>
++		<virtual-keyboard>mai-inscript,us</virtual-keyboard>
++	</engine>
++	<engine>
++		<name>m17n:ml:inscript</name>
++		<virtual-keyboard>ml-inscript,us</virtual-keyboard>
++	</engine>
++	<engine>
++		<name>m17n:mr:inscript</name>
++		<virtual-keyboard>mr-inscript,us</virtual-keyboard>
++	</engine>
++	<engine>
++		<name>m17n:or:inscript</name>
++		<virtual-keyboard>or-inscript,us</virtual-keyboard>
++	</engine>
++	<engine>
++		<name>m17n:pa:inscript</name>
++		<virtual-keyboard>pa-inscript,us</virtual-keyboard>
++	</engine>
++	<engine>
++		<name>m17n:sd:inscript</name>
++		<virtual-keyboard>sd-inscript,us</virtual-keyboard>
++	</engine>
++	<engine>
++		<name>m17n:ta:inscript</name>
++		<virtual-keyboard>ta-inscript,us</virtual-keyboard>
++	</engine>
++	<engine>
++		<name>m17n:te:inscript</name>
++		<virtual-keyboard>te-inscript,us</virtual-keyboard>
++	</engine>
+ </engines>
+diff --git a/src/engine.c b/src/engine.c
+index f1e3068..cad01e5 100644
+--- a/src/engine.c
++++ b/src/engine.c
+@@ -7,6 +7,7 @@
+ #include <m17n.h>
+ #include <string.h>
+ #include "m17nutil.h"
++#include "virtkbd.h"
+ #include "engine.h"
+ 
+ typedef struct _IBusM17NEngine IBusM17NEngine;
+@@ -18,10 +19,13 @@ struct _IBusM17NEngine {
+     /* members */
+     MInputContext *context;
+     IBusLookupTable *table;
++    IBusM17NVirtualKeyboard *virtkbd;
++
+     IBusProperty    *status_prop;
+ #ifdef HAVE_SETUP
+     IBusProperty    *setup_prop;
+ #endif  /* HAVE_SETUP */
++    IBusProperty    *virtkbd_prop;
+     IBusPropList    *prop_list;
+ };
+ 
+@@ -34,6 +38,7 @@ struct _IBusM17NEngineClass {
+     guint preedit_background;
+     gint preedit_underline;
+     gint lookup_table_orientation;
++    gchar *virtual_keyboard;
+ 
+     MInputMethod *im;
+ };
+@@ -110,6 +115,10 @@ ibus_m17n_init (IBusBus *bus)
+     if (config)
+         g_object_ref_sink (config);
+     ibus_m17n_init_common ();
++
++#ifdef HAVE_EEKBOARD
++    eek_init ();
++#endif  /* HAVE_EEKBOARD */
+ }
+ 
+ static gboolean
+@@ -290,6 +299,8 @@ ibus_m17n_engine_class_init (IBusM17NEngineClass *klass)
+                                    &klass->lookup_table_orientation))
+         klass->lookup_table_orientation = IBUS_ORIENTATION_SYSTEM;
+ 
++    klass->virtual_keyboard = engine_config->virtual_keyboard;
++
+     ibus_m17n_engine_config_free (engine_config);
+ 
+     g_signal_connect (config, "value-changed",
+@@ -346,6 +357,7 @@ ibus_m17n_engine_init (IBusM17NEngine *m17n)
+ {
+     IBusText* label;
+     IBusText* tooltip;
++    IBusM17NEngineClass *klass = (IBusM17NEngineClass *) G_OBJECT_GET_CLASS (m17n);
+ 
+     m17n->prop_list = ibus_prop_list_new ();
+     g_object_ref_sink (m17n->prop_list);
+@@ -378,6 +390,22 @@ ibus_m17n_engine_init (IBusM17NEngine *m17n)
+     ibus_prop_list_append (m17n->prop_list, m17n->setup_prop);
+ #endif  /* HAVE_SETUP */
+ 
++    if (klass->virtual_keyboard != NULL) {
++        label = ibus_text_new_from_string ("On-screen Keyboard");
++        tooltip = ibus_text_new_from_string ("Show on-screen keyboard");
++        m17n->virtkbd_prop = ibus_property_new ("virtual-keyboard",
++                                                PROP_TYPE_NORMAL,
++                                                label,
++                                                "input-keyboard",
++                                                tooltip,
++                                                TRUE,
++                                                TRUE,
++                                                PROP_STATE_UNCHECKED,
++                                                NULL);
++        g_object_ref_sink (m17n->virtkbd_prop);
++        ibus_prop_list_append (m17n->prop_list, m17n->virtkbd_prop);
++    }
++
+     m17n->table = ibus_lookup_table_new (9, 0, TRUE, TRUE);
+     g_object_ref_sink (m17n->table);
+     m17n->context = NULL;
+@@ -439,6 +467,8 @@ ibus_m17n_engine_constructor (GType                   type,
+     }
+ 
+     m17n->context = minput_create_ic (klass->im, m17n);
++    m17n->virtkbd = ibus_m17n_virtual_keyboard_new ((IBusEngine *)m17n,
++                                            klass->virtual_keyboard);
+ 
+     return (GObject *) m17n;
+ }
+@@ -473,6 +503,11 @@ ibus_m17n_engine_destroy (IBusM17NEngine *m17n)
+         m17n->context = NULL;
+     }
+ 
++    if (m17n->virtkbd) {
++        g_object_unref (m17n->virtkbd);
++        m17n->virtkbd = NULL;
++    }
++
+     IBUS_OBJECT_CLASS (parent_class)->destroy ((IBusObject *)m17n);
+ }
+ 
+@@ -709,6 +744,8 @@ ibus_m17n_engine_enable (IBusEngine *engine)
+     ibus_engine_get_surrounding_text (engine, &text, &cursor_pos);
+     g_object_unref (text);
+ #endif  /* HAVE_IBUS_ENGINE_GET_SURROUNDING_TEXT */
++
++    ibus_m17n_virtual_keyboard_enable (m17n->virtkbd);
+ }
+ 
+ static void
+@@ -718,6 +755,8 @@ ibus_m17n_engine_disable (IBusEngine *engine)
+ 
+     ibus_m17n_engine_focus_out (engine);
+     parent_class->disable (engine);
++
++    ibus_m17n_virtual_keyboard_disable (m17n->virtkbd);
+ }
+ 
+ static void
+@@ -780,6 +819,11 @@ ibus_m17n_engine_property_activate (IBusEngine  *engine,
+     }
+ #endif  /* HAVE_SETUP */
+ 
++#ifdef HAVE_EEKBOARD
++    if (g_strcmp0 (prop_name, "virtual-keyboard") == 0)
++        ibus_m17n_virtual_keyboard_toggle_display (m17n->virtkbd);
++#endif  /*  HAVE_EEKBOARD */
++
+     parent_class->property_activate (engine, prop_name, prop_state);
+ }
+ 
+diff --git a/src/m17nutil.c b/src/m17nutil.c
+index 3e6b9f1..bf8bf84 100644
+--- a/src/m17nutil.c
++++ b/src/m17nutil.c
+@@ -14,7 +14,8 @@ typedef enum {
+     ENGINE_CONFIG_LAYOUT_MASK = 1 << 1,
+     ENGINE_CONFIG_HOTKEYS_MASK = 1 << 2,
+     ENGINE_CONFIG_SYMBOL_MASK = 1 << 3,
+-    ENGINE_CONFIG_PREEDIT_HIGHLIGHT_MASK = 1 << 4
++    ENGINE_CONFIG_PREEDIT_HIGHLIGHT_MASK = 1 << 4,
++    ENGINE_CONFIG_VIRTUAL_KEYBOARD_MASK = 1 << 5
+ } EngineConfigMask;
+ 
+ struct _EngineConfigNode {
+@@ -281,6 +282,8 @@ ibus_m17n_get_engine_config (const gchar *engine_name)
+                 config->symbol = cnode->config.symbol;
+             if (cnode->mask & ENGINE_CONFIG_PREEDIT_HIGHLIGHT_MASK)
+                 config->preedit_highlight = cnode->config.preedit_highlight;
++            if (cnode->mask & ENGINE_CONFIG_VIRTUAL_KEYBOARD_MASK)
++                config->virtual_keyboard = cnode->config.virtual_keyboard;
+         }
+     }
+     return config;
+@@ -336,6 +339,11 @@ ibus_m17n_engine_config_parse_xml_node (EngineConfigNode *cnode,
+             cnode->mask |= ENGINE_CONFIG_PREEDIT_HIGHLIGHT_MASK;
+             continue;
+         }
++        if (g_strcmp0 (sub_node->name , "virtual-keyboard") == 0) {
++            cnode->config.virtual_keyboard = g_strdup (sub_node->text);
++            cnode->mask |= ENGINE_CONFIG_VIRTUAL_KEYBOARD_MASK;
++            continue;
++        }
+         g_warning ("<engine> element contains invalid element <%s>",
+                    sub_node->name);
+     }
+diff --git a/src/m17nutil.h b/src/m17nutil.h
+index 21b1bb9..f138c8b 100644
+--- a/src/m17nutil.h
++++ b/src/m17nutil.h
+@@ -25,6 +25,9 @@ struct _IBusM17NEngineConfig {
+ 
+     /* whether to highlight preedit */
+     gboolean preedit_highlight;
++
++    /* virtual keyboard type */
++    gchar *virtual_keyboard;
+ };
+ 
+ typedef struct _IBusM17NEngineConfig IBusM17NEngineConfig;
+diff --git a/src/virtkbd.c b/src/virtkbd.c
+new file mode 100644
+index 0000000..92ae3a5
+--- /dev/null
++++ b/src/virtkbd.c
+@@ -0,0 +1,226 @@
++/* vim:set et sts=4: */
++#ifdef HAVE_CONFIG_H
++#include <config.h>
++#endif
++
++#ifdef HAVE_EEKBOARD
++#include <eekboard/eekboard-client.h>
++#endif  /* HAVE_EEKBOARD */
++
++#include "virtkbd.h"
++
++struct _IBusM17NVirtualKeyboard {
++    GObject parent;
++    IBusEngine *engine;
++    gchar *keyboard_type;
++    GSList *keyboards;
++
++#ifdef HAVE_EEKBOARD
++    EekboardClient *client;
++    EekboardContext *context;
++#endif  /* HAVE_EEKBOARD */
++};
++
++struct _IBusM17NVirtualKeyboardClass {
++    GObjectClass parent_class;
++};
++
++typedef struct _IBusM17NVirtualKeyboardClass IBusM17NVirtualKeyboardClass;
++
++G_DEFINE_TYPE (IBusM17NVirtualKeyboard, ibus_m17n_virtual_keyboard, G_TYPE_OBJECT);
++
++static void
++ibus_m17n_virtual_keyboard_dispose (GObject *object)
++{
++    IBusM17NVirtualKeyboard *virtkbd = IBUS_M17N_VIRTUAL_KEYBOARD (object);
++
++    if (virtkbd->engine) {
++        g_object_unref (virtkbd->engine);
++        virtkbd->engine = NULL;
++    }
++    if (virtkbd->keyboards) {
++        GSList *next = virtkbd->keyboards->next;
++        /* virtkbd->keyboards is a ring; break it before free */
++        virtkbd->keyboards->next = NULL;
++        g_slist_free (next);
++    }
++
++#ifdef HAVE_EEKBOARD
++    if (virtkbd->context) {
++        g_object_unref (virtkbd->context);
++        virtkbd->context = NULL;
++    }
++    if (virtkbd->client) {
++        g_object_unref (virtkbd->client);
++        virtkbd->client = NULL;
++    }
++#endif  /* HAVE_EEKBOARD */
++
++    G_OBJECT_CLASS (ibus_m17n_virtual_keyboard_parent_class)->dispose (object);
++}
++
++static void
++ibus_m17n_virtual_keyboard_finalize (GObject *object)
++{
++    IBusM17NVirtualKeyboard *virtkbd = IBUS_M17N_VIRTUAL_KEYBOARD (object);
++
++    g_free (virtkbd->keyboard_type);
++
++    G_OBJECT_CLASS (ibus_m17n_virtual_keyboard_parent_class)->finalize (object);
++}
++
++static void
++ibus_m17n_virtual_keyboard_class_init (IBusM17NVirtualKeyboardClass *klass)
++{
++    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
++    gobject_class->dispose = ibus_m17n_virtual_keyboard_dispose;
++    gobject_class->finalize = ibus_m17n_virtual_keyboard_finalize;
++}
++
++static void
++ibus_m17n_virtual_keyboard_init (IBusM17NVirtualKeyboard *self)
++{
++}
++
++#ifdef HAVE_EEKBOARD
++static void
++destroyed_cb (EekboardClient *client,
++              IBusM17NVirtualKeyboard *virtkbd)
++{
++    if (virtkbd->context) {
++        g_object_unref (virtkbd->context);
++        virtkbd->context = NULL;
++    }
++    if (virtkbd->client) {
++        g_object_unref (virtkbd->client);
++        virtkbd->client = NULL;
++    }
++}
++
++static void
++key_pressed_cb (EekboardContext *context,
++                gchar           *keyname,
++                EekSymbol       *symbol,
++                guint            modifiers,
++                IBusM17NVirtualKeyboard *virtkbd)
++{
++    if (EEK_IS_TEXT (symbol)) {
++        const gchar *string;
++        IBusText *text;
++
++        string = eek_text_get_text (EEK_TEXT (symbol));
++        text = ibus_text_new_from_static_string (string);
++        ibus_engine_commit_text (virtkbd->engine, text);
++    } else if (EEK_IS_KEYSYM (symbol)) {
++        guint keyval = eek_keysym_get_xkeysym (EEK_KEYSYM (symbol));
++        ibus_engine_forward_key_event (virtkbd->engine,
++                                       keyval,
++                                       0,
++                                       modifiers);
++        ibus_engine_forward_key_event (virtkbd->engine,
++                                       keyval,
++                                       0,
++                                       modifiers | IBUS_RELEASE_MASK);
++    } else if (g_strcmp0 (eek_symbol_get_name (symbol),
++                          "cycle-keyboard") == 0) {
++        virtkbd->keyboards = g_slist_next (virtkbd->keyboards);
++        eekboard_context_set_keyboard (virtkbd->context,
++                                       GPOINTER_TO_UINT (virtkbd->keyboards->data),
++                                       NULL);
++    }
++}
++
++static void
++init_client (IBusM17NVirtualKeyboard *virtkbd)
++{
++    GDBusConnection *connection;
++    GError *error;
++    gchar **strv, **p;
++
++    error = NULL;
++    connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
++    if (connection == NULL) {
++        g_printerr ("Can't connect to the session bus: %s\n",
++                    error->message);
++        return;
++    }
++
++    virtkbd->client = eekboard_client_new (connection, NULL);
++    g_object_unref (connection);
++    g_signal_connect (virtkbd->client, "destroyed",
++                      G_CALLBACK (destroyed_cb), virtkbd);
++
++    virtkbd->context = eekboard_client_create_context (virtkbd->client,
++                                                       "ibus-m17n",
++                                                       NULL);
++    g_signal_connect (virtkbd->context, "key-pressed",
++                      G_CALLBACK (key_pressed_cb), virtkbd);
++
++    strv = g_strsplit (virtkbd->keyboard_type, ",", -1);
++    for (p = strv; *p; p++) {
++        guint keyboard;
++
++        keyboard = eekboard_context_add_keyboard (virtkbd->context,
++                                                  g_strstrip (*p),
++                                                  NULL);
++        virtkbd->keyboards = g_slist_prepend (virtkbd->keyboards,
++                                              GUINT_TO_POINTER (keyboard));
++    }
++    virtkbd->keyboards = g_slist_reverse (virtkbd->keyboards);
++    g_strfreev (strv);
++
++    /* make a cycle */
++    g_slist_last (virtkbd->keyboards)->next = virtkbd->keyboards;
++
++    eekboard_context_set_keyboard (virtkbd->context,
++                                   GPOINTER_TO_UINT (virtkbd->keyboards->data),
++                                   NULL);
++}
++#endif  /* HAVE_EEKBOARD */
++
++void
++ibus_m17n_virtual_keyboard_toggle_display (IBusM17NVirtualKeyboard *virtkbd)
++{
++#ifdef HAVE_EEKBOARD
++    if (virtkbd->client == NULL)
++        ibus_m17n_virtual_keyboard_enable (virtkbd);
++
++    if (virtkbd->client != NULL) {
++        if (eekboard_context_is_visible (virtkbd->context))
++            eekboard_context_hide_keyboard (virtkbd->context, NULL);
++        else
++            eekboard_context_show_keyboard (virtkbd->context, NULL);
++    }
++#endif  /* HAVE_EEKBOARD */
++}
++
++void
++ibus_m17n_virtual_keyboard_enable (IBusM17NVirtualKeyboard *virtkbd)
++{
++#ifdef HAVE_EEKBOARD
++    if (virtkbd->client == NULL)
++        init_client (virtkbd);
++
++    if (virtkbd->client != NULL)
++        eekboard_client_push_context (virtkbd->client, virtkbd->context, NULL);
++#endif  /* HAVE_EEKBOARD */
++}
++
++void
++ibus_m17n_virtual_keyboard_disable (IBusM17NVirtualKeyboard *virtkbd)
++{
++#ifdef HAVE_EEKBOARD
++    if (virtkbd->client != NULL)
++        eekboard_client_pop_context (virtkbd->client, NULL);
++#endif  /* HAVE_EEKBOARD */
++}
++
++IBusM17NVirtualKeyboard *
++ibus_m17n_virtual_keyboard_new (IBusEngine  *engine,
++                                const gchar *keyboard_type)
++{
++    IBusM17NVirtualKeyboard *virtkbd = g_object_new (IBUS_M17N_TYPE_VIRTUAL_KEYBOARD, NULL);
++    virtkbd->engine = g_object_ref (engine);
++    virtkbd->keyboard_type = g_strdup (keyboard_type);
++    return virtkbd;
++}
+diff --git a/src/virtkbd.h b/src/virtkbd.h
+new file mode 100644
+index 0000000..c28953a
+--- /dev/null
++++ b/src/virtkbd.h
+@@ -0,0 +1,31 @@
++#ifndef __VIRTKBD_H__
++#define __VIRTKBD_H__ 1
++
++#include <ibus.h>
++
++G_BEGIN_DECLS
++
++#define IBUS_M17N_TYPE_VIRTUAL_KEYBOARD (ibus_m17n_virtual_keyboard_get_type())
++#define IBUS_M17N_VIRTUAL_KEYBOARD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), IBUS_M17N_TYPE_VIRTUAL_KEYBOARD, IBusM17NVirtualKeyboard))
++#define IBUS_M17N_VIRTUAL_KEYBOARD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), IBUS_M17N_TYPE_VIRTUAL_KEYBOARD, IBusM17NVirtualKeyboardClass))
++#define IBUS_M17N_IS_VIRTUAL_KEYBOARD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), IBUS_M17N_TYPE_VIRTUAL_KEYBOARD))
++#define IBUS_M17N_IS_VIRTUAL_KEYBOARD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), IBUS_M17N_TYPE_VIRTUAL_KEYBOARD))
++#define IBUS_M17N_VIRTUAL_KEYBOARD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), IBUS_M17N_TYPE_VIRTUAL_KEYBOARD, IBusM17NVirtualKeyboardClass))
++
++typedef struct _IBusM17NVirtualKeyboard IBusM17NVirtualKeyboard;
++
++GType                    ibus_m17n_virtual_keyboard_get_type
++                         (void);
++IBusM17NVirtualKeyboard *ibus_m17n_virtual_keyboard_new
++                         (IBusEngine              *engine,
++                          const gchar             *keyboard_type);
++void                     ibus_m17n_virtual_keyboard_toggle_display
++                         (IBusM17NVirtualKeyboard *virtkbd);
++void                     ibus_m17n_virtual_keyboard_enable
++                         (IBusM17NVirtualKeyboard *virtkbd);
++void                     ibus_m17n_virtual_keyboard_disable
++                         (IBusM17NVirtualKeyboard *virtkbd);
++
++G_END_DECLS
++
++#endif  /* __VIRTKBD_H__ */
+-- 
+1.7.6.1
+
diff --git a/ibus-m17n-xkb-options.patch b/ibus-m17n-xkb-options.patch
index 6c3d8b9..2dc5c13 100644
--- a/ibus-m17n-xkb-options.patch
+++ b/ibus-m17n-xkb-options.patch
@@ -1,122 +1,49 @@
-Patch to set certain XKB options when an m17n IME is set.
-Index: ibus-m17n-1.3.2/src/default.xml.in.in
-===================================================================
---- ibus-m17n-1.3.2.orig/src/default.xml.in.in
-+++ ibus-m17n-1.3.2/src/default.xml.in.in
-@@ -12,19 +12,22 @@
- 		<preedit-highlight>FALSE</preedit-highlight>
- 	</engine>
- 	<engine>
--		<name>m17n:bn:inscript</name>
-+		<name>m17n:bn:inscript*</name>
- 		<rank>2</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
-+		<layout>default[lv3:ralt_switch]</layout>
- 	</engine>
- 	<engine>
--		<name>m17n:gu:inscript</name>
-+		<name>m17n:gu:inscript*</name>
- 		<rank>2</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
-+		<layout>default[lv3:ralt_switch]</layout>
- 	</engine>
- 	<engine>
--		<name>m17n:hi:inscript</name>
-+		<name>m17n:hi:inscript*</name>
- 		<rank>2</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
-+		<layout>default[lv3:ralt_switch]</layout>
- 	</engine>
- 	<engine>
- 		<name>m17n:kn:kgp</name>
-@@ -37,19 +40,22 @@
- 		<preedit-highlight>FALSE</preedit-highlight>
- 	</engine>
- 	<engine>
--		<name>m17n:mai:inscript</name>
-+		<name>m17n:mai:inscript*</name>
- 		<rank>2</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
-+		<layout>default[lv3:ralt_switch]</layout>
- 	</engine>
- 	<engine>
--		<name>m17n:ml:inscript</name>
-+		<name>m17n:ml:inscript*</name>
- 		<rank>2</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
-+		<layout>default[lv3:ralt_switch]</layout>
- 	</engine>
- 	<engine>
--		<name>m17n:mr:inscript</name>
-+		<name>m17n:mr:inscript*</name>
- 		<rank>2</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
-+		<layout>default[lv3:ralt_switch]</layout>
- 	</engine>
- 	<engine>
- 		<name>m17n:ne:rom</name>
-@@ -57,14 +63,16 @@
- 		<preedit-highlight>FALSE</preedit-highlight>
- 	</engine>
- 	<engine>
--		<name>m17n:or:inscript</name>
-+		<name>m17n:or:inscript*</name>
- 		<rank>2</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
-+		<layout>default[lv3:ralt_switch]</layout>
- 	</engine>
- 	<engine>
--		<name>m17n:pa:inscript</name>
-+		<name>m17n:pa:inscript*</name>
- 		<rank>2</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
-+		<layout>default[lv3:ralt_switch]</layout>
- 	</engine>
- 	<engine>
- 		<name>m17n:sa:harvard-kyoto</name>
-@@ -72,14 +80,16 @@
- 		<preedit-highlight>FALSE</preedit-highlight>
- 	</engine>
- 	<engine>
--		<name>m17n:sd:inscript</name>
-+		<name>m17n:sd:inscript*</name>
- 		<rank>2</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
+From 98be0a7b90cd47cafabb715695d20b9bfc7dd1bb Mon Sep 17 00:00:00 2001
+From: Daiki Ueno <ueno at unixuser.org>
+Date: Mon, 8 Aug 2011 09:59:28 +0900
+Subject: [PATCH 3/5] Set XKB layout option via default.xml.
+
+---
+ src/default.xml.in.in |    9 +++++++++
+ src/m17nutil.c        |   13 +++++++++++--
+ src/m17nutil.h        |    3 +++
+ 3 files changed, 23 insertions(+), 2 deletions(-)
+
+diff --git a/src/default.xml.in.in b/src/default.xml.in.in
+index dc93fd3..785ab05 100644
+--- a/src/default.xml.in.in
++++ b/src/default.xml.in.in
+@@ -157,6 +157,15 @@
+ 		<name>m17n:si:samanala</name>
+ 		<rank>0</rank>
+ 	</engine>
++	<!-- Some Indic engines expect AltGr is automatically mapped -->
++	<engine>
++		<name>m17n:*:inscript</name>
 +		<layout>default[lv3:ralt_switch]</layout>
- 	</engine>
- 	<engine>
- 		<name>m17n:si:wijesekera</name>
- 		<rank>2</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
++	</engine>
++	<engine>
++		<name>m17n:si:*</name>
 +		<layout>default[lv3:ralt_switch]</layout>
- 	</engine>
- 	<engine>
- 		<name>m17n:ta:tamil99</name>
-@@ -87,9 +97,10 @@
- 		<preedit-highlight>FALSE</preedit-highlight>
- 	</engine>
- 	<engine>
--		<name>m17n:te:inscript</name>
-+		<name>m17n:te:inscript*</name>
- 		<rank>2</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
-+		<layout>default[lv3:ralt_switch]</layout>
- 	</engine>
- 	<!-- Samanala should have lower rank than other Sinhala
- 	     engines since it is the only non-keyboard input method in
-@@ -226,6 +237,7 @@
- 		<name>m17n:si:*</name>
- 		<rank>1</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
-+		<layout>default[lv3:ralt_switch]</layout>
- 	</engine>
- 	<engine>
- 		<name>m17n:ta:*</name>
-Index: ibus-m17n-1.3.2/src/m17nutil.c
-===================================================================
---- ibus-m17n-1.3.2.orig/src/m17nutil.c
-+++ ibus-m17n-1.3.2/src/m17nutil.c
-@@ -120,7 +120,7 @@ ibus_m17n_engine_new (MSymbol  lang,
++	</engine>
+ 	<!-- Some CJK engines use preedit. -->
+ 	<engine>
+ 		<name>m17n:zh:cangjie</name>
+diff --git a/src/m17nutil.c b/src/m17nutil.c
+index 00b7194..06e1b58 100644
+--- a/src/m17nutil.c
++++ b/src/m17nutil.c
+@@ -11,7 +11,8 @@ static MConverter *utf8_converter = NULL;
+ 
+ typedef enum {
+     ENGINE_CONFIG_RANK_MASK = 1 << 0,
+-    ENGINE_CONFIG_PREEDIT_HIGHLIGHT_MASK = 1 << 1
++    ENGINE_CONFIG_LAYOUT_MASK = 1 << 1,
++    ENGINE_CONFIG_PREEDIT_HIGHLIGHT_MASK = 1 << 2
+ } EngineConfigMask;
+ 
+ struct _EngineConfigNode {
+@@ -126,7 +127,7 @@ ibus_m17n_engine_new (MSymbol  lang,
                                             "language",    msymbol_name (lang),
                                             "license",     "GPL",
                                             "icon",        engine_icon ? engine_icon : "",
@@ -125,22 +52,32 @@ Index: ibus-m17n-1.3.2/src/m17nutil.c
                                             "rank",        config->rank,
                                             NULL);
  #else
-@@ -282,6 +282,11 @@ ibus_m17n_engine_config_parse_xml_node (
-             cnode->config.rank = atoi (sub_node->text);
+@@ -268,6 +269,8 @@ ibus_m17n_get_engine_config (const gchar *engine_name)
+         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_LAYOUT_MASK)
++                config->layout = cnode->config.layout;
+             if (cnode->mask & ENGINE_CONFIG_PREEDIT_HIGHLIGHT_MASK)
+                 config->preedit_highlight = cnode->config.preedit_highlight;
+         }
+@@ -300,6 +303,12 @@ ibus_m17n_engine_config_parse_xml_node (EngineConfigNode *cnode,
+             cnode->mask |= ENGINE_CONFIG_RANK_MASK;
              continue;
          }
 +        if (g_strcmp0 (sub_node->name , "layout") == 0) {
 +            g_free (cnode->config.layout);
 +            cnode->config.layout = g_strdup (sub_node->text);
++            cnode->mask |= ENGINE_CONFIG_LAYOUT_MASK;
 +            continue;
 +        }
          if (g_strcmp0 (sub_node->name , "preedit-highlight") == 0) {
              if (g_ascii_strcasecmp ("TRUE", sub_node->text) == 0)
                  cnode->config.preedit_highlight = TRUE;
-Index: ibus-m17n-1.3.2/src/m17nutil.h
-===================================================================
---- ibus-m17n-1.3.2.orig/src/m17nutil.h
-+++ ibus-m17n-1.3.2/src/m17nutil.h
+diff --git a/src/m17nutil.h b/src/m17nutil.h
+index 313e7bc..c7b283e 100644
+--- a/src/m17nutil.h
++++ b/src/m17nutil.h
 @@ -14,6 +14,9 @@ struct _IBusM17NEngineConfig {
      /* engine rank */
      gint rank;
@@ -151,3 +88,6 @@ Index: ibus-m17n-1.3.2/src/m17nutil.h
      /* whether to highlight preedit */
      gboolean preedit_highlight;
  };
+-- 
+1.7.6.1
+
diff --git a/ibus-m17n-xx-icon-symbol.patch b/ibus-m17n-xx-icon-symbol.patch
index 1d13292..37553c7 100644
--- a/ibus-m17n-xx-icon-symbol.patch
+++ b/ibus-m17n-xx-icon-symbol.patch
@@ -1,23 +1,23 @@
-From 432d6f93be857d2544ad19ba67caea22d5843cc5 Mon Sep 17 00:00:00 2001
+From 7a3f7a425977c685ad64a4ec44682926ef345ea1 Mon Sep 17 00:00:00 2001
 From: Daiki Ueno <ueno at unixuser.org>
-Date: Tue, 5 Jul 2011 16:26:49 +0900
-Subject: [PATCH] Supply hotkeys and symbol in engine desc.
+Date: Wed, 31 Aug 2011 11:44:46 +0900
+Subject: [PATCH 4/5] Supply hotkeys and symbol in engine desc.
 
 ---
  configure.ac          |    3 +
  m4/.gitignore         |    2 +
- m4/ibus.m4            |   52 +++++++++
- src/default.xml.in.in |  284 +++++++++++++++++++++++++++++++++++++++++--------
- src/m17nutil.c        |   10 ++
- src/m17nutil.h        |    6 +
- 6 files changed, 312 insertions(+), 45 deletions(-)
+ m4/ibus.m4            |   52 ++++++++++++
+ src/default.xml.in.in |  207 +++++++++++++++++++++++++++++++++++++++++++++++++
+ src/m17nutil.c        |   20 +++++-
+ src/m17nutil.h        |    6 ++
+ 6 files changed, 289 insertions(+), 1 deletions(-)
  create mode 100644 m4/ibus.m4
 
-Index: ibus-m17n-1.3.2/configure.ac
-===================================================================
---- ibus-m17n-1.3.2.orig/configure.ac
-+++ ibus-m17n-1.3.2/configure.ac
-@@ -114,6 +114,9 @@ AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GET
+diff --git a/configure.ac b/configure.ac
+index 4df68b6..089aafb 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -114,6 +114,9 @@ AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [Define to the read-only
  AM_GNU_GETTEXT([external])
  AM_GNU_GETTEXT_VERSION(0.16.1)
  
@@ -27,10 +27,19 @@ Index: ibus-m17n-1.3.2/configure.ac
  
  # OUTPUT files
  AC_CONFIG_FILES([ po/Makefile.in
-Index: ibus-m17n-1.3.2/m4/ibus.m4
-===================================================================
+diff --git a/m4/.gitignore b/m4/.gitignore
+index 0f4126c..e28d185 100644
+--- a/m4/.gitignore
++++ b/m4/.gitignore
+@@ -1 +1,3 @@
+ *.m4
++!ibus.m4
++
+diff --git a/m4/ibus.m4 b/m4/ibus.m4
+new file mode 100644
+index 0000000..f8f074a
 --- /dev/null
-+++ ibus-m17n-1.3.2/m4/ibus.m4
++++ b/m4/ibus.m4
 @@ -0,0 +1,52 @@
 +# IBUS_WITH_HOTKEYS([DEFAULT])
 +AC_DEFUN([IBUS_WITH_HOTKEYS], [
@@ -84,503 +93,245 @@ Index: ibus-m17n-1.3.2/m4/ibus.m4
 +  fi
 +  AC_SUBST(IBUS_SYMBOL_XML)
 +])
-Index: ibus-m17n-1.3.2/src/default.xml.in.in
-===================================================================
---- ibus-m17n-1.3.2.orig/src/default.xml.in.in
-+++ ibus-m17n-1.3.2/src/default.xml.in.in
-@@ -10,97 +10,114 @@
- 		<name>m17n:as:phonetic</name>
- 		<rank>2</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
-+		<symbol>ক</symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:bn:inscript*</name>
- 		<rank>2</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
- 		<layout>default[lv3:ralt_switch]</layout>
-+		<symbol>ক</symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:gu:inscript*</name>
- 		<rank>2</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
- 		<layout>default[lv3:ralt_switch]</layout>
-+		<symbol>ક</symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:hi:inscript*</name>
- 		<rank>2</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
- 		<layout>default[lv3:ralt_switch]</layout>
-+		<symbol>क</symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:kn:kgp</name>
- 		<rank>2</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
-+		<symbol>ಕ</symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:ks:kbd</name>
- 		<rank>2</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
-+		<symbol>क</symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:mai:inscript*</name>
- 		<rank>2</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
- 		<layout>default[lv3:ralt_switch]</layout>
-+		<symbol>क</symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:ml:inscript*</name>
- 		<rank>2</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
- 		<layout>default[lv3:ralt_switch]</layout>
-+		<symbol>ക</symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:mr:inscript*</name>
- 		<rank>2</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
- 		<layout>default[lv3:ralt_switch]</layout>
-+		<symbol>क</symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:ne:rom</name>
- 		<rank>2</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
-+		<symbol>ने</symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:or:inscript*</name>
- 		<rank>2</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
- 		<layout>default[lv3:ralt_switch]</layout>
-+		<symbol>କ</symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:pa:inscript*</name>
- 		<rank>2</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
- 		<layout>default[lv3:ralt_switch]</layout>
-+		<symbol>ਕ</symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:sa:harvard-kyoto</name>
- 		<rank>2</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
-+		<symbol>क</symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:sd:inscript*</name>
- 		<rank>2</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
- 		<layout>default[lv3:ralt_switch]</layout>
-+		<symbol>क</symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:si:wijesekera</name>
- 		<rank>2</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
- 		<layout>default[lv3:ralt_switch]</layout>
-+		<symbol>සි</symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:ta:tamil99</name>
- 		<rank>2</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
-+		<symbol>க</symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:te:inscript*</name>
- 		<rank>2</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
- 		<layout>default[lv3:ralt_switch]</layout>
-+		<symbol>క</symbol>
- 	</engine>
- 	<!-- Samanala should have lower rank than other Sinhala
- 	     engines since it is the only non-keyboard input method in
-@@ -109,57 +126,14 @@
- 		<name>m17n:si:samanala</name>
+diff --git a/src/default.xml.in.in b/src/default.xml.in.in
+index 785ab05..8192878 100644
+--- a/src/default.xml.in.in
++++ b/src/default.xml.in.in
+@@ -10,6 +10,8 @@
+ 		<name>m17n:*</name>
  		<rank>0</rank>
  		<preedit-highlight>FALSE</preedit-highlight>
-+		<symbol>සි</symbol>
++		<symbol></symbol>
++		@IBUS_HOTKEYS_XML@
  	</engine>
- 	<!-- Chinese and Japanese engines which require preedit decoration. -->
- 	<engine>
+ 	<!-- Indic engines should be selected by default:
+ 	     https://bugzilla.redhat.com/show_bug.cgi?id=640896 -->
+@@ -203,4 +205,209 @@
  		<name>m17n:ja:anthy</name>
- 		<rank>0</rank>
  		<preedit-highlight>TRUE</preedit-highlight>
--	</engine>
--	<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>
--		<preedit-highlight>TRUE</preedit-highlight>
-+		<symbol>あ</symbol>
  	</engine>
- 	<!-- Other Indic engines should be selected by default:
- 	     https://bugzilla.redhat.com/show_bug.cgi?id=640896 -->
-@@ -167,92 +141,312 @@
- 		<name>m17n:as:*</name>
- 		<rank>1</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
++	<!-- Set IME symbols. -->
++	<engine>
++		<name>m17n:as:*</name>
 +		<symbol>ক</symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:bn:*</name>
- 		<rank>1</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
++	</engine>
++	<engine>
++		<name>m17n:bn:*</name>
 +		<symbol>ক</symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:gu:*</name>
- 		<rank>1</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
++	</engine>
++	<engine>
++		<name>m17n:gu:*</name>
 +		<symbol>ક</symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:hi:*</name>
- 		<rank>1</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
++	</engine>
++	<engine>
++		<name>m17n:hi:*</name>
 +		<symbol>क</symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:kn:*</name>
- 		<rank>1</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
++	</engine>
++	<engine>
++		<name>m17n:kn:*</name>
 +		<symbol>ಕ</symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:ks:*</name>
- 		<rank>1</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
++	</engine>
++	<engine>
++		<name>m17n:ks:*</name>
 +		<symbol>क</symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:mai:*</name>
- 		<rank>1</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
++	</engine>
++	<engine>
++		<name>m17n:mai:*</name>
 +		<symbol>क</symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:ml:*</name>
- 		<rank>1</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
++	</engine>
++	<engine>
++		<name>m17n:ml:*</name>
 +		<symbol>ക</symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:mr:*</name>
- 		<rank>1</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
++	</engine>
++	<engine>
++		<name>m17n:mr:*</name>
 +		<symbol>क</symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:ne:*</name>
- 		<rank>1</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
-+		<symbol></symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:or:*</name>
- 		<rank>1</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
++	</engine>
++	<engine>
++		<name>m17n:ne:*</name>
++		<symbol>ने</symbol>
++	</engine>
++	<engine>
++		<name>m17n:or:*</name>
 +		<symbol>କ</symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:pa:*</name>
- 		<rank>1</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
++	</engine>
++	<engine>
++		<name>m17n:pa:*</name>
 +		<symbol>ਕ</symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:sa:*</name>
- 		<rank>1</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
++	</engine>
++	<engine>
++		<name>m17n:sa:*</name>
 +		<symbol>क</symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:sd:*</name>
- 		<rank>1</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
++	</engine>
++	<engine>
++		<name>m17n:sd:*</name>
 +		<symbol>क</symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:si:*</name>
- 		<rank>1</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
- 		<layout>default[lv3:ralt_switch]</layout>
++	</engine>
++	<engine>
++		<name>m17n:si:*</name>
 +		<symbol>සි</symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:ta:*</name>
- 		<rank>1</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
++	</engine>
++	<engine>
++		<name>m17n:ta:*</name>
 +		<symbol>க</symbol>
- 	</engine>
- 	<engine>
- 		<name>m17n:te:*</name>
- 		<rank>1</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
++	</engine>
++	<engine>
++		<name>m17n:te:*</name>
 +		<symbol>క</symbol>
 +	</engine>
-+	<!-- Tweak symbols: for most maps, their "title" properties
-+	     fit in one character width.  However, some of them are
-+	     bit longer. -->
 +	<engine>
 +		<name>m17n:*:kbd</name>
-+		<rank>0</rank>
-+		<preedit-highlight>FALSE</preedit-highlight>
 +		<symbol></symbol>
 +	</engine>
 +	<engine>
 +		<name>m17n:*:pre</name>
-+		<rank>0</rank>
-+		<preedit-highlight>FALSE</preedit-highlight>
 +		<symbol></symbol>
 +	</engine>
 +	<engine>
 +		<name>m17n:*:post</name>
-+		<rank>0</rank>
-+		<preedit-highlight>FALSE</preedit-highlight>
 +		<symbol></symbol>
 +	</engine>
 +	<engine>
 +		<name>m17n:am:sera</name>
-+		<rank>0</rank>
-+		<preedit-highlight>FALSE</preedit-highlight>
 +		<symbol>አ</symbol>
 +	</engine>
 +	<engine>
 +		<name>m17n:bo:*</name>
-+		<rank>0</rank>
-+		<preedit-highlight>FALSE</preedit-highlight>
 +		<symbol>ཀ</symbol>
 +	</engine>
 +	<engine>
 +		<name>m17n:cr:*</name>
-+		<rank>0</rank>
-+		<preedit-highlight>FALSE</preedit-highlight>
 +		<symbol></symbol>
 +	</engine>
 +	<engine>
 +		<name>m17n:dv:*</name>
-+		<rank>0</rank>
-+		<preedit-highlight>FALSE</preedit-highlight>
 +		<symbol></symbol>
 +	</engine>
 +	<engine>
 +		<name>m17n:eo:*</name>
-+		<rank>0</rank>
-+		<preedit-highlight>FALSE</preedit-highlight>
 +		<symbol></symbol>
 +	</engine>
 +	<engine>
 +		<name>m17n:fa:*</name>
-+		<rank>0</rank>
-+		<preedit-highlight>FALSE</preedit-highlight>
 +		<symbol>ف</symbol>
 +	</engine>
 +	<engine>
 +		<name>m17n:fr:*</name>
-+		<rank>0</rank>
-+		<preedit-highlight>FALSE</preedit-highlight>
 +		<symbol></symbol>
 +	</engine>
 +	<engine>
 +		<name>m17n:ii:*</name>
-+		<rank>0</rank>
-+		<preedit-highlight>FALSE</preedit-highlight>
 +		<symbol></symbol>
 +	</engine>
 +	<engine>
 +		<name>m17n:iu:*</name>
-+		<rank>0</rank>
-+		<preedit-highlight>FALSE</preedit-highlight>
 +		<symbol></symbol>
 +	</engine>
 +	<engine>
++		<name>m17n:ja:anthy</name>
++		<symbol>あ</symbol>
++	</engine>
++	<engine>
 +		<name>m17n:kk:*</name>
-+		<rank>0</rank>
-+		<preedit-highlight>FALSE</preedit-highlight>
 +		<symbol>قا</symbol>
 +	</engine>
 +	<engine>
 +		<name>m17n:km:*</name>
-+		<rank>0</rank>
-+		<preedit-highlight>FALSE</preedit-highlight>
 +		<symbol>ក</symbol>
 +	</engine>
 +	<engine>
 +		<name>m17n:lo:*</name>
-+		<rank>0</rank>
-+		<preedit-highlight>FALSE</preedit-highlight>
 +		<symbol>ກ</symbol>
 +	</engine>
 +	<engine>
 +		<name>m17n:nsk:*</name>
-+		<rank>0</rank>
-+		<preedit-highlight>FALSE</preedit-highlight>
 +		<symbol></symbol>
 +	</engine>
 +	<engine>
 +		<name>m17n:oj:*</name>
-+		<rank>0</rank>
-+		<preedit-highlight>FALSE</preedit-highlight>
 +		<symbol></symbol>
 +	</engine>
 +	<engine>
 +		<name>m17n:ps:*</name>
-+		<rank>0</rank>
-+		<preedit-highlight>FALSE</preedit-highlight>
 +		<symbol></symbol>
 +	</engine>
 +	<engine>
 +		<name>m17n:ru:*</name>
-+		<rank>0</rank>
-+		<preedit-highlight>FALSE</preedit-highlight>
 +		<symbol>Я</symbol>
 +	</engine>
 +	<engine>
 +		<name>m17n:sv:*</name>
-+		<rank>0</rank>
-+		<preedit-highlight>FALSE</preedit-highlight>
 +		<symbol></symbol>
 +	</engine>
 +	<engine>
 +		<name>m17n:syrc:*</name>
-+		<rank>0</rank>
-+		<preedit-highlight>FALSE</preedit-highlight>
 +		<symbol></symbol>
 +	</engine>
 +	<engine>
 +		<name>m17n:tai:*</name>
-+		<rank>0</rank>
-+		<preedit-highlight>FALSE</preedit-highlight>
 +		<symbol>꫞</symbol>
 +	</engine>
 +	<engine>
 +		<name>m17n:th:*</name>
-+		<rank>0</rank>
-+		<preedit-highlight>FALSE</preedit-highlight>
 +		<symbol>ท</symbol>
 +	</engine>
 +	<engine>
 +		<name>m17n:ur:*</name>
-+		<rank>0</rank>
-+		<preedit-highlight>FALSE</preedit-highlight>
 +		<symbol>خ</symbol>
 +	</engine>
 +	<engine>
 +		<name>m17n:vi:han</name>
-+		<rank>0</rank>
-+		<preedit-highlight>FALSE</preedit-highlight>
 +		<symbol>越</symbol>
 +	</engine>
 +	<engine>
 +		<name>m17n:vi:nom*</name>
-+		<rank>0</rank>
-+		<preedit-highlight>FALSE</preedit-highlight>
 +		<symbol>喃</symbol>
 +	</engine>
 +	<engine>
 +		<name>m17n:vi:*</name>
-+		<rank>0</rank>
-+		<preedit-highlight>FALSE</preedit-highlight>
 +		<symbol>Ắ</symbol>
 +	</engine>
 +	<engine>
 +		<name>m17n:yi:*</name>
-+		<rank>0</rank>
-+		<preedit-highlight>TRUE</preedit-highlight>
 +		<symbol></symbol>
 +	</engine>
 +	<engine>
 +		<name>m17n:zh:bopomofo</name>
-+		<rank>0</rank>
-+		<preedit-highlight>TRUE</preedit-highlight>
 +		<symbol>ㄅ</symbol>
 +	</engine>
 +	<engine>
 +		<name>m17n:zh:cangjie</name>
-+		<rank>0</rank>
-+		<preedit-highlight>TRUE</preedit-highlight>
 +		<symbol>倉</symbol>
 +	</engine>
 +	<engine>
 +		<name>m17n:zh:py*</name>
-+		<rank>0</rank>
-+		<preedit-highlight>TRUE</preedit-highlight>
 +		<symbol>拼</symbol>
 +	</engine>
 +	<engine>
 +		<name>m17n:zh:quick</name>
-+		<rank>0</rank>
-+		<preedit-highlight>TRUE</preedit-highlight>
 +		<symbol>簡</symbol>
 +	</engine>
 +	<engine>
 +		<name>m17n:zh:tonepy*</name>
-+		<rank>0</rank>
-+		<preedit-highlight>TRUE</preedit-highlight>
 +		<symbol>调</symbol>
- 	</engine>
- 	<!-- Default for other engines. -->
- 	<engine>
- 		<name>m17n:*</name>
- 		<rank>0</rank>
- 		<preedit-highlight>FALSE</preedit-highlight>
-+		<symbol></symbol>
-+		@IBUS_HOTKEYS_XML@
- 	</engine>
++	</engine>
  </engines>
-Index: ibus-m17n-1.3.2/src/m17nutil.c
-===================================================================
---- ibus-m17n-1.3.2.orig/src/m17nutil.c
-+++ ibus-m17n-1.3.2/src/m17nutil.c
-@@ -122,6 +122,8 @@ ibus_m17n_engine_new (MSymbol  lang,
+diff --git a/src/m17nutil.c b/src/m17nutil.c
+index 06e1b58..3e6b9f1 100644
+--- a/src/m17nutil.c
++++ b/src/m17nutil.c
+@@ -12,7 +12,9 @@ static MConverter *utf8_converter = NULL;
+ typedef enum {
+     ENGINE_CONFIG_RANK_MASK = 1 << 0,
+     ENGINE_CONFIG_LAYOUT_MASK = 1 << 1,
+-    ENGINE_CONFIG_PREEDIT_HIGHLIGHT_MASK = 1 << 2
++    ENGINE_CONFIG_HOTKEYS_MASK = 1 << 2,
++    ENGINE_CONFIG_SYMBOL_MASK = 1 << 3,
++    ENGINE_CONFIG_PREEDIT_HIGHLIGHT_MASK = 1 << 4
+ } EngineConfigMask;
+ 
+ struct _EngineConfigNode {
+@@ -129,6 +131,8 @@ ibus_m17n_engine_new (MSymbol  lang,
                                             "icon",        engine_icon ? engine_icon : "",
                                             "layout",      config->layout ? config->layout : "us",
                                             "rank",        config->rank,
@@ -589,25 +340,38 @@ Index: ibus-m17n-1.3.2/src/m17nutil.c
                                             NULL);
  #else
      engine = ibus_engine_desc_new (engine_name,
-@@ -287,6 +289,14 @@ ibus_m17n_engine_config_parse_xml_node (
-             cnode->config.layout = g_strdup (sub_node->text);
+@@ -271,6 +275,10 @@ ibus_m17n_get_engine_config (const gchar *engine_name)
+                 config->rank = cnode->config.rank;
+             if (cnode->mask & ENGINE_CONFIG_LAYOUT_MASK)
+                 config->layout = cnode->config.layout;
++            if (cnode->mask & ENGINE_CONFIG_HOTKEYS_MASK)
++                config->hotkeys = cnode->config.hotkeys;
++            if (cnode->mask & ENGINE_CONFIG_SYMBOL_MASK)
++                config->symbol = cnode->config.symbol;
+             if (cnode->mask & ENGINE_CONFIG_PREEDIT_HIGHLIGHT_MASK)
+                 config->preedit_highlight = cnode->config.preedit_highlight;
+         }
+@@ -309,6 +317,16 @@ ibus_m17n_engine_config_parse_xml_node (EngineConfigNode *cnode,
+             cnode->mask |= ENGINE_CONFIG_LAYOUT_MASK;
              continue;
          }
 +        if (g_strcmp0 (sub_node->name , "hotkeys") == 0) {
 +            cnode->config.hotkeys = g_strdup (sub_node->text);
++            cnode->mask |= ENGINE_CONFIG_HOTKEYS_MASK;
 +            continue;
 +        }
 +        if (g_strcmp0 (sub_node->name , "symbol") == 0) {
 +            cnode->config.symbol = g_strdup (sub_node->text);
++            cnode->mask |= ENGINE_CONFIG_SYMBOL_MASK;
 +            continue;
 +        }
          if (g_strcmp0 (sub_node->name , "preedit-highlight") == 0) {
              if (g_ascii_strcasecmp ("TRUE", sub_node->text) == 0)
                  cnode->config.preedit_highlight = TRUE;
-Index: ibus-m17n-1.3.2/src/m17nutil.h
-===================================================================
---- ibus-m17n-1.3.2.orig/src/m17nutil.h
-+++ ibus-m17n-1.3.2/src/m17nutil.h
+diff --git a/src/m17nutil.h b/src/m17nutil.h
+index c7b283e..21b1bb9 100644
+--- a/src/m17nutil.h
++++ b/src/m17nutil.h
 @@ -17,6 +17,12 @@ struct _IBusM17NEngineConfig {
      /* keyboard layout */
      gchar *layout;
@@ -621,3 +385,6 @@ Index: ibus-m17n-1.3.2/src/m17nutil.h
      /* whether to highlight preedit */
      gboolean preedit_highlight;
  };
+-- 
+1.7.6.1
+
diff --git a/ibus-m17n.spec b/ibus-m17n.spec
index 9f60a37..184e159 100644
--- a/ibus-m17n.spec
+++ b/ibus-m17n.spec
@@ -11,9 +11,13 @@
 %global _with_hotkeys --with-hotkeys
 %endif
 
+%if (0%{?fedora} > 16)
+%global _enable_eekboard --enable_eekboard
+%endif
+
 Name:       ibus-m17n
 Version:    1.3.2
-Release:    10%{?dist}
+Release:    11%{?dist}
 Summary:    The M17N engine for IBus platform
 License:    GPLv2+
 Group:      System Environment/Libraries
@@ -21,9 +25,10 @@ URL:        http://code.google.com/p/ibus/
 Source0:    http://ibus.googlecode.com/files/%{name}-%{version}.tar.gz
 
 Patch0:     ibus-m17n-HEAD.patch
-Patch1:     ibus-m17n-iok.patch
+Patch1:     ibus-m17n-default-xml-override.patch
 Patch2:     ibus-m17n-xkb-options.patch
 Patch3:     ibus-m17n-xx-icon-symbol.patch
+Patch4:     ibus-m17n-virtkbd.patch
 
 # The following BR is for autogen and not necessary when packging
 # released tarballs.
@@ -39,10 +44,11 @@ BuildRequires:  gtk2-devel
 %endif
 BuildRequires:  libxklavier-devel
 BuildRequires:  ibus-devel >= %{require_ibus_version}
+BuildRequires:	eekboard-devel
 
 Requires:   ibus >= %{require_ibus_version}
 Requires:   m17n-lib
-Requires:   iok > 1.3.1
+Requires:   eekboard
 
 %description
 M17N engine for IBus input platform. It allows input of many languages using
@@ -51,13 +57,14 @@ the input table maps from m17n-db.
 %prep
 %setup -q
 %patch0 -p1 -b .HEAD
-%patch1 -p1 -b .iok
+%patch1 -p1 -b .default-xml-override
 %patch2 -p1 -b .xkb-options
 %patch3 -p1 -b .xx-icon-symbol
+%patch4 -p1 -b .virtkbd
 NOCONFIGURE=1 ./autogen.sh
 
 %build
-%configure --disable-static %{?_with_gtk} %{?_with_hotkeys}
+%configure --disable-static %{?_with_gtk} %{?_with_hotkeys} %{?_enable_eekboard}
 # make -C po update-gmo
 make %{?_smp_mflags}
 
@@ -75,6 +82,10 @@ make DESTDIR=${RPM_BUILD_ROOT} install
 %{_datadir}/ibus/component/*
 
 %changelog
+* Thu Sep  1 2011 Daiki Ueno <dueno at redhat.com> - 1.3.2-11
+- Add ibus-m17n-default-xml-override.patch.
+- Add ibus-m17n-virtkbd.patch, instead of ibus-m17n-iok.patch.
+
 * Tue Aug  9 2011 Daiki Ueno <dueno at redhat.com> - 1.3.2-10
 - Set symbol for m17n:ne:rom.
 


More information about the i18n-bugs mailing list