[ibus-m17n/f15] Update to 1.3.3-3.
Daiki Ueno
ueno at fedoraproject.org
Fri Sep 9 05:59:51 UTC 2011
commit 410549be6e59d2e5df5e2bb88a94ed65608ec077
Author: Daiki Ueno <ueno at unixuser.org>
Date: Fri Sep 9 14:59:27 2011 +0900
Update to 1.3.3-3.
.gitignore | 1 +
ibus-m17n-HEAD.patch | 281 -----------
ibus-m17n-default-xml-override.patch | 621 +++++++++++++++++++++++++
ibus-m17n-iok.patch | 62 ++--
ibus-m17n-setup-refactor.patch | 843 +++++++++++++++++++++++++++++++++
ibus-m17n-virtkbd.patch | 849 ++++++++++++++++++++++++++++++++++
ibus-m17n-xkb-options.patch | 465 ++++---------------
ibus-m17n-xx-icon-symbol.patch | 324 ++++++++++++--
ibus-m17n.spec | 69 +++-
series | 4 -
sources | 2 +-
11 files changed, 2780 insertions(+), 741 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index f71607a..59fba23 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,4 @@ ibus-m17n-1.3.0.tar.gz
/ibus-m17n-1.3.0.tar.gz
/ibus-m17n-1.3.1.tar.gz
/ibus-m17n-1.3.2.tar.gz
+/ibus-m17n-1.3.3.tar.gz
diff --git a/ibus-m17n-default-xml-override.patch b/ibus-m17n-default-xml-override.patch
new file mode 100644
index 0000000..21f2be2
--- /dev/null
+++ b/ibus-m17n-default-xml-override.patch
@@ -0,0 +1,621 @@
+From e37bcc53f1d145e10974fb0bb91802d735921fcd 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/6] 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 cfb853c..dcff0c7 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 42aa8f6..b06f71d 100644
+--- a/src/m17nutil.c
++++ b/src/m17nutil.c
+@@ -13,12 +13,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;
+
+@@ -257,20 +263,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;
+
+@@ -284,6 +301,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) {
+@@ -292,6 +310,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>",
+@@ -320,7 +339,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>",
+@@ -328,9 +347,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);
+@@ -448,30 +467,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-iok.patch b/ibus-m17n-iok.patch
index e73124f..b885aae 100644
--- a/ibus-m17n-iok.patch
+++ b/ibus-m17n-iok.patch
@@ -1,25 +1,33 @@
-Patch to support iok (Indic Onscreen Keyboard).
-Index: ibus-m17n-1.3.2/src/engine.c
-===================================================================
---- ibus-m17n-1.3.2.orig/src/engine.c
-+++ ibus-m17n-1.3.2/src/engine.c
-@@ -23,6 +23,7 @@ struct _IBusM17NEngine {
+From 240931f8433ffa9de0c78a862e0d5e0aad93953d Mon Sep 17 00:00:00 2001
+From: Daiki Ueno <ueno at unixuser.org>
+Date: Fri, 2 Sep 2011 11:27:02 +0900
+Subject: [PATCH 6/6] Apply iok patch from fedora.
+
+---
+ src/engine.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
+ 1 files changed, 44 insertions(+), 0 deletions(-)
+
+diff --git a/src/engine.c b/src/engine.c
+index 1e6bd1b..f23d982 100644
+--- a/src/engine.c
++++ b/src/engine.c
+@@ -26,6 +26,7 @@ struct _IBusM17NEngine {
IBusProperty *setup_prop;
#endif /* HAVE_SETUP */
- IBusPropList *prop_list;
+ IBusProperty *virtkbd_prop;
+ IBusProperty *show_iok_prop;
+ IBusPropList *prop_list;
};
- struct _IBusM17NEngineClass {
-@@ -34,6 +35,7 @@ struct _IBusM17NEngineClass {
- guint preedit_background;
- gint preedit_underline;
+@@ -40,6 +41,7 @@ struct _IBusM17NEngineClass {
gint lookup_table_orientation;
+ gchar *virtual_keyboard;
+ gboolean virtual_keyboard_enabled;
+ gboolean use_iok;
MInputMethod *im;
};
-@@ -248,6 +250,9 @@ ibus_m17n_engine_class_init (IBusM17NEng
+@@ -254,6 +256,9 @@ ibus_m17n_engine_class_init (IBusM17NEngineClass *klass)
}
engine_name = g_strdup_printf ("m17n:%s:%s", lang, name);
klass->config_section = g_strdup_printf ("engine/M17N/%s/%s", lang, name);
@@ -29,17 +37,9 @@ Index: ibus-m17n-1.3.2/src/engine.c
g_free (lang);
g_free (name);
-@@ -344,6 +349,7 @@ ibus_m17n_engine_init (IBusM17NEngine *m
- {
- 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);
-@@ -376,6 +382,23 @@ ibus_m17n_engine_init (IBusM17NEngine *m
- ibus_prop_list_append (m17n->prop_list, m17n->setup_prop);
- #endif /* HAVE_SETUP */
+@@ -412,6 +417,22 @@ ibus_m17n_engine_init (IBusM17NEngine *m17n)
+ klass->virtual_keyboard != NULL)
+ ibus_property_set_visible (m17n->virtkbd_prop, TRUE);
+ label = ibus_text_new_from_string ("iok");
+ m17n->show_iok_prop = ibus_property_new ("iok",
@@ -52,18 +52,17 @@ Index: ibus-m17n-1.3.2/src/engine.c
+ 0,
+ NULL);
+ g_object_ref_sink (m17n->show_iok_prop);
++ ibus_prop_list_append (m17n->prop_list, m17n->show_iok_prop);
+
-+ if (klass->use_iok)
++ if (klass->use_iok && !klass->virtual_keyboard_enabled)
+ ibus_property_set_visible (m17n->show_iok_prop, TRUE);
+
-+ ibus_prop_list_append (m17n->prop_list, m17n->show_iok_prop);
-+
m17n->table = ibus_lookup_table_new (9, 0, TRUE, TRUE);
g_object_ref_sink (m17n->table);
m17n->context = NULL;
-@@ -461,6 +484,11 @@ ibus_m17n_engine_destroy (IBusM17NEngine
+@@ -502,6 +523,11 @@ ibus_m17n_engine_destroy (IBusM17NEngine *m17n)
+ m17n->virtkbd_prop = NULL;
}
- #endif /* HAVE_SETUP */
+ if (m17n->show_iok_prop) {
+ g_object_unref (m17n->show_iok_prop);
@@ -73,9 +72,9 @@ Index: ibus-m17n-1.3.2/src/engine.c
if (m17n->table) {
g_object_unref (m17n->table);
m17n->table = NULL;
-@@ -778,6 +806,24 @@ ibus_m17n_engine_property_activate (IBus
+@@ -842,6 +868,24 @@ ibus_m17n_engine_property_activate (IBusEngine *engine,
}
- #endif /* HAVE_SETUP */
+ #endif /* HAVE_EEKBOARD */
+ if (g_strcmp0 (prop_name, "iok") == 0) {
+ const gchar *engine_name;
@@ -98,3 +97,6 @@ Index: ibus-m17n-1.3.2/src/engine.c
parent_class->property_activate (engine, prop_name, prop_state);
}
+--
+1.7.6.1
+
diff --git a/ibus-m17n-setup-refactor.patch b/ibus-m17n-setup-refactor.patch
new file mode 100644
index 0000000..ccd1346
--- /dev/null
+++ b/ibus-m17n-setup-refactor.patch
@@ -0,0 +1,843 @@
+From bd48b1f5c71ab849e1d2c78fd069a92d37426dc3 Mon Sep 17 00:00:00 2001
+From: Daiki Ueno <ueno at unixuser.org>
+Date: Thu, 1 Sep 2011 18:48:41 +0900
+Subject: [PATCH 2/6] Refactor setup.c.
+
+---
+ src/ibus-m17n-preferences.ui | 3 +-
+ src/setup.c | 663 +++++++++++++++++++++++-------------------
+ 2 files changed, 362 insertions(+), 304 deletions(-)
+
+diff --git a/src/ibus-m17n-preferences.ui b/src/ibus-m17n-preferences.ui
+index 6f6ace7..a46ab49 100644
+--- a/src/ibus-m17n-preferences.ui
++++ b/src/ibus-m17n-preferences.ui
+@@ -263,9 +263,10 @@
+ <property name="hscrollbar_policy">automatic</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <child>
+- <object class="GtkTreeView" id="treeviewMimConfig">
++ <object class="GtkTreeView" id="treeview_mim_config">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
++ <property name="has_tooltip">True</property>
+ <property name="enable_grid_lines">both</property>
+ </object>
+ </child>
+diff --git a/src/setup.c b/src/setup.c
+index aba0e92..30386df 100644
+--- a/src/setup.c
++++ b/src/setup.c
+@@ -17,19 +17,24 @@ enum {
+ NUM_COLS
+ };
+
+-struct _ConfigContext {
+- IBusConfig *config;
+- MSymbol language;
+- MSymbol name;
+- GtkListStore *store;
+- gchar *section;
++struct _SetupDialog {
++ GtkWidget *dialog;
++ GtkWidget *combobox_underline;
++ GtkWidget *combobox_orientation;
++ GtkWidget *checkbutton_foreground;
+ GtkWidget *colorbutton_foreground;
++ GtkWidget *checkbutton_background;
+ GtkWidget *colorbutton_background;
++ GtkWidget *treeview;
++ GtkListStore *store;
+
+-};
+-typedef struct _ConfigContext ConfigContext;
++ gchar *lang;
++ gchar *name;
+
+-static IBusConfig *config = NULL;
++ IBusConfig *config;
++ gchar *section;
++};
++typedef struct _SetupDialog SetupDialog;
+
+ static gchar *opt_name = NULL;
+ static const GOptionEntry options[] = {
+@@ -38,17 +43,8 @@ static const GOptionEntry options[] = {
+ {NULL}
+ };
+
+-void
+-ibus_m17n_init (IBusBus *bus)
+-{
+- config = ibus_bus_get_config (bus);
+- if (config)
+- g_object_ref_sink (config);
+- ibus_m17n_init_common ();
+-}
+-
+ static gchar *
+-format_value (MPlist *plist)
++format_m17n_value (MPlist *plist)
+ {
+ if (mplist_key (plist) == Msymbol)
+ return g_strdup (msymbol_name ((MSymbol) mplist_value (plist)));
+@@ -64,7 +60,7 @@ format_value (MPlist *plist)
+ }
+
+ static MPlist *
+-parse_value (MPlist *plist, gchar *text)
++parse_m17n_value (MPlist *plist, gchar *text)
+ {
+ MPlist *value;
+
+@@ -100,7 +96,7 @@ parse_value (MPlist *plist, gchar *text)
+ }
+
+ static void
+-insert_items (GtkListStore *store, MSymbol language, MSymbol name)
++insert_m17n_items (GtkListStore *store, MSymbol language, MSymbol name)
+ {
+ MPlist *plist;
+
+@@ -109,8 +105,8 @@ insert_items (GtkListStore *store, MSymbol language, MSymbol name)
+ for (; plist && mplist_key (plist) == Mplist; plist = mplist_next (plist)) {
+ GtkTreeIter iter;
+ MSymbol key;
+- MPlist *p, *value;
+- gchar *description;
++ MPlist *p, *mvalue;
++ gchar *description, *value;
+
+ p = mplist_value (plist);
+ key = mplist_value (p); /* name */
+@@ -118,15 +114,17 @@ insert_items (GtkListStore *store, MSymbol language, MSymbol name)
+ p = mplist_next (p); /* description */
+ description = ibus_m17n_mtext_to_utf8 ((MText *) mplist_value (p));
+ p = mplist_next (p); /* status */
+- value = mplist_next (p);
++ mvalue = mplist_next (p);
++ value = format_m17n_value (mvalue);
+
+ gtk_list_store_append (store, &iter);
+ gtk_list_store_set (store, &iter,
+ COLUMN_KEY, msymbol_name (key),
+ COLUMN_DESCRIPTION, description,
+- COLUMN_VALUE, format_value (value),
++ COLUMN_VALUE, value,
+ -1);
+ g_free (description);
++ g_free (value);
+ }
+ }
+
+@@ -163,95 +161,238 @@ on_edited (GtkCellRendererText *cell,
+ gchar *new_text,
+ gpointer data)
+ {
+- ConfigContext *context = data;
+- GtkTreeModel *model = GTK_TREE_MODEL (context->store);
++ SetupDialog *dialog = data;
++ GtkTreeModel *model = GTK_TREE_MODEL (dialog->store);
+ GtkTreeIter iter;
+ GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
+- MPlist *plist, *p, *value;
+- gchar *key;
+
+ gtk_tree_model_get_iter (model, &iter, path);
+- gtk_tree_model_get (model, &iter, COLUMN_KEY, &key, -1);
+
+- plist = minput_get_variable (context->language, context->name,
+- msymbol (key));
+- if (!plist)
+- goto fail;
++ gtk_list_store_set (dialog->store, &iter,
++ COLUMN_VALUE, new_text,
++ -1);
++ gtk_tree_path_free (path);
++}
+
+- p = mplist_next (mplist_next (mplist_next (mplist_value (plist))));
+- if (!p)
+- goto fail;
++static void
++toggle_colorbutton_sensitive (GtkToggleButton *togglebutton,
++ GtkWidget *colorbutton)
++{
++ if (gtk_toggle_button_get_active (togglebutton))
++ gtk_widget_set_sensitive (colorbutton, TRUE);
++ else
++ gtk_widget_set_sensitive (colorbutton, FALSE);
++}
+
+- value = parse_value (p, new_text);
+- if (!value)
+- goto fail;
++static void
++on_foreground_toggled (GtkToggleButton *togglebutton,
++ gpointer user_data)
++{
++ SetupDialog *dialog = user_data;
++ toggle_colorbutton_sensitive (togglebutton, dialog->colorbutton_foreground);
++}
+
+- if (minput_config_variable (context->language, context->name,
+- msymbol (key), value) != 0)
+- goto fail;
++static void
++on_background_toggled (GtkToggleButton *togglebutton,
++ gpointer user_data)
++{
++ SetupDialog *dialog = user_data;
++ toggle_colorbutton_sensitive (togglebutton, dialog->colorbutton_background);
++}
+
+- if (minput_save_config () != 1)
+- goto fail;
++static gint
++get_combo_box_index_by_value (GtkComboBox *combobox, gint value)
++{
++ GtkTreeModel *model;
++ GtkTreeIter iter;
++ gint index;
+
+- gtk_list_store_set (context->store, &iter,
+- COLUMN_VALUE, new_text,
+- -1);
++ index = 0;
++ model = gtk_combo_box_get_model (combobox);
++ if (!gtk_tree_model_get_iter_first (model, &iter))
++ return -1;
+
+- fail:
+- gtk_tree_path_free (path);
++ do {
++ gint _value;
++ gtk_tree_model_get (model, &iter, COLUMN_VALUE, &_value, -1);
++ if (_value == value)
++ return index;
++ index++;
++ } while (gtk_tree_model_iter_next (model, &iter));
++ return -1;
+ }
+
+ static void
+-color_to_gdk (guint color, GdkColor *color_gdk)
++_gdk_color_from_uint (guint color, GdkColor *color_gdk)
+ {
+- memset (color_gdk, 0, sizeof *color_gdk);
++ color_gdk->pixel = 0;
+ color_gdk->red = (color >> 8) & 0xFF00;
+ color_gdk->green = color & 0xFF00;
+ color_gdk->blue = (color & 0xFF) << 8;
+ }
+
+ static void
+-set_color (ConfigContext *context, const gchar *name, GdkColor *color)
++setup_dialog_load_config (SetupDialog *dialog)
+ {
+- gchar buf[8];
++ gchar *color;
++ gboolean bvalue;
++ gint ivalue;
++ GdkColor cvalue;
++ GtkCellRenderer *renderer;
++ gint index;
+
+- if (color)
+- sprintf (buf, "#%02X%02X%02X",
+- (color->red & 0xFF00) >> 8,
+- (color->green & 0xFF00) >> 8,
+- (color->blue & 0xFF00) >> 8);
+- else
+- strcpy (buf, "none");
+- ibus_m17n_config_set_string (config, context->section, name, buf);
++ /* General -> Pre-edit Appearance */
++ /* foreground color of pre-edit buffer */
++ bvalue = FALSE;
++ _gdk_color_from_uint (PREEDIT_FOREGROUND, &cvalue);
++ if (ibus_m17n_config_get_string (dialog->config,
++ dialog->section,
++ "preedit_foreground",
++ &color)) {
++ if (g_strcmp0 (color, "none") != 0 && gdk_color_parse (color, &cvalue))
++ bvalue = TRUE;
++ g_free (color);
++ }
++
++ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(dialog->checkbutton_foreground),
++ bvalue);
++ g_signal_connect (dialog->checkbutton_foreground, "toggled",
++ G_CALLBACK(on_foreground_toggled),
++ dialog);
++ gtk_widget_set_sensitive (dialog->colorbutton_foreground,
++ bvalue);
++ gtk_color_button_set_color (GTK_COLOR_BUTTON(dialog->colorbutton_foreground),
++ &cvalue);
++
++ /* background color of pre-edit buffer */
++ bvalue = FALSE;
++ _gdk_color_from_uint (PREEDIT_BACKGROUND, &cvalue);
++ if (ibus_m17n_config_get_string (dialog->config,
++ dialog->section,
++ "preedit_background",
++ &color)) {
++ if (g_strcmp0 (color, "none") != 0 && gdk_color_parse (color, &cvalue))
++ bvalue = TRUE;
++ g_free (color);
++ }
++ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(dialog->checkbutton_background),
++ bvalue);
++ g_signal_connect (dialog->checkbutton_background, "toggled",
++ G_CALLBACK(on_background_toggled),
++ dialog);
++ gtk_widget_set_sensitive (dialog->colorbutton_background,
++ bvalue);
++ gtk_color_button_set_color (GTK_COLOR_BUTTON(dialog->colorbutton_background),
++ &cvalue);
++
++ /* underline of pre-edit buffer */
++ renderer = gtk_cell_renderer_text_new ();
++ gtk_cell_layout_pack_start (GTK_CELL_LAYOUT(dialog->combobox_underline),
++ renderer, TRUE);
++ gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT(dialog->combobox_underline),
++ renderer, "text", 0, NULL);
++ if (!ibus_m17n_config_get_int (dialog->config,
++ dialog->section,
++ "preedit_underline",
++ &ivalue))
++ ivalue = IBUS_ATTR_UNDERLINE_NONE;
++
++ index = get_combo_box_index_by_value
++ (GTK_COMBO_BOX(dialog->combobox_underline),
++ ivalue);
++ gtk_combo_box_set_active (GTK_COMBO_BOX(dialog->combobox_underline),
++ index);
++
++ /* General -> Other */
++ renderer = gtk_cell_renderer_text_new ();
++ gtk_cell_layout_pack_start (GTK_CELL_LAYOUT(dialog->combobox_orientation),
++ renderer, TRUE);
++ gtk_cell_layout_set_attributes
++ (GTK_CELL_LAYOUT(dialog->combobox_orientation),
++ renderer, "text", 0, NULL);
++ if (!ibus_m17n_config_get_int (dialog->config,
++ dialog->section,
++ "lookup_table_orientation",
++ &ivalue))
++ ivalue = IBUS_ORIENTATION_SYSTEM;
++
++ index = get_combo_box_index_by_value
++ (GTK_COMBO_BOX(dialog->combobox_orientation),
++ ivalue);
++ gtk_combo_box_set_active (GTK_COMBO_BOX(dialog->combobox_orientation),
++ index);
++
++ /* Advanced -> m17n-lib configuration */
++ dialog->store = gtk_list_store_new (NUM_COLS,
++ G_TYPE_STRING,
++ G_TYPE_STRING,
++ G_TYPE_STRING);
++ insert_m17n_items (dialog->store,
++ msymbol (dialog->lang),
++ msymbol (dialog->name));
++
++ gtk_tree_view_set_model (GTK_TREE_VIEW(dialog->treeview),
++ GTK_TREE_MODEL (dialog->store));
++
++ renderer = gtk_cell_renderer_text_new ();
++ gtk_tree_view_insert_column_with_attributes
++ (GTK_TREE_VIEW (dialog->treeview), -1,
++ "Key",
++ renderer,
++ "text", COLUMN_KEY,
++ NULL);
++ renderer = gtk_cell_renderer_text_new ();
++ gtk_tree_view_insert_column_with_attributes
++ (GTK_TREE_VIEW (dialog->treeview), -1,
++ "Value",
++ renderer,
++ "text", COLUMN_VALUE,
++ NULL);
++ g_object_set (renderer, "editable", TRUE, NULL);
++ g_signal_connect (renderer, "edited", G_CALLBACK(on_edited), dialog);
++
++ g_signal_connect (dialog->treeview, "query-tooltip",
++ G_CALLBACK(on_query_tooltip), NULL);
+ }
+
+-static void
+-on_foreground_color_set (GtkColorButton *widget,
+- gpointer user_data)
++static gchar *
++_gdk_color_to_string (GdkColor *color)
+ {
+- ConfigContext *context = user_data;
+- GdkColor color;
+-
+- gtk_color_button_get_color (GTK_COLOR_BUTTON(widget), &color);
+- set_color (context, "preedit_foreground", &color);
++ g_strdup_printf ("#%02X%02X%02X",
++ (color->red & 0xFF00) >> 8,
++ (color->green & 0xFF00) >> 8,
++ (color->blue & 0xFF00) >> 8);
+ }
+
+ static void
+-on_background_color_set (GtkColorButton *widget,
+- gpointer user_data)
++save_color (SetupDialog *dialog,
++ GtkToggleButton *togglebutton,
++ GtkColorButton *colorbutton,
++ const gchar *name)
+ {
+- ConfigContext *context = user_data;
+- GdkColor color;
+-
+- gtk_color_button_get_color (GTK_COLOR_BUTTON(widget), &color);
+- set_color (context, "preedit_background", &color);
++ if (gtk_toggle_button_get_active (togglebutton)) {
++ GdkColor color;
++ gchar *svalue;
++
++ gtk_color_button_get_color (colorbutton, &color);
++ svalue = _gdk_color_to_string (&color);
++ ibus_m17n_config_set_string (dialog->config,
++ dialog->section,
++ name,
++ svalue);
++ g_free (svalue);
++ } else
++ ibus_m17n_config_set_string (dialog->config,
++ dialog->section,
++ name,
++ "none");
+ }
+
+ static void
+-on_underline_changed (GtkComboBox *combo,
+- gpointer user_data)
++save_choice (SetupDialog *dialog,
++ GtkComboBox *combo,
++ const gchar *name)
+ {
+- ConfigContext *context = user_data;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ gint active;
+@@ -260,123 +401,164 @@ on_underline_changed (GtkComboBox *combo,
+ gtk_combo_box_get_active_iter (combo, &iter);
+ gtk_tree_model_get (model, &iter, COLUMN_VALUE, &active, -1);
+
+- ibus_m17n_config_set_int (config,
+- context->section,
+- "preedit_underline",
+- active);
++ ibus_m17n_config_set_int (dialog->config, dialog->section, name, active);
+ }
+
+-static void
+-on_orientation_changed (GtkComboBox *combo,
+- gpointer user_data)
++static gboolean
++save_m17n_options (SetupDialog *dialog)
+ {
+- ConfigContext *context = user_data;
+- GtkTreeModel *model;
++ GtkTreeModel *model = GTK_TREE_MODEL (dialog->store);
+ GtkTreeIter iter;
+- gint active;
++ MPlist *plist, *p, *mvalue = NULL;
++ MSymbol lang, name;
++ gchar *key = NULL, *value = NULL;
++ gboolean retval = TRUE;
+
+- model = gtk_combo_box_get_model (combo);
+- gtk_combo_box_get_active_iter (combo, &iter);
+- gtk_tree_model_get (model, &iter, COLUMN_VALUE, &active, -1);
++ if (!gtk_tree_model_get_iter_first (model, &iter))
++ return;
+
+- ibus_m17n_config_set_int (config,
+- context->section,
+- "lookup_table_orientation",
+- active);
+-}
++ lang = msymbol (dialog->lang);
++ name = msymbol (dialog->name);
+
+-static void
+-toggle_color (ConfigContext *context,
+- GtkToggleButton *togglebutton,
+- GtkWidget *colorbutton,
+- const gchar *name)
+-{
+- GdkColor color;
++ do {
++ gtk_tree_model_get (model, &iter,
++ COLUMN_KEY, &key,
++ COLUMN_VALUE, &value,
++ -1);
+
+- if (gtk_toggle_button_get_active (togglebutton)) {
+- gtk_widget_set_sensitive (colorbutton, TRUE);
+- gtk_color_button_get_color (GTK_COLOR_BUTTON(colorbutton), &color);
+- set_color (context, name, &color);
+- } else {
+- gtk_widget_set_sensitive (colorbutton, FALSE);
+- gtk_color_button_get_color (GTK_COLOR_BUTTON(colorbutton), &color);
+- set_color (context, name, NULL);
+- }
++ plist = minput_get_variable (lang, name, msymbol (key));
++ if (!plist) {
++ retval = FALSE;
++ break;
++ }
++
++ p = mplist_next (mplist_next (mplist_next (mplist_value (plist))));
++ if (!p) {
++ retval = FALSE;
++ break;
++ }
++
++ mvalue = parse_m17n_value (p, value);
++ if (!mvalue) {
++ retval = FALSE;
++ break;
++ }
++
++ if (minput_config_variable (lang, name, msymbol (key), mvalue) != 0) {
++ retval = FALSE;
++ break;
++ }
++
++ if (mvalue)
++ m17n_object_unref (mvalue);
++ g_free (key);
++ g_free (value);
++ mvalue = NULL;
++ key = NULL;
++ value = NULL;
++ } while (gtk_tree_model_iter_next (model, &iter));
++
++ if (retval && minput_save_config () != 1)
++ retval = FALSE;
++
++ if (mvalue)
++ m17n_object_unref (mvalue);
++ g_free (key);
++ g_free (value);
++
++ return retval;
+ }
+
+ static void
+-on_foreground_toggled (GtkToggleButton *togglebutton,
+- gpointer user_data)
++setup_dialog_save_config (SetupDialog *dialog)
+ {
+- ConfigContext *context = user_data;
+-
+- toggle_color (context,
+- togglebutton,
+- context->colorbutton_foreground,
+- "preedit_foreground");
++ save_color (dialog,
++ GTK_TOGGLE_BUTTON(dialog->checkbutton_foreground),
++ GTK_COLOR_BUTTON(dialog->colorbutton_foreground),
++ "preedit_foreground");
++ save_color (dialog,
++ GTK_TOGGLE_BUTTON(dialog->checkbutton_background),
++ GTK_COLOR_BUTTON(dialog->colorbutton_background),
++ "preedit_background");
++ save_choice (dialog,
++ GTK_COMBO_BOX(dialog->combobox_underline),
++ "preedit_underline");
++ save_choice (dialog,
++ GTK_COMBO_BOX(dialog->combobox_orientation),
++ "lookup_table_orientation");
++ save_m17n_options (dialog);
+ }
+
+-static void
+-on_background_toggled (GtkToggleButton *togglebutton,
+- gpointer user_data)
++static SetupDialog *
++setup_dialog_new (IBusConfig *config,
++ const gchar *lang,
++ const gchar *name)
+ {
+- ConfigContext *context = user_data;
++ GtkBuilder *builder;
++ SetupDialog *dialog;
++ GObject *object;
++ GError *error;
++
++ dialog = g_slice_new0 (SetupDialog);
++ dialog->config = g_object_ref_sink (config);
++ dialog->lang = g_strdup (lang);
++ dialog->name = g_strdup (name);
++ dialog->section = g_strdup_printf ("engine/M17N/%s/%s", lang, name);
++
++ builder = gtk_builder_new ();
++ gtk_builder_set_translation_domain (builder, "ibus-m17n");
++
++ error = NULL;
++ gtk_builder_add_from_file (builder,
++ SETUPDIR "/ibus-m17n-preferences.ui",
++ &error);
++ g_assert_no_error (error);
++
++ object = gtk_builder_get_object (builder, "dialog");
++ dialog->dialog = GTK_WIDGET(object);
++ object = gtk_builder_get_object (builder, "checkbutton_foreground");
++ dialog->checkbutton_foreground = GTK_WIDGET(object);
++ object = gtk_builder_get_object (builder, "colorbutton_foreground");
++ dialog->colorbutton_foreground = GTK_WIDGET(object);
++ object = gtk_builder_get_object (builder, "checkbutton_background");
++ dialog->checkbutton_background = GTK_WIDGET(object);
++ object = gtk_builder_get_object (builder, "colorbutton_background");
++ dialog->colorbutton_background = GTK_WIDGET(object);
++ object = gtk_builder_get_object (builder, "combobox_underline");
++ dialog->combobox_underline = GTK_WIDGET(object);
++ object = gtk_builder_get_object (builder, "combobox_orientation");
++ dialog->combobox_orientation = GTK_WIDGET(object);
++ object = gtk_builder_get_object (builder, "treeview_mim_config");
++ dialog->treeview = GTK_WIDGET(object);
+
+- toggle_color (context,
+- togglebutton,
+- context->colorbutton_background,
+- "preedit_background");
++ return dialog;
+ }
+
+-static gint
+-get_combo_box_index_by_value (GtkComboBox *combobox, gint value)
++static void
++setup_dialog_free (SetupDialog *dialog)
+ {
+- GtkTreeModel *model;
+- GtkTreeIter iter;
+- gint index;
++ gtk_widget_destroy (dialog->dialog);
+
+- index = 0;
+- model = gtk_combo_box_get_model (combobox);
+- if (!gtk_tree_model_get_iter_first (model, &iter))
+- return -1;
++ g_free (dialog->lang);
++ g_free (dialog->name);
+
+- do {
+- gint _value;
+- gtk_tree_model_get (model, &iter, COLUMN_VALUE, &_value, -1);
+- if (_value == value)
+- return index;
+- index++;
+- } while (gtk_tree_model_iter_next (model, &iter));
+- return -1;
++ g_free (dialog->section);
++ g_object_unref (dialog->store);
++ g_slice_free (SetupDialog, dialog);
+ }
+
+ static void
+ start (const gchar *engine_name)
+ {
+ IBusBus *bus;
+- gchar **strv, *lang, *name;
+- GtkBuilder *builder;
+- GtkWidget *dialog;
+- GtkWidget *combobox_underline, *combobox_orientation;
+- GtkWidget *checkbutton_foreground, *checkbutton_background;
+- GtkWidget *treeview;
+- GtkListStore *store;
++ IBusConfig *config;
++ gchar **strv, *lang, *name, *section;
++ SetupDialog *dialog;
+ GObject *object;
+ GError *error = NULL;
+- GtkCellRenderer *renderer;
+- ConfigContext context;
+- gchar *color;
+- gboolean is_foreground_set, is_background_set;
+- GdkColor foreground, background;
+- gint underline;
+- gint orientation;
+- gint index;
+
+ ibus_init ();
+-
+- bus = ibus_bus_new ();
+- //g_signal_connect (bus, "disconnected", G_CALLBACK (ibus_disconnected_cb), NULL);
+- ibus_m17n_init (bus);
++ ibus_m17n_init_common ();
+
+ strv = g_strsplit (engine_name, ":", 3);
+
+@@ -386,150 +568,25 @@ start (const gchar *engine_name)
+ lang = strv[1];
+ name = strv[2];
+
+- config = ibus_bus_get_config (bus);
+- context.section = g_strdup_printf ("engine/M17N/%s/%s", lang, name);
+-
+- builder = gtk_builder_new ();
+- gtk_builder_set_translation_domain (builder, "ibus-m17n");
+- gtk_builder_add_from_file (builder,
+- SETUPDIR "/ibus-m17n-preferences.ui",
+- &error);
+- object = gtk_builder_get_object (builder, "dialog");
+- dialog = GTK_WIDGET(object);
+- object = gtk_builder_get_object (builder, "checkbutton_foreground");
+- checkbutton_foreground = GTK_WIDGET(object);
+- object = gtk_builder_get_object (builder, "colorbutton_foreground");
+- context.colorbutton_foreground = GTK_WIDGET(object);
+- object = gtk_builder_get_object (builder, "checkbutton_background");
+- checkbutton_background = GTK_WIDGET(object);
+- object = gtk_builder_get_object (builder, "colorbutton_background");
+- context.colorbutton_background = GTK_WIDGET(object);
+- object = gtk_builder_get_object (builder, "combobox_underline");
+- combobox_underline = GTK_WIDGET(object);
+- object = gtk_builder_get_object (builder, "combobox_orientation");
+- combobox_orientation = GTK_WIDGET(object);
+- object = gtk_builder_get_object (builder, "treeviewMimConfig");
+- treeview = GTK_WIDGET(object);
+-
+- /* General -> Pre-edit Appearance */
+- /* foreground color of pre-edit buffer */
+- is_foreground_set = FALSE;
+- color_to_gdk (PREEDIT_FOREGROUND, &foreground);
+- if (ibus_m17n_config_get_string (config,
+- context.section,
+- "preedit_foreground",
+- &color)) {
+- if (g_strcmp0 (color, "none") != 0 &&
+- gdk_color_parse (color, &foreground))
+- is_foreground_set = TRUE;
+- g_free (color);
+- }
++ bus = ibus_bus_new ();
++ //g_signal_connect (bus, "disconnected", G_CALLBACK (ibus_disconnected_cb), NULL);
+
+- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(checkbutton_foreground),
+- is_foreground_set);
+- g_signal_connect (checkbutton_foreground, "toggled",
+- G_CALLBACK(on_foreground_toggled),
+- &context);
+- gtk_widget_set_sensitive (context.colorbutton_foreground,
+- is_foreground_set);
+- gtk_color_button_set_color
+- (GTK_COLOR_BUTTON(context.colorbutton_foreground),
+- &foreground);
+- g_signal_connect (context.colorbutton_foreground, "color-set",
+- G_CALLBACK(on_foreground_color_set), &context);
++ config = ibus_bus_get_config (bus);
++ dialog = setup_dialog_new (config, lang, name);
+
+-
+- /* background color of pre-edit buffer */
+- is_background_set = FALSE;
+- color_to_gdk (PREEDIT_BACKGROUND, &background);
+- if (ibus_m17n_config_get_string (config,
+- context.section,
+- "preedit_background",
+- &color)) {
+- if (g_strcmp0 (color, "none") != 0 &&
+- gdk_color_parse (color, &background))
+- is_background_set = TRUE;
+- g_debug ("preedit_background %d", is_background_set);
+- g_free (color);
+- }
+- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(checkbutton_background),
+- is_background_set);
+- g_signal_connect (checkbutton_background, "toggled",
+- G_CALLBACK(on_background_toggled),
+- &context);
+- gtk_widget_set_sensitive (context.colorbutton_background,
+- is_background_set);
+- gtk_color_button_set_color
+- (GTK_COLOR_BUTTON(context.colorbutton_background),
+- &background);
+- g_signal_connect (context.colorbutton_background, "color-set",
+- G_CALLBACK(on_background_color_set), &context);
++ g_strfreev (strv);
+
+- /* underline of pre-edit buffer */
+- renderer = gtk_cell_renderer_text_new ();
+- gtk_cell_layout_pack_start (GTK_CELL_LAYOUT(combobox_underline),
+- renderer, TRUE);
+- gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT(combobox_underline),
+- renderer, "text", 0, NULL);
+- if (!ibus_m17n_config_get_int (config,
+- context.section,
+- "preedit_underline",
+- &underline))
+- underline = IBUS_ATTR_UNDERLINE_NONE;
++ setup_dialog_load_config (dialog);
+
+- index = get_combo_box_index_by_value (GTK_COMBO_BOX(combobox_underline),
+- underline);
+- gtk_combo_box_set_active (GTK_COMBO_BOX(combobox_underline), index);
+- g_signal_connect (combobox_underline, "changed",
+- G_CALLBACK(on_underline_changed), &context);
++ gtk_widget_show_all (dialog->dialog);
++ gtk_dialog_run (GTK_DIALOG(dialog->dialog));
+
+- /* General -> Other */
+- renderer = gtk_cell_renderer_text_new ();
+- gtk_cell_layout_pack_start (GTK_CELL_LAYOUT(combobox_orientation),
+- renderer, TRUE);
+- gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT(combobox_orientation),
+- renderer, "text", 0, NULL);
+- if (!ibus_m17n_config_get_int (config,
+- context.section,
+- "lookup_table_orientation",
+- &orientation))
+- orientation = IBUS_ORIENTATION_SYSTEM;
+-
+- index = get_combo_box_index_by_value (GTK_COMBO_BOX(combobox_orientation),
+- orientation);
+- gtk_combo_box_set_active (GTK_COMBO_BOX(combobox_orientation), index);
+- g_signal_connect (combobox_orientation, "changed",
+- G_CALLBACK(on_orientation_changed), &context);
++ setup_dialog_save_config (dialog);
++ setup_dialog_free (dialog);
+
+- /* Advanced -> m17n-lib configuration */
+- store = gtk_list_store_new (NUM_COLS,
+- G_TYPE_STRING,
+- G_TYPE_STRING,
+- G_TYPE_STRING);
+- insert_items (store, msymbol (lang), msymbol (name));
+-
+- gtk_tree_view_set_model (GTK_TREE_VIEW(treeview), GTK_TREE_MODEL (store));
+- gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), -1,
+- "Key",
+- gtk_cell_renderer_text_new (),
+- "text", COLUMN_KEY, NULL);
+- g_object_set (treeview, "has-tooltip", TRUE, NULL);
+- g_signal_connect (treeview, "query-tooltip", G_CALLBACK(on_query_tooltip),
+- NULL);
+-
+- context.language = msymbol (lang);
+- context.name = msymbol (name);
+- context.store = store;
+- renderer = gtk_cell_renderer_text_new ();
+- gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), -1,
+- "Value",
+- renderer,
+- "text", COLUMN_VALUE, NULL);
+- g_object_set (renderer, "editable", TRUE, NULL);
+- g_signal_connect (renderer, "edited", G_CALLBACK(on_edited), &context);
++ g_object_unref (bus);
+
+- gtk_widget_show_all (dialog);
+- gtk_dialog_run (GTK_DIALOG(dialog));
++ M17N_FINI ();
+ }
+
+ int
+--
+1.7.6.1
+
diff --git a/ibus-m17n-virtkbd.patch b/ibus-m17n-virtkbd.patch
new file mode 100644
index 0000000..ad70c1c
--- /dev/null
+++ b/ibus-m17n-virtkbd.patch
@@ -0,0 +1,849 @@
+From 5ec645b395e81cd804f50e5bcd6c21e92d257fbe 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/6] Support virtual keyboard.
+
+---
+ configure.ac | 17 +++
+ src/Makefile.am | 7 ++
+ src/default.xml.in.in | 111 ++++++++++++++++++++
+ src/engine.c | 66 ++++++++++++
+ src/ibus-m17n-preferences.ui | 16 +++
+ src/m17nutil.c | 59 +++++++++++-
+ src/m17nutil.h | 11 ++
+ src/setup.c | 26 +++++
+ src/virtkbd.c | 233 ++++++++++++++++++++++++++++++++++++++++++
+ src/virtkbd.h | 31 ++++++
+ 10 files changed, 576 insertions(+), 1 deletions(-)
+ create mode 100644 src/virtkbd.c
+ create mode 100644 src/virtkbd.h
+
+diff --git a/configure.ac b/configure.ac
+index 23102c4..13e42f8 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 dcff0c7..1e6bd1b 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,8 @@ struct _IBusM17NEngineClass {
+ guint preedit_background;
+ gint preedit_underline;
+ gint lookup_table_orientation;
++ gchar *virtual_keyboard;
++ gboolean virtual_keyboard_enabled;
+
+ MInputMethod *im;
+ };
+@@ -256,6 +262,7 @@ ibus_m17n_engine_class_init (IBusM17NEngineClass *klass)
+ klass->preedit_background = INVALID_COLOR;
+ klass->preedit_underline = IBUS_ATTR_UNDERLINE_NONE;
+ klass->lookup_table_orientation = IBUS_ORIENTATION_SYSTEM;
++ klass->virtual_keyboard_enabled = FALSE;
+
+ engine_config = ibus_m17n_get_engine_config (engine_name);
+ g_free (engine_name);
+@@ -290,6 +297,14 @@ ibus_m17n_engine_class_init (IBusM17NEngineClass *klass)
+ &klass->lookup_table_orientation))
+ klass->lookup_table_orientation = IBUS_ORIENTATION_SYSTEM;
+
++ if (!ibus_m17n_config_get_boolean (config,
++ klass->config_section,
++ "virtual_keyboard_enabled",
++ &klass->virtual_keyboard_enabled))
++ klass->virtual_keyboard_enabled = FALSE;
++
++ klass->virtual_keyboard = engine_config->virtual_keyboard;
++
+ ibus_m17n_engine_config_free (engine_config);
+
+ g_signal_connect (config, "value-changed",
+@@ -346,6 +361,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 +394,24 @@ ibus_m17n_engine_init (IBusM17NEngine *m17n)
+ ibus_prop_list_append (m17n->prop_list, m17n->setup_prop);
+ #endif /* HAVE_SETUP */
+
++ 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,
++ FALSE,
++ PROP_STATE_UNCHECKED,
++ NULL);
++ g_object_ref_sink (m17n->virtkbd_prop);
++ ibus_prop_list_append (m17n->prop_list, m17n->virtkbd_prop);
++
++ if (klass->virtual_keyboard_enabled &&
++ klass->virtual_keyboard != NULL)
++ ibus_property_set_visible (m17n->virtkbd_prop, TRUE);
++
+ m17n->table = ibus_lookup_table_new (9, 0, TRUE, TRUE);
+ g_object_ref_sink (m17n->table);
+ m17n->context = NULL;
+@@ -463,6 +497,11 @@ ibus_m17n_engine_destroy (IBusM17NEngine *m17n)
+ }
+ #endif /* HAVE_SETUP */
+
++ if (m17n->virtkbd_prop) {
++ g_object_unref (m17n->virtkbd_prop);
++ m17n->virtkbd_prop = NULL;
++ }
++
+ if (m17n->table) {
+ g_object_unref (m17n->table);
+ m17n->table = NULL;
+@@ -473,6 +512,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);
+ }
+
+@@ -705,6 +749,9 @@ ibus_m17n_engine_enable (IBusEngine *engine)
+ input context that we will use surrounding-text. */
+ ibus_engine_get_surrounding_text (engine, NULL, NULL, NULL);
+ #endif /* HAVE_IBUS_ENGINE_GET_SURROUNDING_TEXT */
++
++ if (m17n->virtkbd)
++ ibus_m17n_virtual_keyboard_enable (m17n->virtkbd);
+ }
+
+ static void
+@@ -714,6 +761,9 @@ ibus_m17n_engine_disable (IBusEngine *engine)
+
+ ibus_m17n_engine_focus_out (engine);
+ parent_class->disable (engine);
++
++ if (m17n->virtkbd)
++ ibus_m17n_virtual_keyboard_disable (m17n->virtkbd);
+ }
+
+ static void
+@@ -776,6 +826,22 @@ ibus_m17n_engine_property_activate (IBusEngine *engine,
+ }
+ #endif /* HAVE_SETUP */
+
++#ifdef HAVE_EEKBOARD
++ if (g_strcmp0 (prop_name, "virtual-keyboard") == 0) {
++ /* virtual keyboard is not initialized until a user activates
++ the "virtual-keyboard" prop for the first time */
++ if (m17n->virtkbd == NULL) {
++ IBusM17NEngineClass *klass =
++ (IBusM17NEngineClass *) G_OBJECT_GET_CLASS (m17n);
++
++ m17n->virtkbd =
++ ibus_m17n_virtual_keyboard_new ((IBusEngine *)m17n,
++ klass->virtual_keyboard);
++ }
++ ibus_m17n_virtual_keyboard_toggle_display (m17n->virtkbd);
++ }
++#endif /* HAVE_EEKBOARD */
++
+ parent_class->property_activate (engine, prop_name, prop_state);
+ }
+
+diff --git a/src/ibus-m17n-preferences.ui b/src/ibus-m17n-preferences.ui
+index a46ab49..bca034d 100644
+--- a/src/ibus-m17n-preferences.ui
++++ b/src/ibus-m17n-preferences.ui
+@@ -192,6 +192,7 @@
+ <child>
+ <object class="GtkTable" id="table2">
+ <property name="visible">True</property>
++ <property name="n_rows">2</property>
+ <property name="n_columns">2</property>
+ <child>
+ <object class="GtkLabel" id="label9">
+@@ -210,6 +211,21 @@
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
++ <child>
++ <object class="GtkCheckButton" id="checkbutton_virtkbd">
++ <property name="label" translatable="yes">Enable Virtual Keyboard</property>
++ <property name="visible">True</property>
++ <property name="can_focus">True</property>
++ <property name="receives_default">False</property>
++ <property name="draw_indicator">True</property>
++ </object>
++ <packing>
++ <property name="left_attach">0</property>
++ <property name="right_attach">2</property>
++ <property name="top_attach">1</property>
++ <property name="bottom_attach">2</property>
++ </packing>
++ </child>
+ </object>
+ </child>
+ </object>
+diff --git a/src/m17nutil.c b/src/m17nutil.c
+index 94a6891..2143e54 100644
+--- a/src/m17nutil.c
++++ b/src/m17nutil.c
+@@ -18,7 +18,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 {
+@@ -285,6 +286,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;
+@@ -340,6 +343,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);
+ }
+@@ -494,3 +502,52 @@ ibus_m17n_config_get_int (IBusConfig *config,
+ return FALSE;
+ #endif /* !IBUS_CHECK_VERSION(1,3,99) */
+ }
++
++void
++ibus_m17n_config_set_boolean (IBusConfig *config,
++ const gchar *section,
++ const gchar *name,
++ gboolean value)
++{
++#if IBUS_CHECK_VERSION(1,3,99)
++ ibus_config_set_value (config, section, name, g_variant_new_boolean (value));
++#else
++ GValue v = { 0 };
++
++ g_value_init (&v, G_TYPE_BOOLEAN);
++ g_value_set_boolean (&v, value);
++ ibus_config_set_value (config, section, name, &v);
++#endif /* !IBUS_CHECK_VERSION(1,3,99) */
++}
++
++gboolean
++ibus_m17n_config_get_boolean (IBusConfig *config,
++ const gchar *section,
++ const gchar *name,
++ gboolean *result)
++{
++#if IBUS_CHECK_VERSION(1,3,99)
++ GVariant *value = NULL;
++
++ g_return_val_if_fail (result != NULL, FALSE);
++
++ value = ibus_config_get_value (config, section, name);
++ if (value) {
++ *result = g_variant_get_boolean (value);
++ g_variant_unref (value);
++ return TRUE;
++ }
++ return FALSE;
++#else
++ GValue value = { 0 };
++
++ g_return_val_if_fail (result != NULL, FALSE);
++
++ if (ibus_config_get_value (config, section, name, &value)) {
++ *result = g_value_get_boolean (&value);
++ g_value_unset (&value);
++ return TRUE;
++ }
++ return FALSE;
++#endif /* !IBUS_CHECK_VERSION(1,3,99) */
++}
+diff --git a/src/m17nutil.h b/src/m17nutil.h
+index 21b1bb9..9c3fca8 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;
+@@ -56,4 +59,12 @@ gboolean ibus_m17n_config_get_int (IBusConfig *config,
+ const gchar *section,
+ const gchar *name,
+ gint *result);
++void ibus_m17n_config_set_boolean (IBusConfig *config,
++ const gchar *section,
++ const gchar *name,
++ gboolean value);
++gboolean ibus_m17n_config_get_boolean (IBusConfig *config,
++ const gchar *section,
++ const gchar *name,
++ gboolean *result);
+ #endif
+diff --git a/src/setup.c b/src/setup.c
+index 30386df..1c534d6 100644
+--- a/src/setup.c
++++ b/src/setup.c
+@@ -25,6 +25,7 @@ struct _SetupDialog {
+ GtkWidget *colorbutton_foreground;
+ GtkWidget *checkbutton_background;
+ GtkWidget *colorbutton_background;
++ GtkWidget *checkbutton_virtkbd;
+ GtkWidget *treeview;
+ GtkListStore *store;
+
+@@ -322,6 +323,15 @@ setup_dialog_load_config (SetupDialog *dialog)
+ gtk_combo_box_set_active (GTK_COMBO_BOX(dialog->combobox_orientation),
+ index);
+
++ if (!ibus_m17n_config_get_boolean (dialog->config,
++ dialog->section,
++ "virtual_keyboard_enabled",
++ &bvalue))
++ bvalue = FALSE;
++
++ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(dialog->checkbutton_virtkbd),
++ bvalue);
++
+ /* Advanced -> m17n-lib configuration */
+ dialog->store = gtk_list_store_new (NUM_COLS,
+ G_TYPE_STRING,
+@@ -404,6 +414,17 @@ save_choice (SetupDialog *dialog,
+ ibus_m17n_config_set_int (dialog->config, dialog->section, name, active);
+ }
+
++static void
++save_toggle (SetupDialog *dialog,
++ GtkToggleButton *togglebutton,
++ const gchar *name)
++{
++ ibus_m17n_config_set_boolean (dialog->config,
++ dialog->section,
++ name,
++ gtk_toggle_button_get_active (togglebutton));
++}
++
+ static gboolean
+ save_m17n_options (SetupDialog *dialog)
+ {
+@@ -486,6 +507,9 @@ setup_dialog_save_config (SetupDialog *dialog)
+ save_choice (dialog,
+ GTK_COMBO_BOX(dialog->combobox_orientation),
+ "lookup_table_orientation");
++ save_toggle (dialog,
++ GTK_TOGGLE_BUTTON(dialog->checkbutton_virtkbd),
++ "virtual_keyboard_enabled");
+ save_m17n_options (dialog);
+ }
+
+@@ -528,6 +552,8 @@ setup_dialog_new (IBusConfig *config,
+ dialog->combobox_underline = GTK_WIDGET(object);
+ object = gtk_builder_get_object (builder, "combobox_orientation");
+ dialog->combobox_orientation = GTK_WIDGET(object);
++ object = gtk_builder_get_object (builder, "checkbutton_virtkbd");
++ dialog->checkbutton_virtkbd = GTK_WIDGET(object);
+ object = gtk_builder_get_object (builder, "treeview_mim_config");
+ dialog->treeview = GTK_WIDGET(object);
+
+diff --git a/src/virtkbd.c b/src/virtkbd.c
+new file mode 100644
+index 0000000..9baf971
+--- /dev/null
++++ b/src/virtkbd.c
+@@ -0,0 +1,233 @@
++/* 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;
++
++#ifdef HAVE_EEKBOARD
++#define _EEK_INIT() eek_init ()
++#else
++#define _EEK_INIT()
++#endif /* HAVE_EEKBOARD */
++
++G_DEFINE_TYPE_WITH_CODE (IBusM17NVirtualKeyboard, ibus_m17n_virtual_keyboard,
++ G_TYPE_OBJECT, _EEK_INIT());
++
++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 551f1c8..ab09cf0 100644
--- a/ibus-m17n-xkb-options.patch
+++ b/ibus-m17n-xkb-options.patch
@@ -1,386 +1,93 @@
-Patch to set certain XKB options when an m17n IME is set.
-Index: ibus-m17n-1.3.2/configure.ac
-===================================================================
---- ibus-m17n-1.3.2.orig/configure.ac
-+++ ibus-m17n-1.3.2/configure.ac
-@@ -106,6 +106,14 @@ AC_CHECK_FUNCS([ibus_engine_get_surround
- CFLAGS="$save_CFLAGS"
- LIBS="$save_LIBS"
-
-+# check libxklavier
-+have_libxklavier=no
-+PKG_CHECK_MODULES([LIBXKLAVIER], [libxklavier gdk-3.0 x11],
-+ have_libxklavier=yes)
-+if test x$have_libxklavier != xno; then
-+ AC_DEFINE([HAVE_LIBXKLAVIER], [1], [Define if libxklavier is found])
-+fi
-+
- # define GETTEXT_* variables
- GETTEXT_PACKAGE=ibus-m17n
- AC_SUBST(GETTEXT_PACKAGE)
-Index: ibus-m17n-1.3.2/src/Makefile.am
-===================================================================
---- ibus-m17n-1.3.2.orig/src/Makefile.am
-+++ ibus-m17n-1.3.2/src/Makefile.am
-@@ -66,10 +66,15 @@ ibus_engine_m17n_SOURCES = \
- engine.c \
- engine.h \
- $(NULL)
-+ibus_engine_m17n_CFLAGS = \
-+ @LIBXKLAVIER_CFLAGS@ \
-+ $(AM_CFLAGS) \
-+ $(NULL)
- ibus_engine_m17n_LDADD = \
- libm17ncommon.a \
- @IBUS_LIBS@ \
- @M17N_LIBS@ \
-+ @LIBXKLAVIER_LIBS@ \
- $(NULL)
-
- if HAVE_GTK
-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>
-+ <xkb-options>lv3:ralt_switch</xkb-options>
- </engine>
- <engine>
-- <name>m17n:gu:inscript</name>
-+ <name>m17n:gu:inscript*</name>
- <rank>2</rank>
- <preedit-highlight>FALSE</preedit-highlight>
-+ <xkb-options>lv3:ralt_switch</xkb-options>
- </engine>
- <engine>
-- <name>m17n:hi:inscript</name>
-+ <name>m17n:hi:inscript*</name>
- <rank>2</rank>
- <preedit-highlight>FALSE</preedit-highlight>
-+ <xkb-options>lv3:ralt_switch</xkb-options>
- </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>
-+ <xkb-options>lv3:ralt_switch</xkb-options>
- </engine>
- <engine>
-- <name>m17n:ml:inscript</name>
-+ <name>m17n:ml:inscript*</name>
- <rank>2</rank>
- <preedit-highlight>FALSE</preedit-highlight>
-+ <xkb-options>lv3:ralt_switch</xkb-options>
- </engine>
- <engine>
-- <name>m17n:mr:inscript</name>
-+ <name>m17n:mr:inscript*</name>
- <rank>2</rank>
- <preedit-highlight>FALSE</preedit-highlight>
-+ <xkb-options>lv3:ralt_switch</xkb-options>
- </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>
-+ <xkb-options>lv3:ralt_switch</xkb-options>
- </engine>
- <engine>
-- <name>m17n:pa:inscript</name>
-+ <name>m17n:pa:inscript*</name>
- <rank>2</rank>
- <preedit-highlight>FALSE</preedit-highlight>
-+ <xkb-options>lv3:ralt_switch</xkb-options>
- </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>
-+ <xkb-options>lv3:ralt_switch</xkb-options>
- </engine>
- <engine>
- <name>m17n:si:wijesekera</name>
- <rank>2</rank>
- <preedit-highlight>FALSE</preedit-highlight>
-+ <xkb-options>lv3:ralt_switch</xkb-options>
- </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>
-+ <xkb-options>lv3:ralt_switch</xkb-options>
- </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>
-+ <xkb-options>lv3:ralt_switch</xkb-options>
- </engine>
- <engine>
- <name>m17n:ta:*</name>
-Index: ibus-m17n-1.3.2/src/engine.c
-===================================================================
---- ibus-m17n-1.3.2.orig/src/engine.c
-+++ ibus-m17n-1.3.2/src/engine.c
-@@ -6,6 +6,10 @@
- #include <ibus.h>
- #include <m17n.h>
- #include <string.h>
-+#ifdef HAVE_LIBXKLAVIER
-+#include <gdk/gdkx.h>
-+#include <libxklavier/xklavier.h>
-+#endif /* HAVE_LIBXKLAVIER */
- #include "m17nutil.h"
- #include "engine.h"
-
-@@ -38,6 +42,10 @@ struct _IBusM17NEngineClass {
- gboolean use_iok;
-
- MInputMethod *im;
-+
-+#if HAVE_LIBXKLAVIER
-+ XklConfigRec *xkl_config_rec;
-+#endif /* HAVE_LIBXKLAVIER */
- };
-
- /* functions prototype */
-@@ -105,12 +113,90 @@ static IBusEngineClass *parent_class = N
-
- static IBusConfig *config = NULL;
-
-+#if HAVE_LIBXKLAVIER
-+static XklEngine *xkl_engine = NULL;
-+static XklConfigRec *xkl_system_config_rec = NULL;
-+
-+static gboolean
-+parse_xkb_options (XklConfigRec *config_rec, const gchar *xkb_options)
-+{
-+ gchar **strv;
-+
-+ strv = g_strsplit (xkb_options, ",", -1);
-+ if (g_strv_length (strv) < 1) {
-+ g_strfreev (strv);
-+ return FALSE;
-+ }
-+
-+ g_strfreev (config_rec->options);
-+ config_rec->options = strv;
-+
-+ return TRUE;
-+}
-+
-+static GdkFilterReturn
-+filter_xkl_event (GdkXEvent *xev,
-+ GdkEvent *event,
-+ gpointer user_data)
-+{
-+ XEvent *xevent = (XEvent *)xev;
-+
-+ xkl_engine_filter_events (xkl_engine, xevent);
-+ return GDK_FILTER_CONTINUE;
-+}
-+
-+static void
-+on_xkl_config_changed (XklEngine *xklengine,
-+ gpointer user_data)
-+{
-+ IBusM17NEngineClass *klass = user_data;
-+ XklConfigRec *config_rec;
-+
-+ config_rec = xkl_config_rec_new ();
-+ if (!xkl_config_rec_get_from_server (config_rec, xkl_engine)) {
-+ g_object_unref (config_rec);
-+ g_warning ("Can't get default keyboard config from the server");
-+ } else if (klass->xkl_config_rec &&
-+ !xkl_config_rec_equals (config_rec, klass->xkl_config_rec)) {
-+ if (xkl_system_config_rec)
-+ g_object_unref (xkl_system_config_rec);
-+ xkl_system_config_rec = config_rec;
-+ }
-+}
-+#endif /* HAVE_LIBXKLAVIER */
-+
- void
- ibus_m17n_init (IBusBus *bus)
- {
-+#if HAVE_LIBXKLAVIER
-+ if (gdk_init_check (NULL, NULL)) {
-+ GdkDisplay *display = gdk_display_get_default ();
-+ g_assert (display);
-+
-+ xkl_engine = xkl_engine_get_instance (GDK_DISPLAY_XDISPLAY (display));
-+ xkl_system_config_rec = xkl_config_rec_new ();
-+ if (!xkl_config_rec_get_from_server (xkl_system_config_rec,
-+ xkl_engine)) {
-+ g_object_unref (xkl_system_config_rec);
-+ xkl_system_config_rec = NULL;
-+
-+ g_warning ("Can't get default keyboard config from the server");
-+ } else {
-+ gdk_window_add_filter (NULL,
-+ (GdkFilterFunc) filter_xkl_event,
-+ NULL);
-+ gdk_window_add_filter (gdk_get_default_root_window (),
-+ (GdkFilterFunc) filter_xkl_event,
-+ NULL);
-+ xkl_engine_start_listen (xkl_engine, XKLL_TRACK_KEYBOARD_STATE);
-+ }
-+ }
-+#endif /* HAVE_LIBXKLAVIER */
-+
- config = ibus_bus_get_config (bus);
- if (config)
- g_object_ref_sink (config);
-+
- ibus_m17n_init_common ();
- }
-
-@@ -299,6 +385,25 @@ ibus_m17n_engine_class_init (IBusM17NEng
- G_CALLBACK(ibus_m17n_config_value_changed),
- klass);
-
-+#if HAVE_LIBXKLAVIER
-+ if (engine_config->xkb_options) {
-+ klass->xkl_config_rec = xkl_config_rec_new ();
-+ if (!xkl_config_rec_get_from_server (klass->xkl_config_rec,
-+ xkl_engine)) {
-+ g_object_unref (klass->xkl_config_rec);
-+ g_warning ("Can't get default keyboard config from the server");
-+ } else if (!parse_xkb_options (klass->xkl_config_rec,
-+ engine_config->xkb_options)) {
-+ g_object_unref (klass->xkl_config_rec);
-+ g_warning ("Can't parse xkb options %s",
-+ engine_config->xkb_options);
-+ }
-+ }
-+
-+ g_signal_connect (xkl_engine, "X-config-changed",
-+ G_CALLBACK(on_xkl_config_changed), klass);
-+#endif /* HAVE_LIBXKLAVIER */
-+
- klass->im = NULL;
- }
-
-@@ -412,6 +517,9 @@ ibus_m17n_engine_constructor (GType
- IBusM17NEngine *m17n;
- GObjectClass *object_class;
- IBusM17NEngineClass *klass;
-+#if HAVE_LIBXKLAVIER
-+ GdkDisplay *display;
-+#endif /* HAVE_LIBXKLAVIER */
-
- m17n = (IBusM17NEngine *) G_OBJECT_CLASS (parent_class)->constructor (type,
- n_construct_params,
-@@ -499,6 +607,11 @@ ibus_m17n_engine_destroy (IBusM17NEngine
- m17n->context = NULL;
- }
-
-+#if HAVE_LIBXKLAVIER
-+ if (xkl_system_config_rec)
-+ xkl_config_rec_activate (xkl_system_config_rec, xkl_engine);
-+#endif /* HAVE_LIBXKLAVIER */
-+
- IBUS_OBJECT_CLASS (parent_class)->destroy ((IBusObject *)m17n);
- }
-
-@@ -735,6 +848,19 @@ ibus_m17n_engine_enable (IBusEngine *eng
- ibus_engine_get_surrounding_text (engine, &text, &cursor_pos);
- g_object_unref (text);
- #endif /* HAVE_IBUS_ENGINE_GET_SURROUNDING_TEXT */
-+
-+#if HAVE_LIBXKLAVIER
-+ GObjectClass *object_class;
-+ IBusM17NEngineClass *klass;
-+
-+ object_class = G_OBJECT_GET_CLASS (m17n);
-+ klass = (IBusM17NEngineClass *) object_class;
-+
-+ if (klass->xkl_config_rec) {
-+ if (!xkl_config_rec_activate (klass->xkl_config_rec, xkl_engine))
-+ g_warning ("Can't set the XKB layout");
-+ }
-+#endif /* HAVE_LIBXKLAVIER */
- }
-
- static void
-@@ -744,6 +870,17 @@ ibus_m17n_engine_disable (IBusEngine *en
-
- ibus_m17n_engine_focus_out (engine);
- parent_class->disable (engine);
-+
-+#if HAVE_LIBXKLAVIER
-+ GObjectClass *object_class;
-+ IBusM17NEngineClass *klass;
-+
-+ object_class = G_OBJECT_GET_CLASS (m17n);
-+ klass = (IBusM17NEngineClass *) object_class;
-+
-+ if (xkl_system_config_rec)
-+ xkl_config_rec_activate (xkl_system_config_rec, xkl_engine);
-+#endif /* HAVE_LIBXKLAVIER */
- }
-
- static void
-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
-@@ -290,6 +290,11 @@ ibus_m17n_engine_config_parse_xml_node (
- sub_node->name, sub_node->text);
+From 0cc2abaab50e6668e525da093ef12ed0277d5c21 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/6] 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:*</name>
++ <layout>default[lv3:ralt_switch]</layout>
++ </engine>
+ <!-- Some CJK engines use preedit. -->
+ <engine>
+ <name>m17n:zh:cangjie</name>
+diff --git a/src/m17nutil.c b/src/m17nutil.c
+index b06f71d..201c8b4 100644
+--- a/src/m17nutil.c
++++ b/src/m17nutil.c
+@@ -15,7 +15,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 {
+@@ -130,7 +131,7 @@ ibus_m17n_engine_new (MSymbol lang,
+ "language", msymbol_name (lang),
+ "license", "GPL",
+ "icon", engine_icon ? engine_icon : "",
+- "layout", "us",
++ "layout", config->layout ? config->layout : "us",
+ "rank", config->rank,
+ NULL);
+ #else
+@@ -272,6 +273,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;
+ }
+@@ -304,6 +307,12 @@ ibus_m17n_engine_config_parse_xml_node (EngineConfigNode *cnode,
+ cnode->mask |= ENGINE_CONFIG_RANK_MASK;
continue;
}
-+ if (g_strcmp0 (sub_node->name, "xkb-options") == 0) {
-+ g_free (cnode->config.xkb_options);
-+ cnode->config.xkb_options = g_strdup (sub_node->text);
++ 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;
+ }
- g_warning ("<engine> element contains invalid element <%s>",
- sub_node->name);
- }
-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
-@@ -16,6 +16,9 @@ struct _IBusM17NEngineConfig {
-
+ if (g_strcmp0 (sub_node->name , "preedit-highlight") == 0) {
+ if (g_ascii_strcasecmp ("TRUE", sub_node->text) == 0)
+ cnode->config.preedit_highlight = TRUE;
+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;
+
++ /* keyboard layout */
++ gchar *layout;
++
/* whether to highlight preedit */
gboolean preedit_highlight;
-+
-+ /* keyboard options to which the engine switches when enabled */
-+ char *xkb_options;
};
-
- typedef struct _IBusM17NEngineConfig IBusM17NEngineConfig;
+--
+1.7.6.1
+
diff --git a/ibus-m17n-xx-icon-symbol.patch b/ibus-m17n-xx-icon-symbol.patch
index 43dac05..42e70fd 100644
--- a/ibus-m17n-xx-icon-symbol.patch
+++ b/ibus-m17n-xx-icon-symbol.patch
@@ -1,23 +1,45 @@
-Patch to embed hotkeys and symbol property in component XML.
-Index: ibus-m17n-1.3.2/configure.ac
-===================================================================
---- ibus-m17n-1.3.2.orig/configure.ac
-+++ ibus-m17n-1.3.2/configure.ac
-@@ -122,6 +122,10 @@ AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GET
+From 4cad5fe6e36be9cbfe0d50f683b489e9202c7d53 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 4/6] Supply hotkeys and symbol in engine desc.
+
+---
+ configure.ac | 3 +
+ m4/.gitignore | 2 +
+ 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
+
+diff --git a/configure.ac b/configure.ac
+index 927d382..23102c4 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)
+# hotkeys in component xml
+IBUS_WITH_HOTKEYS
-+IBUS_SET_SYMBOL([?])
+
# 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], [
@@ -71,53 +93,288 @@ 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
-@@ -254,5 +254,7 @@
+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>
+ @IBUS_HOTKEYS_XML@
-+ @IBUS_SYMBOL_XML@
</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>
+ <preedit-highlight>TRUE</preedit-highlight>
+ </engine>
++ <!-- Set IME symbols. -->
++ <engine>
++ <name>m17n:as:*</name>
++ <symbol>ক</symbol>
++ </engine>
++ <engine>
++ <name>m17n:bn:*</name>
++ <symbol>ক</symbol>
++ </engine>
++ <engine>
++ <name>m17n:gu:*</name>
++ <symbol>ક</symbol>
++ </engine>
++ <engine>
++ <name>m17n:hi:*</name>
++ <symbol>क</symbol>
++ </engine>
++ <engine>
++ <name>m17n:kn:*</name>
++ <symbol>ಕ</symbol>
++ </engine>
++ <engine>
++ <name>m17n:ks:*</name>
++ <symbol>क</symbol>
++ </engine>
++ <engine>
++ <name>m17n:mai:*</name>
++ <symbol>क</symbol>
++ </engine>
++ <engine>
++ <name>m17n:ml:*</name>
++ <symbol>ക</symbol>
++ </engine>
++ <engine>
++ <name>m17n:mr:*</name>
++ <symbol>क</symbol>
++ </engine>
++ <engine>
++ <name>m17n:ne:*</name>
++ <symbol>ने</symbol>
++ </engine>
++ <engine>
++ <name>m17n:or:*</name>
++ <symbol>କ</symbol>
++ </engine>
++ <engine>
++ <name>m17n:pa:*</name>
++ <symbol>ਕ</symbol>
++ </engine>
++ <engine>
++ <name>m17n:sa:*</name>
++ <symbol>क</symbol>
++ </engine>
++ <engine>
++ <name>m17n:sd:*</name>
++ <symbol>क</symbol>
++ </engine>
++ <engine>
++ <name>m17n:si:*</name>
++ <symbol>සි</symbol>
++ </engine>
++ <engine>
++ <name>m17n:ta:*</name>
++ <symbol>க</symbol>
++ </engine>
++ <engine>
++ <name>m17n:te:*</name>
++ <symbol>క</symbol>
++ </engine>
++ <engine>
++ <name>m17n:*:kbd</name>
++ <symbol></symbol>
++ </engine>
++ <engine>
++ <name>m17n:*:pre</name>
++ <symbol></symbol>
++ </engine>
++ <engine>
++ <name>m17n:*:post</name>
++ <symbol></symbol>
++ </engine>
++ <engine>
++ <name>m17n:am:sera</name>
++ <symbol>አ</symbol>
++ </engine>
++ <engine>
++ <name>m17n:bo:*</name>
++ <symbol>ཀ</symbol>
++ </engine>
++ <engine>
++ <name>m17n:cr:*</name>
++ <symbol></symbol>
++ </engine>
++ <engine>
++ <name>m17n:dv:*</name>
++ <symbol></symbol>
++ </engine>
++ <engine>
++ <name>m17n:eo:*</name>
++ <symbol></symbol>
++ </engine>
++ <engine>
++ <name>m17n:fa:*</name>
++ <symbol>ف</symbol>
++ </engine>
++ <engine>
++ <name>m17n:fr:*</name>
++ <symbol></symbol>
++ </engine>
++ <engine>
++ <name>m17n:ii:*</name>
++ <symbol></symbol>
++ </engine>
++ <engine>
++ <name>m17n:iu:*</name>
++ <symbol></symbol>
++ </engine>
++ <engine>
++ <name>m17n:ja:anthy</name>
++ <symbol>あ</symbol>
++ </engine>
++ <engine>
++ <name>m17n:kk:*</name>
++ <symbol>قا</symbol>
++ </engine>
++ <engine>
++ <name>m17n:km:*</name>
++ <symbol>ក</symbol>
++ </engine>
++ <engine>
++ <name>m17n:lo:*</name>
++ <symbol>ກ</symbol>
++ </engine>
++ <engine>
++ <name>m17n:nsk:*</name>
++ <symbol></symbol>
++ </engine>
++ <engine>
++ <name>m17n:oj:*</name>
++ <symbol></symbol>
++ </engine>
++ <engine>
++ <name>m17n:ps:*</name>
++ <symbol></symbol>
++ </engine>
++ <engine>
++ <name>m17n:ru:*</name>
++ <symbol>Я</symbol>
++ </engine>
++ <engine>
++ <name>m17n:sv:*</name>
++ <symbol></symbol>
++ </engine>
++ <engine>
++ <name>m17n:syrc:*</name>
++ <symbol></symbol>
++ </engine>
++ <engine>
++ <name>m17n:tai:*</name>
++ <symbol>꫞</symbol>
++ </engine>
++ <engine>
++ <name>m17n:th:*</name>
++ <symbol>ท</symbol>
++ </engine>
++ <engine>
++ <name>m17n:ur:*</name>
++ <symbol>خ</symbol>
++ </engine>
++ <engine>
++ <name>m17n:vi:han</name>
++ <symbol>越</symbol>
++ </engine>
++ <engine>
++ <name>m17n:vi:nom*</name>
++ <symbol>喃</symbol>
++ </engine>
++ <engine>
++ <name>m17n:vi:*</name>
++ <symbol>Ắ</symbol>
++ </engine>
++ <engine>
++ <name>m17n:yi:*</name>
++ <symbol></symbol>
++ </engine>
++ <engine>
++ <name>m17n:zh:bopomofo</name>
++ <symbol>ㄅ</symbol>
++ </engine>
++ <engine>
++ <name>m17n:zh:cangjie</name>
++ <symbol>倉</symbol>
++ </engine>
++ <engine>
++ <name>m17n:zh:py*</name>
++ <symbol>拼</symbol>
++ </engine>
++ <engine>
++ <name>m17n:zh:quick</name>
++ <symbol>簡</symbol>
++ </engine>
++ <engine>
++ <name>m17n:zh:tonepy*</name>
++ <symbol>调</symbol>
++ </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 201c8b4..94a6891 100644
+--- a/src/m17nutil.c
++++ b/src/m17nutil.c
+@@ -16,7 +16,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 {
+@@ -133,6 +135,8 @@ ibus_m17n_engine_new (MSymbol lang,
"icon", engine_icon ? engine_icon : "",
- "layout", "us",
+ "layout", config->layout ? config->layout : "us",
"rank", config->rank,
+ "hotkeys", config->hotkeys ? config->hotkeys : "",
+ "symbol", config->symbol ? config->symbol : "",
NULL);
#else
engine = ibus_engine_desc_new (engine_name,
-@@ -282,6 +284,14 @@ ibus_m17n_engine_config_parse_xml_node (
- cnode->config.rank = atoi (sub_node->text);
+@@ -275,6 +279,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;
+ }
+@@ -313,6 +321,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
-@@ -14,6 +14,12 @@ struct _IBusM17NEngineConfig {
- /* engine rank */
- gint rank;
+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;
+ /* hotkeys */
+ gchar *hotkeys;
@@ -127,4 +384,7 @@ 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 aa1103c..1afff8d 100644
--- a/ibus-m17n.spec
+++ b/ibus-m17n.spec
@@ -1,4 +1,10 @@
+%if (0%{?fedora} > 14)
+%global require_ibus_version 1.3.99.20110817
+%global require_eekboard_version 1.0.3
+%else
%global require_ibus_version 1.3.0
+%global require_eekboard_version 0.0.6
+%endif
%global have_bridge_hotkey 0
%if (0%{?fedora} > 14)
@@ -11,21 +17,26 @@
%global _with_hotkeys --with-hotkeys
%endif
+%if (0%{?fedora} > 16)
+%global _enable_eekboard --enable-eekboard
+%endif
+
Name: ibus-m17n
-Version: 1.3.2
-Release: 7%{?dist}
+Version: 1.3.3
+Release: 3%{?dist}
Summary: The M17N engine for IBus platform
License: GPLv2+
Group: System Environment/Libraries
URL: http://code.google.com/p/ibus/
Source0: http://ibus.googlecode.com/files/%{name}-%{version}.tar.gz
-# dummy source to keep quilt series file
-Source1: series
-Patch0: ibus-m17n-HEAD.patch
-Patch1: ibus-m17n-iok.patch
-Patch2: ibus-m17n-xkb-options.patch
-Patch3: ibus-m17n-xx-icon-symbol.patch
+#Patch0: ibus-m17n-HEAD.patch
+Patch1: ibus-m17n-default-xml-override.patch
+Patch2: ibus-m17n-setup-refactor.patch
+Patch3: ibus-m17n-xkb-options.patch
+Patch4: ibus-m17n-xx-icon-symbol.patch
+Patch5: ibus-m17n-virtkbd.patch
+Patch6: ibus-m17n-iok.patch
# The following BR is for autogen and not necessary when packging
# released tarballs.
@@ -41,10 +52,12 @@ BuildRequires: gtk2-devel
%endif
BuildRequires: libxklavier-devel
BuildRequires: ibus-devel >= %{require_ibus_version}
+BuildRequires: eekboard-devel >= %{require_eekboard_version}
Requires: ibus >= %{require_ibus_version}
Requires: m17n-lib
-Requires: iok > 1.3.1
+Requires: eekboard >= %{require_eekboard_version}
+Requires: iok
%description
M17N engine for IBus input platform. It allows input of many languages using
@@ -52,14 +65,19 @@ the input table maps from m17n-db.
%prep
%setup -q
-%patch0 -p1 -b .HEAD
-%patch1 -p1 -b .iok
-%patch2 -p1 -b .xkb-options
-%patch3 -p1 -b .xx-icon-symbol
+#patch0 -p1 -b .HEAD
+%patch1 -p1 -b .default-xml-override
+%patch2 -p1 -b .setup-refactor
+%patch3 -p1 -b .xkb-options
+# do not apply patch to m4/.gitignore
+sed -i 's!^[-+][-+][-+] .*/m4/\.gitignore!#\0!' %PATCH4
+%patch4 -p1 -b .xx-icon-symbol
+%patch5 -p1 -b .virtkbd
+%patch6 -p1 -b .iok
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}
@@ -77,6 +95,29 @@ make DESTDIR=${RPM_BUILD_ROOT} install
%{_datadir}/ibus/component/*
%changelog
+* Fri Sep 9 2011 Takao Fujiwara <tfujiwar at redhat.com> - 1.3.3-3
+- Rebuild with the latest ibus 1.3.99.20110817-4 and eekboard 1.0.3
+
+* Fri Sep 2 2011 Daiki Ueno <dueno at redhat.com> - 1.3.3-2
+- Revive iok patch.
+
+* Thu Sep 1 2011 Daiki Ueno <dueno at redhat.com> - 1.3.3-1
+- New upstream release.
+- 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.
+
+* Mon Aug 8 2011 Daiki Ueno <dueno at redhat.com> - 1.3.2-9
+- Update ibus-m17n-xkb-options.patch.
+- Don't set XKB options directly from engine but via ibus-xkb
+
+* Fri Aug 5 2011 Daiki Ueno <dueno at redhat.com> - 1.3.2-8
+- Update ibus-m17n-xx-icon-symbol.patch.
+- Fix bug 727024 - ibus compose file needs a symbol tag for gnome-shell
+- Update ibus-m17n-xkb-options.patch.
+
* Thu Jul 7 2011 Daiki Ueno <dueno at redhat.com> - 1.3.2-7
- don't specify --with-hotkey.
diff --git a/sources b/sources
index c0a12ba..8af2da5 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-4c406147318f94e5e805c408c4be075e ibus-m17n-1.3.2.tar.gz
+8fa050df5b2d25095d0e2df51946b0de ibus-m17n-1.3.3.tar.gz
More information about the scm-commits
mailing list