public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
* [rpms/ibus] autotool: Updated to 1.4.99.20120203
@ 2026-05-31  2:05 Takao Fujiwara
  0 siblings, 0 replies; only message in thread
From: Takao Fujiwara @ 2026-05-31  2:05 UTC (permalink / raw)
  To: git-commits

            A new commit has been pushed.

            Repo   : rpms/ibus
            Branch : autotool
            Commit : db6c98183ce02ece1edb0bd0abff7d6f5b0b9d4a
            Author : Takao Fujiwara <tfujiwar@redhat.com>
            Date   : 2012-02-04T10:13:28+09:00
            Stats  : +2941/-11813 in 7 file(s)
            URL    : https://src.fedoraproject.org/rpms/ibus/c/db6c98183ce02ece1edb0bd0abff7d6f5b0b9d4a?branch=autotool

            Log:
            Updated to 1.4.99.20120203

- Removed ibus-xx-bridge-hotkey.patch
- Updated ibus-541492-xkb.patch to use libgnomekbd.
- Updated ibus-xx-setup-frequent-lang.patch for 1.4.99.20120203

---
diff --git a/.gitignore b/.gitignore
index ee43755..5afc5a0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -32,3 +32,6 @@ ibus-1.3.6.tar.gz
 /ibus-gjs-3.2.1.20111118.tar.gz
 /ibus-gjs-3.2.1.20111128.tar.gz
 /ibus-gjs-3.2.1.20111230.tar.gz
+/ibus-1.4.99.20120203.tar.gz
+/ibus-gjs-3.3.3.20120203.tar.gz
+/ibus-gsettings-db

diff --git a/ibus-541492-xkb.patch b/ibus-541492-xkb.patch
index a7c9667..8d49641 100644
--- a/ibus-541492-xkb.patch
+++ b/ibus-541492-xkb.patch
@@ -1,104 +1,135 @@
-From 5b4c1700b4798f20b61dec5193b3f08d1e60742d Mon Sep 17 00:00:00 2001
+From 2aea99b5872c741c413e995a50f9ac0842f3af96 Mon Sep 17 00:00:00 2001
 From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Fri, 30 Dec 2011 15:46:13 +0900
-Subject: [PATCH] Add XKB layouts
+Date: Fri, 3 Feb 2012 12:12:29 +0900
+Subject: [PATCH] Add ibus-xkb and libgnomekbd.
 
 ---
- Makefile.am                  |    7 +
- configure.ac                 |   56 +
- data/ibus.schemas.in         |   47 +
- ibus-1.0.pc.in               |    2 +
- ibus/Makefile.am             |   26 +
- ibus/__init__.py             |    2 +
- ibus/bus.py                  |    3 +
- ibus/interface/iibus.py      |    3 +
- ibus/xkblayout.py.in         |  360 ++++
- ibus/xkbxml.py.in            |  419 ++++
- setup/Makefile.am            |    1 +
- setup/enginecombobox.py      |    7 +-
- setup/main.py                |    3 +
- setup/setup.ui               |  609 ++++++-
- setup/xkbsetup.py            |  490 +++++
- src/Makefile.am              |    5 +
- src/ibus.h                   |    1 +
- src/ibusxkbxml.c             |  441 +++++
- src/ibusxkbxml.h             |  172 ++
- ui/gtk/panel.py              |   41 +
- xkb/Makefile.am              |  107 +
- xkb/Makefile.am.orig         |  104 +
- xkb/gtkimcontextsimpleseqs.h | 4484 ++++++++++++++++++++++++++++++++++++++++++
- xkb/ibus-engine-xkb-main.c   |  303 +++
- xkb/ibus-engine-xkb-main.h   |   32 +
- xkb/ibus-simple-engine.c     | 1007 ++++++++++
- xkb/ibus-simple-engine.h     |   13 +
- xkb/ibus-xkb-main.c          |  112 ++
- xkb/xkblayout.xml.in         |   16 +
- xkb/xkblayoutconfig.xml.in   |    6 +
- xkb/xkblib.c                 |  327 +++
- xkb/xkblib.h                 |   41 +
- xkb/xkbxml.c                 |  345 ++++
- xkb/xkbxml.h                 |  113 ++
- 34 files changed, 9701 insertions(+), 4 deletions(-)
- create mode 100644 ibus/xkblayout.py.in
- create mode 100644 ibus/xkbxml.py.in
- create mode 100644 setup/xkbsetup.py
+ bindings/vala/ibus-1.0.vapi        |   11 +
+ bindings/vala/ibus-1.0/ibus-1.0.gi |   45 +++
+ configure.ac                       |   59 ++++
+ data/ibus.schemas.in               |   58 ++++
+ engine/Makefile.am                 |   22 ++
+ engine/ibus-xkb-main.c             |  111 ++++++++
+ engine/main.vala                   |   84 ++++++
+ engine/simple.xml.in.in            |  531 +-----------------------------------
+ engine/xkblib.c                    |  327 ++++++++++++++++++++++
+ engine/xkblib.h                    |   41 +++
+ ibus-1.0.pc.in                     |    4 +
+ setup/main.py                      |   29 ++-
+ src/Makefile.am                    |    5 +
+ src/ibus.h                         |    1 +
+ src/ibusxkbxml.c                   |  454 ++++++++++++++++++++++++++++++
+ src/ibusxkbxml.h                   |  187 +++++++++++++
+ ui/gtk3/Gkbd-3.0.metadata          |    1 +
+ ui/gtk3/Makefile.am                |   47 ++++
+ ui/gtk3/gkbdlayout.vala.false      |   63 +++++
+ ui/gtk3/gkbdlayout.vala.true       |  111 ++++++++
+ ui/gtk3/panel.vala                 |  211 ++++++++++++++-
+ ui/gtk3/xkblayout.vala             |  466 +++++++++++++++++++++++++++++++
+ 22 files changed, 2321 insertions(+), 547 deletions(-)
+ create mode 100644 engine/ibus-xkb-main.c
+ create mode 100644 engine/xkblib.c
+ create mode 100644 engine/xkblib.h
  create mode 100644 src/ibusxkbxml.c
  create mode 100644 src/ibusxkbxml.h
- create mode 100644 xkb/Makefile.am
- create mode 100644 xkb/Makefile.am.orig
- create mode 100644 xkb/gtkimcontextsimpleseqs.h
- create mode 100644 xkb/ibus-engine-xkb-main.c
- create mode 100644 xkb/ibus-engine-xkb-main.h
- create mode 100644 xkb/ibus-simple-engine.c
- create mode 100644 xkb/ibus-simple-engine.h
- create mode 100644 xkb/ibus-xkb-main.c
- create mode 100644 xkb/xkblayout.xml.in
- create mode 100644 xkb/xkblayoutconfig.xml.in
- create mode 100644 xkb/xkblib.c
- create mode 100644 xkb/xkblib.h
- create mode 100644 xkb/xkbxml.c
- create mode 100644 xkb/xkbxml.h
+ create mode 100644 ui/gtk3/Gkbd-3.0.metadata
+ create mode 100644 ui/gtk3/gkbdlayout.vala.false
+ create mode 100644 ui/gtk3/gkbdlayout.vala.true
+ create mode 100644 ui/gtk3/xkblayout.vala
 
-diff --git a/Makefile.am b/Makefile.am
-index ff0fabc..056ddfc 100644
---- a/Makefile.am
-+++ b/Makefile.am
-@@ -42,6 +42,12 @@ DAEMON_DIRS =       \
- 	$(NULL)
- endif
- 
-+if ENABLE_XKB
-+XKB_DIRS =          \
-+	xkb             \
-+	$(NULL)
-+endif
-+
- if ENABLE_MEMCONF
- MEMCONF_DIRS = \
- 	memconf \
-@@ -66,6 +72,7 @@ SUBDIRS =           \
- 	$(DAEMON_DIRS)  \
- 	$(PYTHON_DIRS)  \
- 	$(GCONF_DIRS)   \
-+	$(XKB_DIRS)     \
- 	$(MEMCONF_DIRS) \
- 	$(DCONF_DIRS)   \
- 	$(NULL)
+diff --git a/bindings/vala/ibus-1.0.vapi b/bindings/vala/ibus-1.0.vapi
+index bf3ae61..c5baa1c 100644
+--- a/bindings/vala/ibus-1.0.vapi
++++ b/bindings/vala/ibus-1.0.vapi
+@@ -527,6 +527,17 @@ namespace IBus {
+ 		public unowned string get_text ();
+ 	}
+ 	[CCode (cheader_filename = "ibus.h")]
++	public class XKBConfigRegistry : IBus.Object {
++		[CCode (has_construct_function = false)]
++		public XKBConfigRegistry ();
++		public unowned GLib.HashTable get_layout_list ();
++		public unowned string layout_desc_get_desc (string layout);
++		public unowned GLib.List layout_lang_get_langs (string layout);
++		public unowned GLib.List layout_list_get_layouts ();
++		public unowned GLib.List layout_list_get_variants (string layout);
++		public unowned string variant_desc_get_desc (string variant);
++	}
++	[CCode (cheader_filename = "ibus.h")]
+ 	[Compact]
+ 	public class XMLNode {
+ 		public weak string attributes;
+diff --git a/bindings/vala/ibus-1.0/ibus-1.0.gi b/bindings/vala/ibus-1.0/ibus-1.0.gi
+index 65852f1..9e062fd 100644
+--- a/bindings/vala/ibus-1.0/ibus-1.0.gi
++++ b/bindings/vala/ibus-1.0/ibus-1.0.gi
+@@ -2878,6 +2878,51 @@
+ 			<field name="text" type="gchar*"/>
+ 			<field name="attrs" type="IBusAttrList*"/>
+ 		</object>
++		<object name="IBusXKBConfigRegistry" parent="IBusObject" type-name="IBusXKBConfigRegistry" get-type="ibus_xkb_config_registry_get_type">
++			<method name="get_layout_list" symbol="ibus_xkb_config_registry_get_layout_list">
++				<return-type type="GHashTable*"/>
++				<parameters>
++					<parameter name="xkb_config" type="IBusXKBConfigRegistry*"/>
++				</parameters>
++			</method>
++			<method name="layout_desc_get_desc" symbol="ibus_xkb_config_registry_layout_desc_get_desc">
++				<return-type type="gchar*"/>
++				<parameters>
++					<parameter name="xkb_config" type="IBusXKBConfigRegistry*"/>
++					<parameter name="layout" type="gchar*"/>
++				</parameters>
++			</method>
++			<method name="layout_lang_get_langs" symbol="ibus_xkb_config_registry_layout_lang_get_langs">
++				<return-type type="GList*"/>
++				<parameters>
++					<parameter name="xkb_config" type="IBusXKBConfigRegistry*"/>
++					<parameter name="layout" type="gchar*"/>
++				</parameters>
++			</method>
++			<method name="layout_list_get_layouts" symbol="ibus_xkb_config_registry_layout_list_get_layouts">
++				<return-type type="GList*"/>
++				<parameters>
++					<parameter name="xkb_config" type="IBusXKBConfigRegistry*"/>
++				</parameters>
++			</method>
++			<method name="layout_list_get_variants" symbol="ibus_xkb_config_registry_layout_list_get_variants">
++				<return-type type="GList*"/>
++				<parameters>
++					<parameter name="xkb_config" type="IBusXKBConfigRegistry*"/>
++					<parameter name="layout" type="gchar*"/>
++				</parameters>
++			</method>
++			<method name="variant_desc_get_desc" symbol="ibus_xkb_config_registry_variant_desc_get_desc">
++				<return-type type="gchar*"/>
++				<parameters>
++					<parameter name="xkb_config" type="IBusXKBConfigRegistry*"/>
++					<parameter name="variant" type="gchar*"/>
++				</parameters>
++			</method>
++			<constructor name="new" symbol="ibus_xkb_config_registry_new">
++				<return-type type="IBusXKBConfigRegistry*"/>
++			</constructor>
++		</object>
+ 		<constant name="IBUS_INTERFACE_CONFIG" type="char*" value="org.freedesktop.IBus.Config"/>
+ 		<constant name="IBUS_INTERFACE_ENGINE" type="char*" value="org.freedesktop.IBus.Engine"/>
+ 		<constant name="IBUS_INTERFACE_FACTORY" type="char*" value="org.freedesktop.IBus.Factory"/>
 diff --git a/configure.ac b/configure.ac
-index f452666..227e28e 100644
+index 74f6d93..fe0cd4e 100644
 --- a/configure.ac
 +++ b/configure.ac
-@@ -221,6 +221,60 @@ else
+@@ -222,6 +222,63 @@ else
      enable_xim="no (disabled, use --enable-xim to enable)"
  fi
  
++# --enable-xkb option.
 +AC_ARG_ENABLE(xkb,
-+    AS_HELP_STRING([--disable-xkb],
-+                   [Do not build xkb]),
++    AS_HELP_STRING([--enable-xkb],
++                   [Build xkb]),
 +    [enable_xkb=$enableval],
-+    [enable_xkb=yes]
++    [enable_xkb=no]
 +)
-+
 +AM_CONDITIONAL([ENABLE_XKB], [test x"$enable_xkb" = x"yes"])
 +if test x"$enable_xkb" = x"yes"; then
 +    PKG_CHECK_MODULES(X11, [
@@ -116,7 +147,30 @@ index f452666..227e28e 100644
 +fi
 +AC_SUBST(HAVE_IBUS_XKB)
 +
-+# define XKB rules file
++# --enable-libgnomekbd option.
++AC_ARG_ENABLE(libgnomekbd,
++    AS_HELP_STRING([--enable-libgnomekbd],
++                   [Use libgnomekbd to handle the keymaps]),
++    [enable_libgnomekbd=$enableval],
++    [enable_libgnomekbd=no]
++)
++AM_CONDITIONAL([ENABLE_LIBGNOMEKBD], [test x"$enable_libgnomekbd" = x"yes"])
++if test x"$enable_libgnomekbd" = x"yes"; then
++    # check for libgnomekbd
++    PKG_CHECK_MODULES(LIBGNOMEKBDUI, [
++        libgnomekbdui
++    ])
++    PKG_CHECK_MODULES(ATK, [
++        atk
++    ])
++    HAVE_IBUS_GKBD=true
++else
++    enable_libgnomekbd="no (disabled, use --enable-libgnomekbd to enable)"
++    HAVE_IBUS_GKBD=false
++fi
++AC_SUBST(HAVE_IBUS_GKBD)
++
++# Define XKB rules file
 +AC_ARG_WITH(xkb-rules-xml,
 +    AS_HELP_STRING([--with-xkb-rules-xml[=$DIR/evdev.xml]],
 +        [Set evdev.xml file path (default: /usr/share/X11/xkb/rules/evdev.xml)]),
@@ -125,78 +179,45 @@ index f452666..227e28e 100644
 +)
 +AC_DEFINE_UNQUOTED(XKB_RULES_XML_FILE, "$XKB_RULES_XML_FILE",
 +    [Define file path of evdev.xml])
-+AC_SUBST(XKB_RULES_XML_FILE)
-+
-+# define XKB preload layouts
-+AC_ARG_WITH(xkb-preload-layouts,
-+    AS_HELP_STRING([--with-xkb-preload-layouts[=layout,...]],
-+        [Set preload xkb layouts (default: us,fr,de,...)]),
-+    XKB_PRELOAD_LAYOUTS=$with_xkb_preload_layouts,
-+    [XKB_PRELOAD_LAYOUTS=""\
-+"us,us(chr),us(dvorak),ad,al,am,ara,az,ba,bd,be,bg,br,bt,by,"\
-+"de,dk,ca,ch,cn(tib),cz,ee,epo,es,et,fi,fo,fr,"\
-+"gb,ge,ge(dsb),ge(ru),ge(os),gh,gh(akan),gh(ewe),gh(fula),gh(ga),gh(hausa),"\
-+"gn,gr,hu,hr,ie,ie(CloGaelach),il,"\
-+"in,in(ben),in(guj),in(guru),in(jhelum),in(kan),in(mal),in(ori),in(tam),"\
-+"in(tel),in(urd-phonetic),in(bolnagri),iq,iq(ku),ir,ir(ku),is,it,"\
-+"kg,kh,kz,la,latam,lk,lk(tam_unicode),lt,lv,ma,ma(tifinagh),mal,mao,"\
-+"me,mk,mm,mt,mv,ng,ng(hausa),ng,ng(igbo),ng(yoruba),nl,no,no(smi),np,"\
-+"pk,pl,pl(csb),pt,ro,rs,ru,ru(cv),ru(kom),ru(sah),ru(tt),ru(xal),"\
-+"se,si,sk,sy,sy(ku),th,tj,tr,ua,uz,vn"]
-+)
-+AC_SUBST(XKB_PRELOAD_LAYOUTS)
 +
  # GObject introspection
  GOBJECT_INTROSPECTION_CHECK([0.6.8])
  
-@@ -478,6 +532,7 @@ bindings/Makefile
- bindings/vala/Makefile
- dconf/Makefile
- dconf/dconf.xml.in
-+xkb/Makefile
+@@ -517,5 +574,7 @@ Build options:
+   No snooper regexes        "$NO_SNOOPER_APPS"
+   Panel icon                "$IBUS_ICON_KEYBOARD"
+   Enable surrounding-text   $enable_surrounding_text
++  Build XKB                 $enable_xkb
++  Build libgnomebkd         $enable_libgnomekbd
  ])
  
- AC_OUTPUT
-@@ -493,6 +548,7 @@ Build options:
-   Build gtk2 immodule       $enable_gtk2
-   Build gtk3 immodule       $enable_gtk3
-   Build XIM agent server    $enable_xim
-+  Build XKB                 $enable_xkb
-   Build python modules      $enable_python
-   Build gconf modules       $enable_gconf
-   Build memconf modules     $enable_memconf
 diff --git a/data/ibus.schemas.in b/data/ibus.schemas.in
-index 663358c..e0a6a37 100644
+index 68def40..34de9b4 100644
 --- a/data/ibus.schemas.in
 +++ b/data/ibus.schemas.in
-@@ -191,6 +191,53 @@
+@@ -26,6 +26,18 @@
        </locale>
      </schema>
      <schema>
-+      <key>/schemas/desktop/ibus/general/system_keyboard_layout</key>
-+      <applyto>/desktop/ibus/general/system_keyboard_layout</applyto>
-+      <owner>ibus</owner>
-+      <type>string</type>
-+      <default>default</default>
-+      <gettext_domain>ibus</gettext_domain>
-+      <locale name="C">
-+        <short>Set system keyboard layout</short>
-+            <long>Override default system keyboard layout. default is 'default'</long>
-+      </locale>
-+    </schema>
-+    <schema>
-+      <key>/schemas/desktop/ibus/general/system_keyboard_option</key>
-+      <applyto>/desktop/ibus/general/system_keyboard_option</applyto>
++      <key>/schemas/desktop/ibus/general/hotkey/trigger-accel</key>
++      <applyto>/desktop/ibus/general/hotkey/trigger-accel</applyto>
 +      <owner>ibus</owner>
-+      <type>string</type>
-+      <default>default</default>
-+      <gettext_domain>ibus</gettext_domain>
++      <type>list</type>
++      <list_type>string</list_type>
++      <default>[&lt;Control&gt;space]</default>
 +      <locale name="C">
-+        <short>Set system keyboard option</short>
-+            <long>Override default system keyboard option. default is 'default'</long>
++        <short>Trigger shortcut keys for gtk_accelerator_parse</short>
++	    <long>The shortcut keys for turning input method on or off</long>
 +      </locale>
 +    </schema>
 +    <schema>
+       <key>/schemas/desktop/ibus/general/hotkey/enable_unconditional</key>
+       <applyto>/desktop/ibus/general/hotkey/enable_unconditional</applyto>
+       <owner>ibus</owner>
+@@ -191,6 +203,52 @@
+       </locale>
+     </schema>
+     <schema>
 +      <key>/schemas/desktop/ibus/general/use_xmodmap</key>
 +      <applyto>/desktop/ibus/general/use_xmodmap</applyto>
 +      <owner>ibus</owner>
@@ -216,2152 +237,88 @@ index 663358c..e0a6a37 100644
 +      <default>[ara,bg,cz,dev,gr,gur,in,jp(kana),mal,mkd,ru,ua]</default>
 +      <locale name="C">
 +        <short>Latin layout which have no ASCII</short>
-+	    <long>us layout is appended to the latin layouts. variant is not needed.</long>
++           <long>us layout is appended to the latin layouts. variant is not needed.</long>
++      </locale>
++    </schema>
++    <schema>
++      <key>/schemas/desktop/ibus/general/load_xkb_layouts</key>
++      <applyto>/desktop/ibus/general/load_xkb_layouts</applyto>
++      <owner>ibus</owner>
++      <type>list</type>
++      <list_type>string</list_type>
++      <default>[us,us(chr),us(dvorak),ad,al,am,ara,az,ba,bd,be,bg,br,bt,by,
++de,dk,ca,ch,cn(tib),cz,ee,epo,es,et,fi,fo,fr,
++gb,ge,ge(dsb),ge(ru),ge(os),gh,gh(akan),gh(ewe),gh(fula),gh(ga),gh(hausa),
++gn,gr,hu,hr,ie,ie(CloGaelach),il,
++in,
++in(tel),in(bolnagri),iq,iq(ku),ir,ir(ku),is,it,jp,
++kg,kh,kz,la,latam,lk,lk(tam_unicode),lt,lv,ma,ma(tifinagh),mal,mao,
++me,mk,mm,mt,mv,ng,ng(hausa),ng,ng(igbo),ng(yoruba),nl,no,no(smi),np,
++pk,pl,pl(csb),pt,ro,rs,ru,ru(cv),ru(kom),ru(sah),ru(tt),ru(xal),
++se,si,sk,sy,sy(ku),th,tj,tr,ua,uz,vn
++]</default>
++      <locale name="C">
++        <short>XKB layout list which is shown on ibus-setup</short>
++           <long>XKB layout list which is shown on ibus-setup.
++                 The format is "layout" or "layout(variant)".</long>
 +      </locale>
 +    </schema>
 +    <schema>
        <key>/schemas/desktop/ibus/panel/use_custom_font</key>
        <applyto>/desktop/ibus/panel/use_custom_font</applyto>
        <owner>ibus</owner>
-diff --git a/ibus-1.0.pc.in b/ibus-1.0.pc.in
-index 9f593ab..51eb67a 100644
---- a/ibus-1.0.pc.in
-+++ b/ibus-1.0.pc.in
-@@ -4,6 +4,8 @@ libdir=@libdir@
- includedir=@includedir@
- datadir=@datadir@
- pkgdatadir=@datadir@/ibus
-+have_ibus_xkb=@HAVE_IBUS_XKB@
-+ibus_xkb=@libexecdir@/ibus-xkb
+diff --git a/engine/Makefile.am b/engine/Makefile.am
+index b3b46be..af4747d 100644
+--- a/engine/Makefile.am
++++ b/engine/Makefile.am
+@@ -25,6 +25,8 @@ libibus = $(top_builddir)/src/libibus-@IBUS_API_VERSION@.la
+ INCLUDES = \
+ 	-I$(top_srcdir)/src \
+ 	-I$(top_builddir)/src \
++	-DIBUS_LOCALEDIR=\"$(datadir)/locale\" \
++	-DLIBEXECDIR=\""$(libexecdir)"\" \
+ 	$(NULL)
  
- Name: IBus
- Description: IBus Library
-diff --git a/ibus/Makefile.am b/ibus/Makefile.am
-index c71df1b..508c98f 100644
---- a/ibus/Makefile.am
-+++ b/ibus/Makefile.am
-@@ -58,12 +58,38 @@ nodist_ibus_PYTHON = \
+ AM_CFLAGS = \
+@@ -78,6 +80,26 @@ component_DATA = \
  
- ibusdir = @pkgpythondir@
+ componentdir = $(pkgdatadir)/component
  
-+xkblayout_py_in_files = \
-+	xkblayout.py.in \
-+	xkbxml.py.in \
-+	$(NULL)
-+xkblayout_py_DATA = $(xkblayout_py_in_files:.py.in=.py)
-+xkblayout_pydir = @pkgpythondir@
-+
-+ibus_PYTHON += $(xkblayout_py_DATA)
-+
 +if ENABLE_XKB
-+XKB_COMMAND=\\\"$(libexecdir)/ibus-xkb\\\"
-+HAVE_XKB=True
-+else
-+XKB_COMMAND="None"
-+HAVE_XKB=False
++libexec_PROGRAMS += ibus-xkb
++ibus_xkb_SOURCES = \
++    ibus-xkb-main.c \
++    xkblib.h \
++    xkblib.c \
++    $(NULL)
++ibus_xkb_CFLAGS = \
++    @XKB_CFLAGS@ \
++    @X11_CFLAGS@ \
++    @GLIB2_CFLAGS@ \
++    $(NULL)
++ibus_xkb_LDADD = \
++    @XKB_LIBS@ \
++    @X11_LIBS@ \
++    @GLIB2_LIBS@ \
++    $(libibus) \
++    $(NULL)
 +endif
 +
-+%.py : %.py.in
-+	@sed -e "s|\@XKB_COMMAND\@|$(XKB_COMMAND)|g" \
-+	     -e "s|\@XKB_RULES_XML_FILE\@|$(XKB_RULES_XML_FILE)|g" \
-+	     -e "s|\@HAVE_XKB\@|$(HAVE_XKB)|g" \
-+	     -e "s|\@datadir\@|$(datadir)|g" \
-+	$< > $@
-+
- EXTRA_DIST = \
- 	_config.py.in \
-+	$(xkblayout_py_in_files) \
- 	$(NULL)
- 
  CLEANFILES = \
- 	*.pyc \
-+	$(xkblayout_py_DATA) \
- 	$(NULL)
- 
- DISTCLEANFILES = \
-diff --git a/ibus/__init__.py b/ibus/__init__.py
-index 7c8f8be..3c25605 100644
---- a/ibus/__init__.py
-+++ b/ibus/__init__.py
-@@ -41,4 +41,6 @@ from text import *
- from observedpath import *
- from enginedesc import *
- from component import *
-+from xkblayout import *
-+from xkbxml import *
- from _config import *
-diff --git a/ibus/bus.py b/ibus/bus.py
-index a8a458d..84b4140 100644
---- a/ibus/bus.py
-+++ b/ibus/bus.py
-@@ -163,6 +163,9 @@ class Bus(object.Object):
-             data = serializable.deserialize_object(data)
-         return data
- 
-+    def get_use_sys_layout(self):
-+        return self.__ibus.GetUseSysLayout();
-+
-     def introspect_ibus(self):
-         return self.__ibus.Introspect()
- 
-diff --git a/ibus/interface/iibus.py b/ibus/interface/iibus.py
-index 678d517..7de56fc 100644
---- a/ibus/interface/iibus.py
-+++ b/ibus/interface/iibus.py
-@@ -75,6 +75,9 @@ class IIBus(dbus.service.Object):
-     @method(in_signature="v", out_signature="v")
-     def Ping(self, data, dbusconn): pass
- 
-+    @method(out_signature="b")
-+    def GetUseSysLayout(self, dbusconn): pass
-+
-     @signal(signature="")
-     def RegistryChanged(self): pass
- 
-diff --git a/ibus/xkblayout.py.in b/ibus/xkblayout.py.in
-new file mode 100644
-index 0000000..c0c95ce
---- /dev/null
-+++ b/ibus/xkblayout.py.in
-@@ -0,0 +1,360 @@
-+# vim:set et sts=4 sw=4:
-+#
-+# ibus - The Input Bus
-+#
-+# Copyright (c) 2011 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+# Copyright (c) 2011 Peng Huang <shawn.p.huang@gmail.com>
-+# Copyright (c) 2011 Red Hat, Inc.
-+#
-+# This library is free software; you can redistribute it and/or
-+# modify it under the terms of the GNU Lesser General Public
-+# License as published by the Free Software Foundation; either
-+# version 2 of the License, or (at your option) any later version.
-+#
-+# This library is distributed in the hope that it will be useful,
-+# but WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+# GNU Lesser General Public License for more details.
-+#
-+# You should have received a copy of the GNU Lesser General Public
-+# License along with this program; if not, write to the
-+# Free Software Foundation, Inc., 59 Temple Place, Suite 330,
-+# Boston, MA  02111-1307  USA
-+
-+__all__ = (
-+        'XKBLayout',
-+    )
-+
-+import os, sys, time
-+import glib
-+
-+XKB_COMMAND = @XKB_COMMAND@
-+XKB_SESSION_TIME_OUT = 30.0
-+XMODMAP_CMD = 'xmodmap'
-+XMODMAP_KNOWN_FILES = ['.xmodmap', '.xmodmaprc', '.Xmodmap', '.Xmodmaprc']
-+
-+class XKBLayout():
-+    def __init__(self, config = None, command=XKB_COMMAND):
-+        self.__config = config
-+        self.__command = command
-+        self.__use_xkb = True
-+        self.__xkb_pid = None
-+        self.__xmodmap_pid = None
-+        self.__use_xmodmap = True
-+        if self.__command == None:
-+            self.__use_xkb = False
-+        self.__default_layout = self.get_layout()
-+        self.__default_model = self.get_model()
-+        self.__default_option = self.get_option()
-+        self.__time_lag_session_xkb_layout = True
-+        self.__time_lag_session_xkb_option = True
-+        self.__time_lag_session_xkb_timer = time.time()
-+        self.__xkb_latin_layouts = []
-+        if config != None:
-+            self.__xkb_latin_layouts = list(self.__config.get_value('general',
-+                                                                    'xkb_latin_layouts',
-+                                                                    []))
-+            self.__use_xmodmap = bool(self.__config.get_value('general',
-+                                                              'use_xmodmap',
-+                                                              True))
-+
-+
-+    def __get_model_from_layout(self, layout):
-+        left_bracket = layout.find('(')
-+        right_bracket = layout.find(')')
-+        if left_bracket >= 0 and right_bracket > left_bracket:
-+            return (layout[:left_bracket] + layout[right_bracket + 1:], \
-+                    layout[left_bracket + 1:right_bracket])
-+        return (layout, 'default')
-+
-+    def __get_option_from_layout(self, layout):
-+        left_bracket = layout.find('[')
-+        right_bracket = layout.find(']')
-+        if left_bracket >= 0 and right_bracket > left_bracket:
-+            return (layout[:left_bracket] + layout[right_bracket + 1:], \
-+                    layout[left_bracket + 1:right_bracket])
-+        return (layout, 'default')
-+
-+    def __get_output_from_cmdline(self, arg, string):
-+        exec_command = '%s %s' % (self.__command, arg)
-+        retval = None
-+        for line in os.popen(exec_command).readlines():
-+            line = line.strip()
-+            if line.startswith(string):
-+                retval = line[len(string):]
-+                break
-+        return retval
-+
-+    def __get_userhome(self):
-+        if 'HOME' not in os.environ:
-+            import pwd
-+            userhome = pwd.getpwuid(os.getuid()).pw_dir
-+        else:
-+            userhome = os.environ['HOME']
-+        userhome = userhome.rstrip('/')
-+        return userhome
-+
-+    def __get_fullpath(self, command):
-+        if 'PATH' in os.environ:
-+            envpath = os.environ['PATH']
-+        else:
-+            envpath = os.defpath
-+        PATH = envpath.split(os.pathsep)
-+        for dir in PATH:
-+            filepath = os.path.join(dir, command)
-+            if os.path.exists(filepath):
-+                return filepath
-+        return None
-+
-+    def __set_layout_cb(self, pid, status):
-+        if self.__xkb_pid != pid:
-+            print >> sys.stderr, \
-+                'ibus.xkblayout: set_layout_cb has another pid'
-+            return
-+        self.__xkb_pid.close()
-+        self.__xkb_pid = None
-+        self.set_xmodmap()
-+
-+    def __set_xmodmap_cb(self, pid, status):
-+        if self.__xmodmap_pid != pid:
-+            print >> sys.stderr, \
-+                'ibus.xkblayout: set_xmodmap_cb has another pid'
-+            return
-+        self.__xmodmap_pid.close()
-+        self.__xmodmap_pid = None
-+
-+    def use_xkb(self, enable):
-+        if self.__command == None:
-+            return
-+        self.__use_xkb = enable
-+
-+    def get_layout(self):
-+        if not self.__use_xkb:
-+            return None
-+        return self.__get_output_from_cmdline('--get', 'layout: ')
-+
-+    def get_model(self):
-+        if not self.__use_xkb:
-+            return None
-+        return self.__get_output_from_cmdline('--get', 'model: ')
-+
-+    def get_option(self):
-+        if not self.__use_xkb:
-+            return None
-+        return self.__get_output_from_cmdline('--get', 'option: ')
-+
-+    def get_group(self):
-+        if not self.__use_xkb:
-+            return 0
-+        return int(self.__get_output_from_cmdline('--get-group', 'group: '))
-+
-+    def set_layout(self, layout='default', model='default', option='default'):
-+        if not self.__use_xkb:
-+            return
-+        if layout == None:
-+            return
-+        if self.__default_layout == None:
-+            # Maybe opening display was failed in constructor.
-+            self.reload_default_layout()
-+        if self.__default_layout == None:
-+            return
-+        layout = str(layout)
-+        # if set_default_layout() is not default, the default layout is
-+        # pulled from the current XKB. But it's possible gnome-settings-daemon
-+        # does not run yet. I added XKB_SESSION_TIME_OUT for the timer.
-+        if self.__time_lag_session_xkb_layout == True:
-+            self.__default_layout = self.get_layout()
-+            self.__default_model = self.get_model()
-+        if self.__time_lag_session_xkb_option == True:
-+            self.__default_option = self.get_option()
-+        if (self.__time_lag_session_xkb_layout == True or \
-+            self.__time_lag_session_xkb_option == True ) and \
-+           (time.time() - self.__time_lag_session_xkb_timer \
-+            > XKB_SESSION_TIME_OUT):
-+            self.__time_lag_session_xkb_layout = False
-+            self.__time_lag_session_xkb_option = False
-+        if layout == 'default':
-+            layout = self.__default_layout
-+        else:
-+            self.__time_lag_session_xkb_layout = False
-+        if model != None:
-+            model = str(model)
-+            if model == 'default':
-+                (layout, model) = self.__get_model_from_layout(layout)
-+            if model == 'default':
-+                model = self.__default_model
-+            else:
-+                self.__time_lag_session_xkb_layout = False
-+        if option != None:
-+            option = str(option)
-+            if option == 'default':
-+                (layout, engine_option) = self.__get_option_from_layout(layout)
-+                if engine_option != None and engine_option != 'default':
-+                    option = self.__default_option
-+                    if option == None:
-+                        option = engine_option
-+                    else:
-+                        option = '%s,%s' % (option, engine_option)
-+                    self.__time_lag_session_xkb_option = False
-+            if option == 'default':
-+                option = self.__default_option
-+        need_us_layout = False
-+        for latin_layout in self.__xkb_latin_layouts:
-+            latin_layout = str(latin_layout)
-+            # layout 'in' and model 'eng' is English layout.
-+            if layout == latin_layout and model != 'eng':
-+                need_us_layout = True
-+                break
-+            if model != None and layout + '(' + model + ')' == latin_layout:
-+                need_us_layout = True
-+                break
-+        if need_us_layout:
-+            layout = layout + ',us'
-+            if model != None:
-+                model = model + ','
-+        if layout == self.get_layout() and \
-+           model == self.get_model() and \
-+           option == self.get_option():
-+            return
-+        args = []
-+        args.append(self.__command)
-+        args.append('--layout')
-+        args.append(layout)
-+        if model != None:
-+            args.append('--model')
-+            args.append(model)
-+        if option != None:
-+            args.append('--option')
-+            args.append(option)
-+        pid = glib.spawn_async(argv=args,
-+                               flags=glib.SPAWN_DO_NOT_REAP_CHILD)[0]
-+        self.__xkb_pid = pid
-+        glib.child_watch_add(self.__xkb_pid, self.__set_layout_cb)
-+
-+    def set_default_layout(self, layout='default', model='default'):
-+        if not self.__use_xkb:
-+            return
-+        if layout == None:
-+            print >> sys.stderr, 'ibus.xkblayout: None layout'
-+            return
-+        if model == None:
-+            print >> sys.stderr, 'ibus.xkblayout: None model'
-+            return
-+        if layout == 'default':
-+            self.__default_layout = self.get_layout()
-+            self.__default_model = self.get_model()
-+        else:
-+            if model == 'default':
-+                (layout, model) = self.__get_model_from_layout(layout)
-+            self.__default_layout = layout
-+            self.__time_lag_session_xkb_layout = False
-+            if model == 'default':
-+                self.__default_model = None
-+            else:
-+                self.__default_model = model
-+
-+    def set_default_option(self, option='default'):
-+        if not self.__use_xkb:
-+            return
-+        if option == None:
-+            print >> sys.stderr, 'ibus.xkblayout: None option'
-+            return
-+        if option == 'default':
-+            self.__default_option = self.get_option()
-+        else:
-+            self.__default_option = option
-+            self.__time_lag_session_xkb_option = False
-+
-+    def get_default_layout(self):
-+        return [self.__default_layout, self.__default_model];
-+
-+    def get_default_option(self):
-+        return self.__default_option
-+
-+    def reload_default_layout(self):
-+        if not self.__use_xkb:
-+            return
-+        self.__default_layout = self.get_layout()
-+        self.__default_model = self.get_model()
-+        self.__default_option = self.get_option()
-+
-+    def set_xmodmap(self):
-+        if not self.__use_xmodmap:
-+            return
-+        if self.__xmodmap_pid != None:
-+            return
-+        xmodmap_cmdpath = self.__get_fullpath(XMODMAP_CMD)
-+        if xmodmap_cmdpath == None:
-+            xmodmap_cmdpath = XMODMAP_CMD
-+        for xmodmap_file in XMODMAP_KNOWN_FILES:
-+            xmodmap_filepath = os.path.join(self.__get_userhome(), xmodmap_file)
-+            if not os.path.exists(xmodmap_filepath):
-+                continue
-+            pid = glib.spawn_async(argv=[xmodmap_cmdpath, xmodmap_filepath],
-+                                   flags=glib.SPAWN_DO_NOT_REAP_CHILD)[0]
-+            self.__xmodmap_pid = pid
-+            glib.child_watch_add(self.__xmodmap_pid, self.__set_xmodmap_cb)
-+            break
-+
-+
-+def test():
-+    import gtk
-+    import ibus
-+
-+    window = None
-+    config = None
-+    xkblayout = None
-+
-+    def __destroy(*args):
-+        window.hide()
-+        gtk.main_quit()
-+
-+    def __test_set_session_xkb(button):
-+        xkblayout.set_layout('default')
-+        print 'Reset the default keymap'
-+        print 'Layout:', xkblayout.get_default_layout()
-+        print 'Option:', xkblayout.get_default_option()
-+
-+    def __test_set_user_xkb(button):
-+        layout = 'us'
-+        model = 'default'
-+        option = 'default'
-+        if len(sys.argv) > 1:
-+            layout = sys.argv[1]
-+        if len(sys.argv) > 2:
-+            model = sys.argv[2]
-+            if model == 'None':
-+                model = None
-+        if len(sys.argv) > 3:
-+            option = sys.argv[3]
-+            if option == 'None':
-+                optoin = None
-+        xkblayout.set_layout(layout, model, option)
-+        print 'Test set_layout:', layout, model, option
-+
-+    if ibus.get_address() != None:
-+        bus = ibus.Bus()
-+        config = bus.get_config()
-+    else:
-+        print 'no ibus'
-+    xkblayout = XKBLayout(config)
-+    print 'Layout:', xkblayout.get_default_layout()
-+    print 'Option:', xkblayout.get_default_option()
-+    window = gtk.Window(gtk.WINDOW_TOPLEVEL)
-+    window.connect('destroy', __destroy)
-+    vb = gtk.VBox()
-+    window.add(vb)
-+    b = gtk.Button('Test xkb')
-+    b.connect('clicked', __test_set_user_xkb)
-+    vb.add(b)
-+    b = gtk.Button('Reset the default xkb')
-+    b.connect('clicked', __test_set_session_xkb)
-+    vb.add(b)
-+    window.show_all()
-+    if config != None:
-+        ibus.main()
-+    else:
-+        gtk.main()
-+
-+if __name__ == '__main__':
-+    test()
-diff --git a/ibus/xkbxml.py.in b/ibus/xkbxml.py.in
-new file mode 100644
-index 0000000..9407c13
---- /dev/null
-+++ b/ibus/xkbxml.py.in
-@@ -0,0 +1,419 @@
-+# vim:set et sts=4 sw=4:
-+#
-+# ibus - The Input Bus
-+#
-+# Copyright (c) 2011 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+# Copyright (c) 2011 Peng Huang <shawn.p.huang@gmail.com>
-+# Copyright (c) 2011 Red Hat, Inc.
-+#
-+# This library is free software; you can redistribute it and/or
-+# modify it under the terms of the GNU Lesser General Public
-+# License as published by the Free Software Foundation; either
-+# version 2 of the License, or (at your option) any later version.
-+#
-+# This library is distributed in the hope that it will be useful,
-+# but WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+# GNU Lesser General Public License for more details.
-+#
-+# You should have received a copy of the GNU Lesser General Public
-+# License along with this program; if not, write to the
-+# Free Software Foundation, Inc., 59 Temple Place, Suite 330,
-+# Boston, MA  02111-1307  USA
-+
-+__all__ = (
-+        'XKBConfigRegistry',
-+        'XKBLayoutConfig',
-+    )
-+
-+import os
-+import string
-+import xml.sax as sax
-+import enginedesc
-+from xml.sax.saxutils import XMLFilterBase, XMLGenerator
-+from xml.sax._exceptions import SAXParseException
-+from cStringIO import StringIO
-+
-+try:
-+    from glib import get_user_config_dir
-+except ImportError:
-+    get_user_config_dir = lambda : None
-+
-+XKB_RULES_XML_FILE = '@XKB_RULES_XML_FILE@'
-+
-+class XKBConfigRegistryHandler(XMLFilterBase):
-+    def __init__(self, parser=None, root='root'):
-+        XMLFilterBase.__init__(self, parser)
-+        self.__root = root
-+        self.__current_node = root
-+        self.__layoutlist_array = {}
-+        self.__layoutlist = False
-+        self.__layout = False
-+        self.__layout_label = None
-+        self.__layout_desc = {}
-+        self.__layout_lang = {}
-+        self.__variantlist = False
-+        self.__variant = False
-+        self.__variant_label = None
-+        self.__variant_desc = {}
-+        self.__optionlist_array = {}
-+        self.__optionlist = False
-+        self.__option_group_desc = {}
-+        self.__option_desc = {}
-+        self.__option = False
-+        self.__option_label = None
-+        self.__group = False
-+        self.__group_label = None
-+
-+    def __characters_layoutlist(self, text):
-+        if not self.__layout:
-+            return
-+        if self.__variant:
-+            if self.__current_node == 'name':
-+                self.__variant_label = text
-+                if self.__layout_label != None and \
-+                   self.__layout_label in self.__layoutlist_array:
-+                    self.__layoutlist_array[self.__layout_label].append(text)
-+            elif self.__current_node == 'description':
-+                label =  '%s(%s)' % (self.__layout_label, self.__variant_label)
-+                self.__variant_desc[label] = text
-+            elif self.__current_node == 'iso639Id':
-+                label = self.__layout_label
-+                if label != None:
-+                    label = '%s(%s)' % (label, self.__variant_label)
-+                else:
-+                    label = self.__variant_label
-+                if label not in self.__layout_lang:
-+                    self.__layout_lang[label] = []
-+                self.__layout_lang[label].append(text)
-+            else:
-+                pass
-+        else:
-+            if self.__current_node == 'name':
-+                self.__layout_label = text
-+                self.__layoutlist_array[self.__layout_label] = []
-+            elif self.__current_node == 'description':
-+                self.__layout_desc[self.__layout_label] = text
-+            elif self.__current_node == 'iso639Id':
-+                if self.__layout_label not in self.__layout_lang:
-+                    self.__layout_lang[self.__layout_label] = []
-+                self.__layout_lang[self.__layout_label].append(text)
-+            else:
-+                pass
-+
-+    def __characters_optionlist(self, text):
-+        if not self.__group:
-+            return
-+        if self.__option:
-+            if self.__current_node == 'name':
-+                self.__option_label = text
-+                if self.__group_label != None and \
-+                   self.__group_label in self.__optionlist_array:
-+                    self.__optionlist_array[self.__group_label].append(text)
-+            elif self.__current_node == 'description':
-+                self.__option_desc[self.__option_label] = text
-+            else:
-+                pass
-+        else:
-+            if self.__current_node == 'name':
-+                self.__group_label = text
-+                self.__optionlist_array[self.__group_label] = []
-+            elif self.__current_node == 'description':
-+                self.__option_group_desc[self.__group_label] = text
-+            else:
-+                pass
-+
-+    def startElement(self, name, attrs):
-+        self.__current_node = name
-+        if name == 'layoutList':
-+            self.__layoutlist = True
-+        elif name == 'layout':
-+            self.__layout = True
-+            self.__layout_label = None
-+        elif name == 'variantList':
-+            self.__variantlist = True
-+        elif name == 'variant':
-+            self.__variant = True
-+            self.__variant_label = None
-+        elif name == 'optionList':
-+            self.__optionlist = True
-+        elif name == 'option':
-+            self.__option = True
-+            self.__option_label = None
-+        elif name == 'group':
-+            self.__group = True
-+            self.__group_label = None
-+
-+    def endElement(self, name):
-+        self.__current_node = self.__root
-+        if name == 'layoutList':
-+            self.__layoutlist = False
-+        elif name == 'layout':
-+            self.__layout = False
-+        elif name == 'variantList':
-+            self.__variantlist = False
-+        elif name == 'variant':
-+            self.__variant = False
-+        elif name == 'optionList':
-+            self.__optionlist = False
-+        elif name == 'option':
-+            self.__option = False
-+        elif name == 'group':
-+            self.__group = False
-+
-+    def characters(self, text):
-+        if self.__current_node == self.__root:
-+            return
-+        if self.__layoutlist:
-+            self.__characters_layoutlist(text)
-+        elif self.__optionlist:
-+            self.__characters_optionlist(text)
-+
-+    def getLayoutList(self):
-+        return self.__layoutlist_array
-+
-+    def getLayoutDesc(self):
-+        return self.__layout_desc
-+
-+    def getLayoutLang(self):
-+        return self.__layout_lang
-+
-+    def getVariantDesc(self):
-+        return self.__variant_desc
-+
-+    def getOptionList(self):
-+        return self.__optionlist_array
-+
-+    def getOptionGroupDesc(self):
-+        return self.__option_group_desc
-+
-+    def getOptionDesc(self):
-+        return self.__option_desc
-+
-+class XKBLayoutConfigHandler(XMLFilterBase):
-+    def __init__(self,
-+                 parser=None,
-+                 downstream=None,
-+                 preload_layouts=None,
-+                 root='root'):
-+        XMLFilterBase.__init__(self, parser)
-+        self.__downstream = downstream
-+        self.__preload_layouts = preload_layouts
-+        self.__root = root
-+        self.__current_node = root
-+        self.__xkblayout = False 
-+        self.__config = False 
-+
-+    def startDocument(self):
-+        if self.__downstream != None:
-+            self.__downstream.startDocument()
-+
-+    def endDocument(self):
-+        if self.__downstream != None:
-+            self.__downstream.endDocument()
-+
-+    def startElement(self, name, attrs):
-+        self.__current_node = name
-+        if name == 'xkblayout':
-+            self.__xkblayout = True
-+        if name == 'config':
-+            self.__config = True
-+        if self.__downstream != None:
-+            self.__downstream.startElement(name, {})
-+
-+    def endElement(self, name):
-+        self.__current_node = self.__root
-+        if name == 'xkblayout':
-+            self.__xkblayout = False
-+        if name == 'config':
-+            self.__config = False
-+        if self.__downstream != None:
-+            self.__downstream.endElement(name)
-+
-+    def characters(self, text):
-+        if self.__current_node == self.__root:
-+            return
-+        if not self.__xkblayout or not self.__config:
-+            return
-+        if self.__current_node == 'preload_layouts':
-+            if self.__preload_layouts == None:
-+                self.__preload_layouts = text.split(',')
-+                self.__preload_layouts.sort()
-+            if self.__downstream != None:
-+                self.__downstream.characters(string.join(self.__preload_layouts,
-+                                                         ','))
-+
-+    def getPreloadLayouts(self):
-+        return self.__preload_layouts
-+
-+class XKBConfigRegistry():
-+    def __init__(self, file_path=XKB_RULES_XML_FILE):
-+        self.__handler = None
-+        parser = sax.make_parser()
-+        parser.setFeature(sax.handler.feature_namespaces, 0)
-+        self.__handler = XKBConfigRegistryHandler(parser)
-+        parser.setContentHandler(self.__handler)
-+        f = file(file_path, 'r')
-+        try:
-+            parser.parse(f)
-+        except SAXParseException:
-+            print 'ERROR: invalid file format', file_path
-+        finally:
-+            f.close()
-+
-+    def get_layout_list(self):
-+        return self.__handler.getLayoutList()
-+
-+    def get_layout_desc(self):
-+        return self.__handler.getLayoutDesc()
-+
-+    def get_layout_lang(self):
-+        return self.__handler.getLayoutLang()
-+
-+    def get_variant_desc(self):
-+        return self.__handler.getVariantDesc()
-+
-+    def get_option_list(self):
-+        return self.__handler.getOptionList()
-+
-+    def get_option_group_desc(self):
-+        return self.__handler.getOptionGroupDesc()
-+
-+    def get_option_desc(self):
-+        return self.__handler.getOptionDesc()
-+
-+    @classmethod
-+    def have_xkb(self):
-+        return @HAVE_XKB@
-+
-+    @classmethod
-+    def engine_desc_new(self,
-+                        lang,
-+                        layout,
-+                        layout_desc=None,
-+                        variant=None,
-+                        variant_desc=None,
-+                        name=None):
-+        if variant_desc != None:
-+            longname = variant_desc
-+        elif layout != None and variant != None:
-+            longname = layout + ' - ' + variant
-+        elif layout_desc != None:
-+            longname = layout_desc
-+        else:
-+            longname = layout
-+        name_prefix='xkb:layout:'
-+        if variant != None:
-+            if name == None:
-+                name = name_prefix + layout + ':' + variant
-+            desc = 'XKB ' + layout + '(' + variant + ') keyboard layout'
-+            engine_layout = layout + '(' + variant + ')'
-+        else:
-+            if name == None:
-+                name = name_prefix + layout
-+            desc = 'XKB ' + layout + ' keyboard layout'
-+            engine_layout = layout
-+
-+        icon = 'ibus-engine'
-+
-+        engine = enginedesc.EngineDesc(name, longname, desc, lang,
-+                                       'LGPL2.1',
-+                                       'Takao Fujiwara <takao.fujiwara1@gmail.com>',
-+                                       icon,
-+                                       engine_layout)
-+        return engine
-+
-+class XKBLayoutConfig():
-+    def __init__(self,
-+                 system_config='@datadir@/ibus/xkb/xkblayoutconfig.xml'):
-+        self.__user_config = get_user_config_dir()
-+        if self.__user_config == None:
-+            self.__user_config = os.environ['HOME'] + '/.config'
-+        self.__user_config = self.__user_config + \
-+            '/ibus/xkb/xkblayoutconfig.xml'
-+        self.__system_config = system_config
-+        self.__filter_handler = None
-+        self.__load()
-+
-+    def __load(self, downstream=None, preload_layouts=None):
-+        parser = sax.make_parser()
-+        parser.setFeature(sax.handler.feature_namespaces, 0)
-+        self.__filter_handler = XKBLayoutConfigHandler(parser,
-+                                                       downstream,
-+                                                       preload_layouts)
-+        parser.setContentHandler(self.__filter_handler)
-+        f = None
-+        if os.path.exists(self.__user_config):
-+            f = file(self.__user_config)
-+        elif os.path.exists(self.__system_config):
-+            f = file(self.__system_config)
-+        if f == None:
-+            return
-+        try:
-+            parser.parse(f)
-+        except SAXParseException:
-+            print 'ERROR: invalid file format', self.__user_config
-+        finally:
-+            f.close()
-+
-+    def get_preload_layouts(self):
-+        return self.__filter_handler.getPreloadLayouts()
-+
-+    def save_preload_layouts(self, layouts):
-+        if layouts == None:
-+            if os.path.exists(self.__user_config):
-+                os.unlink(self.__user_config)
-+                return
-+        parser = sax.make_parser()
-+        parser.setFeature(sax.handler.feature_namespaces, 0)
-+        result = StringIO()
-+        downstream_handler = XMLGenerator(result, 'utf-8')
-+        self.__load(downstream_handler, layouts)
-+        contents = result.getvalue()
-+        dir = os.path.dirname(self.__user_config)
-+        if not os.path.exists(dir):
-+            os.makedirs(dir, 0700)
-+        f = open(self.__user_config, 'w')
-+        f.write(contents)
-+        f.close()
-+        os.chmod(self.__user_config, 0600)
-+
-+def test():
-+    xkbconfig = XKBConfigRegistry()
-+    layout_list = xkbconfig.get_layout_list()
-+    layout_desc = xkbconfig.get_layout_desc()
-+    layout_lang = xkbconfig.get_layout_lang()
-+    variant_desc = xkbconfig.get_variant_desc()
-+    for layout in layout_list.keys():
-+        if layout not in layout_lang:
-+            print 'layout name:', layout, 'NO-LANG description:', layout_desc[layout]
-+            continue
-+        lang = layout_lang[layout]
-+        print 'layout name:', layout, 'lang:', lang, 'description:', layout_desc[layout]
-+        for variant in layout_list[layout]:
-+            label = '%s(%s)' % (layout, variant)
-+            if label in layout_lang:
-+                lang = layout_lang[label]
-+            print '  variant name:', variant, 'lang:', lang, 'description:', variant_desc[variant]
-+
-+    option_list = xkbconfig.get_option_list()
-+    option_group_desc = xkbconfig.get_option_group_desc()
-+    option_desc = xkbconfig.get_option_desc()
-+    for option_group in option_list.keys():
-+        print 'option group name:', option_group, 'description:', option_group_desc[option_group]
-+        for option in option_list[option_group]:
-+            print '  option name:', option, 'description:', option_desc[option]
-+
-+def test2():
-+    xkblayoutconfig = XKBLayoutConfig('../xkb/xkblayoutconfig.xml')
-+    list = xkblayoutconfig.get_preload_layouts()
-+    print list
-+    if list == None:
-+        list = []
-+    list.append('gb(test)')
-+    list.sort()
-+    #xkblayoutconfig.save_preload_layouts(list)
-+
-+if __name__ == '__main__':
-+    test()
-+    test2()
-diff --git a/setup/Makefile.am b/setup/Makefile.am
-index 9618d7f..48b1fed 100644
---- a/setup/Makefile.am
-+++ b/setup/Makefile.am
-@@ -28,6 +28,7 @@ ibussetup_PYTHON = \
- 	enginetreeview.py \
- 	engineabout.py \
- 	keyboardshortcut.py \
-+	xkbsetup.py \
+ 	simple.xml \
  	$(NULL)
- 
- ibussetup_DATA = \
-diff --git a/setup/enginecombobox.py b/setup/enginecombobox.py
-index 2fd8876..7383177 100644
---- a/setup/enginecombobox.py
-+++ b/setup/enginecombobox.py
-@@ -43,6 +43,7 @@ class EngineComboBox(gtk.ComboBox):
-         self.connect("notify::active", self.__notify_active_cb)
- 
-         self.__model = None
-+        self.__title = _("Select an input method")
- 
-         renderer = gtk.CellRendererPixbuf()
-         renderer.set_property("xalign", 0)
-@@ -117,7 +118,7 @@ class EngineComboBox(gtk.ComboBox):
-             renderer.set_property("weight", pango.WEIGHT_NORMAL)
-         elif isinstance(engine, int):
-             renderer.set_property("sensitive", True)
--            renderer.set_property("text", _("Select an input method"))
-+            renderer.set_property("text", self.__title)
-             renderer.set_property("weight", pango.WEIGHT_NORMAL)
-         else:
-             renderer.set_property("sensitive", True)
-@@ -140,5 +141,9 @@ class EngineComboBox(gtk.ComboBox):
-     def get_active_engine(self):
-         return self.get_property("active-engine")
- 
-+    def get_title(self):
-+        return self.__title
- 
-+    def set_title(self, title):
-+        self.__title = title
- 
-diff --git a/setup/main.py b/setup/main.py
-index 6c0fb0e..97e05a4 100644
---- a/setup/main.py
-+++ b/setup/main.py
-@@ -37,6 +37,7 @@ from gtk import gdk
- from enginecombobox import EngineComboBox
- from enginetreeview import EngineTreeView
- from engineabout import EngineAbout
-+from xkbsetup import XKBSetup
- from i18n import DOMAINNAME, _, N_, init as i18n_init
- 
- (
-@@ -245,6 +246,8 @@ class Setup(object):
-         self.__combobox.connect("notify::active-engine", self.__combobox_notify_active_engine_cb)
-         self.__treeview.connect("notify", self.__treeview_notify_cb)
- 
-+        XKBSetup(self.__config, self.__builder)
-+
-     def __combobox_notify_active_engine_cb(self, combobox, property):
-         engine = self.__combobox.get_active_engine()
-         button = self.__builder.get_object("button_engine_add")
-diff --git a/setup/setup.ui b/setup/setup.ui
-index c7ff564..57cb597 100644
---- a/setup/setup.ui
-+++ b/setup/setup.ui
-@@ -117,7 +117,6 @@
-                                 <child>
-                                   <object class="GtkLabel" id="label9">
-                                     <property name="visible">True</property>
--                                    <property name="sensitive">False</property>
-                                     <property name="tooltip_text" translatable="yes">The shortcut keys for switching to previous input method in the list</property>
-                                     <property name="xalign">0</property>
-                                     <property name="label" translatable="yes">Previous input method:</property>
-@@ -204,7 +203,6 @@
-                                     <child>
-                                       <object class="GtkEntry" id="entry_prev_engine">
-                                         <property name="visible">True</property>
--                                        <property name="sensitive">False</property>
-                                         <property name="can_focus">True</property>
-                                         <property name="editable">False</property>
-                                       </object>
-@@ -216,7 +214,6 @@
-                                       <object class="GtkButton" id="button_prev_engine">
-                                         <property name="label" translatable="yes">...</property>
-                                         <property name="visible">True</property>
--                                        <property name="sensitive">False</property>
-                                         <property name="can_focus">True</property>
-                                         <property name="receives_default">False</property>
-                                         <property name="use_underline">True</property>
-@@ -841,6 +838,7 @@ You may use up/down buttons to change it.&lt;/i&gt;&lt;/small&gt;</property>
-                                     <property name="visible">True</property>
-                                     <property name="orientation">vertical</property>
-                                     <property name="spacing">6</property>
-+                                    <property name="no_show_all">True</property>
-                                     <child>
-                                       <object class="GtkCheckButton" id="checkbutton_use_sys_layout">
-                                         <property name="label" translatable="yes">Use system keyboard layout</property>
-@@ -856,6 +854,57 @@ You may use up/down buttons to change it.&lt;/i&gt;&lt;/small&gt;</property>
-                                         <property name="position">0</property>
-                                       </packing>
-                                     </child>
-+                                    <child>
-+                                      <object class="GtkHBox" id="hbox_system_keyboard_layout">
-+                                        <property name="visible">True</property>
-+                                        <property name="spacing">6</property>
-+                                        <child>
-+                                          <object class="GtkLabel" id="label20">
-+                                            <property name="visible">True</property>
-+                                            <property name="label" translatable="yes">System Keyboard Layout:</property>
-+                                            <property name="use_markup">True</property>
-+                                            <property name="justify">center</property>
-+                                          </object>
-+                                          <packing>
-+                                            <property name="expand">False</property>
-+                                            <property name="fill">False</property>
-+                                            <property name="position">0</property>
-+                                          </packing>
-+                                        </child>
-+                                        <child>
-+                                          <object class="GtkButton" id="button_system_keyboard_layout">
-+                                            <property name="label"></property>
-+                                            <property name="visible">True</property>
-+                                            <property name="can_focus">True</property>
-+                                            <property name="receives_default">False</property>
-+                                          </object>
-+                                          <packing>
-+                                            <property name="expand">False</property>
-+                                            <property name="fill">False</property>
-+                                            <property name="position">1</property>
-+                                          </packing>
-+                                        </child>
-+                                      </object>
-+                                      <packing>
-+                                        <property name="expand">False</property>
-+                                        <property name="fill">False</property>
-+                                        <property name="position">1</property>
-+                                      </packing>
-+                                    </child>
-+                                    <child>
-+                                      <object class="GtkButton" id="button_config_layouts">
-+                                        <property name="label">Add or remove layouts in 'Select an input method' list</property>
-+                                        <property name="visible">True</property>
-+                                        <property name="can_focus">True</property>
-+                                        <property name="receives_default">False</property>
-+                                        <property name="tooltip_text" translatable="yes">Add or remove keyboard layouts in all input method engnines</property>
-+                                      </object>
-+                                      <packing>
-+                                        <property name="expand">False</property>
-+                                        <property name="fill">False</property>
-+                                        <property name="position">2</property>
-+                                      </packing>
-+                                    </child>
-                                   </object>
-                                 </child>
-                               </object>
-@@ -1054,4 +1103,558 @@ Homepage: http://code.google.com/p/ibus
-       </object>
-     </child>
-   </object>
-+  <object class="GtkDialog" id="dialog_config_layouts">
-+    <property name="title" translatable="yes">Add or Remove Layouts</property>
-+    <property name="icon_name">ibus-setup</property>
-+    <child internal-child="vbox">
-+      <object class="GtkVBox" id="vbox101">
-+        <property name="orientation">vertical</property>
-+        <property name="visible">True</property>
-+        <property name="border-width">10</property>
-+        <property name="spacing">12</property>
-+        <child>
-+          <object class="GtkAlignment" id="alignment101">
-+            <property name="visible">True</property>
-+            <property name="top_padding">12</property>
-+            <property name="left_padding">12</property>
-+            <child>
-+              <object class="GtkFrame" id="frame101">
-+                <property name="visible">True</property>
-+                <property name="label_xalign">0</property>
-+                <property name="shadow_type">none</property>
-+                <child>
-+                  <object class="GtkAlignment" id="alignment102">
-+                    <property name="visible">True</property>
-+                    <property name="top_padding">12</property>
-+                    <property name="left_padding">12</property>
-+                    <child>
-+                      <object class="GtkVBox" id="vbox102">
-+                        <property name="visible">True</property>
-+                        <property name="orientation">vertical</property>
-+                        <property name="spacing">6</property>
-+                        <child>
-+                          <object class="GtkScrolledWindow" id="scrolledwindow101">
-+                            <property name="visible">True</property>
-+                            <property name="can_focus">True</property>
-+                            <property name="border_width">5</property>
-+                            <property name="width_request">450</property>
-+                            <property name="height_request">350</property>
-+                            <property name="hscrollbar_policy">automatic</property>
-+                            <property name="vscrollbar_policy">automatic</property>
-+                            <property name="shadow_type">out</property>
-+                            <child>
-+                              <object class="GtkViewport" id="viewport101">
-+                                <property name="visible">True</property>
-+                                <property name="shadow_type">none</property>
-+                                <child>
-+                                  <object class="GtkVBox" id="vbox_all_keyboard_layouts">
-+                                    <property name="visible">True</property>
-+                                    <property name="orientation">vertical</property>
-+                                  </object>
-+                                </child>
-+                              </object>
-+                            </child>
-+                          </object>
-+                          <packing>
-+                            <property name="position">0</property>
-+                          </packing>
-+                        </child>
-+                      </object>
-+                    </child>
-+                  </object>
-+                </child>
-+                <child type="label">
-+                  <object class="GtkLabel" id="label101">
-+                    <property name="visible">True</property>
-+                    <property name="label" translatable="yes">&lt;b&gt;Keyboard Layout&lt;/b&gt;</property>
-+                    <property name="use_markup">True</property>
-+                  </object>
-+                </child>
-+              </object>
-+            </child>
-+          </object>
-+          <packing>
-+            <property name="expand">False</property>
-+            <property name="position">0</property>
-+          </packing>
-+        </child>
-+        <child internal-child="action_area">
-+          <object class="GtkHButtonBox" id="hbuttonbox101">
-+            <property name="visible">True</property>
-+            <property name="homogeneous">True</property>
-+            <property name="layout_style">end</property>
-+            <child>
-+              <object class="GtkButton" id="button_config_layouts_cancel">
-+                <property name="label">gtk-cancel</property>
-+                <property name="visible">True</property>
-+                <property name="use_stock">True</property>
-+              </object>
-+              <packing>
-+                <property name="expand">False</property>
-+                <property name="fill">False</property>
-+                <property name="position">0</property>
-+              </packing>
-+            </child>
-+            <child>
-+              <object class="GtkButton" id="button_config_layouts_ok">
-+                <property name="label">gtk-ok</property>
-+                <property name="visible">True</property>
-+                <property name="use_stock">True</property>
-+                <property name="receives_default">True</property>
-+              </object>
-+              <packing>
-+                <property name="expand">False</property>
-+                <property name="fill">False</property>
-+                <property name="position">1</property>
-+              </packing>
-+            </child>
-+          </object>
-+          <packing>
-+            <property name="expand">False</property>
-+            <property name="fill">False</property>
-+            <property name="pack_type">end</property>
-+            <property name="position">1</property>
-+          </packing>
-+        </child>
-+      </object>
-+    </child>
-+  </object>
-+  <object class="GtkDialog" id="dialog_system_keyboard_layout">
-+    <property name="title" translatable="yes">System Keyboard Layout Setup</property>
-+    <property name="icon_name">ibus-setup</property>
-+    <child internal-child="vbox">
-+      <object class="GtkVBox" id="vbox201">
-+        <property name="orientation">vertical</property>
-+        <property name="visible">True</property>
-+        <property name="border-width">10</property>
-+        <property name="spacing">12</property>
-+        <child>
-+          <object class="GtkAlignment" id="alignment201">
-+            <property name="visible">True</property>
-+            <property name="top_padding">12</property>
-+            <property name="left_padding">12</property>
-+            <child>
-+              <object class="GtkFrame" id="frame201">
-+                <property name="visible">True</property>
-+                <property name="label_xalign">0</property>
-+                <property name="shadow_type">none</property>
-+                <child>
-+                  <object class="GtkAlignment" id="alignment202">
-+                    <property name="visible">True</property>
-+                    <property name="top_padding">12</property>
-+                    <property name="left_padding">12</property>
-+                    <child>
-+                      <object class="GtkVBox" id="vbox202">
-+                        <property name="visible">True</property>
-+                        <property name="orientation">vertical</property>
-+                        <property name="spacing">6</property>
-+                        <child>
-+                          <object class="GtkHBox" id="hbox201">
-+                            <property name="visible">True</property>
-+                            <child>
-+                              <object class="GtkVBox" id="vbox203">
-+                                <property name="visible">True</property>
-+                                <property name="orientation">vertical</property>
-+                                <property name="spacing">6</property>
-+                                <child>
-+                                  <object class="EngineComboBox" id="combobox_system_keyboard_layout_engines">
-+                                    <property name="visible">True</property>
-+                                  </object>
-+                                  <packing>
-+                                    <property name="expand">False</property>
-+                                    <property name="position">0</property>
-+                                  </packing>
-+                                </child>
-+                                <child>
-+                                  <object class="GtkScrolledWindow" id="scrolledwindow201">
-+                                    <property name="height_request">150</property>
-+                                    <property name="visible">True</property>
-+                                    <property name="can_focus">True</property>
-+                                    <property name="hscrollbar_policy">automatic</property>
-+                                    <property name="vscrollbar_policy">automatic</property>
-+                                    <property name="shadow_type">in</property>
-+                                    <child>
-+                                      <object class="EngineTreeView" id="treeview_system_keyboard_layout_engines">
-+                                        <property name="visible">True</property>
-+                                        <property name="can_focus">True</property>
-+                                        <property name="height_request">150</property>
-+                                      </object>
-+                                    </child>
-+                                  </object>
-+                                  <packing>
-+                                    <property name="expand">False</property>
-+                                    <property name="position">1</property>
-+                                  </packing>
-+                                </child>
-+                              </object>
-+                              <packing>
-+                                <property name="position">0</property>
-+                              </packing>
-+                            </child>
-+                            <child>
-+                              <object class="GtkVButtonBox" id="vbuttonbox201">
-+                                <property name="visible">True</property>
-+                                <property name="orientation">vertical</property>
-+                                <property name="spacing">5</property>
-+                                <property name="layout_style">start</property>
-+                                <child>
-+                                  <object class="GtkButton" id="button_system_keyboard_layout_engine_add">
-+                                    <property name="label">gtk-add</property>
-+                                    <property name="visible">True</property>
-+                                    <property name="sensitive">False</property>
-+                                    <property name="can_focus">True</property>
-+                                    <property name="receives_default">True</property>
-+                                    <property name="tooltip_text" translatable="yes">Add the selected keyboard layout into the system keyboard layouts</property>
-+                                    <property name="use_stock">True</property>
-+                                  </object>
-+                                  <packing>
-+                                    <property name="expand">False</property>
-+                                    <property name="fill">False</property>
-+                                    <property name="position">0</property>
-+                                  </packing>
-+                                </child>
-+                                <child>
-+                                  <object class="GtkButton" id="button_system_keyboard_layout_engine_remove">
-+                                    <property name="label">gtk-remove</property>
-+                                    <property name="visible">True</property>
-+                                    <property name="sensitive">False</property>
-+                                    <property name="can_focus">True</property>
-+                                    <property name="receives_default">True</property>
-+                                    <property name="tooltip_text" translatable="yes">Remove the selected keyboard layout from the system keyboard layouts</property>
-+                                    <property name="use_stock">True</property>
-+                                  </object>
-+                                  <packing>
-+                                    <property name="expand">False</property>
-+                                    <property name="fill">False</property>
-+                                    <property name="position">1</property>
-+                                  </packing>
-+                                </child>
-+                                <child>
-+                                  <object class="GtkButton" id="button_system_keyboard_layout_engine_up">
-+                                    <property name="label">gtk-go-up</property>
-+                                    <property name="visible">True</property>
-+                                    <property name="sensitive">False</property>
-+                                    <property name="can_focus">True</property>
-+                                    <property name="receives_default">True</property>
-+                                    <property name="tooltip_text" translatable="yes">Move up the selected keyboard layout in the system keyboard layouts list</property>
-+                                    <property name="use_stock">True</property>
-+                                  </object>
-+                                  <packing>
-+                                    <property name="expand">False</property>
-+                                    <property name="fill">False</property>
-+                                    <property name="position">2</property>
-+                                  </packing>
-+                                </child>
-+                                <child>
-+                                  <object class="GtkButton" id="button_system_keyboard_layout_engine_down">
-+                                    <property name="label">gtk-go-down</property>
-+                                    <property name="visible">True</property>
-+                                    <property name="sensitive">False</property>
-+                                    <property name="can_focus">True</property>
-+                                    <property name="receives_default">True</property>
-+                                    <property name="tooltip_text" translatable="yes">Move down the selected keyboard layout in the system keyboard layouts list</property>
-+                                    <property name="use_stock">True</property>
-+                                  </object>
-+                                  <packing>
-+                                    <property name="expand">False</property>
-+                                    <property name="fill">False</property>
-+                                    <property name="position">3</property>
-+                                  </packing>
-+                                </child>
-+                                <child>
-+                                  <object class="GtkButton" id="button_system_keyboard_layout_engine_reset">
-+                                    <property name="label" translatable="yes">Rese_t</property>
-+                                    <property name="visible">True</property>
-+                                    <property name="sensitive">False</property>
-+                                    <property name="can_focus">True</property>
-+                                    <property name="receives_default">True</property>
-+                                    <property name="tooltip_text" translatable="yes">Reset the system keyboard layouts list</property>
-+                                    <property name="use_underline">True</property>
-+                                  </object>
-+                                  <packing>
-+                                    <property name="expand">False</property>
-+                                    <property name="fill">False</property>
-+                                    <property name="position">4</property>
-+                                  </packing>
-+                                </child>
-+                              </object>
-+                              <packing>
-+                                <property name="position">1</property>
-+                              </packing>
-+                            </child>
-+                          </object>
-+                          <packing>
-+                            <property name="position">0</property>
-+                          </packing>
-+                        </child>
-+                        <child>
-+                          <object class="GtkHBox" id="hbox202">
-+                            <property name="visible">True</property>
-+                            <property name="spacing">6</property>
-+                            <child>
-+                              <object class="GtkImage" id="image201">
-+                                <property name="visible">True</property>
-+                                <property name="stock">gtk-info</property>
-+                                <property name="icon-size">2</property>
-+                              </object>
-+                              <packing>
-+                                <property name="expand">False</property>
-+                                <property name="position">0</property>
-+                              </packing>
-+                            </child>
-+                            <child>
-+                              <object class="GtkLabel" id="label_system_keyboard_layout_engines">
-+                                <property name="visible">True</property>
-+                                <property name="xalign">0</property>
-+                                <property name="use_markup">True</property>
-+                              </object>
-+                              <packing>
-+                                <property name="position">1</property>
-+                              </packing>
-+                            </child>
-+                          </object>
-+                          <packing>
-+                            <property name="position">1</property>
-+                          </packing>
-+                        </child>
-+                      </object>
-+                    </child>
-+                  </object>
-+                </child>
-+                <child type="label">
-+                  <object class="GtkLabel" id="label201">
-+                    <property name="visible">True</property>
-+                    <property name="label" translatable="yes">&lt;b&gt;Keyboard Layout&lt;/b&gt;</property>
-+                    <property name="use_markup">True</property>
-+                  </object>
-+                </child>
-+              </object>
-+            </child>
-+          </object>
-+          <packing>
-+            <property name="expand">False</property>
-+            <property name="position">0</property>
-+          </packing>
-+        </child>
-+        <child>
-+          <object class="GtkAlignment" id="alignment204">
-+            <property name="visible">True</property>
-+            <property name="top_padding">12</property>
-+            <property name="left_padding">12</property>
-+            <child>
-+              <object class="GtkFrame" id="frame202">
-+                <property name="visible">True</property>
-+                <property name="label_xalign">0</property>
-+                <property name="shadow_type">none</property>
-+                <child>
-+                  <object class="GtkAlignment" id="alignment205">
-+                    <property name="visible">True</property>
-+                    <property name="top_padding">12</property>
-+                    <property name="left_padding">12</property>
-+                    <child>
-+                      <object class="GtkVBox" id="vbox204">
-+                        <property name="visible">True</property>
-+                        <property name="orientation">vertical</property>
-+                        <property name="spacing">6</property>
-+                        <child>
-+                          <object class="GtkHButtonBox" id="hbuttonbox201">
-+                            <property name="visible">True</property>
-+                            <property name="homogeneous">True</property>
-+                            <property name="layout_style">start</property>
-+                            <child>
-+                              <object class="GtkButton" id="button_system_keyboard_option_setup">
-+                                <property name="visible">True</property>
-+                                <property name="label" translatable="yes">_Options...</property>
-+                                <property name="can_focus">True</property>
-+                                <property name="use_underline">True</property>
-+                              </object>
-+                              <packing>
-+                                <property name="expand">False</property>
-+                                <property name="fill">False</property>
-+                                <property name="position">0</property>
-+                              </packing>
-+                            </child>
-+                          </object>
-+                          <packing>
-+                            <property name="expand">False</property>
-+                            <property name="fill">False</property>
-+                            <property name="position">0</property>
-+                          </packing>
-+                        </child>
-+                      </object>
-+                    </child>
-+                  </object>
-+                </child>
-+                <child type="label">
-+                  <object class="GtkLabel" id="label202">
-+                    <property name="visible">True</property>
-+                    <property name="label" translatable="yes">&lt;b&gt;Keyboard Option&lt;/b&gt;</property>
-+                    <property name="use_markup">True</property>
-+                  </object>
-+                </child>
-+              </object>
-+            </child>
-+          </object>
-+          <packing>
-+            <property name="expand">False</property>
-+            <property name="position">1</property>
-+          </packing>
-+        </child>
-+        <child internal-child="action_area">
-+          <object class="GtkHButtonBox" id="hbuttonbox202">
-+            <property name="visible">True</property>
-+            <property name="homogeneous">True</property>
-+            <property name="layout_style">end</property>
-+            <child>
-+              <object class="GtkButton" id="button_system_keyboard_layout_cancel">
-+                <property name="label">gtk-cancel</property>
-+                <property name="visible">True</property>
-+                <property name="use_stock">True</property>
-+              </object>
-+              <packing>
-+                <property name="expand">False</property>
-+                <property name="fill">False</property>
-+                <property name="position">0</property>
-+              </packing>
-+            </child>
-+            <child>
-+              <object class="GtkButton" id="button_system_keyboard_layout_ok">
-+                <property name="label">gtk-ok</property>
-+                <property name="visible">True</property>
-+                <property name="use_stock">True</property>
-+                <property name="receives_default">True</property>
-+              </object>
-+              <packing>
-+                <property name="expand">False</property>
-+                <property name="fill">False</property>
-+                <property name="position">1</property>
-+              </packing>
-+            </child>
-+          </object>
-+          <packing>
-+            <property name="expand">False</property>
-+            <property name="fill">False</property>
-+            <property name="pack_type">end</property>
-+            <property name="position">1</property>
-+          </packing>
-+        </child>
-+      </object>
-+    </child>
-+  </object>
-+  <object class="GtkDialog" id="dialog_system_keyboard_option">
-+    <property name="title" translatable="yes">System Keyboard Option Setup</property>
-+    <property name="icon_name">ibus-setup</property>
-+    <child internal-child="vbox">
-+      <object class="GtkVBox" id="vbox301">
-+        <property name="orientation">vertical</property>
-+        <property name="visible">True</property>
-+        <property name="border-width">10</property>
-+        <property name="spacing">12</property>
-+        <child>
-+          <object class="GtkAlignment" id="alignment301">
-+            <property name="visible">True</property>
-+            <property name="top_padding">12</property>
-+            <property name="left_padding">12</property>
-+            <child>
-+              <object class="GtkFrame" id="frame301">
-+                <property name="visible">True</property>
-+                <property name="label_xalign">0</property>
-+                <property name="shadow_type">none</property>
-+                <child>
-+                  <object class="GtkAlignment" id="alignment302">
-+                    <property name="visible">True</property>
-+                    <property name="top_padding">12</property>
-+                    <property name="left_padding">12</property>
-+                    <child>
-+                      <object class="GtkVBox" id="vbox302">
-+                        <property name="visible">True</property>
-+                        <property name="orientation">vertical</property>
-+                        <property name="spacing">6</property>
-+                        <child>
-+                          <object class="GtkCheckButton" id="checkbutton_use_system_keyboard_option">
-+                            <property name="label" translatable="yes">Use the default keyboard option</property>
-+                            <property name="visible">True</property>
-+                            <property name="can_focus">True</property>
-+                            <property name="receives_default">False</property>
-+                            <property name="tooltip_text" translatable="yes">Use the defualt XKB option</property>
-+                            <property name="draw_indicator">True</property>
-+                          </object>
-+                          <packing>
-+                            <property name="position">0</property>
-+                          </packing>
-+                        </child>
-+                        <child>
-+                          <object class="GtkScrolledWindow" id="scrolledwindow301">
-+                            <property name="visible">True</property>
-+                            <property name="can_focus">True</property>
-+                            <property name="border_width">5</property>
-+                            <property name="width_request">450</property>
-+                            <property name="height_request">350</property>
-+                            <property name="hscrollbar_policy">automatic</property>
-+                            <property name="vscrollbar_policy">automatic</property>
-+                            <property name="shadow_type">out</property>
-+                            <child>
-+                              <object class="GtkViewport" id="viewport301">
-+                                <property name="visible">True</property>
-+                                <property name="shadow_type">none</property>
-+                                <child>
-+                                  <object class="GtkVBox" id="vbox_system_keyboard_options">
-+                                    <property name="visible">True</property>
-+                                    <property name="orientation">vertical</property>
-+                                  </object>
-+                                </child>
-+                              </object>
-+                            </child>
-+                          </object>
-+                          <packing>
-+                            <property name="position">1</property>
-+                          </packing>
-+                        </child>
-+                      </object>
-+                    </child>
-+                  </object>
-+                </child>
-+                <child type="label">
-+                  <object class="GtkLabel" id="label301">
-+                    <property name="visible">True</property>
-+                    <property name="label" translatable="yes">&lt;b&gt;Keyboard Option&lt;/b&gt;</property>
-+                    <property name="use_markup">True</property>
-+                  </object>
-+                </child>
-+              </object>
-+            </child>
-+          </object>
-+          <packing>
-+            <property name="expand">False</property>
-+            <property name="position">0</property>
-+          </packing>
-+        </child>
-+        <child internal-child="action_area">
-+          <object class="GtkHButtonBox" id="hbuttonbox301">
-+            <property name="visible">True</property>
-+            <property name="homogeneous">True</property>
-+            <property name="layout_style">end</property>
-+            <child>
-+              <object class="GtkButton" id="button_system_keyboard_option_close">
-+                <property name="label">gtk-close</property>
-+                <property name="visible">True</property>
-+                <property name="use_stock">True</property>
-+              </object>
-+              <packing>
-+                <property name="expand">False</property>
-+                <property name="fill">False</property>
-+                <property name="position">0</property>
-+              </packing>
-+            </child>
-+          </object>
-+          <packing>
-+            <property name="expand">False</property>
-+            <property name="fill">False</property>
-+            <property name="pack_type">end</property>
-+            <property name="position">1</property>
-+          </packing>
-+        </child>
-+      </object>
-+    </child>
-+  </object>
- </interface>
-diff --git a/setup/xkbsetup.py b/setup/xkbsetup.py
-new file mode 100644
-index 0000000..e777cea
---- /dev/null
-+++ b/setup/xkbsetup.py
-@@ -0,0 +1,490 @@
-+# vim:set et sts=4 sw=4:
-+#
-+# ibus - The Input Bus
-+#
-+# Copyright (c) 2011 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+# Copyright (c) 2011 Peng Huang <shawn.p.huang@gmail.com>
-+# Copyright (c) 2011 Red Hat, Inc.
-+#
-+# This library is free software; you can redistribute it and/or
-+# modify it under the terms of the GNU Lesser General Public
-+# License as published by the Free Software Foundation; either
-+# version 2 of the License, or (at your option) any later version.
-+#
-+# This library is distributed in the hope that it will be useful,
-+# but WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+# GNU Lesser General Public License for more details.
-+#
-+# You should have received a copy of the GNU Lesser General Public
-+# License along with this program; if not, write to the
-+# Free Software Foundation, Inc., 59 Temple Place, Suite 330,
-+# Boston, MA  02111-1307  USA
-+
-+import gettext
-+import gobject
-+import gtk
-+import ibus
-+
-+_ = lambda a : gettext.dgettext("ibus", a)
-+XKB_MAX_LAYOUTS = 4
-+
-+class XKBSetup(gobject.GObject):
-+    def __init__(self, config, builder):
-+        super(XKBSetup, self).__init__()
-+
-+        self.__config = config
-+        self.__builder = builder
-+
-+        # system keyboard layout setting
-+        self.__button_system_keyboard_layout = self.__builder.get_object("button_system_keyboard_layout")
-+        text = str(self.__config.get_value("general", "system_keyboard_layout", ''))
-+        if text == 'default' or text == '':
-+            text = _("Default")
-+        self.__button_system_keyboard_layout.set_label(text)
-+        if not self.__config.get_value("general", "use_system_keyboard_layout", True):
-+            self.__button_system_keyboard_layout.set_sensitive(False)
-+        self.__button_system_keyboard_layout.connect("clicked", self.__button_system_keyboard_layout_cb)
-+
-+        # use system keyboard layout setting
-+        self.__config.connect("value-changed", self.__config_value_changed_cb)
-+
-+        self.__xkblayoutconfig = None
-+        self.__preload_xkb_engines = []
-+        self.__other_xkb_engines = []
-+        self.__default_xkb_engine = None
-+        if ibus.XKBConfigRegistry.have_xkb():
-+            self.__xkblayoutconfig = ibus.XKBLayoutConfig()
-+
-+        # config layouts dialog
-+        self.__init_config_layouts()
-+
-+        # default system keyboard dialog
-+        self.__init_system_keyboard()
-+
-+    def __config_value_changed_cb(self, bus, section, name, value):
-+        if section == "general" and name == "use_system_keyboard_layout":
-+            self.__button_system_keyboard_layout.set_sensitive(value)
-+
-+    def __get_xkb_engines(self):
-+        xkb_engines = []
-+        xkbconfig = ibus.XKBConfigRegistry()
-+        layout_list = xkbconfig.get_layout_list()
-+        layout_desc = xkbconfig.get_layout_desc()
-+        layout_lang = xkbconfig.get_layout_lang()
-+        variant_desc = xkbconfig.get_variant_desc()
-+        for layout in layout_list.keys():
-+            langs = []
-+            if layout in layout_lang:
-+                langs = layout_lang[layout]
-+            for lang in langs:
-+                engine = ibus.XKBConfigRegistry.engine_desc_new(
-+                    lang,
-+                    layout,
-+                    layout_desc[layout],
-+                    None,
-+                    None)
-+                xkb_engines.append(engine)
-+            for variant in layout_list[layout]:
-+                label = "%s(%s)" % (layout, variant)
-+                sub_langs = []
-+                if label in layout_lang:
-+                    sub_langs = layout_lang[label]
-+                else:
-+                    sub_langs = langs
-+                for lang in sub_langs:
-+                    engine = ibus.XKBConfigRegistry.engine_desc_new(
-+                        lang,
-+                        layout,
-+                        layout_desc[layout],
-+                        variant,
-+                        variant_desc[label])
-+                    xkb_engines.append(engine)
-+        return xkb_engines
-+
-+    def __get_default_xkb_engine(self):
-+        if self.__default_xkb_engine != None:
-+            return self.__default_xkb_engine
-+        self.__default_xkb_engine = ibus.XKBConfigRegistry.engine_desc_new(
-+            "other",
-+            "default",
-+            _("Default"),
-+            None,
-+            None)
-+        return self.__default_xkb_engine
-+
-+    def __init_config_layouts(self):
-+        if not ibus.XKBConfigRegistry.have_xkb():
-+            button = self.__builder.get_object("button_config_layouts")
-+            button.hide()
-+            return
-+
-+        self.__dialog_config_layouts = self.__builder.get_object("dialog_config_layouts")
-+        self.__button_config_layouts_cancel = self.__builder.get_object("button_config_layouts_cancel")
-+        self.__button_config_layouts_cancel.connect("clicked", self.__button_config_layouts_cancel_cb)
-+        self.__button_config_layouts_ok = self.__builder.get_object("button_config_layouts_ok")
-+        self.__button_config_layouts_ok.connect("clicked", self.__button_config_layouts_ok_cb)
-+        self.__vbox_all_keyboard_layouts = self.__builder.get_object("vbox_all_keyboard_layouts")
-+
-+        xkb_engines = self.__get_xkb_engines()
-+        if len(xkb_engines) > 0:
-+            button = self.__builder.get_object("button_config_layouts")
-+            button.connect("clicked", self.__button_config_layouts_cb)
-+            button.set_sensitive(True)
-+
-+        engine_dict = {}
-+        for engine in xkb_engines:
-+            if not engine.name.startswith("xkb:layout:"):
-+                continue
-+            lang = ibus.get_language_name(engine.language)
-+            if lang not in engine_dict:
-+                engine_dict[lang] = []
-+            engine_dict[lang].append(engine)
-+
-+        keys = engine_dict.keys()
-+        keys.sort()
-+        if ibus.get_language_name("Other") in keys:
-+            keys.remove(ibus.get_language_name("Other"))
-+            keys += [ibus.get_language_name("Other")]
-+
-+        preload_xkb_engines = self.__xkblayoutconfig.get_preload_layouts()
-+        for lang in keys:
-+            expander = gtk.Expander("")
-+            self.__vbox_all_keyboard_layouts.pack_start(expander, True, True, 0)
-+            expander.show()
-+            label = expander.get_label_widget()
-+            label.set_label(lang)
-+            align = gtk.Alignment(0, 0, 1, 0)
-+            align.set_padding(6, 0, 18, 0)
-+            expander.add(align)
-+            align.show()
-+            vbox = gtk.VBox(False, 0)
-+            align.add(vbox)
-+            vbox.show()
-+
-+            def cmp_engine(a, b):
-+                if a.rank == b.rank:
-+                    return cmp(a.longname, b.longname)
-+                return int(b.rank - a.rank)
-+            engine_dict[lang].sort(cmp_engine)
-+
-+            for engine in engine_dict[lang]:
-+                sub_name = engine.name[len("xkb:layout:"):]
-+                layout_list = sub_name.split(':')
-+                if len(layout_list) > 1:
-+                    layout = "%s(%s)" % (layout_list[0], layout_list[1])
-+                else:
-+                    layout = layout_list[0]
-+                has_preloaded = False
-+                for preload_name in preload_xkb_engines:
-+                    preload_name = str(preload_name)
-+                    if len(preload_name) == 0:
-+                        continue
-+                    if layout == preload_name:
-+                        has_preloaded = True
-+                        break
-+
-+                checkbutton = gtk.CheckButton(engine.longname)
-+                checkbutton.set_data("layout", layout)
-+                if has_preloaded:
-+                    checkbutton.set_active(True)
-+                vbox.pack_start(checkbutton, False, True, 0)
-+                checkbutton.show()
-+
-+    def __init_system_keyboard_layout(self):
-+        self.__dialog_system_keyboard_layout = self.__builder.get_object("dialog_system_keyboard_layout")
-+        self.__button_system_keyboard_layout_cancel = self.__builder.get_object("button_system_keyboard_layout_cancel")
-+        self.__button_system_keyboard_layout_cancel.connect("clicked", self.__button_system_keyboard_layout_cancel_cb)
-+        self.__button_system_keyboard_layout_ok = self.__builder.get_object("button_system_keyboard_layout_ok")
-+        self.__button_system_keyboard_layout_ok.connect("clicked", self.__button_system_keyboard_layout_ok_cb)
-+
-+        # get xkb layouts
-+        xkb_engines = self.__get_xkb_engines()
-+
-+        self.__combobox_system_keyboard_layout = self.__builder.get_object("combobox_system_keyboard_layout_engines")
-+        self.__combobox_system_keyboard_layout.set_engines(xkb_engines)
-+        self.__combobox_system_keyboard_layout.set_title(_("Select keyboard layouts"))
-+        self.__combobox_system_keyboard_layout.connect("notify::active-engine", self.__combobox_notify_active_system_keyboard_layout_cb)
-+        self.__treeview_system_keyboard_layout = self.__builder.get_object("treeview_system_keyboard_layout_engines")
-+        self.__treeview_system_keyboard_layout.connect("notify", self.__treeview_notify_system_keyboard_layout_cb)
-+        column = self.__treeview_system_keyboard_layout.get_column(0)
-+        column.set_title(_("Keyboard Layouts"))
-+        button = self.__builder.get_object("button_system_keyboard_layout_engine_add")
-+        button.connect("clicked", self.__button_system_keyboard_layout_add_cb)
-+        button = self.__builder.get_object("button_system_keyboard_layout_engine_remove")
-+        button.connect("clicked", self.__button_system_keyboard_layout_remove_cb)
-+        button = self.__builder.get_object("button_system_keyboard_layout_engine_up")
-+        button.connect("clicked", lambda *args:self.__treeview_system_keyboard_layout.move_up_engine())
-+
-+        button = self.__builder.get_object("button_system_keyboard_layout_engine_down")
-+        button.connect("clicked", lambda *args:self.__treeview_system_keyboard_layout.move_down_engine())
-+        button = self.__builder.get_object("button_system_keyboard_layout_engine_reset")
-+        button.connect("clicked", self.__button_system_keyboard_layout_reset_cb)
-+        button_reset = button
-+        text = str(self.__config.get_value("general", "system_keyboard_layout", ''))
-+        if text == "default" or text == None:
-+            engine = self.__get_default_xkb_engine()
-+            self.__treeview_system_keyboard_layout.set_engines([engine])
-+            button_reset.set_sensitive(False)
-+        else:
-+            # The saved string 'cz,us(qwerty,)' needs to be rearranged to
-+            # ['cz(qwerty)', 'us'] for each engine.
-+            [l, v] = self.__get_model_from_layout(text)
-+            variants = []
-+            if v != 'default' and v != None:
-+                variants = v.split(',')
-+            for i, layout in enumerate(l.split(',')):
-+                if i < len(variants) and len(variants[i]) > 0:
-+                    layout = '%s(%s)' % (layout, variants[i])
-+                layout_engine = None
-+                for engine in xkb_engines:
-+                    if layout == engine.layout:
-+                        layout_engine = engine
-+                        break
-+                if layout_engine != None:
-+                    self.__treeview_system_keyboard_layout.append_engine(layout_engine)
-+            button_reset.set_sensitive(True)
-+        label = self.__builder.get_object("label_system_keyboard_layout_engines")
-+        label.set_markup(_("<small><i>The system keyboard layouts "
-+                           "can be set less than or equal to %d.\n"
-+                           "You may use Up/Down buttons to change the order."
-+                           "</i></small>") % XKB_MAX_LAYOUTS)
-+
-+    def __init_system_keyboard_option(self):
-+        self.__dialog_system_keyboard_option = self.__builder.get_object("dialog_system_keyboard_option")
-+        self.__button_system_keyboard_option_close = self.__builder.get_object("button_system_keyboard_option_close")
-+        self.__button_system_keyboard_option_close.connect(
-+            "clicked", lambda button: self.__dialog_system_keyboard_option.hide())
-+
-+        button = self.__builder.get_object("button_system_keyboard_option_setup")
-+        button.connect("clicked", self.__button_system_keyboard_option_cb)
-+        self.__checkbutton_use_system_keyboard_option = self.__builder.get_object("checkbutton_use_system_keyboard_option")
-+        self.__vbox_system_keyboard_options = self.__builder.get_object("vbox_system_keyboard_options")
-+        option_array = []
-+        text = str(self.__config.get_value("general", "system_keyboard_option", ''))
-+        if text == None or text == "default":
-+            self.__checkbutton_use_system_keyboard_option.set_active(True)
-+            self.__vbox_system_keyboard_options.set_sensitive(False)
-+        else:
-+            self.__checkbutton_use_system_keyboard_option.set_active(False)
-+            self.__vbox_system_keyboard_options.set_sensitive(True)
-+            option_array = text.split(',')
-+        self.__checkbutton_use_system_keyboard_option.connect(
-+            "toggled", lambda button: self.__vbox_system_keyboard_options.set_sensitive(not button.get_active()))
-+
-+        xkbconfig = ibus.XKBConfigRegistry()
-+        option_list = xkbconfig.get_option_list()
-+        option_group_desc = xkbconfig.get_option_group_desc()
-+        option_desc = xkbconfig.get_option_desc()
-+        for option_group in option_list.keys():
-+            expander = gtk.Expander("")
-+            self.__vbox_system_keyboard_options.pack_start(expander, True, True, 0)
-+            expander.show()
-+            checked = 0
-+            label = expander.get_label_widget()
-+            label.set_label(option_group_desc[option_group])
-+            label.set_data("option_group", option_group)
-+            expander.set_data("checked", checked)
-+            align = gtk.Alignment(0, 0, 1, 0)
-+            align.set_padding(6, 0, 18, 0)
-+            expander.add(align)
-+            align.show()
-+            vbox = gtk.VBox(False, 0)
-+            align.add(vbox)
-+            vbox.show()
-+            for option in option_list[option_group]:
-+                checkbutton = gtk.CheckButton(option_desc[option])
-+                checkbutton.set_data("option", option)
-+                if option in option_array:
-+                    checkbutton.set_active(True)
-+                    label.set_markup("<b>" +
-+                                     option_group_desc[option_group] +
-+                                     "</b>")
-+                    checked = checked + 1
-+                    expander.set_data("checked", checked)
-+                checkbutton.connect("toggled",
-+                                    self.__checkbutton_system_keyboard_option_toggled_cb,
-+                                    expander)
-+                vbox.pack_start(checkbutton, False, True, 0)
-+                checkbutton.show()
-+
-+    def __init_system_keyboard(self):
-+        if not ibus.XKBConfigRegistry.have_xkb():
-+            hbox = self.__builder.get_object("hbox_system_keyboard_layout")
-+            hbox.hide()
-+            return
-+
-+        self.__init_system_keyboard_layout()
-+        self.__init_system_keyboard_option()
-+
-+    def __get_model_from_layout(self, layout):
-+        left_bracket = layout.find('(')
-+        right_bracket = layout.find(')')
-+        if left_bracket >= 0 and right_bracket > left_bracket:
-+            return (layout[:left_bracket] + layout[right_bracket + 1:], \
-+                    layout[left_bracket + 1:right_bracket])
-+        return (layout, 'default')
-+
-+    def __combobox_notify_active_system_keyboard_layout_cb(self, combobox, property):
-+        engine = self.__combobox_system_keyboard_layout.get_active_engine()
-+        button = self.__builder.get_object("button_system_keyboard_layout_engine_add")
-+        engines = self.__treeview_system_keyboard_layout.get_engines()
-+        button.set_sensitive(engine != None and \
-+                             engine not in engines and \
-+                             len(engines) < XKB_MAX_LAYOUTS)
-+
-+    def __treeview_notify_system_keyboard_layout_cb(self, treeview, property):
-+        if property.name != "active-engine" and property.name != "engines":
-+            return
-+
-+        engines = self.__treeview_system_keyboard_layout.get_engines()
-+        engine = self.__treeview_system_keyboard_layout.get_active_engine()
-+
-+        button = self.__builder.get_object("button_system_keyboard_layout_engine_remove")
-+        button.set_sensitive(engine != None)
-+        button = self.__builder.get_object("button_system_keyboard_layout_engine_up")
-+        button.set_sensitive(engine not in engines[:1])
-+        button = self.__builder.get_object("button_system_keyboard_layout_engine_down")
-+        button.set_sensitive(engine not in engines[-1:])
-+
-+    def __button_system_keyboard_layout_add_cb(self, button):
-+        engines = self.__treeview_system_keyboard_layout.get_engines()
-+        engine = self.__combobox_system_keyboard_layout.get_active_engine()
-+        if engine == None:
-+            return
-+        # If engines[0] is the default dummy engine:
-+        if len(engines) > 0 and engines[0].layout == "default":
-+            self.__treeview_system_keyboard_layout.set_engines([engine])
-+        else:
-+            self.__treeview_system_keyboard_layout.append_engine(engine)
-+        button_reset = self.__builder.get_object("button_system_keyboard_layout_engine_reset")
-+        button_reset.set_sensitive(True)
-+        if len(self.__treeview_system_keyboard_layout.get_engines()) >= XKB_MAX_LAYOUTS:
-+            button.set_sensitive(False)
-+
-+    def __button_system_keyboard_layout_remove_cb(self, button):
-+        self.__treeview_system_keyboard_layout.remove_engine()
-+        if len(self.__treeview_system_keyboard_layout.get_engines()) < XKB_MAX_LAYOUTS:
-+            button_add = self.__builder.get_object("button_system_keyboard_layout_engine_add")
-+            button_add.set_sensitive(True)
-+        button_reset = self.__builder.get_object("button_system_keyboard_layout_engine_reset")
-+        button_reset.set_sensitive(True)
-+
-+    def __button_system_keyboard_layout_reset_cb(self, button):
-+        engine = self.__get_default_xkb_engine()
-+        self.__treeview_system_keyboard_layout.set_engines([engine])
-+        button.set_sensitive(False)
-+
-+    def __button_config_layouts_cb(self, button):
-+        self.__dialog_config_layouts.run()
-+        self.__dialog_config_layouts.hide()
-+
-+    def __button_config_layouts_cancel_cb(self, button):
-+        self.__dialog_config_layouts.hide()
-+
-+    def __button_config_layouts_ok_cb(self, button):
-+        self.__dialog_config_layouts.hide()
-+        engine_list = []
-+        for expander in self.__vbox_all_keyboard_layouts.get_children():
-+            align = expander.get_children()[0]
-+            vbox = align.get_children()[0]
-+            for checkbutton in vbox.get_children():
-+                if checkbutton.get_active():
-+                    engine_list.append(checkbutton.get_data("layout"))
-+        if len(engine_list) == 0:
-+            return
-+        engine_list.sort()
-+        self.__xkblayoutconfig.save_preload_layouts(engine_list)
-+        message = _("Please restart IBus to reload your configuration.")
-+        dlg = gtk.MessageDialog(type = gtk.MESSAGE_INFO,
-+                                buttons = gtk.BUTTONS_OK,
-+                                message_format = message)
-+        dlg.run()
-+        dlg.destroy()
-+
-+    def __button_system_keyboard_layout_cb(self, button):
-+        self.__dialog_system_keyboard_layout.run()
-+        self.__dialog_system_keyboard_layout.hide()
-+
-+    def __button_system_keyboard_layout_cancel_cb(self, button):
-+        self.__dialog_system_keyboard_layout.hide()
-+
-+    def __button_system_keyboard_layout_ok_cb(self, button):
-+        self.__dialog_system_keyboard_layout.hide()
-+        layout = 'default'
-+        variant = ''
-+        has_variant = False
-+        # if the string is 'cz(qwerty),us[options,...]', it would difficult
-+        # to separate layouts by comma. So we rearrange this likes
-+        # 'cz,us(qwerty,)[options,...]' here.
-+        for engine in self.__treeview_system_keyboard_layout.get_engines():
-+            [l, v] = self.__get_model_from_layout(engine.layout)
-+            if v == 'default' or v == None:
-+                v = ''
-+            if len(v) > 0:
-+                has_variant = True
-+            if layout == "default":
-+                layout = l
-+                variant = v
-+            else:
-+                layout = '%s,%s' % (layout, l)
-+                variant = '%s,%s' % (variant, v)
-+        if has_variant:
-+            layout = '%s(%s)' % (layout, variant)
-+        if layout == None or layout == "":
-+            layout = "default"
-+        org_layout = str(self.__config.get_value("general", "system_keyboard_layout", None))
-+        if layout != org_layout:
-+            self.__config.set_value("general", "system_keyboard_layout", layout)
-+        if layout == "default":
-+            layout = _("Default")
-+        self.__button_system_keyboard_layout.set_label(layout)
-+        option = "default"
-+        if not self.__checkbutton_use_system_keyboard_option.get_active():
-+            for expander in self.__vbox_system_keyboard_options.get_children():
-+                align = expander.get_children()[0]
-+                vbox = align.get_children()[0]
-+                for checkbutton in vbox.get_children():
-+                    if checkbutton.get_active():
-+                        data = checkbutton.get_data("option")
-+                        if option == "default":
-+                            option = data
-+                        else:
-+                            option = "%s,%s" % (option, data)
-+        if option == None or option == "":
-+            option = "default"
-+        if option != "default" and option.find(':') < 0:
-+            message = _("The keyboard option cannot be chosen.")
-+            dlg = gtk.MessageDialog(type = gtk.MESSAGE_INFO,
-+                                    buttons = gtk.BUTTONS_OK,
-+                                    message_format = message)
-+            dlg.run()
-+            dlg.destroy()
-+            return
-+        org_option = str(self.__config.get_value("general", "system_keyboard_option", None))
-+        if option != org_option:
-+            self.__config.set_value("general", "system_keyboard_option", option)
-+        message = _("Please restart IBus to reload your configuration.")
-+        dlg = gtk.MessageDialog(type = gtk.MESSAGE_INFO,
-+                                buttons = gtk.BUTTONS_OK,
-+                                message_format = message)
-+        dlg.run()
-+        dlg.destroy()
-+
-+    def __button_system_keyboard_option_cb(self, button):
-+        self.__dialog_system_keyboard_option.run()
-+        self.__dialog_system_keyboard_option.hide()
-+
-+    def __checkbutton_system_keyboard_option_toggled_cb(self, button, user_data):
-+        expander = user_data
-+        checked = expander.get_data("checked")
-+        label = expander.get_label_widget()
-+        if button.get_active():
-+            checked = checked + 1
-+            label.set_markup("<b>" + label.get_text() + "</b>")
-+        else:
-+            checked = checked - 1
-+            if checked <= 0:
-+                label.set_text(label.get_text())
-+        expander.set_data("checked", checked)
-+
-diff --git a/src/Makefile.am b/src/Makefile.am
-index 6f0321c..c62f3ed 100644
---- a/src/Makefile.am
-+++ b/src/Makefile.am
-@@ -186,6 +186,11 @@ typelibs_DATA = $(INTROSPECTION_GIRS:.gir=.typelib)
- CLEANFILES += $(dist_gir_DATA) $(typelibs_DATA)
- endif
- 
-+if ENABLE_XKB
-+ibus_sources += ibusxkbxml.c
-+ibus_headers += ibusxkbxml.h
-+endif
-+
- # gen enum types
- ibusenumtypes.h: $(ibus_headers) ibusenumtypes.h.template
- 	$(AM_V_GEN) ( top_builddir=`cd $(top_builddir) && pwd`; \
-diff --git a/src/ibus.h b/src/ibus.h
-index addc531..467c775 100644
---- a/src/ibus.h
-+++ b/src/ibus.h
-@@ -45,6 +45,7 @@
- #include <ibuskeys.h>
- #include <ibusenumtypes.h>
- #include <ibushotkey.h>
-+#include <ibusxkbxml.h>
- #include <ibusxml.h>
- #include <ibusenginedesc.h>
- #include <ibusobservedpath.h>
-diff --git a/src/ibusxkbxml.c b/src/ibusxkbxml.c
+diff --git a/engine/ibus-xkb-main.c b/engine/ibus-xkb-main.c
 new file mode 100644
-index 0000000..5386fdb
+index 0000000..75f6679
 --- /dev/null
-+++ b/src/ibusxkbxml.c
-@@ -0,0 +1,441 @@
++++ b/engine/ibus-xkb-main.c
+@@ -0,0 +1,111 @@
 +/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
 +/* vim:set et sts=4: */
 +/* bus - The Input Bus
-+ * Copyright (C) 2011 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2011 Peng Huang <shawn.p.huang@gmail.com>
-+ * Copyright (C) 2011 Red Hat, Inc.
++ * Copyright (C) 2012 Takao Fujiwara <takao.fujiwara1@gmail.com>
++ * Copyright (C) 2012 Peng Huang <shawn.p.huang@gmail.com>
++ * Copyright (C) 2012 Red Hat, Inc.
 + *
 + * This library is free software; you can redistribute it and/or
 + * modify it under the terms of the GNU Lesser General Public
@@ -2383,5416 +340,744 @@ index 0000000..5386fdb
 +#endif
 +
 +#include <glib.h>
++#include <glib/gprintf.h>
++#include <glib/gi18n.h>
++#include <X11/Xlib.h>
 +
-+#include "ibus.h"
-+#include "ibusxkbxml.h"
-+
-+#ifndef XKB_RULES_XML_FILE
-+#define XKB_RULES_XML_FILE "/usr/share/X11/xkb/rules/evdev.xml"
++#ifdef ENABLE_NLS
++#include <locale.h>
 +#endif
 +
-+#define IBUS_XKB_CONFIG_REGISTRY_GET_PRIVATE(o)  \
-+   (G_TYPE_INSTANCE_GET_PRIVATE ((o), IBUS_TYPE_XKB_CONFIG_REGISTRY, IBusXKBConfigRegistryPrivate))
++#include "xkblib.h"
 +
-+typedef struct _IBusXKBConfigRegistryPrivate IBusXKBConfigRegistryPrivate;
++static gboolean get_layout = FALSE;
++static gboolean get_group = FALSE;
++static gchar *layout = NULL;
++static gchar *variant = NULL;
++static gchar *option = NULL;
++static int group = 0;
 +
-+struct _IBusXKBConfigRegistryPrivate {
-+    GHashTable *layout_list;
-+    GHashTable *layout_lang;
-+    GHashTable *layout_desc;
-+    GHashTable *variant_desc;
++static const GOptionEntry entries[] =
++{
++    { "get", 'g', 0, G_OPTION_ARG_NONE, &get_layout, N_("Get current xkb layout"), NULL },
++    { "layout", 'l', 0, G_OPTION_ARG_STRING, &layout, N_("Set xkb LAYOUT"), N_("LAYOUT") },
++    { "variant", 'v', 0, G_OPTION_ARG_STRING, &variant, N_("Set xkb VARIANT"), N_("VARIANT") },
++    { "option", 'o', 0, G_OPTION_ARG_STRING, &option, N_("Set xkb OPTION"), N_("OPTION") },
++    { "get-group", 'G', 0, G_OPTION_ARG_NONE, &get_group, N_("Get current xkb state"), NULL },
++    { NULL },
 +};
 +
++int
++main (int argc, char *argv[])
++{
++    GOptionContext *context;
++    GError *error = NULL;
++    Display *xdisplay;
 +
-+/* functions prototype */
-+static void         ibus_xkb_config_registry_destroy
-+                                           (IBusXKBConfigRegistry *xkb_config);
++#ifdef ENABLE_NLS
++    setlocale (LC_ALL, "");
 +
-+G_DEFINE_TYPE (IBusXKBConfigRegistry, ibus_xkb_config_registry, IBUS_TYPE_OBJECT)
++    bindtextdomain (GETTEXT_PACKAGE, IBUS_LOCALEDIR);
++    bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
++#endif
 +
-+static void
-+parse_xkb_xml_languagelist_node (IBusXKBConfigRegistryPrivate *priv,
-+                                 XMLNode *parent_node,
-+                                 const gchar *layout_name)
-+{
-+    XMLNode *node = parent_node;
-+    XMLNode *sub_node;
-+    GList *p;
-+    GList *lang_list = NULL;
++    context = g_option_context_new ("- ibus daemon");
 +
-+    g_assert (node != NULL);
-+    g_assert (layout_name != NULL);
-+    for (p = node->sub_nodes; p; p = p->next) {
-+        sub_node = (XMLNode *) p->data;
-+        if (g_strcmp0 (sub_node->name, "iso639Id") == 0) {
-+            lang_list = g_list_append (lang_list,
-+                                       (gpointer) g_strdup (sub_node->text));
-+            continue;
-+        }
++    g_option_context_set_translation_domain (context, GETTEXT_PACKAGE);
++    g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE);
++
++    if (!g_option_context_parse (context, &argc, &argv, &error)) {
++        g_printerr ("Option parsing failed: %s\n", error->message);
++        return -1;
 +    }
-+    if (lang_list == NULL) {
-+        /* some nodes have no lang */
-+        return;
++
++    xdisplay = XOpenDisplay (NULL);
++    if (xdisplay == NULL) {
++        g_warning ("Could not open display");
++        return -1;
 +    }
-+    if (g_hash_table_lookup (priv->layout_lang, layout_name) != NULL) {
-+        g_warning ("duplicated name %s exists", layout_name);
-+        return;
++    ibus_xkb_init (xdisplay);
++
++    if (layout) {
++        ibus_xkb_set_layout (layout, variant, option);
++    }
++    if (get_layout) {
++        layout = ibus_xkb_get_current_layout ();
++        variant = ibus_xkb_get_current_variant ();
++        option = ibus_xkb_get_current_option ();
++        g_printf ("layout: %s\n"
++                  "variant: %s\n"
++                  "option: %s\n",
++                  layout ? layout : "",
++                  variant ? variant : "",
++                  option ? option : "");
++        g_free (layout);
++        g_free (variant);
++        g_free (option);
++    }
++    if (get_group) {
++        group = ibus_xkb_get_current_group ();
++        g_printf ("group: %d\n", group);
 +    }
-+    g_hash_table_insert (priv->layout_lang,
-+                         (gpointer) g_strdup (layout_name),
-+                         (gpointer) lang_list);
-+}
 +
-+static const gchar *
-+parse_xkb_xml_configitem_node (IBusXKBConfigRegistryPrivate *priv,
-+                               XMLNode *parent_node)
-+{
-+    XMLNode *node = parent_node;
-+    XMLNode *sub_node;
-+    GList *p;
-+    gchar *name = NULL;
-+    gchar *description = NULL;
++    ibus_xkb_finit ();
 +
-+    g_assert (node != NULL);
-+    for (p = node->sub_nodes; p; p = p->next) {
-+        sub_node = (XMLNode *) p->data;
-+        if (g_strcmp0 (sub_node->name, "name") == 0) {
-+            name = sub_node->text;
-+            continue;
++    return 0;
++}
+diff --git a/engine/main.vala b/engine/main.vala
+index e1fd129..0dd15ce 100644
+--- a/engine/main.vala
++++ b/engine/main.vala
+@@ -21,6 +21,83 @@
+  */
+ 
+ using IBus;
++using GLib;
++
++private void print_xml(string  layout,
++                       string  layout_desc,
++                       string? variant,
++                       string? variant_desc,
++                       string  lang) {
++    string name = "xkb:%s:%s:%s".printf(layout, variant ?? "", lang);
++    string keymap = layout;
++    string desc = layout_desc;
++    string symbol = lang;
++
++    if (variant != null) {
++        keymap = "%s(%s)".printf(layout, variant);
++    }
++
++    if (variant_desc != null) {
++        desc = variant_desc;
++    }
++
++    desc = desc.replace("<", "&lt;").replace(">", "&gt;");
++
++    if (lang.length > 2) {
++        symbol = lang[0:2];
++    }
++
++    string engine = "
++              <engine>
++                        <name>%s</name>
++                        <language>%s</language>
++                        <license>GPL</license>
++                        <author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
++                        <layout>%s</layout>
++                        <longname>%s</longname>
++                        <description>%s</description>
++                        <icon>ibus-keyboard</icon>
++                        <symbol>%s</symbol>
++                        <rank>%d</rank>
++              </engine>".printf(name, lang, keymap, desc, desc, symbol, 99);
++    print (engine);
++}
++
++private void print_component() {
++    IBus.XKBConfigRegistry registry = new IBus.XKBConfigRegistry();
++    unowned GLib.List layouts = registry.layout_list_get_layouts();
++    unowned GLib.List variants;
++    unowned GLib.List langs;
++    string layout_desc;
++    const string header = "<engines>";
++    const string footer = "
++</engines>";
++
++    print (header);
++    for (unowned GLib.List<string> l = layouts; l != null; l = l.next) {
++        variants = registry.layout_list_get_variants(l.data);
++        langs = registry.layout_lang_get_langs(l.data);
++        layout_desc = registry.layout_desc_get_desc(l.data);
++        for (unowned GLib.List<string> lg = langs; lg != null; lg = lg.next) {
++            print_xml(l.data, layout_desc, null, null, lg.data);
 +        }
-+        if (g_strcmp0 (sub_node->name, "description") == 0) {
-+            description = sub_node->text;
-+            continue;
++        for (unowned GLib.List<string> v = variants; v != null; v = v.next) {
++            var l_v = "%s(%s)".printf(l.data, v.data);
++            unowned GLib.List<string> l_v_langs = registry.layout_lang_get_langs(l_v);
++            if (l_v_langs == null) {
++                l_v_langs = langs;
++            }
++            for (unowned GLib.List<string> lg = l_v_langs; lg != null; lg = lg.next) {
++                print_xml(l.data,
++                          layout_desc,
++                          v.data,
++                          registry.variant_desc_get_desc(l_v),
++                          lg.data);
++            }
 +        }
-+        if (g_strcmp0 (sub_node->name, "languageList") == 0) {
-+            if (name == NULL) {
-+                g_warning ("layout name is NULL in node %s", node->name);
-+                continue;
-+            }
-+            parse_xkb_xml_languagelist_node (priv, sub_node, name);
-+            continue;
-+        }
-+    }
-+    if (name == NULL) {
-+        g_warning ("No name in layout node");
-+        return NULL;
-+    }
-+    if (g_hash_table_lookup (priv->layout_desc, name) != NULL) {
-+        g_warning ("duplicated name %s exists", name);
-+        return name;
-+    }
-+    g_hash_table_insert (priv->layout_desc,
-+                         (gpointer) g_strdup (name),
-+                         (gpointer) g_strdup (description));
-+
-+    return name;
-+}
-+
-+static const gchar *
-+parse_xkb_xml_variant_configitem_node (IBusXKBConfigRegistryPrivate *priv,
-+                            XMLNode *parent_node,
-+                            const gchar *layout_name)
-+{
-+    XMLNode *node = parent_node;
-+    XMLNode *sub_node;
-+    GList *p;
-+    gchar *name = NULL;
-+    gchar *description = NULL;
-+    gchar *variant_lang_name = NULL;
-+
-+    g_assert (node != NULL);
-+    g_assert (layout_name != NULL);
-+    for (p = node->sub_nodes; p; p = p->next) {
-+        sub_node = (XMLNode *) p->data;
-+        if (g_strcmp0 (sub_node->name, "name") == 0) {
-+            name = sub_node->text;
-+            continue;
-+        }
-+        if (g_strcmp0 (sub_node->name, "description") == 0) {
-+            description = sub_node->text;
-+            continue;
-+        }
-+        if (g_strcmp0 (sub_node->name, "languageList") == 0) {
-+            if (name == NULL) {
-+                g_warning ("layout name is NULL in node %s", node->name);
-+                continue;
-+            }
-+            variant_lang_name = g_strdup_printf ("%s(%s)", layout_name, name);
-+            parse_xkb_xml_languagelist_node (priv, sub_node, variant_lang_name);
-+            g_free (variant_lang_name);
-+            continue;
-+        }
-+    }
-+    if (name == NULL) {
-+        g_warning ("No name in layout node");
-+        return NULL;
-+    }
-+    if (g_hash_table_lookup (priv->variant_desc, name) != NULL) {
-+        /* This is an expected case. */
-+        return name;
-+    }
-+    g_hash_table_insert (priv->variant_desc,
-+                         (gpointer) g_strdup (name),
-+                         (gpointer) g_strdup (description));
-+    return name;
-+}
-+
-+static const gchar *
-+parse_xkb_xml_variant_node (IBusXKBConfigRegistryPrivate *priv,
-+                            XMLNode *parent_node,
-+                            const gchar *layout_name)
-+{
-+    XMLNode *node = parent_node;
-+    XMLNode *sub_node;
-+    GList *p;
-+    const gchar *variant_name = NULL;
-+
-+    g_assert (node != NULL);
-+    g_assert (layout_name != NULL);
-+    for (p = node->sub_nodes; p; p = p->next) {
-+        sub_node = (XMLNode *) p->data;
-+        if (g_strcmp0 (sub_node->name, "configItem") == 0) {
-+            variant_name = parse_xkb_xml_variant_configitem_node (priv, sub_node, layout_name);
-+            continue;
-+        }
-+    }
-+    return variant_name;
-+}
-+
-+static GList *
-+parse_xkb_xml_variantlist_node (IBusXKBConfigRegistryPrivate *priv,
-+                                XMLNode *parent_node,
-+                                const gchar *layout_name,
-+                                GList *variant_list)
-+{
-+    XMLNode *node = parent_node;
-+    XMLNode *sub_node;
-+    GList *p;
-+    const gchar *variant_name = NULL;
-+
-+    g_assert (node != NULL);
-+    g_assert (layout_name != NULL);
-+    for (p = node->sub_nodes; p; p = p->next) {
-+        sub_node = (XMLNode *) p->data;
-+        if (g_strcmp0 (sub_node->name, "variant") == 0) {
-+            variant_name = parse_xkb_xml_variant_node (priv, sub_node, layout_name);
-+            if (variant_name != NULL) {
-+                variant_list = g_list_append (variant_list,
-+                                              (gpointer) g_strdup (variant_name));
-+            }
-+            continue;
-+        }
-+    }
-+    return variant_list;
-+}
-+
-+static void
-+parse_xkb_xml_layout_node (IBusXKBConfigRegistryPrivate *priv,
-+                           XMLNode *parent_node)
-+{
-+    XMLNode *node = parent_node;
-+    XMLNode *sub_node;
-+    GList *p;
-+    const gchar *name = NULL;
-+    GList *variant_list = NULL;
-+
-+    g_assert (node != NULL);
-+    for (p = node->sub_nodes; p; p = p->next) {
-+        sub_node = (XMLNode *) p->data;
-+        if (g_strcmp0 (sub_node->name, "configItem") == 0) {
-+            name = parse_xkb_xml_configitem_node (priv, sub_node);
-+            continue;
-+        }
-+        if (g_strcmp0 (sub_node->name, "variantList") == 0) {
-+            if (name == NULL) {
-+                g_warning ("layout name is NULL in node %s", node->name);
-+                continue;
-+            }
-+            variant_list = parse_xkb_xml_variantlist_node (priv, sub_node,
-+                                                           name,
-+                                                           variant_list);
-+            continue;
-+        }
-+    }
-+    if (g_hash_table_lookup (priv->layout_list, name) != NULL) {
-+        g_warning ("duplicated name %s exists", name);
-+        return;
-+    }
-+    g_hash_table_insert (priv->layout_list,
-+                         (gpointer) g_strdup (name),
-+                         (gpointer) variant_list);
-+}
-+
-+static void
-+parse_xkb_xml_top_node (IBusXKBConfigRegistryPrivate *priv,
-+                        XMLNode *parent_node)
-+{
-+    XMLNode *node = parent_node;
-+    XMLNode *sub_node;
-+    GList *p;
-+
-+    g_assert (priv != NULL);
-+    g_assert (node != NULL);
-+
-+    if (g_strcmp0 (node->name, "xkbConfigRegistry") != 0) {
-+        g_warning ("node has no xkbConfigRegistry name");
-+        return;
-+    }
-+    for (p = node->sub_nodes; p; p = p->next) {
-+        sub_node = (XMLNode *) p->data;
-+        if (g_strcmp0 (sub_node->name, "layoutList") == 0) {
-+            break;
-+        }
-+    }
-+    if (p == NULL) {
-+        g_warning ("xkbConfigRegistry node has no layoutList node");
-+        return;
-+    }
-+    node = sub_node;
-+    for (p = node->sub_nodes; p; p = p->next) {
-+        sub_node = (XMLNode *) p->data;
-+        if (g_strcmp0 (sub_node->name, "layout") == 0) {
-+            parse_xkb_xml_layout_node (priv, sub_node);
-+            continue;
-+        }
-+    }
-+}
-+
-+static void
-+free_lang_list (GList *list)
-+{
-+    GList *l = list;
-+    while (l) {
-+        g_free (l->data);
-+        l->data = NULL;
-+        l = l->next;
-+    }
-+    g_list_free (list);
-+}
-+
-+static void
-+parse_xkb_config_registry_file (IBusXKBConfigRegistryPrivate *priv,
-+                                const gchar *file)
-+{
-+    XMLNode *node;
-+
-+    g_assert (file != NULL);
-+
-+    priv->layout_list = g_hash_table_new_full (g_str_hash,
-+                                               (GEqualFunc) g_str_equal,
-+                                               (GDestroyNotify) g_free,
-+                                               (GDestroyNotify) free_lang_list);
-+    priv->layout_desc = g_hash_table_new_full (g_str_hash,
-+                                               (GEqualFunc) g_str_equal,
-+                                               (GDestroyNotify) g_free,
-+                                               (GDestroyNotify) g_free);
-+    priv->layout_lang = g_hash_table_new_full (g_str_hash,
-+                                               (GEqualFunc) g_str_equal,
-+                                               (GDestroyNotify) g_free,
-+                                               (GDestroyNotify) free_lang_list);
-+    priv->variant_desc = g_hash_table_new_full (g_str_hash,
-+                                               (GEqualFunc) g_str_equal,
-+                                               (GDestroyNotify) g_free,
-+                                               (GDestroyNotify) g_free);
-+    node = ibus_xml_parse_file (file);
-+    parse_xkb_xml_top_node (priv, node);
-+    ibus_xml_free (node);
-+}
-+
-+static void
-+ibus_xkb_config_registry_init (IBusXKBConfigRegistry *xkb_config)
-+{
-+    IBusXKBConfigRegistryPrivate *priv;
-+    const gchar *file = XKB_RULES_XML_FILE;
-+
-+    priv = IBUS_XKB_CONFIG_REGISTRY_GET_PRIVATE (xkb_config);
-+    parse_xkb_config_registry_file (priv, file);
-+}
-+
-+static void
-+ibus_xkb_config_registry_destroy (IBusXKBConfigRegistry *xkb_config)
-+{
-+    IBusXKBConfigRegistryPrivate *priv;
-+
-+    g_return_if_fail (xkb_config != NULL);
-+
-+    priv = IBUS_XKB_CONFIG_REGISTRY_GET_PRIVATE (xkb_config);
-+
-+    g_hash_table_destroy (priv->layout_list);
-+    priv->layout_list = NULL;
-+    g_hash_table_destroy (priv->layout_lang);
-+    priv->layout_lang= NULL;
-+    g_hash_table_destroy (priv->layout_desc);
-+    priv->layout_desc= NULL;
-+    g_hash_table_destroy (priv->variant_desc);
-+    priv->variant_desc = NULL;
-+
-+    IBUS_OBJECT_CLASS(ibus_xkb_config_registry_parent_class)->destroy (IBUS_OBJECT (xkb_config));
-+}
-+
-+static void
-+ibus_xkb_config_registry_class_init (IBusXKBConfigRegistryClass *klass)
-+{
-+    IBusObjectClass *ibus_object_class = IBUS_OBJECT_CLASS (klass);
-+
-+    g_type_class_add_private (klass, sizeof (IBusXKBConfigRegistryPrivate));
-+
-+    ibus_object_class->destroy = (IBusObjectDestroyFunc) ibus_xkb_config_registry_destroy;
-+}
-+
-+IBusXKBConfigRegistry *
-+ibus_xkb_config_registry_new (void)
-+{
-+    IBusXKBConfigRegistry *xkb_config;
-+
-+    xkb_config = IBUS_XKB_CONFIG_REGISTRY (g_object_new (IBUS_TYPE_XKB_CONFIG_REGISTRY, NULL));
-+    return xkb_config;
-+}
-+
-+#define TABLE_FUNC(field_name) const GHashTable *                       \
-+ibus_xkb_config_registry_get_##field_name  (IBusXKBConfigRegistry *xkb_config) \
-+{                                                                       \
-+    IBusXKBConfigRegistryPrivate *priv;                                 \
-+                                                                        \
-+    g_return_val_if_fail (xkb_config != NULL, NULL);                    \
-+    priv = IBUS_XKB_CONFIG_REGISTRY_GET_PRIVATE (xkb_config);           \
-+    return priv->field_name;                                            \
-+}
-+
-+TABLE_FUNC (layout_list)
-+TABLE_FUNC (layout_lang)
-+TABLE_FUNC (layout_desc)
-+TABLE_FUNC (variant_desc)
-+
-+#undef TABLE_FUNC
-+
-+#define TABLE_LOOKUP_LIST_FUNC(field_name, value) GList *               \
-+ibus_xkb_config_registry_##field_name##_get_##value  (IBusXKBConfigRegistry *xkb_config, const gchar *key) \
-+{                                                                       \
-+    GHashTable *table;                                                  \
-+    GList *list = NULL;                                                 \
-+                                                                        \
-+    table = (GHashTable *)                                              \
-+        ibus_xkb_config_registry_get_##field_name (xkb_config);         \
-+    list = (GList *) g_hash_table_lookup (table, key);                  \
-+    return g_list_copy (list);                                          \
-+}
-+
-+#define TABLE_LOOKUP_STRING_FUNC(field_name, value) gchar *             \
-+ibus_xkb_config_registry_##field_name##_get_##value  (IBusXKBConfigRegistry *xkb_config, const gchar *key) \
-+{                                                                       \
-+    GHashTable *table;                                                  \
-+    const gchar *desc = NULL;                                           \
-+                                                                        \
-+    table = (GHashTable *)                                              \
-+        ibus_xkb_config_registry_get_##field_name (xkb_config);         \
-+    desc = (const gchar *) g_hash_table_lookup (table, key);            \
-+    return g_strdup (desc);                                             \
-+}
-+
-+TABLE_LOOKUP_LIST_FUNC (layout_list, variants)
-+TABLE_LOOKUP_LIST_FUNC (layout_lang, langs)
-+TABLE_LOOKUP_STRING_FUNC (layout_desc, desc)
-+TABLE_LOOKUP_STRING_FUNC (variant_desc, desc)
-+
-+#undef TABLE_LOOKUP_LIST_FUNC
-+#undef TABLE_LOOKUP_STRING_FUNC
-diff --git a/src/ibusxkbxml.h b/src/ibusxkbxml.h
-new file mode 100644
-index 0000000..6986b5c
---- /dev/null
-+++ b/src/ibusxkbxml.h
-@@ -0,0 +1,172 @@
-+/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
-+/* vim:set et sts=4: */
-+/* bus - The Input Bus
-+ * Copyright (C) 2011 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2011 Peng Huang <shawn.p.huang@gmail.com>
-+ * Copyright (C) 2011 Red Hat, Inc.
-+ *
-+ * This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2 of the License, or (at your option) any later version.
-+ *
-+ * This library is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General Public
-+ * License along with this library; if not, write to the
-+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-+ * Boston, MA 02111-1307, USA.
-+ */
-+#ifndef __IBUS_XKBXML_H_
-+#define __IBUS_XKBXML_H_
-+
-+#include "ibus.h"
-+
-+/*
-+ * Type macros.
-+ */
-+/* define IBusXKBConfigRegistry macros */
-+#define IBUS_TYPE_XKB_CONFIG_REGISTRY                   \
-+    (ibus_xkb_config_registry_get_type ())
-+#define IBUS_XKB_CONFIG_REGISTRY(obj)                   \
-+    (G_TYPE_CHECK_INSTANCE_CAST ((obj), IBUS_TYPE_XKB_CONFIG_REGISTRY, IBusXKBConfigRegistry))
-+#define IBUS_XKB_CONFIG_REGISTRY_CLASS(klass)           \
-+    (G_TYPE_CHECK_CLASS_CAST ((klass), IBUS_TYPE_XKB_CONFIG_REGISTRY, IBusXKBConfigRegistryClass))
-+#define IBUS_IS_XKB_CONFIG_REGISTRY(obj)                \
-+    (G_TYPE_CHECK_INSTANCE_TYPE ((obj), IBUS_TYPE_XKB_CONFIG_REGISTRY))
-+#define IBUS_IS_XKB_CONFIG_REGISTRY_CLASS(klass)        \
-+    (G_TYPE_CHECK_CLASS_TYPE ((klass), IBUS_TYPE_XKB_CONFIG_REGISTRY))
-+#define IBUS_XKB_CONFIG_REGISTRY_GET_CLASS(obj)         \
-+    (G_TYPE_INSTANCE_GET_CLASS ((obj), IBUS_TYPE_XKB_CONFIG_REGISTRY, IBusXKBConfigRegistryClass))
-+
-+G_BEGIN_DECLS
-+
-+typedef struct _IBusXKBConfigRegistry IBusXKBConfigRegistry;
-+typedef struct _IBusXKBConfigRegistryClass IBusXKBConfigRegistryClass;
-+
-+struct _IBusXKBConfigRegistry {
-+    IBusObject parent;
-+};
-+
-+struct _IBusXKBConfigRegistryClass {
-+    IBusObjectClass parent;
-+    /* signals */
-+    /*< private >*/
-+    /* padding */
-+    gpointer pdummy[8];
-+};
-+
-+
-+GType            ibus_xkb_config_registry_get_type
-+                                                 (void);
-+
-+/**
-+ * ibus_xkb_config_registry_new:
-+ * @returns: A newly allocated IBusXKBConfigRegistry
-+ *
-+ * New an IBusXKBConfigRegistry.
-+ */
-+IBusXKBConfigRegistry *
-+                 ibus_xkb_config_registry_new
-+                                                 (void);
-+
-+/**
-+ * ibus_xkb_config_registry_get_layout_list: (skip)
-+ * @xkb_config: An IBusXKBConfigRegistry.
-+ * @returns: A const GHashTable
-+ *
-+ * a const GHashTable
-+ */
-+const GHashTable *
-+                 ibus_xkb_config_registry_get_layout_list
-+                                                 (IBusXKBConfigRegistry *xkb_config);
-+
-+/**
-+ * ibus_xkb_config_registry_get_layout_lang: (skip)
-+ * @xkb_config: An IBusXKBConfigRegistry.
-+ * @returns: A const GHashTable
-+ *
-+ * a const GHashTable
-+ */
-+const GHashTable *
-+                 ibus_xkb_config_registry_get_layout_lang
-+                                                 (IBusXKBConfigRegistry *xkb_config);
-+
-+/**
-+ * ibus_xkb_config_registry_get_layout_desc: (skip)
-+ * @xkb_config: An IBusXKBConfigRegistry.
-+ * @returns: A const GHashTable
-+ *
-+ * a const GHashTable
-+ */
-+const GHashTable *
-+                 ibus_xkb_config_registry_get_layout_desc
-+                                                 (IBusXKBConfigRegistry *xkb_config);
-+
-+/**
-+ * ibus_xkb_config_registry_get_variant_desc: (skip)
-+ * @xkb_config: An IBusXKBConfigRegistry.
-+ * @returns: A const GHashTable
-+ *
-+ * a const GHashTable
-+ */
-+const GHashTable *
-+                 ibus_xkb_config_registry_get_variant_desc
-+                                                 (IBusXKBConfigRegistry *xkb_config);
-+
-+/**
-+ * ibus_xkb_config_registry_layout_list_get_variants:
-+ * @xkb_config: An IBusXKBConfigRegistry.
-+ * @layout: A layout.
-+ * @returns: (transfer container) (element-type utf8): A GList
-+ *
-+ * a GList
-+ */
-+GList *
-+                 ibus_xkb_config_registry_layout_list_get_variants
-+                                                 (IBusXKBConfigRegistry *xkb_config,
-+                                                  const gchar           *layout);
-+
-+/**
-+ * ibus_xkb_config_registry_layout_lang_get_langs:
-+ * @xkb_config: An IBusXKBConfigRegistry.
-+ * @layout: A layout.
-+ * @returns: (transfer container) (element-type utf8): A GList
-+ *
-+ * a GList
-+ */
-+GList *
-+                 ibus_xkb_config_registry_layout_lang_get_langs
-+                                                 (IBusXKBConfigRegistry *xkb_config,
-+                                                  const gchar           *layout);
-+
-+/**
-+ * ibus_xkb_config_registry_layout_desc_get_desc:
-+ * @xkb_config: An IBusXKBConfigRegistry.
-+ * @layout: A layout.
-+ * @returns: A layout description
-+ *
-+ * a layout description
-+ */
-+gchar *
-+                 ibus_xkb_config_registry_layout_desc_get_desc
-+                                                 (IBusXKBConfigRegistry *xkb_config,
-+                                                  const gchar           *layout);
-+
-+/**
-+ * ibus_xkb_config_registry_variant_desc_get_desc:
-+ * @xkb_config: An IBusXKBConfigRegistry.
-+ * @variant: A variant.
-+ * @returns: A variant description
-+ *
-+ * a variant description
-+ */
-+gchar *
-+                 ibus_xkb_config_registry_variant_desc_get_desc
-+                                                 (IBusXKBConfigRegistry *xkb_config,
-+                                                  const gchar           *variant);
-+G_END_DECLS
-+#endif
-diff --git a/ui/gtk/panel.py b/ui/gtk/panel.py
-index f71a36d..a202d13 100644
---- a/ui/gtk/panel.py
-+++ b/ui/gtk/panel.py
-@@ -132,6 +132,22 @@ class Panel(ibus.PanelBase):
-         self.__config_load_show_im_name()
-         # self.__bus.request_name(ibus.panel.IBUS_SERVICE_PANEL, 0)
- 
-+        # init xkb
-+        self.__xkblayout = ibus.XKBLayout(self.__config)
-+        use_xkb = self.__config.get_value("general", "use_system_keyboard_layout", False)
-+        if not use_xkb:
-+            self.__xkblayout.use_xkb(use_xkb)
-+        value = str(self.__config.get_value("general", "system_keyboard_layout", ''))
-+        if value == '':
-+            value = 'default'
-+        if value != 'default':
-+            self.__xkblayout.set_default_layout(value)
-+        value = str(self.__config.get_value("general", "system_keyboard_option", ''))
-+        if value == '':
-+            value = 'default'
-+        if value != 'default':
-+            self.__xkblayout.set_default_option(value)
-+
-     def set_cursor_location(self, x, y, w, h):
-         self.__candidate_panel.set_cursor_location(x, y, w, h)
- 
-@@ -226,14 +242,20 @@ class Panel(ibus.PanelBase):
-         if not enabled:
-             self.__set_im_icon(ICON_KEYBOARD)
-             self.__set_im_name(None)
-+            if self.__bus.get_use_sys_layout():
-+                self.__xkblayout.set_layout()
-         else:
-             engine = self.__focus_ic.get_engine()
-             if engine:
-                 self.__set_im_icon(engine.icon)
-                 self.__set_im_name(engine.longname)
-+                if self.__bus.get_use_sys_layout():
-+                    self.__xkblayout.set_layout(self.__engine_get_layout_wrapper(engine))
-             else:
-                 self.__set_im_icon(ICON_KEYBOARD)
-                 self.__set_im_name(None)
-+                if self.__bus.get_use_sys_layout():
-+                    self.__xkblayout.set_layout()
-         self.__language_bar.focus_in()
- 
-     def focus_out(self, ic):
-@@ -243,6 +265,8 @@ class Panel(ibus.PanelBase):
-         self.__language_bar.focus_out()
-         self.__set_im_icon(ICON_KEYBOARD)
-         self.__set_im_name(None)
-+        if self.__bus.get_use_sys_layout():
-+            self.__xkblayout.set_layout()
- 
-     def state_changed(self):
-         if not self.__focus_ic:
-@@ -255,14 +279,20 @@ class Panel(ibus.PanelBase):
-             self.reset()
-             self.__set_im_icon(ICON_KEYBOARD)
-             self.__set_im_name(None)
-+            if self.__bus.get_use_sys_layout():
-+                self.__xkblayout.set_layout()
-         else:
-             engine = self.__focus_ic.get_engine()
-             if engine:
-                 self.__set_im_icon(engine.icon)
-                 self.__set_im_name(engine.longname)
-+                if self.__bus.get_use_sys_layout():
-+                    self.__xkblayout.set_layout(self.__engine_get_layout_wrapper(engine))
-             else:
-                 self.__set_im_icon(ICON_KEYBOARD)
-                 self.__set_im_name(None)
-+                if self.__bus.get_use_sys_layout():
-+                    self.__xkblayout.set_layout()
- 
- 
-     def reset(self):
-@@ -542,3 +572,14 @@ class Panel(ibus.PanelBase):
-                                flags=glib.SPAWN_DO_NOT_REAP_CHILD)[0]
-         self.__setup_pid = pid
-         glib.child_watch_add(self.__setup_pid, self.__child_watch_cb)
-+
-+    def __engine_get_layout_wrapper(self, engine):
-+        # This code is for the back compatibility.
-+        # Should we remove the codes after all IM engines are changed
-+        # to "default" layout?
-+        if engine.name != None and engine.name.startswith("xkb:layout:"):
-+            return engine.layout
-+        elif engine.layout != None and engine.layout.startswith("default"):
-+            return engine.layout
-+        else:
-+            return "default"
-diff --git a/xkb/Makefile.am b/xkb/Makefile.am
-new file mode 100644
-index 0000000..b4d8ba2
---- /dev/null
-+++ b/xkb/Makefile.am
-@@ -0,0 +1,107 @@
-+# vim:set noet ts=4:
-+#
-+# ibus - The Input Bus
-+#
-+# Copyright (C) 2011 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+# Copyright (c) 2011 Peng Huang <shawn.p.huang@gmail.com>
-+# Copyright (c) 2011 Red Hat, Inc.
-+#
-+# This library is free software; you can redistribute it and/or
-+# modify it under the terms of the GNU Lesser General Public
-+# License as published by the Free Software Foundation; either
-+# version 2 of the License, or (at your option) any later version.
-+#
-+# This library is distributed in the hope that it will be useful,
-+# but WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+# GNU Lesser General Public License for more details.
-+#
-+# You should have received a copy of the GNU Lesser General Public
-+# License along with this program; if not, write to the
-+# Free Software Foundation, Inc., 59 Temple Place, Suite 330,
-+# Boston, MA  02111-1307  USA
-+
-+libibus = $(top_builddir)/src/libibus-@IBUS_API_VERSION@.la
-+
-+INCLUDES = \
-+        -I$(top_srcdir) \
-+        -I$(top_srcdir)/src \
-+	-DIBUS_LOCALEDIR=\"$(datadir)/locale\" \
-+	-DLIBEXECDIR=\""$(libexecdir)"\" \
-+        $(NULL)
-+
-+noinst_PROGRAMS = $(TESTS)
-+libexec_PROGRAMS =
-+EXTRA_DIST =
-+DISTCLEANFILES =
-+
-+if ENABLE_XKB
-+libexec_PROGRAMS += ibus-xkb
-+ibus_xkb_SOURCES = \
-+	ibus-xkb-main.c \
-+	xkblib.h \
-+	xkblib.c \
-+	$(NULL)
-+ibus_xkb_CFLAGS = \
-+	@XKB_CFLAGS@ \
-+	@X11_CFLAGS@ \
-+	@GLIB2_CFLAGS@ \
-+	$(NULL)
-+ibus_xkb_LDADD = \
-+	@XKB_LIBS@ \
-+	@X11_LIBS@ \
-+	@GLIB2_LIBS@ \
-+	$(libibus) \
-+	$(NULL)
-+
-+libexec_PROGRAMS += ibus-engine-xkb
-+ibus_engine_xkb_SOURCES = \
-+        ibus-engine-xkb-main.c \
-+        ibus-engine-xkb-main.h \
-+        ibus-simple-engine.c \
-+        ibus-simple-engine.h \
-+        gtkimcontextsimpleseqs.h \
-+        xkbxml.c \
-+        xkbxml.h \
-+        $(NULL)
-+ibus_engine_xkb_CFLAGS = \
-+	@GLIB2_CFLAGS@ \
-+	@GOBJECT2_CFLAGS@ \
-+	@GCONF_CFLAGS@ \
-+        $(NULL)
-+ibus_engine_xkb_LDADD = \
-+	@GLIB2_LIBS@ \
-+	@GOBJECT2_LIBS@ \
-+	@GCONF_LIBS@ \
-+	$(libibus) \
-+        $(NULL)
-+
-+xkblayoutdir = $(datadir)/ibus/component
-+xkblayout_in_files = xkblayout.xml.in
-+xkblayout_DATA = $(xkblayout_in_files:.xml.in=.xml)
-+
-+xkblayoutconfigdir = $(datadir)/ibus/xkb
-+xkblayoutconfig_in_files = xkblayoutconfig.xml.in
-+xkblayoutconfig_DATA = $(xkblayoutconfig_in_files:.xml.in=.xml)
-+
-+%.xml : %.xml.in
-+	@sed -e "s|\@libexecdir\@|$(libexecdir)|g" \
-+	     -e "s|\@datadir\@|$(datadir)|g" \
-+	     -e "s|\@XKB_PRELOAD_LAYOUTS\@|$(XKB_PRELOAD_LAYOUTS)|g" \
-+	$< > $@
-+
-+INCLUDES += \
-+	-DXKBLAYOUTCONFIG_FILE=\""$(xkblayoutconfigdir)/$(xkblayoutconfig_DATA)"\" \
-+	$(NULL)
-+
-+EXTRA_DIST += \
-+        $(xkblayout_in_files) \
-+        $(xkblayoutconfig_in_files) \
-+        $(NULL)
-+
-+DISTCLEANFILES += \
-+        $(xkblayout_DATA) \
-+        $(xkblayoutconfig_DATA) \
-+        $(NULL)
-+
-+endif
-diff --git a/xkb/Makefile.am.orig b/xkb/Makefile.am.orig
-new file mode 100644
-index 0000000..ad9cdd9
---- /dev/null
-+++ b/xkb/Makefile.am.orig
-@@ -0,0 +1,104 @@
-+# vim:set noet ts=4:
-+#
-+# ibus - The Input Bus
-+#
-+# Copyright (C) 2011 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+# Copyright (c) 2011 Peng Huang <shawn.p.huang@gmail.com>
-+# Copyright (c) 2011 Red Hat, Inc.
-+#
-+# This library is free software; you can redistribute it and/or
-+# modify it under the terms of the GNU Lesser General Public
-+# License as published by the Free Software Foundation; either
-+# version 2 of the License, or (at your option) any later version.
-+#
-+# This library is distributed in the hope that it will be useful,
-+# but WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+# GNU Lesser General Public License for more details.
-+#
-+# You should have received a copy of the GNU Lesser General Public
-+# License along with this program; if not, write to the
-+# Free Software Foundation, Inc., 59 Temple Place, Suite 330,
-+# Boston, MA  02111-1307  USA
-+
-+libibus = $(top_builddir)/src/libibus-@IBUS_API_VERSION@.la
-+
-+INCLUDES = \
-+        -I$(top_srcdir) \
-+        -I$(top_srcdir)/src \
-+	-DIBUS_LOCALEDIR=\"$(datadir)/locale\" \
-+	-DLIBEXECDIR=\""$(libexecdir)"\" \
-+        $(NULL)
-+
-+noinst_PROGRAMS = $(TESTS)
-+libexec_PROGRAMS =
-+EXTRA_DIST =
-+DISTCLEANFILES =
-+
-+if ENABLE_XKB
-+libexec_PROGRAMS += ibus-xkb
-+ibus_xkb_SOURCES = \
-+	ibus-xkb-main.c \
-+	xkblib.h \
-+	xkblib.c \
-+	$(NULL)
-+ibus_xkb_CFLAGS = \
-+	@XKB_CFLAGS@ \
-+	@X11_CFLAGS@ \
-+	@GLIB2_CFLAGS@ \
-+	$(NULL)
-+ibus_xkb_LDADD = \
-+	@XKB_LIBS@ \
-+	@X11_LIBS@ \
-+	@GLIB2_LIBS@ \
-+	$(libibus) \
-+	$(NULL)
-+
-+libexec_PROGRAMS += ibus-engine-xkb
-+ibus_engine_xkb_SOURCES = \
-+        ibus-engine-xkb-main.c \
-+        ibus-engine-xkb-main.h \
-+        xkbxml.c \
-+        xkbxml.h \
-+        $(NULL)
-+ibus_engine_xkb_CFLAGS = \
-+	@GLIB2_CFLAGS@ \
-+	@GOBJECT2_CFLAGS@ \
-+	@GCONF_CFLAGS@ \
-+        $(NULL)
-+ibus_engine_xkb_LDADD = \
-+	@GLIB2_LIBS@ \
-+	@GOBJECT2_LIBS@ \
-+	@GCONF_LIBS@ \
-+	$(libibus) \
-+        $(NULL)
-+
-+xkblayoutdir = $(datadir)/ibus/component
-+xkblayout_in_files = xkblayout.xml.in
-+xkblayout_DATA = $(xkblayout_in_files:.xml.in=.xml)
-+
-+xkblayoutconfigdir = $(datadir)/ibus/xkb
-+xkblayoutconfig_in_files = xkblayoutconfig.xml.in
-+xkblayoutconfig_DATA = $(xkblayoutconfig_in_files:.xml.in=.xml)
-+
-+%.xml : %.xml.in
-+	@sed -e "s|\@libexecdir\@|$(libexecdir)|g" \
-+	     -e "s|\@datadir\@|$(datadir)|g" \
-+	     -e "s|\@XKB_PRELOAD_LAYOUTS\@|$(XKB_PRELOAD_LAYOUTS)|g" \
-+	$< > $@
-+
-+INCLUDES += \
-+	-DXKBLAYOUTCONFIG_FILE=\""$(xkblayoutconfigdir)/$(xkblayoutconfig_DATA)"\" \
-+	$(NULL)
-+
-+EXTRA_DIST += \
-+        $(xkblayout_in_files) \
-+        $(xkblayoutconfig_in_files) \
-+        $(NULL)
-+
-+DISTCLEANFILES += \
-+        $(xkblayout_DATA) \
-+        $(xkblayoutconfig_DATA) \
-+        $(NULL)
-+
-+endif
-diff --git a/xkb/gtkimcontextsimpleseqs.h b/xkb/gtkimcontextsimpleseqs.h
-new file mode 100644
-index 0000000..00dc83c
---- /dev/null
-+++ b/xkb/gtkimcontextsimpleseqs.h
-@@ -0,0 +1,4484 @@
-+/* GTK - The GIMP Tool Kit
-+ * Copyright (C) 2007, 2008 GNOME Foundation
-+ *
-+ * This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2 of the License, or (at your option) any later version.
-+ *
-+ * This library is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General Public
-+ * License along with this library; if not, write to the
-+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-+ * Boston, MA 02111-1307, USA.
-+ */
-+
-+/*
-+ * File auto-generated from script found at http://bugzilla.gnome.org/show_bug.cgi?id=321896
-+ * using the input files
-+ *  Input   : http://gitweb.freedesktop.org/?p=xorg/lib/libX11.git;a=blob_plain;f=nls/en_US.UTF-8/Compose.pre
-+ *  Input   : http://www.cl.cam.ac.uk/~mgk25/ucs/keysyms.txt
-+ *  Input   : http://www.unicode.org/Public/UNIDATA/UnicodeData.txt
-+ *
-+ * This table is optimised for space and requires special handling to access the content.
-+ * This table is used solely by http://svn.gnome.org/viewcvs/gtk%2B/trunk/gtk/gtkimcontextsimple.c
-+ *
-+ * The resulting file is placed at http://svn.gnome.org/viewcvs/gtk%2B/trunk/gtk/gtkimcontextsimpleseqs.h
-+ * This file is described in bug report http://bugzilla.gnome.org/show_bug.cgi?id=321896
-+ */
-+
-+/*
-+ * Modified by the GTK+ Team and others 2007, 2008.  See the AUTHORS
-+ * file for a list of people on the GTK+ Team.  See the ChangeLog
-+ * files for a list of changes.  These files are distributed with
-+ * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
-+ */
-+
-+#ifndef __GTK_IM_CONTEXT_SIMPLE_SEQS_H__
-+#define __GTK_IM_CONTEXT_SIMPLE_SEQS_H__
-+
-+/* === These are the original comments of the file; we keep for historical purposes ===
-+ *
-+ * The following table was generated from the X compose tables include with
-+ * XFree86 4.0 using a set of Perl scripts. Contact Owen Taylor <otaylor@redhat.com>
-+ * to obtain the relevant perl scripts.
-+ *
-+ * The following compose letter letter sequences confliced
-+ *   Dstroke/dstroke and ETH/eth; resolved to Dstroke (Croation, Vietnamese, Lappish), over
-+ *                                ETH (Icelandic, Faroese, old English, IPA)  [ D- -D d- -d ]
-+ *   Amacron/amacron and ordfeminine; resolved to ordfeminine                 [ _A A_ a_ _a ]
-+ *   Amacron/amacron and Atilde/atilde; resolved to atilde                    [ -A A- a- -a ]
-+ *   Omacron/Omacron and masculine; resolved to masculine                     [ _O O_ o_ _o ]
-+ *   Omacron/omacron and Otilde/atilde; resolved to otilde                    [ -O O- o- -o ]
-+ *
-+ * [ Amacron and Omacron are in Latin-4 (Baltic). ordfeminine and masculine are used for
-+ *   spanish. atilde and otilde are used at least for Portuguese ]
-+ *
-+ *   at and Aring; resolved to Aring                                          [ AA ]
-+ *   guillemotleft and caron; resolved to guillemotleft                       [ << ]
-+ *   ogonek and cedilla; resolved to cedilla                                  [ ,, ]
-+ *
-+ * This probably should be resolved by first checking an additional set of compose tables
-+ * that depend on the locale or selected input method.
-+ */
-+
-+static const guint16 gtk_compose_seqs_compact[] = {
-+IBUS_dead_stroke, 144, 232, 241, 241, 241,
-+IBUS_Greek_accentdieresis, 241, 245, 245, 245, 245,
-+IBUS_dead_grave, 245, 307, 394, 606, 606,
-+IBUS_dead_acute, 606, 670, 766, 1042, 1042,
-+IBUS_dead_circumflex, 1042, 1166, 1166, 1366, 1366,
-+IBUS_dead_tilde, 1366, 1450, 1513, 1653, 1653,
-+IBUS_dead_macron, 1653, 1699, 1699, 1771, 1771,
-+IBUS_dead_breve, 1771, 1821, 1821, 1845, 1845,
-+IBUS_dead_abovedot, 1845, 1875, 1878, 1910, 1910,
-+IBUS_dead_diaeresis, 1910, 1998, 2007, 2031, 2031,
-+IBUS_dead_abovering, 2031, 2041, 2041, 2041, 2041,
-+IBUS_dead_doubleacute, 2041, 2051, 2051, 2051, 2051,
-+IBUS_dead_caron, 2051, 2093, 2093, 2101, 2101,
-+IBUS_dead_cedilla, 2101, 2113, 2113, 2113, 2113,
-+IBUS_dead_ogonek, 2113, 2123, 2123, 2123, 2123,
-+IBUS_dead_iota, 2123, 2145, 2244, 2676, 3336,
-+IBUS_dead_voiced_sound, 3336, 3382, 3382, 3382, 3382,
-+IBUS_dead_semivoiced_sound, 3382, 3392, 3392, 3392, 3392,
-+IBUS_dead_belowdot, 3392, 3408, 3408, 3424, 3424,
-+IBUS_dead_hook, 3424, 3500, 3500, 3556, 3556,
-+IBUS_dead_horn, 3556, 3566, 3566, 3566, 3566,
-+IBUS_dead_psili, 3566, 3594, 3594, 3594, 3594,
-+IBUS_dead_dasia, 3594, 3626, 3626, 3626, 3626,
-+IBUS_Multi_key, 3626, 3626, 9560, 13268, 15133,
-+IBUS_space, 0x002F,
-+IBUS_2, 0x01BB,
-+IBUS_A, 0x023A,
-+IBUS_B, 0x0243,
-+IBUS_C, 0x023B,
-+IBUS_D, 0x0110,
-+IBUS_E, 0x0246,
-+IBUS_G, 0x01E4,
-+IBUS_H, 0x0126,
-+IBUS_I, 0x0197,
-+IBUS_J, 0x0248,
-+IBUS_L, 0x0141,
-+IBUS_O, 0x00D8,
-+IBUS_P, 0x2C63,
-+IBUS_R, 0x024C,
-+IBUS_T, 0x0166,
-+IBUS_U, 0x0244,
-+IBUS_Y, 0x024E,
-+IBUS_Z, 0x01B5,
-+IBUS_a, 0x2C65,
-+IBUS_b, 0x0180,
-+IBUS_c, 0x023C,
-+IBUS_d, 0x0111,
-+IBUS_e, 0x0247,
-+IBUS_g, 0x01E5,
-+IBUS_h, 0x0127,
-+IBUS_i, 0x0268,
-+IBUS_j, 0x0249,
-+IBUS_l, 0x0142,
-+IBUS_o, 0x00F8,
-+IBUS_p, 0x1D7D,
-+IBUS_r, 0x024D,
-+IBUS_t, 0x0167,
-+IBUS_u, 0x0289,
-+IBUS_y, 0x024F,
-+IBUS_z, 0x01B6,
-+IBUS_nobreakspace, 0x0338,
-+IBUS_Oacute, 0x01FE,
-+IBUS_oacute, 0x01FF,
-+0x0237, 0x025F,
-+0x0269, 0x1D7C,
-+IBUS_dead_stroke, 0x002F,
-+IBUS_lessthanequal, 0x2270,
-+IBUS_greaterthanequal, 0x2271,
-+IBUS_dead_acute, IBUS_O, 0x01FE,
-+IBUS_dead_acute, IBUS_o, 0x01FF,
-+IBUS_dead_abovedot, IBUS_j, 0x025F,
-+IBUS_Greek_iota, 0x0390,
-+IBUS_Greek_upsilon, 0x03B0,
-+IBUS_space, 0x0060,
-+IBUS_V, 0x01DB,
-+IBUS_v, 0x01DC,
-+IBUS_nobreakspace, 0x0300,
-+IBUS_Abreve, 0x1EB0,
-+IBUS_abreve, 0x1EB1,
-+IBUS_Emacron, 0x1E14,
-+IBUS_emacron, 0x1E15,
-+IBUS_Omacron, 0x1E50,
-+IBUS_omacron, 0x1E51,
-+IBUS_Cyrillic_ie, 0x0450,
-+IBUS_Cyrillic_i, 0x045D,
-+IBUS_Cyrillic_IE, 0x0400,
-+IBUS_Cyrillic_I, 0x040D,
-+IBUS_Greek_iotadieresis, 0x1FD2,
-+IBUS_Greek_upsilondieresis, 0x1FE2,
-+IBUS_Greek_ALPHA, 0x1FBA,
-+IBUS_Greek_EPSILON, 0x1FC8,
-+IBUS_Greek_ETA, 0x1FCA,
-+IBUS_Greek_IOTA, 0x1FDA,
-+IBUS_Greek_OMICRON, 0x1FF8,
-+IBUS_Greek_UPSILON, 0x1FEA,
-+IBUS_Greek_OMEGA, 0x1FFA,
-+IBUS_Greek_alpha, 0x1F70,
-+IBUS_Greek_epsilon, 0x1F72,
-+IBUS_Greek_eta, 0x1F74,
-+IBUS_Greek_iota, 0x1F76,
-+IBUS_Greek_omicron, 0x1F78,
-+IBUS_Greek_upsilon, 0x1F7A,
-+IBUS_Greek_omega, 0x1F7C,
-+IBUS_dead_grave, 0x0060,
-+IBUS_dead_diaeresis, IBUS_Greek_iota, 0x1FD2,
-+IBUS_dead_diaeresis, IBUS_Greek_upsilon, 0x1FE2,
-+IBUS_dead_psili, IBUS_Greek_ALPHA, 0x1F0A,
-+IBUS_dead_psili, IBUS_Greek_EPSILON, 0x1F1A,
-+IBUS_dead_psili, IBUS_Greek_ETA, 0x1F2A,
-+IBUS_dead_psili, IBUS_Greek_IOTA, 0x1F3A,
-+IBUS_dead_psili, IBUS_Greek_OMICRON, 0x1F4A,
-+IBUS_dead_psili, IBUS_Greek_OMEGA, 0x1F6A,
-+IBUS_dead_psili, IBUS_Greek_alpha, 0x1F02,
-+IBUS_dead_psili, IBUS_Greek_epsilon, 0x1F12,
-+IBUS_dead_psili, IBUS_Greek_eta, 0x1F22,
-+IBUS_dead_psili, IBUS_Greek_iota, 0x1F32,
-+IBUS_dead_psili, IBUS_Greek_omicron, 0x1F42,
-+IBUS_dead_psili, IBUS_Greek_upsilon, 0x1F52,
-+IBUS_dead_psili, IBUS_Greek_omega, 0x1F62,
-+IBUS_dead_dasia, IBUS_Greek_ALPHA, 0x1F0B,
-+IBUS_dead_dasia, IBUS_Greek_EPSILON, 0x1F1B,
-+IBUS_dead_dasia, IBUS_Greek_ETA, 0x1F2B,
-+IBUS_dead_dasia, IBUS_Greek_IOTA, 0x1F3B,
-+IBUS_dead_dasia, IBUS_Greek_OMICRON, 0x1F4B,
-+IBUS_dead_dasia, IBUS_Greek_UPSILON, 0x1F5B,
-+IBUS_dead_dasia, IBUS_Greek_OMEGA, 0x1F6B,
-+IBUS_dead_dasia, IBUS_Greek_alpha, 0x1F03,
-+IBUS_dead_dasia, IBUS_Greek_epsilon, 0x1F13,
-+IBUS_dead_dasia, IBUS_Greek_eta, 0x1F23,
-+IBUS_dead_dasia, IBUS_Greek_iota, 0x1F33,
-+IBUS_dead_dasia, IBUS_Greek_omicron, 0x1F43,
-+IBUS_dead_dasia, IBUS_Greek_upsilon, 0x1F53,
-+IBUS_dead_dasia, IBUS_Greek_omega, 0x1F63,
-+IBUS_Multi_key, IBUS_quotedbl, IBUS_U, 0x01DB,
-+IBUS_Multi_key, IBUS_quotedbl, IBUS_u, 0x01DC,
-+IBUS_Multi_key, IBUS_quotedbl, IBUS_Greek_iota, 0x1FD2,
-+IBUS_Multi_key, IBUS_quotedbl, IBUS_Greek_upsilon, 0x1FE2,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_ALPHA, 0x1F0B,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_EPSILON, 0x1F1B,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_ETA, 0x1F2B,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_IOTA, 0x1F3B,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_OMICRON, 0x1F4B,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_UPSILON, 0x1F5B,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_OMEGA, 0x1F6B,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_alpha, 0x1F03,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_epsilon, 0x1F13,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_eta, 0x1F23,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_iota, 0x1F33,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_omicron, 0x1F43,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_upsilon, 0x1F53,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_omega, 0x1F63,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_ALPHA, 0x1F0A,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_EPSILON, 0x1F1A,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_ETA, 0x1F2A,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_IOTA, 0x1F3A,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_OMICRON, 0x1F4A,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_OMEGA, 0x1F6A,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_alpha, 0x1F02,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_epsilon, 0x1F12,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_eta, 0x1F22,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_iota, 0x1F32,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_omicron, 0x1F42,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_upsilon, 0x1F52,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_omega, 0x1F62,
-+IBUS_Multi_key, IBUS_plus, IBUS_O, 0x1EDC,
-+IBUS_Multi_key, IBUS_plus, IBUS_U, 0x1EEA,
-+IBUS_Multi_key, IBUS_plus, IBUS_o, 0x1EDD,
-+IBUS_Multi_key, IBUS_plus, IBUS_u, 0x1EEB,
-+IBUS_Multi_key, IBUS_U, IBUS_A, 0x1EB0,
-+IBUS_Multi_key, IBUS_U, IBUS_a, 0x1EB1,
-+IBUS_Multi_key, IBUS_asciicircum, IBUS_A, 0x1EA6,
-+IBUS_Multi_key, IBUS_asciicircum, IBUS_E, 0x1EC0,
-+IBUS_Multi_key, IBUS_asciicircum, IBUS_O, 0x1ED2,
-+IBUS_Multi_key, IBUS_asciicircum, IBUS_a, 0x1EA7,
-+IBUS_Multi_key, IBUS_asciicircum, IBUS_e, 0x1EC1,
-+IBUS_Multi_key, IBUS_asciicircum, IBUS_o, 0x1ED3,
-+IBUS_Multi_key, IBUS_underscore, IBUS_E, 0x1E14,
-+IBUS_Multi_key, IBUS_underscore, IBUS_O, 0x1E50,
-+IBUS_Multi_key, IBUS_underscore, IBUS_e, 0x1E15,
-+IBUS_Multi_key, IBUS_underscore, IBUS_o, 0x1E51,
-+IBUS_Multi_key, IBUS_b, IBUS_A, 0x1EB0,
-+IBUS_Multi_key, IBUS_b, IBUS_a, 0x1EB1,
-+IBUS_Multi_key, IBUS_macron, IBUS_E, 0x1E14,
-+IBUS_Multi_key, IBUS_macron, IBUS_O, 0x1E50,
-+IBUS_Multi_key, IBUS_macron, IBUS_e, 0x1E15,
-+IBUS_Multi_key, IBUS_macron, IBUS_o, 0x1E51,
-+IBUS_space, 0x0027,
-+IBUS_V, 0x01D7,
-+IBUS_v, 0x01D8,
-+IBUS_nobreakspace, 0x0301,
-+IBUS_Abreve, 0x1EAE,
-+IBUS_abreve, 0x1EAF,
-+IBUS_Emacron, 0x1E16,
-+IBUS_emacron, 0x1E17,
-+IBUS_Utilde, 0x1E78,
-+IBUS_omacron, 0x1E53,
-+IBUS_utilde, 0x1E79,
-+IBUS_Cyrillic_ghe, 0x0453,
-+IBUS_Cyrillic_ka, 0x045C,
-+IBUS_Cyrillic_GHE, 0x0403,
-+IBUS_Cyrillic_KA, 0x040C,
-+IBUS_Greek_iotadieresis, 0x0390,
-+IBUS_Greek_upsilondieresis, 0x03B0,
-+IBUS_Greek_ALPHA, 0x0386,
-+IBUS_Greek_EPSILON, 0x0388,
-+IBUS_Greek_ETA, 0x0389,
-+IBUS_Greek_IOTA, 0x038A,
-+IBUS_Greek_OMICRON, 0x038C,
-+IBUS_Greek_UPSILON, 0x038E,
-+IBUS_Greek_OMEGA, 0x038F,
-+IBUS_Greek_alpha, 0x03AC,
-+IBUS_Greek_epsilon, 0x03AD,
-+IBUS_Greek_eta, 0x03AE,
-+IBUS_Greek_iota, 0x03AF,
-+IBUS_Greek_omicron, 0x03CC,
-+IBUS_Greek_upsilon, 0x03CD,
-+IBUS_Greek_omega, 0x03CE,
-+IBUS_dead_acute, 0x00B4,
-+IBUS_dead_stroke, IBUS_O, 0x01FE,
-+IBUS_dead_stroke, IBUS_o, 0x01FF,
-+IBUS_dead_diaeresis, IBUS_space, 0x0385,
-+IBUS_dead_diaeresis, IBUS_Greek_iota, 0x0390,
-+IBUS_dead_diaeresis, IBUS_Greek_upsilon, 0x03B0,
-+IBUS_dead_psili, IBUS_Greek_ALPHA, 0x1F0C,
-+IBUS_dead_psili, IBUS_Greek_EPSILON, 0x1F1C,
-+IBUS_dead_psili, IBUS_Greek_ETA, 0x1F2C,
-+IBUS_dead_psili, IBUS_Greek_IOTA, 0x1F3C,
-+IBUS_dead_psili, IBUS_Greek_OMICRON, 0x1F4C,
-+IBUS_dead_psili, IBUS_Greek_OMEGA, 0x1F6C,
-+IBUS_dead_psili, IBUS_Greek_alpha, 0x1F04,
-+IBUS_dead_psili, IBUS_Greek_epsilon, 0x1F14,
-+IBUS_dead_psili, IBUS_Greek_eta, 0x1F24,
-+IBUS_dead_psili, IBUS_Greek_iota, 0x1F34,
-+IBUS_dead_psili, IBUS_Greek_omicron, 0x1F44,
-+IBUS_dead_psili, IBUS_Greek_upsilon, 0x1F54,
-+IBUS_dead_psili, IBUS_Greek_omega, 0x1F64,
-+IBUS_dead_dasia, IBUS_Greek_ALPHA, 0x1F0D,
-+IBUS_dead_dasia, IBUS_Greek_EPSILON, 0x1F1D,
-+IBUS_dead_dasia, IBUS_Greek_ETA, 0x1F2D,
-+IBUS_dead_dasia, IBUS_Greek_IOTA, 0x1F3D,
-+IBUS_dead_dasia, IBUS_Greek_OMICRON, 0x1F4D,
-+IBUS_dead_dasia, IBUS_Greek_UPSILON, 0x1F5D,
-+IBUS_dead_dasia, IBUS_Greek_OMEGA, 0x1F6D,
-+IBUS_dead_dasia, IBUS_Greek_alpha, 0x1F05,
-+IBUS_dead_dasia, IBUS_Greek_epsilon, 0x1F15,
-+IBUS_dead_dasia, IBUS_Greek_eta, 0x1F25,
-+IBUS_dead_dasia, IBUS_Greek_iota, 0x1F35,
-+IBUS_dead_dasia, IBUS_Greek_omicron, 0x1F45,
-+IBUS_dead_dasia, IBUS_Greek_upsilon, 0x1F55,
-+IBUS_dead_dasia, IBUS_Greek_omega, 0x1F65,
-+IBUS_Multi_key, IBUS_quotedbl, IBUS_I, 0x1E2E,
-+IBUS_Multi_key, IBUS_quotedbl, IBUS_U, 0x01D7,
-+IBUS_Multi_key, IBUS_quotedbl, IBUS_i, 0x1E2F,
-+IBUS_Multi_key, IBUS_quotedbl, IBUS_u, 0x01D8,
-+IBUS_Multi_key, IBUS_quotedbl, IBUS_Greek_iota, 0x0390,
-+IBUS_Multi_key, IBUS_quotedbl, IBUS_Greek_upsilon, 0x03B0,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_ALPHA, 0x1F0D,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_EPSILON, 0x1F1D,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_ETA, 0x1F2D,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_IOTA, 0x1F3D,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_OMICRON, 0x1F4D,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_UPSILON, 0x1F5D,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_OMEGA, 0x1F6D,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_alpha, 0x1F05,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_epsilon, 0x1F15,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_eta, 0x1F25,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_iota, 0x1F35,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_omicron, 0x1F45,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_upsilon, 0x1F55,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_omega, 0x1F65,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_ALPHA, 0x1F0C,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_EPSILON, 0x1F1C,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_ETA, 0x1F2C,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_IOTA, 0x1F3C,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_OMICRON, 0x1F4C,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_OMEGA, 0x1F6C,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_alpha, 0x1F04,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_epsilon, 0x1F14,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_eta, 0x1F24,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_iota, 0x1F34,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_omicron, 0x1F44,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_upsilon, 0x1F54,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_omega, 0x1F64,
-+IBUS_Multi_key, IBUS_plus, IBUS_O, 0x1EDA,
-+IBUS_Multi_key, IBUS_plus, IBUS_U, 0x1EE8,
-+IBUS_Multi_key, IBUS_plus, IBUS_o, 0x1EDB,
-+IBUS_Multi_key, IBUS_plus, IBUS_u, 0x1EE9,
-+IBUS_Multi_key, IBUS_comma, IBUS_C, 0x1E08,
-+IBUS_Multi_key, IBUS_comma, IBUS_c, 0x1E09,
-+IBUS_Multi_key, IBUS_slash, IBUS_O, 0x01FE,
-+IBUS_Multi_key, IBUS_slash, IBUS_o, 0x01FF,
-+IBUS_Multi_key, IBUS_U, IBUS_A, 0x1EAE,
-+IBUS_Multi_key, IBUS_U, IBUS_a, 0x1EAF,
-+IBUS_Multi_key, IBUS_asciicircum, IBUS_A, 0x1EA4,
-+IBUS_Multi_key, IBUS_asciicircum, IBUS_E, 0x1EBE,
-+IBUS_Multi_key, IBUS_asciicircum, IBUS_O, 0x1ED0,
-+IBUS_Multi_key, IBUS_asciicircum, IBUS_a, 0x1EA5,
-+IBUS_Multi_key, IBUS_asciicircum, IBUS_e, 0x1EBF,
-+IBUS_Multi_key, IBUS_asciicircum, IBUS_o, 0x1ED1,
-+IBUS_Multi_key, IBUS_underscore, IBUS_E, 0x1E16,
-+IBUS_Multi_key, IBUS_underscore, IBUS_O, 0x1E52,
-+IBUS_Multi_key, IBUS_underscore, IBUS_e, 0x1E17,
-+IBUS_Multi_key, IBUS_underscore, IBUS_o, 0x1E53,
-+IBUS_Multi_key, IBUS_b, IBUS_A, 0x1EAE,
-+IBUS_Multi_key, IBUS_b, IBUS_a, 0x1EAF,
-+IBUS_Multi_key, IBUS_o, IBUS_A, 0x01FA,
-+IBUS_Multi_key, IBUS_o, IBUS_a, 0x01FB,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_O, 0x1E4C,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_U, 0x1E78,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_o, 0x1E4D,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_u, 0x1E79,
-+IBUS_Multi_key, IBUS_macron, IBUS_E, 0x1E16,
-+IBUS_Multi_key, IBUS_macron, IBUS_O, 0x1E52,
-+IBUS_Multi_key, IBUS_macron, IBUS_e, 0x1E17,
-+IBUS_Multi_key, IBUS_macron, IBUS_o, 0x1E53,
-+IBUS_Multi_key, IBUS_cedilla, IBUS_C, 0x1E08,
-+IBUS_Multi_key, IBUS_cedilla, IBUS_c, 0x1E09,
-+IBUS_Multi_key, IBUS_KP_Divide, IBUS_O, 0x01FE,
-+IBUS_Multi_key, IBUS_KP_Divide, IBUS_o, 0x01FF,
-+IBUS_space, 0x005E,
-+IBUS_parenleft, 0x207D,
-+IBUS_parenright, 0x207E,
-+IBUS_plus, 0x207A,
-+IBUS_minus, 0x207B,
-+IBUS_0, 0x2070,
-+IBUS_1, 0x00B9,
-+IBUS_2, 0x00B2,
-+IBUS_3, 0x00B3,
-+IBUS_4, 0x2074,
-+IBUS_5, 0x2075,
-+IBUS_6, 0x2076,
-+IBUS_7, 0x2077,
-+IBUS_8, 0x2078,
-+IBUS_9, 0x2079,
-+IBUS_equal, 0x207C,
-+IBUS_nobreakspace, 0x0302,
-+IBUS_Agrave, 0x1EA6,
-+IBUS_Aacute, 0x1EA4,
-+IBUS_Atilde, 0x1EAA,
-+IBUS_Egrave, 0x1EC0,
-+IBUS_Eacute, 0x1EBE,
-+IBUS_Ograve, 0x1ED2,
-+IBUS_Oacute, 0x1ED0,
-+IBUS_Otilde, 0x1ED6,
-+IBUS_agrave, 0x1EA7,
-+IBUS_aacute, 0x1EA5,
-+IBUS_atilde, 0x1EAB,
-+IBUS_egrave, 0x1EC1,
-+IBUS_eacute, 0x1EBF,
-+IBUS_ograve, 0x1ED3,
-+IBUS_oacute, 0x1ED1,
-+IBUS_otilde, 0x1ED7,
-+0x2212, 0x207B,
-+0x4E00, 0x3192,
-+0x4E01, 0x319C,
-+0x4E09, 0x3194,
-+0x4E0A, 0x3196,
-+0x4E0B, 0x3198,
-+0x4E19, 0x319B,
-+0x4E2D, 0x3197,
-+0x4E59, 0x319A,
-+0x4E8C, 0x3193,
-+0x4EBA, 0x319F,
-+0x56DB, 0x3195,
-+0x5730, 0x319E,
-+0x5929, 0x319D,
-+0x7532, 0x3199,
-+IBUS_dead_circumflex, 0x005E,
-+IBUS_KP_Space, 0x00B2,
-+IBUS_KP_Add, 0x207A,
-+IBUS_KP_0, 0x2070,
-+IBUS_KP_1, 0x00B9,
-+IBUS_KP_2, 0x00B2,
-+IBUS_KP_3, 0x00B3,
-+IBUS_KP_4, 0x2074,
-+IBUS_KP_5, 0x2075,
-+IBUS_KP_6, 0x2076,
-+IBUS_KP_7, 0x2077,
-+IBUS_KP_8, 0x2078,
-+IBUS_KP_9, 0x2079,
-+IBUS_KP_Equal, 0x207C,
-+IBUS_Multi_key, IBUS_exclam, IBUS_A, 0x1EAC,
-+IBUS_Multi_key, IBUS_exclam, IBUS_E, 0x1EC6,
-+IBUS_Multi_key, IBUS_exclam, IBUS_O, 0x1ED8,
-+IBUS_Multi_key, IBUS_exclam, IBUS_a, 0x1EAD,
-+IBUS_Multi_key, IBUS_exclam, IBUS_e, 0x1EC7,
-+IBUS_Multi_key, IBUS_exclam, IBUS_o, 0x1ED9,
-+IBUS_Multi_key, IBUS_S, IBUS_M, 0x2120,
-+IBUS_Multi_key, IBUS_S, IBUS_m, 0x2120,
-+IBUS_Multi_key, IBUS_T, IBUS_M, 0x2122,
-+IBUS_Multi_key, IBUS_T, IBUS_m, 0x2122,
-+IBUS_Multi_key, IBUS_underscore, IBUS_a, 0x00AA,
-+IBUS_Multi_key, IBUS_underscore, IBUS_h, 0x02B0,
-+IBUS_Multi_key, IBUS_underscore, IBUS_i, 0x2071,
-+IBUS_Multi_key, IBUS_underscore, IBUS_j, 0x02B2,
-+IBUS_Multi_key, IBUS_underscore, IBUS_l, 0x02E1,
-+IBUS_Multi_key, IBUS_underscore, IBUS_n, 0x207F,
-+IBUS_Multi_key, IBUS_underscore, IBUS_o, 0x00BA,
-+IBUS_Multi_key, IBUS_underscore, IBUS_r, 0x02B3,
-+IBUS_Multi_key, IBUS_underscore, IBUS_s, 0x02E2,
-+IBUS_Multi_key, IBUS_underscore, IBUS_w, 0x02B7,
-+IBUS_Multi_key, IBUS_underscore, IBUS_x, 0x02E3,
-+IBUS_Multi_key, IBUS_underscore, IBUS_y, 0x02B8,
-+IBUS_Multi_key, IBUS_underscore, 0x0263, 0x02E0,
-+IBUS_Multi_key, IBUS_underscore, 0x0266, 0x02B1,
-+IBUS_Multi_key, IBUS_underscore, 0x0279, 0x02B4,
-+IBUS_Multi_key, IBUS_underscore, 0x027B, 0x02B5,
-+IBUS_Multi_key, IBUS_underscore, 0x0281, 0x02B6,
-+IBUS_Multi_key, IBUS_underscore, 0x0295, 0x02E4,
-+IBUS_Multi_key, IBUS_s, IBUS_M, 0x2120,
-+IBUS_Multi_key, IBUS_s, IBUS_m, 0x2120,
-+IBUS_Multi_key, IBUS_t, IBUS_M, 0x2122,
-+IBUS_Multi_key, IBUS_t, IBUS_m, 0x2122,
-+IBUS_Multi_key, IBUS_underbar, IBUS_a, 0x00AA,
-+IBUS_Multi_key, IBUS_underbar, IBUS_h, 0x02B0,
-+IBUS_Multi_key, IBUS_underbar, IBUS_i, 0x2071,
-+IBUS_Multi_key, IBUS_underbar, IBUS_j, 0x02B2,
-+IBUS_Multi_key, IBUS_underbar, IBUS_l, 0x02E1,
-+IBUS_Multi_key, IBUS_underbar, IBUS_n, 0x207F,
-+IBUS_Multi_key, IBUS_underbar, IBUS_o, 0x00BA,
-+IBUS_Multi_key, IBUS_underbar, IBUS_r, 0x02B3,
-+IBUS_Multi_key, IBUS_underbar, IBUS_s, 0x02E2,
-+IBUS_Multi_key, IBUS_underbar, IBUS_w, 0x02B7,
-+IBUS_Multi_key, IBUS_underbar, IBUS_x, 0x02E3,
-+IBUS_Multi_key, IBUS_underbar, IBUS_y, 0x02B8,
-+IBUS_Multi_key, IBUS_underbar, 0x0263, 0x02E0,
-+IBUS_Multi_key, IBUS_underbar, 0x0266, 0x02B1,
-+IBUS_Multi_key, IBUS_underbar, 0x0279, 0x02B4,
-+IBUS_Multi_key, IBUS_underbar, 0x027B, 0x02B5,
-+IBUS_Multi_key, IBUS_underbar, 0x0281, 0x02B6,
-+IBUS_Multi_key, IBUS_underbar, 0x0295, 0x02E4,
-+IBUS_space, 0x007E,
-+IBUS_less, 0x2272,
-+IBUS_equal, 0x2243,
-+IBUS_greater, 0x2273,
-+IBUS_nobreakspace, 0x0303,
-+IBUS_Oacute, 0x1E4C,
-+IBUS_Odiaeresis, 0x1E4E,
-+IBUS_Uacute, 0x1E78,
-+IBUS_oacute, 0x1E4D,
-+IBUS_odiaeresis, 0x1E4F,
-+IBUS_uacute, 0x1E79,
-+IBUS_Abreve, 0x1EB4,
-+IBUS_abreve, 0x1EB5,
-+IBUS_Omacron, 0x022C,
-+IBUS_omacron, 0x022D,
-+IBUS_Greek_iotadieresis, 0x1FD7,
-+IBUS_Greek_upsilondieresis, 0x1FE7,
-+IBUS_Greek_alpha, 0x1FB6,
-+IBUS_Greek_eta, 0x1FC6,
-+IBUS_Greek_iota, 0x1FD6,
-+IBUS_Greek_upsilon, 0x1FE6,
-+IBUS_Greek_omega, 0x1FF6,
-+0x1F00, 0x1F06,
-+0x1F01, 0x1F07,
-+0x1F08, 0x1F0E,
-+0x1F09, 0x1F0F,
-+0x1F20, 0x1F26,
-+0x1F21, 0x1F27,
-+0x1F28, 0x1F2E,
-+0x1F29, 0x1F2F,
-+0x1F30, 0x1F36,
-+0x1F31, 0x1F37,
-+0x1F38, 0x1F3E,
-+0x1F39, 0x1F3F,
-+0x1F50, 0x1F56,
-+0x1F51, 0x1F57,
-+0x1F59, 0x1F5F,
-+0x1F60, 0x1F66,
-+0x1F61, 0x1F67,
-+0x1F68, 0x1F6E,
-+0x1F69, 0x1F6F,
-+IBUS_dead_tilde, 0x007E,
-+IBUS_dead_diaeresis, IBUS_Greek_iota, 0x1FD7,
-+IBUS_dead_diaeresis, IBUS_Greek_upsilon, 0x1FE7,
-+IBUS_dead_psili, IBUS_Greek_ALPHA, 0x1F0E,
-+IBUS_dead_psili, IBUS_Greek_ETA, 0x1F2E,
-+IBUS_dead_psili, IBUS_Greek_IOTA, 0x1F3E,
-+IBUS_dead_psili, IBUS_Greek_OMEGA, 0x1F6E,
-+IBUS_dead_psili, IBUS_Greek_alpha, 0x1F06,
-+IBUS_dead_psili, IBUS_Greek_eta, 0x1F26,
-+IBUS_dead_psili, IBUS_Greek_iota, 0x1F36,
-+IBUS_dead_psili, IBUS_Greek_upsilon, 0x1F56,
-+IBUS_dead_psili, IBUS_Greek_omega, 0x1F66,
-+IBUS_dead_dasia, IBUS_Greek_ALPHA, 0x1F0F,
-+IBUS_dead_dasia, IBUS_Greek_ETA, 0x1F2F,
-+IBUS_dead_dasia, IBUS_Greek_IOTA, 0x1F3F,
-+IBUS_dead_dasia, IBUS_Greek_UPSILON, 0x1F5F,
-+IBUS_dead_dasia, IBUS_Greek_OMEGA, 0x1F6F,
-+IBUS_dead_dasia, IBUS_Greek_alpha, 0x1F07,
-+IBUS_dead_dasia, IBUS_Greek_eta, 0x1F27,
-+IBUS_dead_dasia, IBUS_Greek_iota, 0x1F37,
-+IBUS_dead_dasia, IBUS_Greek_upsilon, 0x1F57,
-+IBUS_dead_dasia, IBUS_Greek_omega, 0x1F67,
-+IBUS_Multi_key, IBUS_quotedbl, IBUS_Greek_iota, 0x1FD7,
-+IBUS_Multi_key, IBUS_quotedbl, IBUS_Greek_upsilon, 0x1FE7,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_ALPHA, 0x1F0F,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_ETA, 0x1F2F,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_IOTA, 0x1F3F,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_UPSILON, 0x1F5F,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_OMEGA, 0x1F6F,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_alpha, 0x1F07,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_eta, 0x1F27,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_iota, 0x1F37,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_upsilon, 0x1F57,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_omega, 0x1F67,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_ALPHA, 0x1F0E,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_ETA, 0x1F2E,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_IOTA, 0x1F3E,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_OMEGA, 0x1F6E,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_alpha, 0x1F06,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_eta, 0x1F26,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_iota, 0x1F36,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_upsilon, 0x1F56,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_omega, 0x1F66,
-+IBUS_Multi_key, IBUS_plus, IBUS_O, 0x1EE0,
-+IBUS_Multi_key, IBUS_plus, IBUS_U, 0x1EEE,
-+IBUS_Multi_key, IBUS_plus, IBUS_o, 0x1EE1,
-+IBUS_Multi_key, IBUS_plus, IBUS_u, 0x1EEF,
-+IBUS_Multi_key, IBUS_U, IBUS_A, 0x1EB4,
-+IBUS_Multi_key, IBUS_U, IBUS_a, 0x1EB5,
-+IBUS_Multi_key, IBUS_asciicircum, IBUS_A, 0x1EAA,
-+IBUS_Multi_key, IBUS_asciicircum, IBUS_E, 0x1EC4,
-+IBUS_Multi_key, IBUS_asciicircum, IBUS_O, 0x1ED6,
-+IBUS_Multi_key, IBUS_asciicircum, IBUS_a, 0x1EAB,
-+IBUS_Multi_key, IBUS_asciicircum, IBUS_e, 0x1EC5,
-+IBUS_Multi_key, IBUS_asciicircum, IBUS_o, 0x1ED7,
-+IBUS_Multi_key, IBUS_b, IBUS_A, 0x1EB4,
-+IBUS_Multi_key, IBUS_b, IBUS_a, 0x1EB5,
-+IBUS_space, 0x00AF,
-+IBUS_V, 0x01D5,
-+IBUS_v, 0x01D6,
-+IBUS_nobreakspace, 0x0304,
-+IBUS_Egrave, 0x1E14,
-+IBUS_Eacute, 0x1E16,
-+IBUS_Ograve, 0x1E50,
-+IBUS_Oacute, 0x1E52,
-+IBUS_egrave, 0x1E15,
-+IBUS_eacute, 0x1E17,
-+IBUS_ograve, 0x1E51,
-+IBUS_oacute, 0x1E53,
-+IBUS_Cyrillic_i, 0x04E3,
-+IBUS_Cyrillic_u, 0x04EF,
-+IBUS_Cyrillic_I, 0x04E2,
-+IBUS_Cyrillic_U, 0x04EE,
-+IBUS_Greek_ALPHA, 0x1FB9,
-+IBUS_Greek_IOTA, 0x1FD9,
-+IBUS_Greek_UPSILON, 0x1FE9,
-+IBUS_Greek_alpha, 0x1FB1,
-+IBUS_Greek_iota, 0x1FD1,
-+IBUS_Greek_upsilon, 0x1FE1,
-+IBUS_dead_macron, 0x00AF,
-+IBUS_Multi_key, IBUS_exclam, IBUS_L, 0x1E38,
-+IBUS_Multi_key, IBUS_exclam, IBUS_R, 0x1E5C,
-+IBUS_Multi_key, IBUS_exclam, IBUS_l, 0x1E39,
-+IBUS_Multi_key, IBUS_exclam, IBUS_r, 0x1E5D,
-+IBUS_Multi_key, IBUS_quotedbl, IBUS_A, 0x01DE,
-+IBUS_Multi_key, IBUS_quotedbl, IBUS_O, 0x022A,
-+IBUS_Multi_key, IBUS_quotedbl, IBUS_U, 0x01D5,
-+IBUS_Multi_key, IBUS_quotedbl, IBUS_a, 0x01DF,
-+IBUS_Multi_key, IBUS_quotedbl, IBUS_o, 0x022B,
-+IBUS_Multi_key, IBUS_quotedbl, IBUS_u, 0x01D6,
-+IBUS_Multi_key, IBUS_period, IBUS_A, 0x01E0,
-+IBUS_Multi_key, IBUS_period, IBUS_O, 0x0230,
-+IBUS_Multi_key, IBUS_period, IBUS_a, 0x01E1,
-+IBUS_Multi_key, IBUS_period, IBUS_o, 0x0231,
-+IBUS_Multi_key, IBUS_semicolon, IBUS_O, 0x01EC,
-+IBUS_Multi_key, IBUS_semicolon, IBUS_o, 0x01ED,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_O, 0x022C,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_o, 0x022D,
-+IBUS_space, 0x02D8,
-+IBUS_nobreakspace, 0x0306,
-+IBUS_Agrave, 0x1EB0,
-+IBUS_Aacute, 0x1EAE,
-+IBUS_Atilde, 0x1EB4,
-+IBUS_agrave, 0x1EB1,
-+IBUS_aacute, 0x1EAF,
-+IBUS_atilde, 0x1EB5,
-+IBUS_Cyrillic_a, 0x04D1,
-+IBUS_Cyrillic_ie, 0x04D7,
-+IBUS_Cyrillic_i, 0x0439,
-+IBUS_Cyrillic_u, 0x045E,
-+IBUS_Cyrillic_zhe, 0x04C2,
-+IBUS_Cyrillic_A, 0x04D0,
-+IBUS_Cyrillic_IE, 0x04D6,
-+IBUS_Cyrillic_I, 0x0419,
-+IBUS_Cyrillic_U, 0x040E,
-+IBUS_Cyrillic_ZHE, 0x04C1,
-+IBUS_Greek_ALPHA, 0x1FB8,
-+IBUS_Greek_IOTA, 0x1FD8,
-+IBUS_Greek_UPSILON, 0x1FE8,
-+IBUS_Greek_alpha, 0x1FB0,
-+IBUS_Greek_iota, 0x1FD0,
-+IBUS_Greek_upsilon, 0x1FE0,
-+IBUS_dead_breve, 0x02D8,
-+IBUS_Multi_key, IBUS_exclam, IBUS_A, 0x1EB6,
-+IBUS_Multi_key, IBUS_exclam, IBUS_a, 0x1EB7,
-+IBUS_Multi_key, IBUS_comma, IBUS_E, 0x1E1C,
-+IBUS_Multi_key, IBUS_comma, IBUS_e, 0x1E1D,
-+IBUS_Multi_key, IBUS_cedilla, IBUS_E, 0x1E1C,
-+IBUS_Multi_key, IBUS_cedilla, IBUS_e, 0x1E1D,
-+IBUS_space, 0x02D9,
-+IBUS_L, 0x013F,
-+IBUS_i, 0x0131,
-+IBUS_j, 0x0237,
-+IBUS_l, 0x0140,
-+IBUS_nobreakspace, 0x0307,
-+IBUS_Sacute, 0x1E64,
-+IBUS_Scaron, 0x1E66,
-+IBUS_sacute, 0x1E65,
-+IBUS_scaron, 0x1E67,
-+IBUS_Amacron, 0x01E0,
-+IBUS_Omacron, 0x0230,
-+IBUS_amacron, 0x01E1,
-+IBUS_omacron, 0x0231,
-+IBUS_dead_abovedot, 0x02D9,
-+IBUS_dead_stroke, IBUS_j, 0x025F,
-+IBUS_Multi_key, IBUS_exclam, IBUS_S, 0x1E68,
-+IBUS_Multi_key, IBUS_exclam, IBUS_s, 0x1E69,
-+IBUS_Multi_key, IBUS_apostrophe, IBUS_S, 0x1E64,
-+IBUS_Multi_key, IBUS_apostrophe, IBUS_s, 0x1E65,
-+IBUS_Multi_key, IBUS_c, IBUS_S, 0x1E66,
-+IBUS_Multi_key, IBUS_c, IBUS_s, 0x1E67,
-+IBUS_Multi_key, IBUS_acute, IBUS_S, 0x1E64,
-+IBUS_Multi_key, IBUS_acute, IBUS_s, 0x1E65,
-+IBUS_space, 0x0022,
-+IBUS_apostrophe, 0x0344,
-+IBUS_nobreakspace, 0x0308,
-+IBUS_acute, 0x0344,
-+IBUS_Iacute, 0x1E2E,
-+IBUS_Ugrave, 0x01DB,
-+IBUS_Uacute, 0x01D7,
-+IBUS_iacute, 0x1E2F,
-+IBUS_ugrave, 0x01DC,
-+IBUS_uacute, 0x01D8,
-+0x01D3, 0x01D9,
-+0x01D4, 0x01DA,
-+IBUS_Amacron, 0x01DE,
-+IBUS_Umacron, 0x1E7A,
-+IBUS_amacron, 0x01DF,
-+IBUS_omacron, 0x022B,
-+IBUS_umacron, 0x1E7B,
-+IBUS_Ukrainian_i, 0x0457,
-+IBUS_Ukrainian_I, 0x0407,
-+IBUS_Cyrillic_a, 0x04D3,
-+IBUS_Cyrillic_ie, 0x0451,
-+IBUS_Cyrillic_i, 0x04E5,
-+IBUS_Cyrillic_o, 0x04E7,
-+IBUS_Cyrillic_u, 0x04F1,
-+IBUS_Cyrillic_zhe, 0x04DD,
-+IBUS_Cyrillic_yeru, 0x04F9,
-+IBUS_Cyrillic_ze, 0x04DF,
-+IBUS_Cyrillic_e, 0x04ED,
-+IBUS_Cyrillic_che, 0x04F5,
-+IBUS_Cyrillic_A, 0x04D2,
-+IBUS_Cyrillic_IE, 0x0401,
-+IBUS_Cyrillic_I, 0x04E4,
-+IBUS_Cyrillic_O, 0x04E6,
-+IBUS_Cyrillic_U, 0x04F0,
-+IBUS_Cyrillic_ZHE, 0x04DC,
-+IBUS_Cyrillic_YERU, 0x04F8,
-+IBUS_Cyrillic_ZE, 0x04DE,
-+IBUS_Cyrillic_E, 0x04EC,
-+IBUS_Cyrillic_CHE, 0x04F4,
-+IBUS_Greek_IOTA, 0x03AA,
-+IBUS_Greek_UPSILON, 0x03AB,
-+IBUS_Greek_iota, 0x03CA,
-+IBUS_Greek_upsilon, 0x03CB,
-+IBUS_dead_diaeresis, 0x00A8,
-+IBUS_dead_acute, IBUS_space, 0x0385,
-+IBUS_dead_acute, IBUS_Greek_iota, 0x0390,
-+IBUS_dead_acute, IBUS_Greek_upsilon, 0x03B0,
-+IBUS_Multi_key, IBUS_underscore, IBUS_U, 0x1E7A,
-+IBUS_Multi_key, IBUS_underscore, IBUS_u, 0x1E7B,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_O, 0x1E4E,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_o, 0x1E4F,
-+IBUS_Multi_key, IBUS_macron, IBUS_U, 0x1E7A,
-+IBUS_Multi_key, IBUS_macron, IBUS_u, 0x1E7B,
-+IBUS_space, 0x00B0,
-+IBUS_nobreakspace, 0x030A,
-+IBUS_Aacute, 0x01FA,
-+IBUS_aacute, 0x01FB,
-+IBUS_dead_abovering, 0x00B0,
-+IBUS_space, 0x02DD,
-+IBUS_nobreakspace, 0x030B,
-+IBUS_Cyrillic_u, 0x04F3,
-+IBUS_Cyrillic_U, 0x04F2,
-+IBUS_dead_doubleacute, 0x02DD,
-+IBUS_space, 0x02C7,
-+IBUS_parenleft, 0x208D,
-+IBUS_parenright, 0x208E,
-+IBUS_plus, 0x208A,
-+IBUS_minus, 0x208B,
-+IBUS_0, 0x2080,
-+IBUS_1, 0x2081,
-+IBUS_2, 0x2082,
-+IBUS_3, 0x2083,
-+IBUS_4, 0x2084,
-+IBUS_5, 0x2085,
-+IBUS_6, 0x2086,
-+IBUS_7, 0x2087,
-+IBUS_8, 0x2088,
-+IBUS_9, 0x2089,
-+IBUS_equal, 0x208C,
-+IBUS_V, 0x01D9,
-+IBUS_v, 0x01DA,
-+IBUS_nobreakspace, 0x030C,
-+0x01F2, 0x01C5,
-+IBUS_dead_caron, 0x02C7,
-+IBUS_Multi_key, IBUS_quotedbl, IBUS_U, 0x01D9,
-+IBUS_Multi_key, IBUS_quotedbl, IBUS_u, 0x01DA,
-+IBUS_space, 0x00B8,
-+IBUS_nobreakspace, 0x0327,
-+IBUS_cent, 0x20B5,
-+IBUS_Cacute, 0x1E08,
-+IBUS_cacute, 0x1E09,
-+IBUS_dead_cedilla, 0x00B8,
-+IBUS_space, 0x02DB,
-+IBUS_nobreakspace, 0x0328,
-+IBUS_Omacron, 0x01EC,
-+IBUS_omacron, 0x01ED,
-+IBUS_dead_ogonek, 0x02DB,
-+IBUS_space, 0x037A,
-+IBUS_Greek_alphaaccent, 0x1FB4,
-+IBUS_Greek_etaaccent, 0x1FC4,
-+IBUS_Greek_omegaaccent, 0x1FF4,
-+IBUS_Greek_ALPHA, 0x1FBC,
-+IBUS_Greek_ETA, 0x1FCC,
-+IBUS_Greek_OMEGA, 0x1FFC,
-+IBUS_Greek_alpha, 0x1FB3,
-+IBUS_Greek_eta, 0x1FC3,
-+IBUS_Greek_omega, 0x1FF3,
-+IBUS_dead_iota, 0x037A,
-+IBUS_dead_grave, IBUS_Greek_alpha, 0x1FB2,
-+IBUS_dead_grave, IBUS_Greek_eta, 0x1FC2,
-+IBUS_dead_grave, IBUS_Greek_omega, 0x1FF2,
-+IBUS_dead_acute, IBUS_Greek_alpha, 0x1FB4,
-+IBUS_dead_acute, IBUS_Greek_eta, 0x1FC4,
-+IBUS_dead_acute, IBUS_Greek_omega, 0x1FF4,
-+IBUS_dead_tilde, IBUS_Greek_alpha, 0x1FB7,
-+IBUS_dead_tilde, IBUS_Greek_eta, 0x1FC7,
-+IBUS_dead_tilde, IBUS_Greek_omega, 0x1FF7,
-+IBUS_dead_tilde, 0x1F00, 0x1F86,
-+IBUS_dead_tilde, 0x1F01, 0x1F87,
-+IBUS_dead_tilde, 0x1F08, 0x1F8E,
-+IBUS_dead_tilde, 0x1F09, 0x1F8F,
-+IBUS_dead_tilde, 0x1F20, 0x1F96,
-+IBUS_dead_tilde, 0x1F21, 0x1F97,
-+IBUS_dead_tilde, 0x1F28, 0x1F9E,
-+IBUS_dead_tilde, 0x1F29, 0x1F9F,
-+IBUS_dead_tilde, 0x1F60, 0x1FA6,
-+IBUS_dead_tilde, 0x1F61, 0x1FA7,
-+IBUS_dead_tilde, 0x1F68, 0x1FAE,
-+IBUS_dead_tilde, 0x1F69, 0x1FAF,
-+IBUS_dead_psili, IBUS_Greek_ALPHA, 0x1F88,
-+IBUS_dead_psili, IBUS_Greek_ETA, 0x1F98,
-+IBUS_dead_psili, IBUS_Greek_OMEGA, 0x1FA8,
-+IBUS_dead_psili, IBUS_Greek_alpha, 0x1F80,
-+IBUS_dead_psili, IBUS_Greek_eta, 0x1F90,
-+IBUS_dead_psili, IBUS_Greek_omega, 0x1FA0,
-+IBUS_dead_dasia, IBUS_Greek_ALPHA, 0x1F89,
-+IBUS_dead_dasia, IBUS_Greek_ETA, 0x1F99,
-+IBUS_dead_dasia, IBUS_Greek_OMEGA, 0x1FA9,
-+IBUS_dead_dasia, IBUS_Greek_alpha, 0x1F81,
-+IBUS_dead_dasia, IBUS_Greek_eta, 0x1F91,
-+IBUS_dead_dasia, IBUS_Greek_omega, 0x1FA1,
-+IBUS_dead_grave, IBUS_dead_psili, IBUS_Greek_ALPHA, 0x1F8A,
-+IBUS_dead_grave, IBUS_dead_psili, IBUS_Greek_ETA, 0x1F9A,
-+IBUS_dead_grave, IBUS_dead_psili, IBUS_Greek_OMEGA, 0x1FAA,
-+IBUS_dead_grave, IBUS_dead_psili, IBUS_Greek_alpha, 0x1F82,
-+IBUS_dead_grave, IBUS_dead_psili, IBUS_Greek_eta, 0x1F92,
-+IBUS_dead_grave, IBUS_dead_psili, IBUS_Greek_omega, 0x1FA2,
-+IBUS_dead_grave, IBUS_dead_dasia, IBUS_Greek_ALPHA, 0x1F8B,
-+IBUS_dead_grave, IBUS_dead_dasia, IBUS_Greek_ETA, 0x1F9B,
-+IBUS_dead_grave, IBUS_dead_dasia, IBUS_Greek_OMEGA, 0x1FAB,
-+IBUS_dead_grave, IBUS_dead_dasia, IBUS_Greek_alpha, 0x1F83,
-+IBUS_dead_grave, IBUS_dead_dasia, IBUS_Greek_eta, 0x1F93,
-+IBUS_dead_grave, IBUS_dead_dasia, IBUS_Greek_omega, 0x1FA3,
-+IBUS_dead_acute, IBUS_dead_psili, IBUS_Greek_ALPHA, 0x1F8C,
-+IBUS_dead_acute, IBUS_dead_psili, IBUS_Greek_ETA, 0x1F9C,
-+IBUS_dead_acute, IBUS_dead_psili, IBUS_Greek_OMEGA, 0x1FAC,
-+IBUS_dead_acute, IBUS_dead_psili, IBUS_Greek_alpha, 0x1F84,
-+IBUS_dead_acute, IBUS_dead_psili, IBUS_Greek_eta, 0x1F94,
-+IBUS_dead_acute, IBUS_dead_psili, IBUS_Greek_omega, 0x1FA4,
-+IBUS_dead_acute, IBUS_dead_dasia, IBUS_Greek_ALPHA, 0x1F8D,
-+IBUS_dead_acute, IBUS_dead_dasia, IBUS_Greek_ETA, 0x1F9D,
-+IBUS_dead_acute, IBUS_dead_dasia, IBUS_Greek_OMEGA, 0x1FAD,
-+IBUS_dead_acute, IBUS_dead_dasia, IBUS_Greek_alpha, 0x1F85,
-+IBUS_dead_acute, IBUS_dead_dasia, IBUS_Greek_eta, 0x1F95,
-+IBUS_dead_acute, IBUS_dead_dasia, IBUS_Greek_omega, 0x1FA5,
-+IBUS_dead_tilde, IBUS_dead_psili, IBUS_Greek_ALPHA, 0x1F8E,
-+IBUS_dead_tilde, IBUS_dead_psili, IBUS_Greek_ETA, 0x1F9E,
-+IBUS_dead_tilde, IBUS_dead_psili, IBUS_Greek_OMEGA, 0x1FAE,
-+IBUS_dead_tilde, IBUS_dead_psili, IBUS_Greek_alpha, 0x1F86,
-+IBUS_dead_tilde, IBUS_dead_psili, IBUS_Greek_eta, 0x1F96,
-+IBUS_dead_tilde, IBUS_dead_psili, IBUS_Greek_omega, 0x1FA6,
-+IBUS_dead_tilde, IBUS_dead_dasia, IBUS_Greek_ALPHA, 0x1F8F,
-+IBUS_dead_tilde, IBUS_dead_dasia, IBUS_Greek_ETA, 0x1F9F,
-+IBUS_dead_tilde, IBUS_dead_dasia, IBUS_Greek_OMEGA, 0x1FAF,
-+IBUS_dead_tilde, IBUS_dead_dasia, IBUS_Greek_alpha, 0x1F87,
-+IBUS_dead_tilde, IBUS_dead_dasia, IBUS_Greek_eta, 0x1F97,
-+IBUS_dead_tilde, IBUS_dead_dasia, IBUS_Greek_omega, 0x1FA7,
-+IBUS_Multi_key, IBUS_apostrophe, IBUS_Greek_alpha, 0x1FB4,
-+IBUS_Multi_key, IBUS_apostrophe, IBUS_Greek_eta, 0x1FC4,
-+IBUS_Multi_key, IBUS_apostrophe, IBUS_Greek_omega, 0x1FF4,
-+IBUS_Multi_key, IBUS_apostrophe, 0x1F00, 0x1F84,
-+IBUS_Multi_key, IBUS_apostrophe, 0x1F01, 0x1F85,
-+IBUS_Multi_key, IBUS_apostrophe, 0x1F08, 0x1F8C,
-+IBUS_Multi_key, IBUS_apostrophe, 0x1F09, 0x1F8D,
-+IBUS_Multi_key, IBUS_apostrophe, 0x1F20, 0x1F94,
-+IBUS_Multi_key, IBUS_apostrophe, 0x1F21, 0x1F95,
-+IBUS_Multi_key, IBUS_apostrophe, 0x1F28, 0x1F9C,
-+IBUS_Multi_key, IBUS_apostrophe, 0x1F29, 0x1F9D,
-+IBUS_Multi_key, IBUS_apostrophe, 0x1F60, 0x1FA4,
-+IBUS_Multi_key, IBUS_apostrophe, 0x1F61, 0x1FA5,
-+IBUS_Multi_key, IBUS_apostrophe, 0x1F68, 0x1FAC,
-+IBUS_Multi_key, IBUS_apostrophe, 0x1F69, 0x1FAD,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_ALPHA, 0x1F89,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_ETA, 0x1F99,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_OMEGA, 0x1FA9,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_alpha, 0x1F81,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_eta, 0x1F91,
-+IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_omega, 0x1FA1,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_ALPHA, 0x1F88,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_ETA, 0x1F98,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_OMEGA, 0x1FA8,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_alpha, 0x1F80,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_eta, 0x1F90,
-+IBUS_Multi_key, IBUS_parenright, IBUS_Greek_omega, 0x1FA0,
-+IBUS_Multi_key, IBUS_grave, IBUS_Greek_alpha, 0x1FB2,
-+IBUS_Multi_key, IBUS_grave, IBUS_Greek_eta, 0x1FC2,
-+IBUS_Multi_key, IBUS_grave, IBUS_Greek_omega, 0x1FF2,
-+IBUS_Multi_key, IBUS_grave, 0x1F00, 0x1F82,
-+IBUS_Multi_key, IBUS_grave, 0x1F01, 0x1F83,
-+IBUS_Multi_key, IBUS_grave, 0x1F08, 0x1F8A,
-+IBUS_Multi_key, IBUS_grave, 0x1F09, 0x1F8B,
-+IBUS_Multi_key, IBUS_grave, 0x1F20, 0x1F92,
-+IBUS_Multi_key, IBUS_grave, 0x1F21, 0x1F93,
-+IBUS_Multi_key, IBUS_grave, 0x1F28, 0x1F9A,
-+IBUS_Multi_key, IBUS_grave, 0x1F29, 0x1F9B,
-+IBUS_Multi_key, IBUS_grave, 0x1F60, 0x1FA2,
-+IBUS_Multi_key, IBUS_grave, 0x1F61, 0x1FA3,
-+IBUS_Multi_key, IBUS_grave, 0x1F68, 0x1FAA,
-+IBUS_Multi_key, IBUS_grave, 0x1F69, 0x1FAB,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_Greek_alpha, 0x1FB7,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_Greek_eta, 0x1FC7,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_Greek_omega, 0x1FF7,
-+IBUS_Multi_key, IBUS_asciitilde, 0x1F00, 0x1F86,
-+IBUS_Multi_key, IBUS_asciitilde, 0x1F01, 0x1F87,
-+IBUS_Multi_key, IBUS_asciitilde, 0x1F08, 0x1F8E,
-+IBUS_Multi_key, IBUS_asciitilde, 0x1F09, 0x1F8F,
-+IBUS_Multi_key, IBUS_asciitilde, 0x1F20, 0x1F96,
-+IBUS_Multi_key, IBUS_asciitilde, 0x1F21, 0x1F97,
-+IBUS_Multi_key, IBUS_asciitilde, 0x1F28, 0x1F9E,
-+IBUS_Multi_key, IBUS_asciitilde, 0x1F29, 0x1F9F,
-+IBUS_Multi_key, IBUS_asciitilde, 0x1F60, 0x1FA6,
-+IBUS_Multi_key, IBUS_asciitilde, 0x1F61, 0x1FA7,
-+IBUS_Multi_key, IBUS_asciitilde, 0x1F68, 0x1FAE,
-+IBUS_Multi_key, IBUS_asciitilde, 0x1F69, 0x1FAF,
-+IBUS_Multi_key, IBUS_acute, IBUS_Greek_alpha, 0x1FB4,
-+IBUS_Multi_key, IBUS_acute, IBUS_Greek_eta, 0x1FC4,
-+IBUS_Multi_key, IBUS_acute, IBUS_Greek_omega, 0x1FF4,
-+IBUS_Multi_key, IBUS_acute, 0x1F00, 0x1F84,
-+IBUS_Multi_key, IBUS_acute, 0x1F01, 0x1F85,
-+IBUS_Multi_key, IBUS_acute, 0x1F08, 0x1F8C,
-+IBUS_Multi_key, IBUS_acute, 0x1F09, 0x1F8D,
-+IBUS_Multi_key, IBUS_acute, 0x1F20, 0x1F94,
-+IBUS_Multi_key, IBUS_acute, 0x1F21, 0x1F95,
-+IBUS_Multi_key, IBUS_acute, 0x1F28, 0x1F9C,
-+IBUS_Multi_key, IBUS_acute, 0x1F29, 0x1F9D,
-+IBUS_Multi_key, IBUS_acute, 0x1F60, 0x1FA4,
-+IBUS_Multi_key, IBUS_acute, 0x1F61, 0x1FA5,
-+IBUS_Multi_key, IBUS_acute, 0x1F68, 0x1FAC,
-+IBUS_Multi_key, IBUS_acute, 0x1F69, 0x1FAD,
-+IBUS_dead_grave, IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_ALPHA, 0x1F8B,
-+IBUS_dead_grave, IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_ETA, 0x1F9B,
-+IBUS_dead_grave, IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_OMEGA, 0x1FAB,
-+IBUS_dead_grave, IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_alpha, 0x1F83,
-+IBUS_dead_grave, IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_eta, 0x1F93,
-+IBUS_dead_grave, IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_omega, 0x1FA3,
-+IBUS_dead_grave, IBUS_Multi_key, IBUS_parenright, IBUS_Greek_ALPHA, 0x1F8A,
-+IBUS_dead_grave, IBUS_Multi_key, IBUS_parenright, IBUS_Greek_ETA, 0x1F9A,
-+IBUS_dead_grave, IBUS_Multi_key, IBUS_parenright, IBUS_Greek_OMEGA, 0x1FAA,
-+IBUS_dead_grave, IBUS_Multi_key, IBUS_parenright, IBUS_Greek_alpha, 0x1F82,
-+IBUS_dead_grave, IBUS_Multi_key, IBUS_parenright, IBUS_Greek_eta, 0x1F92,
-+IBUS_dead_grave, IBUS_Multi_key, IBUS_parenright, IBUS_Greek_omega, 0x1FA2,
-+IBUS_dead_acute, IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_ALPHA, 0x1F8D,
-+IBUS_dead_acute, IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_ETA, 0x1F9D,
-+IBUS_dead_acute, IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_OMEGA, 0x1FAD,
-+IBUS_dead_acute, IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_alpha, 0x1F85,
-+IBUS_dead_acute, IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_eta, 0x1F95,
-+IBUS_dead_acute, IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_omega, 0x1FA5,
-+IBUS_dead_acute, IBUS_Multi_key, IBUS_parenright, IBUS_Greek_ALPHA, 0x1F8C,
-+IBUS_dead_acute, IBUS_Multi_key, IBUS_parenright, IBUS_Greek_ETA, 0x1F9C,
-+IBUS_dead_acute, IBUS_Multi_key, IBUS_parenright, IBUS_Greek_OMEGA, 0x1FAC,
-+IBUS_dead_acute, IBUS_Multi_key, IBUS_parenright, IBUS_Greek_alpha, 0x1F84,
-+IBUS_dead_acute, IBUS_Multi_key, IBUS_parenright, IBUS_Greek_eta, 0x1F94,
-+IBUS_dead_acute, IBUS_Multi_key, IBUS_parenright, IBUS_Greek_omega, 0x1FA4,
-+IBUS_dead_tilde, IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_ALPHA, 0x1F8F,
-+IBUS_dead_tilde, IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_ETA, 0x1F9F,
-+IBUS_dead_tilde, IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_OMEGA, 0x1FAF,
-+IBUS_dead_tilde, IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_alpha, 0x1F87,
-+IBUS_dead_tilde, IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_eta, 0x1F97,
-+IBUS_dead_tilde, IBUS_Multi_key, IBUS_parenleft, IBUS_Greek_omega, 0x1FA7,
-+IBUS_dead_tilde, IBUS_Multi_key, IBUS_parenright, IBUS_Greek_ALPHA, 0x1F8E,
-+IBUS_dead_tilde, IBUS_Multi_key, IBUS_parenright, IBUS_Greek_ETA, 0x1F9E,
-+IBUS_dead_tilde, IBUS_Multi_key, IBUS_parenright, IBUS_Greek_OMEGA, 0x1FAE,
-+IBUS_dead_tilde, IBUS_Multi_key, IBUS_parenright, IBUS_Greek_alpha, 0x1F86,
-+IBUS_dead_tilde, IBUS_Multi_key, IBUS_parenright, IBUS_Greek_eta, 0x1F96,
-+IBUS_dead_tilde, IBUS_Multi_key, IBUS_parenright, IBUS_Greek_omega, 0x1FA6,
-+IBUS_Multi_key, IBUS_apostrophe, IBUS_parenleft, IBUS_Greek_ALPHA, 0x1F8D,
-+IBUS_Multi_key, IBUS_apostrophe, IBUS_parenleft, IBUS_Greek_ETA, 0x1F9D,
-+IBUS_Multi_key, IBUS_apostrophe, IBUS_parenleft, IBUS_Greek_OMEGA, 0x1FAD,
-+IBUS_Multi_key, IBUS_apostrophe, IBUS_parenleft, IBUS_Greek_alpha, 0x1F85,
-+IBUS_Multi_key, IBUS_apostrophe, IBUS_parenleft, IBUS_Greek_eta, 0x1F95,
-+IBUS_Multi_key, IBUS_apostrophe, IBUS_parenleft, IBUS_Greek_omega, 0x1FA5,
-+IBUS_Multi_key, IBUS_apostrophe, IBUS_parenright, IBUS_Greek_ALPHA, 0x1F8C,
-+IBUS_Multi_key, IBUS_apostrophe, IBUS_parenright, IBUS_Greek_ETA, 0x1F9C,
-+IBUS_Multi_key, IBUS_apostrophe, IBUS_parenright, IBUS_Greek_OMEGA, 0x1FAC,
-+IBUS_Multi_key, IBUS_apostrophe, IBUS_parenright, IBUS_Greek_alpha, 0x1F84,
-+IBUS_Multi_key, IBUS_apostrophe, IBUS_parenright, IBUS_Greek_eta, 0x1F94,
-+IBUS_Multi_key, IBUS_apostrophe, IBUS_parenright, IBUS_Greek_omega, 0x1FA4,
-+IBUS_Multi_key, IBUS_apostrophe, IBUS_dead_psili, IBUS_Greek_ALPHA, 0x1F8C,
-+IBUS_Multi_key, IBUS_apostrophe, IBUS_dead_psili, IBUS_Greek_ETA, 0x1F9C,
-+IBUS_Multi_key, IBUS_apostrophe, IBUS_dead_psili, IBUS_Greek_OMEGA, 0x1FAC,
-+IBUS_Multi_key, IBUS_apostrophe, IBUS_dead_psili, IBUS_Greek_alpha, 0x1F84,
-+IBUS_Multi_key, IBUS_apostrophe, IBUS_dead_psili, IBUS_Greek_eta, 0x1F94,
-+IBUS_Multi_key, IBUS_apostrophe, IBUS_dead_psili, IBUS_Greek_omega, 0x1FA4,
-+IBUS_Multi_key, IBUS_apostrophe, IBUS_dead_dasia, IBUS_Greek_ALPHA, 0x1F8D,
-+IBUS_Multi_key, IBUS_apostrophe, IBUS_dead_dasia, IBUS_Greek_ETA, 0x1F9D,
-+IBUS_Multi_key, IBUS_apostrophe, IBUS_dead_dasia, IBUS_Greek_OMEGA, 0x1FAD,
-+IBUS_Multi_key, IBUS_apostrophe, IBUS_dead_dasia, IBUS_Greek_alpha, 0x1F85,
-+IBUS_Multi_key, IBUS_apostrophe, IBUS_dead_dasia, IBUS_Greek_eta, 0x1F95,
-+IBUS_Multi_key, IBUS_apostrophe, IBUS_dead_dasia, IBUS_Greek_omega, 0x1FA5,
-+IBUS_Multi_key, IBUS_grave, IBUS_parenleft, IBUS_Greek_ALPHA, 0x1F8B,
-+IBUS_Multi_key, IBUS_grave, IBUS_parenleft, IBUS_Greek_ETA, 0x1F9B,
-+IBUS_Multi_key, IBUS_grave, IBUS_parenleft, IBUS_Greek_OMEGA, 0x1FAB,
-+IBUS_Multi_key, IBUS_grave, IBUS_parenleft, IBUS_Greek_alpha, 0x1F83,
-+IBUS_Multi_key, IBUS_grave, IBUS_parenleft, IBUS_Greek_eta, 0x1F93,
-+IBUS_Multi_key, IBUS_grave, IBUS_parenleft, IBUS_Greek_omega, 0x1FA3,
-+IBUS_Multi_key, IBUS_grave, IBUS_parenright, IBUS_Greek_ALPHA, 0x1F8A,
-+IBUS_Multi_key, IBUS_grave, IBUS_parenright, IBUS_Greek_ETA, 0x1F9A,
-+IBUS_Multi_key, IBUS_grave, IBUS_parenright, IBUS_Greek_OMEGA, 0x1FAA,
-+IBUS_Multi_key, IBUS_grave, IBUS_parenright, IBUS_Greek_alpha, 0x1F82,
-+IBUS_Multi_key, IBUS_grave, IBUS_parenright, IBUS_Greek_eta, 0x1F92,
-+IBUS_Multi_key, IBUS_grave, IBUS_parenright, IBUS_Greek_omega, 0x1FA2,
-+IBUS_Multi_key, IBUS_grave, IBUS_dead_psili, IBUS_Greek_ALPHA, 0x1F8A,
-+IBUS_Multi_key, IBUS_grave, IBUS_dead_psili, IBUS_Greek_ETA, 0x1F9A,
-+IBUS_Multi_key, IBUS_grave, IBUS_dead_psili, IBUS_Greek_OMEGA, 0x1FAA,
-+IBUS_Multi_key, IBUS_grave, IBUS_dead_psili, IBUS_Greek_alpha, 0x1F82,
-+IBUS_Multi_key, IBUS_grave, IBUS_dead_psili, IBUS_Greek_eta, 0x1F92,
-+IBUS_Multi_key, IBUS_grave, IBUS_dead_psili, IBUS_Greek_omega, 0x1FA2,
-+IBUS_Multi_key, IBUS_grave, IBUS_dead_dasia, IBUS_Greek_ALPHA, 0x1F8B,
-+IBUS_Multi_key, IBUS_grave, IBUS_dead_dasia, IBUS_Greek_ETA, 0x1F9B,
-+IBUS_Multi_key, IBUS_grave, IBUS_dead_dasia, IBUS_Greek_OMEGA, 0x1FAB,
-+IBUS_Multi_key, IBUS_grave, IBUS_dead_dasia, IBUS_Greek_alpha, 0x1F83,
-+IBUS_Multi_key, IBUS_grave, IBUS_dead_dasia, IBUS_Greek_eta, 0x1F93,
-+IBUS_Multi_key, IBUS_grave, IBUS_dead_dasia, IBUS_Greek_omega, 0x1FA3,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_parenleft, IBUS_Greek_ALPHA, 0x1F8F,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_parenleft, IBUS_Greek_ETA, 0x1F9F,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_parenleft, IBUS_Greek_OMEGA, 0x1FAF,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_parenleft, IBUS_Greek_alpha, 0x1F87,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_parenleft, IBUS_Greek_eta, 0x1F97,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_parenleft, IBUS_Greek_omega, 0x1FA7,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_parenright, IBUS_Greek_ALPHA, 0x1F8E,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_parenright, IBUS_Greek_ETA, 0x1F9E,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_parenright, IBUS_Greek_OMEGA, 0x1FAE,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_parenright, IBUS_Greek_alpha, 0x1F86,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_parenright, IBUS_Greek_eta, 0x1F96,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_parenright, IBUS_Greek_omega, 0x1FA6,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_dead_psili, IBUS_Greek_ALPHA, 0x1F8E,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_dead_psili, IBUS_Greek_ETA, 0x1F9E,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_dead_psili, IBUS_Greek_OMEGA, 0x1FAE,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_dead_psili, IBUS_Greek_alpha, 0x1F86,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_dead_psili, IBUS_Greek_eta, 0x1F96,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_dead_psili, IBUS_Greek_omega, 0x1FA6,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_dead_dasia, IBUS_Greek_ALPHA, 0x1F8F,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_dead_dasia, IBUS_Greek_ETA, 0x1F9F,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_dead_dasia, IBUS_Greek_OMEGA, 0x1FAF,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_dead_dasia, IBUS_Greek_alpha, 0x1F87,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_dead_dasia, IBUS_Greek_eta, 0x1F97,
-+IBUS_Multi_key, IBUS_asciitilde, IBUS_dead_dasia, IBUS_Greek_omega, 0x1FA7,
-+IBUS_Multi_key, IBUS_acute, IBUS_parenleft, IBUS_Greek_ALPHA, 0x1F8D,
-+IBUS_Multi_key, IBUS_acute, IBUS_parenleft, IBUS_Greek_ETA, 0x1F9D,
-+IBUS_Multi_key, IBUS_acute, IBUS_parenleft, IBUS_Greek_OMEGA, 0x1FAD,
-+IBUS_Multi_key, IBUS_acute, IBUS_parenleft, IBUS_Greek_alpha, 0x1F85,
-+IBUS_Multi_key, IBUS_acute, IBUS_parenleft, IBUS_Greek_eta, 0x1F95,
-+IBUS_Multi_key, IBUS_acute, IBUS_parenleft, IBUS_Greek_omega, 0x1FA5,
-+IBUS_Multi_key, IBUS_acute, IBUS_parenright, IBUS_Greek_ALPHA, 0x1F8C,
-+IBUS_Multi_key, IBUS_acute, IBUS_parenright, IBUS_Greek_ETA, 0x1F9C,
-+IBUS_Multi_key, IBUS_acute, IBUS_parenright, IBUS_Greek_OMEGA, 0x1FAC,
-+IBUS_Multi_key, IBUS_acute, IBUS_parenright, IBUS_Greek_alpha, 0x1F84,
-+IBUS_Multi_key, IBUS_acute, IBUS_parenright, IBUS_Greek_eta, 0x1F94,
-+IBUS_Multi_key, IBUS_acute, IBUS_parenright, IBUS_Greek_omega, 0x1FA4,
-+IBUS_Multi_key, IBUS_acute, IBUS_dead_psili, IBUS_Greek_ALPHA, 0x1F8C,
-+IBUS_Multi_key, IBUS_acute, IBUS_dead_psili, IBUS_Greek_ETA, 0x1F9C,
-+IBUS_Multi_key, IBUS_acute, IBUS_dead_psili, IBUS_Greek_OMEGA, 0x1FAC,
-+IBUS_Multi_key, IBUS_acute, IBUS_dead_psili, IBUS_Greek_alpha, 0x1F84,
-+IBUS_Multi_key, IBUS_acute, IBUS_dead_psili, IBUS_Greek_eta, 0x1F94,
-+IBUS_Multi_key, IBUS_acute, IBUS_dead_psili, IBUS_Greek_omega, 0x1FA4,
-+IBUS_Multi_key, IBUS_acute, IBUS_dead_dasia, IBUS_Greek_ALPHA, 0x1F8D,
-+IBUS_Multi_key, IBUS_acute, IBUS_dead_dasia, IBUS_Greek_ETA, 0x1F9D,
-+IBUS_Multi_key, IBUS_acute, IBUS_dead_dasia, IBUS_Greek_OMEGA, 0x1FAD,
-+IBUS_Multi_key, IBUS_acute, IBUS_dead_dasia, IBUS_Greek_alpha, 0x1F85,
-+IBUS_Multi_key, IBUS_acute, IBUS_dead_dasia, IBUS_Greek_eta, 0x1F95,
-+IBUS_Multi_key, IBUS_acute, IBUS_dead_dasia, IBUS_Greek_omega, 0x1FA5,
-+IBUS_kana_WO, 0x30FA,
-+IBUS_kana_U, 0x30F4,
-+IBUS_kana_KA, 0x30AC,
-+IBUS_kana_KI, 0x30AE,
-+IBUS_kana_KU, 0x30B0,
-+IBUS_kana_KE, 0x30B2,
-+IBUS_kana_KO, 0x30B4,
-+IBUS_kana_SA, 0x30B6,
-+IBUS_kana_SHI, 0x30B8,
-+IBUS_kana_SU, 0x30BA,
-+IBUS_kana_SE, 0x30BC,
-+IBUS_kana_SO, 0x30BE,
-+IBUS_kana_TA, 0x30C0,
-+IBUS_kana_CHI, 0x30C2,
-+IBUS_kana_TSU, 0x30C5,
-+IBUS_kana_TE, 0x30C7,
-+IBUS_kana_TO, 0x30C9,
-+IBUS_kana_HA, 0x30D0,
-+IBUS_kana_HI, 0x30D3,
-+IBUS_kana_FU, 0x30D6,
-+IBUS_kana_HE, 0x30D9,
-+IBUS_kana_HO, 0x30DC,
-+IBUS_kana_WA, 0x30F7,
-+IBUS_kana_HA, 0x30D1,
-+IBUS_kana_HI, 0x30D4,
-+IBUS_kana_FU, 0x30D7,
-+IBUS_kana_HE, 0x30DA,
-+IBUS_kana_HO, 0x30DD,
-+IBUS_space, 0x0323,
-+IBUS_plus, 0x2A25,
-+IBUS_minus, 0x2A2A,
-+IBUS_equal, 0x2A66,
-+IBUS_nobreakspace, 0x0323,
-+IBUS_Abreve, 0x1EB6,
-+IBUS_abreve, 0x1EB7,
-+IBUS_dead_belowdot, 0x0323,
-+IBUS_Multi_key, IBUS_plus, IBUS_O, 0x1EE2,
-+IBUS_Multi_key, IBUS_plus, IBUS_U, 0x1EF0,
-+IBUS_Multi_key, IBUS_plus, IBUS_o, 0x1EE3,
-+IBUS_Multi_key, IBUS_plus, IBUS_u, 0x1EF1,
-+IBUS_space, 0x0309,
-+IBUS_B, 0x0181,
-+IBUS_C, 0x0187,
-+IBUS_D, 0x018A,
-+IBUS_F, 0x0191,
-+IBUS_G, 0x0193,
-+IBUS_K, 0x0198,
-+IBUS_M, 0x2C6E,
-+IBUS_N, 0x019D,
-+IBUS_P, 0x01A4,
-+IBUS_T, 0x01AC,
-+IBUS_V, 0x01B2,
-+IBUS_W, 0x2C72,
-+IBUS_Z, 0x0224,
-+IBUS_b, 0x0253,
-+IBUS_c, 0x0188,
-+IBUS_d, 0x0257,
-+IBUS_f, 0x0192,
-+IBUS_g, 0x0260,
-+IBUS_h, 0x0266,
-+IBUS_k, 0x0199,
-+IBUS_m, 0x0271,
-+IBUS_n, 0x0272,
-+IBUS_p, 0x01A5,
-+IBUS_q, 0x02A0,
-+IBUS_s, 0x0282,
-+IBUS_t, 0x01AD,
-+IBUS_v, 0x028B,
-+IBUS_w, 0x2C73,
-+IBUS_z, 0x0225,
-+IBUS_nobreakspace, 0x0309,
-+IBUS_Abreve, 0x1EB2,
-+IBUS_abreve, 0x1EB3,
-+0x0256, 0x1D91,
-+0x025C, 0x025D,
-+0x025F, 0x0284,
-+0x0279, 0x027B,
-+IBUS_dead_hook, 0x0309,
-+IBUS_Multi_key, IBUS_plus, IBUS_O, 0x1EDE,
-+IBUS_Multi_key, IBUS_plus, IBUS_U, 0x1EEC,
-+IBUS_Multi_key, IBUS_plus, IBUS_o, 0x1EDF,
-+IBUS_Multi_key, IBUS_plus, IBUS_u, 0x1EED,
-+IBUS_Multi_key, IBUS_U, IBUS_A, 0x1EB2,
-+IBUS_Multi_key, IBUS_U, IBUS_a, 0x1EB3,
-+IBUS_Multi_key, IBUS_asciicircum, IBUS_A, 0x1EA8,
-+IBUS_Multi_key, IBUS_asciicircum, IBUS_E, 0x1EC2,
-+IBUS_Multi_key, IBUS_asciicircum, IBUS_O, 0x1ED4,
-+IBUS_Multi_key, IBUS_asciicircum, IBUS_a, 0x1EA9,
-+IBUS_Multi_key, IBUS_asciicircum, IBUS_e, 0x1EC3,
-+IBUS_Multi_key, IBUS_asciicircum, IBUS_o, 0x1ED5,
-+IBUS_Multi_key, IBUS_b, IBUS_A, 0x1EB2,
-+IBUS_Multi_key, IBUS_b, IBUS_a, 0x1EB3,
-+IBUS_space, 0x031B,
-+IBUS_nobreakspace, 0x031B,
-+IBUS_Utilde, 0x1EEE,
-+IBUS_utilde, 0x1EEF,
-+IBUS_dead_horn, 0x031B,
-+IBUS_Greek_ALPHA, 0x1F08,
-+IBUS_Greek_EPSILON, 0x1F18,
-+IBUS_Greek_ETA, 0x1F28,
-+IBUS_Greek_IOTA, 0x1F38,
-+IBUS_Greek_OMICRON, 0x1F48,
-+IBUS_Greek_OMEGA, 0x1F68,
-+IBUS_Greek_alpha, 0x1F00,
-+IBUS_Greek_epsilon, 0x1F10,
-+IBUS_Greek_eta, 0x1F20,
-+IBUS_Greek_iota, 0x1F30,
-+IBUS_Greek_omicron, 0x1F40,
-+IBUS_Greek_rho, 0x1FE4,
-+IBUS_Greek_upsilon, 0x1F50,
-+IBUS_Greek_omega, 0x1F60,
-+IBUS_Greek_ALPHA, 0x1F09,
-+IBUS_Greek_EPSILON, 0x1F19,
-+IBUS_Greek_ETA, 0x1F29,
-+IBUS_Greek_IOTA, 0x1F39,
-+IBUS_Greek_OMICRON, 0x1F49,
-+IBUS_Greek_RHO, 0x1FEC,
-+IBUS_Greek_UPSILON, 0x1F59,
-+IBUS_Greek_OMEGA, 0x1F69,
-+IBUS_Greek_alpha, 0x1F01,
-+IBUS_Greek_epsilon, 0x1F11,
-+IBUS_Greek_eta, 0x1F21,
-+IBUS_Greek_iota, 0x1F31,
-+IBUS_Greek_omicron, 0x1F41,
-+IBUS_Greek_rho, 0x1FE5,
-+IBUS_Greek_upsilon, 0x1F51,
-+IBUS_Greek_omega, 0x1F61,
-+IBUS_space, IBUS_space, 0x00A0,
-+IBUS_space, IBUS_apostrophe, 0x0027,
-+IBUS_space, IBUS_parenleft, 0x02D8,
-+IBUS_space, IBUS_comma, 0x00B8,
-+IBUS_space, IBUS_minus, 0x007E,
-+IBUS_space, IBUS_period, 0x2008,
-+IBUS_space, IBUS_less, 0x02C7,
-+IBUS_space, IBUS_greater, 0x005E,
-+IBUS_space, IBUS_asciicircum, 0x005E,
-+IBUS_space, IBUS_grave, 0x0060,
-+IBUS_space, IBUS_asciitilde, 0x007E,
-+IBUS_exclam, IBUS_exclam, 0x00A1,
-+IBUS_exclam, IBUS_question, 0x203D,
-+IBUS_exclam, IBUS_A, 0x1EA0,
-+IBUS_exclam, IBUS_B, 0x1E04,
-+IBUS_exclam, IBUS_D, 0x1E0C,
-+IBUS_exclam, IBUS_E, 0x1EB8,
-+IBUS_exclam, IBUS_H, 0x1E24,
-+IBUS_exclam, IBUS_I, 0x1ECA,
-+IBUS_exclam, IBUS_K, 0x1E32,
-+IBUS_exclam, IBUS_L, 0x1E36,
-+IBUS_exclam, IBUS_M, 0x1E42,
-+IBUS_exclam, IBUS_N, 0x1E46,
-+IBUS_exclam, IBUS_O, 0x1ECC,
-+IBUS_exclam, IBUS_P, 0x00B6,
-+IBUS_exclam, IBUS_R, 0x1E5A,
-+IBUS_exclam, IBUS_S, 0x1E62,
-+IBUS_exclam, IBUS_T, 0x1E6C,
-+IBUS_exclam, IBUS_U, 0x1EE4,
-+IBUS_exclam, IBUS_V, 0x1E7E,
-+IBUS_exclam, IBUS_W, 0x1E88,
-+IBUS_exclam, IBUS_Y, 0x1EF4,
-+IBUS_exclam, IBUS_Z, 0x1E92,
-+IBUS_exclam, IBUS_asciicircum, 0x00A6,
-+IBUS_exclam, IBUS_a, 0x1EA1,
-+IBUS_exclam, IBUS_b, 0x1E05,
-+IBUS_exclam, IBUS_d, 0x1E0D,
-+IBUS_exclam, IBUS_e, 0x1EB9,
-+IBUS_exclam, IBUS_h, 0x1E25,
-+IBUS_exclam, IBUS_i, 0x1ECB,
-+IBUS_exclam, IBUS_k, 0x1E33,
-+IBUS_exclam, IBUS_l, 0x1E37,
-+IBUS_exclam, IBUS_m, 0x1E43,
-+IBUS_exclam, IBUS_n, 0x1E47,
-+IBUS_exclam, IBUS_o, 0x1ECD,
-+IBUS_exclam, IBUS_p, 0x00B6,
-+IBUS_exclam, IBUS_r, 0x1E5B,
-+IBUS_exclam, IBUS_s, 0x1E63,
-+IBUS_exclam, IBUS_t, 0x1E6D,
-+IBUS_exclam, IBUS_u, 0x1EE5,
-+IBUS_exclam, IBUS_v, 0x1E7F,
-+IBUS_exclam, IBUS_w, 0x1E89,
-+IBUS_exclam, IBUS_y, 0x1EF5,
-+IBUS_exclam, IBUS_z, 0x1E93,
-+IBUS_quotedbl, IBUS_quotedbl, 0x00A8,
-+IBUS_quotedbl, IBUS_apostrophe, 0x0344,
-+IBUS_quotedbl, IBUS_comma, 0x201E,
-+IBUS_quotedbl, IBUS_slash, 0x301E,
-+IBUS_quotedbl, IBUS_less, 0x201C,
-+IBUS_quotedbl, IBUS_greater, 0x201D,
-+IBUS_quotedbl, IBUS_A, 0x00C4,
-+IBUS_quotedbl, IBUS_E, 0x00CB,
-+IBUS_quotedbl, IBUS_H, 0x1E26,
-+IBUS_quotedbl, IBUS_I, 0x00CF,
-+IBUS_quotedbl, IBUS_O, 0x00D6,
-+IBUS_quotedbl, IBUS_U, 0x00DC,
-+IBUS_quotedbl, IBUS_W, 0x1E84,
-+IBUS_quotedbl, IBUS_X, 0x1E8C,
-+IBUS_quotedbl, IBUS_Y, 0x0178,
-+IBUS_quotedbl, IBUS_backslash, 0x301D,
-+IBUS_quotedbl, IBUS_a, 0x00E4,
-+IBUS_quotedbl, IBUS_e, 0x00EB,
-+IBUS_quotedbl, IBUS_h, 0x1E27,
-+IBUS_quotedbl, IBUS_i, 0x00EF,
-+IBUS_quotedbl, IBUS_o, 0x00F6,
-+IBUS_quotedbl, IBUS_t, 0x1E97,
-+IBUS_quotedbl, IBUS_u, 0x00FC,
-+IBUS_quotedbl, IBUS_w, 0x1E85,
-+IBUS_quotedbl, IBUS_x, 0x1E8D,
-+IBUS_quotedbl, IBUS_y, 0x00FF,
-+IBUS_quotedbl, IBUS_acute, 0x0344,
-+IBUS_quotedbl, IBUS_Otilde, 0x1E4E,
-+IBUS_quotedbl, IBUS_otilde, 0x1E4F,
-+IBUS_quotedbl, 0x03D2, 0x03D4,
-+IBUS_quotedbl, IBUS_Umacron, 0x1E7A,
-+IBUS_quotedbl, IBUS_umacron, 0x1E7B,
-+IBUS_quotedbl, 0x04D8, 0x04DA,
-+IBUS_quotedbl, 0x04D9, 0x04DB,
-+IBUS_quotedbl, 0x04E8, 0x04EA,
-+IBUS_quotedbl, 0x04E9, 0x04EB,
-+IBUS_quotedbl, IBUS_Ukrainian_i, 0x0457,
-+IBUS_quotedbl, IBUS_Ukrainian_I, 0x0407,
-+IBUS_quotedbl, IBUS_Cyrillic_a, 0x04D3,
-+IBUS_quotedbl, IBUS_Cyrillic_ie, 0x0451,
-+IBUS_quotedbl, IBUS_Cyrillic_i, 0x04E5,
-+IBUS_quotedbl, IBUS_Cyrillic_o, 0x04E7,
-+IBUS_quotedbl, IBUS_Cyrillic_u, 0x04F1,
-+IBUS_quotedbl, IBUS_Cyrillic_zhe, 0x04DD,
-+IBUS_quotedbl, IBUS_Cyrillic_yeru, 0x04F9,
-+IBUS_quotedbl, IBUS_Cyrillic_ze, 0x04DF,
-+IBUS_quotedbl, IBUS_Cyrillic_e, 0x04ED,
-+IBUS_quotedbl, IBUS_Cyrillic_che, 0x04F5,
-+IBUS_quotedbl, IBUS_Cyrillic_A, 0x04D2,
-+IBUS_quotedbl, IBUS_Cyrillic_IE, 0x0401,
-+IBUS_quotedbl, IBUS_Cyrillic_I, 0x04E4,
-+IBUS_quotedbl, IBUS_Cyrillic_O, 0x04E6,
-+IBUS_quotedbl, IBUS_Cyrillic_U, 0x04F0,
-+IBUS_quotedbl, IBUS_Cyrillic_ZHE, 0x04DC,
-+IBUS_quotedbl, IBUS_Cyrillic_YERU, 0x04F8,
-+IBUS_quotedbl, IBUS_Cyrillic_ZE, 0x04DE,
-+IBUS_quotedbl, IBUS_Cyrillic_E, 0x04EC,
-+IBUS_quotedbl, IBUS_Cyrillic_CHE, 0x04F4,
-+IBUS_quotedbl, IBUS_Greek_IOTA, 0x03AA,
-+IBUS_quotedbl, IBUS_Greek_UPSILON, 0x03AB,
-+IBUS_quotedbl, IBUS_Greek_iota, 0x03CA,
-+IBUS_quotedbl, IBUS_Greek_upsilon, 0x03CB,
-+IBUS_quotedbl, IBUS_dead_acute, 0x0344,
-+IBUS_numbersign, IBUS_numbersign, 0x266F,
-+IBUS_numbersign, IBUS_b, 0x266D,
-+IBUS_numbersign, IBUS_f, 0x266E,
-+IBUS_percent, IBUS_o, 0x2030,
-+IBUS_apostrophe, IBUS_space, 0x0027,
-+IBUS_apostrophe, IBUS_apostrophe, 0x00B4,
-+IBUS_apostrophe, IBUS_comma, 0x201A,
-+IBUS_apostrophe, IBUS_less, 0x2018,
-+IBUS_apostrophe, IBUS_greater, 0x2019,
-+IBUS_apostrophe, IBUS_A, 0x00C1,
-+IBUS_apostrophe, IBUS_C, 0x0106,
-+IBUS_apostrophe, IBUS_E, 0x00C9,
-+IBUS_apostrophe, IBUS_G, 0x01F4,
-+IBUS_apostrophe, IBUS_I, 0x00CD,
-+IBUS_apostrophe, IBUS_K, 0x1E30,
-+IBUS_apostrophe, IBUS_L, 0x0139,
-+IBUS_apostrophe, IBUS_M, 0x1E3E,
-+IBUS_apostrophe, IBUS_N, 0x0143,
-+IBUS_apostrophe, IBUS_O, 0x00D3,
-+IBUS_apostrophe, IBUS_P, 0x1E54,
-+IBUS_apostrophe, IBUS_R, 0x0154,
-+IBUS_apostrophe, IBUS_S, 0x015A,
-+IBUS_apostrophe, IBUS_U, 0x00DA,
-+IBUS_apostrophe, IBUS_W, 0x1E82,
-+IBUS_apostrophe, IBUS_Y, 0x00DD,
-+IBUS_apostrophe, IBUS_Z, 0x0179,
-+IBUS_apostrophe, IBUS_a, 0x00E1,
-+IBUS_apostrophe, IBUS_c, 0x0107,
-+IBUS_apostrophe, IBUS_e, 0x00E9,
-+IBUS_apostrophe, IBUS_g, 0x01F5,
-+IBUS_apostrophe, IBUS_i, 0x00ED,
-+IBUS_apostrophe, IBUS_k, 0x1E31,
-+IBUS_apostrophe, IBUS_l, 0x013A,
-+IBUS_apostrophe, IBUS_m, 0x1E3F,
-+IBUS_apostrophe, IBUS_n, 0x0144,
-+IBUS_apostrophe, IBUS_o, 0x00F3,
-+IBUS_apostrophe, IBUS_p, 0x1E55,
-+IBUS_apostrophe, IBUS_r, 0x0155,
-+IBUS_apostrophe, IBUS_s, 0x015B,
-+IBUS_apostrophe, IBUS_u, 0x00FA,
-+IBUS_apostrophe, IBUS_w, 0x1E83,
-+IBUS_apostrophe, IBUS_y, 0x00FD,
-+IBUS_apostrophe, IBUS_z, 0x017A,
-+IBUS_apostrophe, IBUS_Acircumflex, 0x1EA4,
-+IBUS_apostrophe, IBUS_Aring, 0x01FA,
-+IBUS_apostrophe, IBUS_AE, 0x01FC,
-+IBUS_apostrophe, IBUS_Ccedilla, 0x1E08,
-+IBUS_apostrophe, IBUS_Ecircumflex, 0x1EBE,
-+IBUS_apostrophe, IBUS_Idiaeresis, 0x1E2E,
-+IBUS_apostrophe, IBUS_Ocircumflex, 0x1ED0,
-+IBUS_apostrophe, IBUS_Otilde, 0x1E4C,
-+IBUS_apostrophe, IBUS_Ooblique, 0x01FE,
-+IBUS_apostrophe, IBUS_Udiaeresis, 0x01D7,
-+IBUS_apostrophe, IBUS_acircumflex, 0x1EA5,
-+IBUS_apostrophe, IBUS_aring, 0x01FB,
-+IBUS_apostrophe, IBUS_ae, 0x01FD,
-+IBUS_apostrophe, IBUS_ccedilla, 0x1E09,
-+IBUS_apostrophe, IBUS_ecircumflex, 0x1EBF,
-+IBUS_apostrophe, IBUS_idiaeresis, 0x1E2F,
-+IBUS_apostrophe, IBUS_ocircumflex, 0x1ED1,
-+IBUS_apostrophe, IBUS_otilde, 0x1E4D,
-+IBUS_apostrophe, IBUS_oslash, 0x01FF,
-+IBUS_apostrophe, IBUS_udiaeresis, 0x01D8,
-+IBUS_apostrophe, IBUS_Abreve, 0x1EAE,
-+IBUS_apostrophe, IBUS_abreve, 0x1EAF,
-+IBUS_apostrophe, IBUS_Emacron, 0x1E16,
-+IBUS_apostrophe, IBUS_emacron, 0x1E17,
-+IBUS_apostrophe, IBUS_Omacron, 0x1E52,
-+IBUS_apostrophe, IBUS_Utilde, 0x1E78,
-+IBUS_apostrophe, IBUS_omacron, 0x1E53,
-+IBUS_apostrophe, IBUS_utilde, 0x1E79,
-+IBUS_apostrophe, IBUS_Cyrillic_ghe, 0x0453,
-+IBUS_apostrophe, IBUS_Cyrillic_ka, 0x045C,
-+IBUS_apostrophe, IBUS_Cyrillic_GHE, 0x0403,
-+IBUS_apostrophe, IBUS_Cyrillic_KA, 0x040C,
-+IBUS_apostrophe, IBUS_Greek_iotadieresis, 0x0390,
-+IBUS_apostrophe, IBUS_Greek_upsilondieresis, 0x03B0,
-+IBUS_apostrophe, IBUS_Greek_ALPHA, 0x0386,
-+IBUS_apostrophe, IBUS_Greek_EPSILON, 0x0388,
-+IBUS_apostrophe, IBUS_Greek_ETA, 0x0389,
-+IBUS_apostrophe, IBUS_Greek_IOTA, 0x038A,
-+IBUS_apostrophe, IBUS_Greek_OMICRON, 0x038C,
-+IBUS_apostrophe, IBUS_Greek_UPSILON, 0x038E,
-+IBUS_apostrophe, IBUS_Greek_OMEGA, 0x038F,
-+IBUS_apostrophe, IBUS_Greek_alpha, 0x03AC,
-+IBUS_apostrophe, IBUS_Greek_epsilon, 0x03AD,
-+IBUS_apostrophe, IBUS_Greek_eta, 0x03AE,
-+IBUS_apostrophe, IBUS_Greek_iota, 0x03AF,
-+IBUS_apostrophe, IBUS_Greek_omicron, 0x03CC,
-+IBUS_apostrophe, IBUS_Greek_upsilon, 0x03CD,
-+IBUS_apostrophe, IBUS_Greek_omega, 0x03CE,
-+IBUS_apostrophe, 0x1F00, 0x1F04,
-+IBUS_apostrophe, 0x1F01, 0x1F05,
-+IBUS_apostrophe, 0x1F08, 0x1F0C,
-+IBUS_apostrophe, 0x1F09, 0x1F0D,
-+IBUS_apostrophe, 0x1F10, 0x1F14,
-+IBUS_apostrophe, 0x1F11, 0x1F15,
-+IBUS_apostrophe, 0x1F18, 0x1F1C,
-+IBUS_apostrophe, 0x1F19, 0x1F1D,
-+IBUS_apostrophe, 0x1F20, 0x1F24,
-+IBUS_apostrophe, 0x1F21, 0x1F25,
-+IBUS_apostrophe, 0x1F28, 0x1F2C,
-+IBUS_apostrophe, 0x1F29, 0x1F2D,
-+IBUS_apostrophe, 0x1F30, 0x1F34,
-+IBUS_apostrophe, 0x1F31, 0x1F35,
-+IBUS_apostrophe, 0x1F38, 0x1F3C,
-+IBUS_apostrophe, 0x1F39, 0x1F3D,
-+IBUS_apostrophe, 0x1F40, 0x1F44,
-+IBUS_apostrophe, 0x1F41, 0x1F45,
-+IBUS_apostrophe, 0x1F48, 0x1F4C,
-+IBUS_apostrophe, 0x1F49, 0x1F4D,
-+IBUS_apostrophe, 0x1F50, 0x1F54,
-+IBUS_apostrophe, 0x1F51, 0x1F55,
-+IBUS_apostrophe, 0x1F59, 0x1F5D,
-+IBUS_apostrophe, 0x1F60, 0x1F64,
-+IBUS_apostrophe, 0x1F61, 0x1F65,
-+IBUS_apostrophe, 0x1F68, 0x1F6C,
-+IBUS_apostrophe, 0x1F69, 0x1F6D,
-+IBUS_parenleft, IBUS_space, 0x02D8,
-+IBUS_parenleft, IBUS_parenleft, 0x005B,
-+IBUS_parenleft, IBUS_minus, 0x007B,
-+IBUS_parenleft, IBUS_A, 0x0102,
-+IBUS_parenleft, IBUS_G, 0x011E,
-+IBUS_parenleft, IBUS_a, 0x0103,
-+IBUS_parenleft, IBUS_c, 0x00A9,
-+IBUS_parenleft, IBUS_g, 0x011F,
-+IBUS_parenleft, IBUS_r, 0x00AE,
-+IBUS_parenleft, IBUS_Greek_ALPHA, 0x1F09,
-+IBUS_parenleft, IBUS_Greek_EPSILON, 0x1F19,
-+IBUS_parenleft, IBUS_Greek_ETA, 0x1F29,
-+IBUS_parenleft, IBUS_Greek_IOTA, 0x1F39,
-+IBUS_parenleft, IBUS_Greek_OMICRON, 0x1F49,
-+IBUS_parenleft, IBUS_Greek_RHO, 0x1FEC,
-+IBUS_parenleft, IBUS_Greek_UPSILON, 0x1F59,
-+IBUS_parenleft, IBUS_Greek_OMEGA, 0x1F69,
-+IBUS_parenleft, IBUS_Greek_alpha, 0x1F01,
-+IBUS_parenleft, IBUS_Greek_epsilon, 0x1F11,
-+IBUS_parenleft, IBUS_Greek_eta, 0x1F21,
-+IBUS_parenleft, IBUS_Greek_iota, 0x1F31,
-+IBUS_parenleft, IBUS_Greek_omicron, 0x1F41,
-+IBUS_parenleft, IBUS_Greek_rho, 0x1FE5,
-+IBUS_parenleft, IBUS_Greek_upsilon, 0x1F51,
-+IBUS_parenleft, IBUS_Greek_omega, 0x1F61,
-+IBUS_parenright, IBUS_parenright, 0x005D,
-+IBUS_parenright, IBUS_minus, 0x007D,
-+IBUS_parenright, IBUS_Greek_ALPHA, 0x1F08,
-+IBUS_parenright, IBUS_Greek_EPSILON, 0x1F18,
-+IBUS_parenright, IBUS_Greek_ETA, 0x1F28,
-+IBUS_parenright, IBUS_Greek_IOTA, 0x1F38,
-+IBUS_parenright, IBUS_Greek_OMICRON, 0x1F48,
-+IBUS_parenright, IBUS_Greek_OMEGA, 0x1F68,
-+IBUS_parenright, IBUS_Greek_alpha, 0x1F00,
-+IBUS_parenright, IBUS_Greek_epsilon, 0x1F10,
-+IBUS_parenright, IBUS_Greek_eta, 0x1F20,
-+IBUS_parenright, IBUS_Greek_iota, 0x1F30,
-+IBUS_parenright, IBUS_Greek_omicron, 0x1F40,
-+IBUS_parenright, IBUS_Greek_rho, 0x1FE4,
-+IBUS_parenright, IBUS_Greek_upsilon, 0x1F50,
-+IBUS_parenright, IBUS_Greek_omega, 0x1F60,
-+IBUS_asterisk, IBUS_0, 0x00B0,
-+IBUS_asterisk, IBUS_A, 0x00C5,
-+IBUS_asterisk, IBUS_U, 0x016E,
-+IBUS_asterisk, IBUS_a, 0x00E5,
-+IBUS_asterisk, IBUS_u, 0x016F,
-+IBUS_plus, IBUS_plus, 0x0023,
-+IBUS_plus, IBUS_minus, 0x00B1,
-+IBUS_plus, IBUS_O, 0x01A0,
-+IBUS_plus, IBUS_U, 0x01AF,
-+IBUS_plus, IBUS_o, 0x01A1,
-+IBUS_plus, IBUS_u, 0x01B0,
-+IBUS_comma, IBUS_space, 0x00B8,
-+IBUS_comma, IBUS_quotedbl, 0x201E,
-+IBUS_comma, IBUS_apostrophe, 0x201A,
-+IBUS_comma, IBUS_comma, 0x00B8,
-+IBUS_comma, IBUS_minus, 0x00AC,
-+IBUS_comma, IBUS_A, 0x0104,
-+IBUS_comma, IBUS_C, 0x00C7,
-+IBUS_comma, IBUS_D, 0x1E10,
-+IBUS_comma, IBUS_E, 0x0228,
-+IBUS_comma, IBUS_G, 0x0122,
-+IBUS_comma, IBUS_H, 0x1E28,
-+IBUS_comma, IBUS_I, 0x012E,
-+IBUS_comma, IBUS_K, 0x0136,
-+IBUS_comma, IBUS_L, 0x013B,
-+IBUS_comma, IBUS_N, 0x0145,
-+IBUS_comma, IBUS_R, 0x0156,
-+IBUS_comma, IBUS_S, 0x015E,
-+IBUS_comma, IBUS_T, 0x0162,
-+IBUS_comma, IBUS_U, 0x0172,
-+IBUS_comma, IBUS_a, 0x0105,
-+IBUS_comma, IBUS_c, 0x00E7,
-+IBUS_comma, IBUS_d, 0x1E11,
-+IBUS_comma, IBUS_e, 0x0229,
-+IBUS_comma, IBUS_g, 0x0123,
-+IBUS_comma, IBUS_h, 0x1E29,
-+IBUS_comma, IBUS_i, 0x012F,
-+IBUS_comma, IBUS_k, 0x0137,
-+IBUS_comma, IBUS_l, 0x013C,
-+IBUS_comma, IBUS_n, 0x0146,
-+IBUS_comma, IBUS_r, 0x0157,
-+IBUS_comma, IBUS_s, 0x015F,
-+IBUS_comma, IBUS_t, 0x0163,
-+IBUS_comma, IBUS_u, 0x0173,
-+IBUS_minus, IBUS_space, 0x007E,
-+IBUS_minus, IBUS_parenleft, 0x007B,
-+IBUS_minus, IBUS_parenright, 0x007D,
-+IBUS_minus, IBUS_plus, 0x00B1,
-+IBUS_minus, IBUS_comma, 0x00AC,
-+IBUS_minus, IBUS_colon, 0x00F7,
-+IBUS_minus, IBUS_greater, 0x2192,
-+IBUS_minus, IBUS_A, 0x00C3,
-+IBUS_minus, IBUS_D, 0x0110,
-+IBUS_minus, IBUS_E, 0x0112,
-+IBUS_minus, IBUS_I, 0x012A,
-+IBUS_minus, IBUS_L, 0x00A3,
-+IBUS_minus, IBUS_N, 0x00D1,
-+IBUS_minus, IBUS_O, 0x00D5,
-+IBUS_minus, IBUS_U, 0x016A,
-+IBUS_minus, IBUS_Y, 0x00A5,
-+IBUS_minus, IBUS_asciicircum, 0x00AF,
-+IBUS_minus, IBUS_a, 0x0101,
-+IBUS_minus, IBUS_d, 0x0111,
-+IBUS_minus, IBUS_e, 0x0113,
-+IBUS_minus, IBUS_i, 0x012B,
-+IBUS_minus, IBUS_l, 0x00A3,
-+IBUS_minus, IBUS_n, 0x00F1,
-+IBUS_minus, IBUS_o, 0x014D,
-+IBUS_minus, IBUS_u, 0x016B,
-+IBUS_minus, IBUS_y, 0x00A5,
-+IBUS_period, IBUS_minus, 0x00B7,
-+IBUS_period, IBUS_period, 0x2026,
-+IBUS_period, IBUS_less, 0x2039,
-+IBUS_period, IBUS_equal, 0x2022,
-+IBUS_period, IBUS_greater, 0x203A,
-+IBUS_period, IBUS_A, 0x0226,
-+IBUS_period, IBUS_B, 0x1E02,
-+IBUS_period, IBUS_C, 0x010A,
-+IBUS_period, IBUS_D, 0x1E0A,
-+IBUS_period, IBUS_E, 0x0116,
-+IBUS_period, IBUS_F, 0x1E1E,
-+IBUS_period, IBUS_G, 0x0120,
-+IBUS_period, IBUS_H, 0x1E22,
-+IBUS_period, IBUS_I, 0x0130,
-+IBUS_period, IBUS_M, 0x1E40,
-+IBUS_period, IBUS_N, 0x1E44,
-+IBUS_period, IBUS_O, 0x022E,
-+IBUS_period, IBUS_P, 0x1E56,
-+IBUS_period, IBUS_R, 0x1E58,
-+IBUS_period, IBUS_S, 0x1E60,
-+IBUS_period, IBUS_T, 0x1E6A,
-+IBUS_period, IBUS_W, 0x1E86,
-+IBUS_period, IBUS_X, 0x1E8A,
-+IBUS_period, IBUS_Y, 0x1E8E,
-+IBUS_period, IBUS_Z, 0x017B,
-+IBUS_period, IBUS_asciicircum, 0x00B7,
-+IBUS_period, IBUS_a, 0x0227,
-+IBUS_period, IBUS_b, 0x1E03,
-+IBUS_period, IBUS_c, 0x010B,
-+IBUS_period, IBUS_d, 0x1E0B,
-+IBUS_period, IBUS_e, 0x0117,
-+IBUS_period, IBUS_f, 0x1E1F,
-+IBUS_period, IBUS_g, 0x0121,
-+IBUS_period, IBUS_h, 0x1E23,
-+IBUS_period, IBUS_i, 0x0131,
-+IBUS_period, IBUS_m, 0x1E41,
-+IBUS_period, IBUS_n, 0x1E45,
-+IBUS_period, IBUS_o, 0x022F,
-+IBUS_period, IBUS_p, 0x1E57,
-+IBUS_period, IBUS_r, 0x1E59,
-+IBUS_period, IBUS_s, 0x1E61,
-+IBUS_period, IBUS_t, 0x1E6B,
-+IBUS_period, IBUS_w, 0x1E87,
-+IBUS_period, IBUS_x, 0x1E8B,
-+IBUS_period, IBUS_y, 0x1E8F,
-+IBUS_period, IBUS_z, 0x017C,
-+IBUS_period, 0x017F, 0x1E9B,
-+IBUS_period, IBUS_Sacute, 0x1E64,
-+IBUS_period, IBUS_Scaron, 0x1E66,
-+IBUS_period, IBUS_sacute, 0x1E65,
-+IBUS_period, IBUS_scaron, 0x1E67,
-+IBUS_period, 0x1E62, 0x1E68,
-+IBUS_period, 0x1E63, 0x1E69,
-+IBUS_slash, IBUS_slash, 0x005C,
-+IBUS_slash, IBUS_less, 0x005C,
-+IBUS_slash, IBUS_equal, 0x2260,
-+IBUS_slash, IBUS_C, 0x20A1,
-+IBUS_slash, IBUS_D, 0x0110,
-+IBUS_slash, IBUS_G, 0x01E4,
-+IBUS_slash, IBUS_H, 0x0126,
-+IBUS_slash, IBUS_I, 0x0197,
-+IBUS_slash, IBUS_L, 0x0141,
-+IBUS_slash, IBUS_O, 0x00D8,
-+IBUS_slash, IBUS_T, 0x0166,
-+IBUS_slash, IBUS_U, 0x00B5,
-+IBUS_slash, IBUS_Z, 0x01B5,
-+IBUS_slash, IBUS_asciicircum, 0x007C,
-+IBUS_slash, IBUS_b, 0x0180,
-+IBUS_slash, IBUS_c, 0x00A2,
-+IBUS_slash, IBUS_d, 0x0111,
-+IBUS_slash, IBUS_g, 0x01E5,
-+IBUS_slash, IBUS_h, 0x0127,
-+IBUS_slash, IBUS_i, 0x0268,
-+IBUS_slash, IBUS_l, 0x0142,
-+IBUS_slash, IBUS_m, 0x20A5,
-+IBUS_slash, IBUS_o, 0x00F8,
-+IBUS_slash, IBUS_t, 0x0167,
-+IBUS_slash, IBUS_u, 0x00B5,
-+IBUS_slash, IBUS_z, 0x01B6,
-+IBUS_slash, 0x0294, 0x02A1,
-+IBUS_slash, 0x04AE, 0x04B0,
-+IBUS_slash, 0x04AF, 0x04B1,
-+IBUS_slash, IBUS_Cyrillic_ghe, 0x0493,
-+IBUS_slash, IBUS_Cyrillic_ka, 0x049F,
-+IBUS_slash, IBUS_Cyrillic_GHE, 0x0492,
-+IBUS_slash, IBUS_Cyrillic_KA, 0x049E,
-+IBUS_slash, IBUS_leftarrow, 0x219A,
-+IBUS_slash, IBUS_rightarrow, 0x219B,
-+IBUS_slash, 0x2194, 0x21AE,
-+IBUS_0, IBUS_asterisk, 0x00B0,
-+IBUS_0, IBUS_C, 0x00A9,
-+IBUS_0, IBUS_S, 0x00A7,
-+IBUS_0, IBUS_X, 0x00A4,
-+IBUS_0, IBUS_asciicircum, 0x00B0,
-+IBUS_0, IBUS_c, 0x00A9,
-+IBUS_0, IBUS_s, 0x00A7,
-+IBUS_0, IBUS_x, 0x00A4,
-+IBUS_1, IBUS_2, 0x00BD,
-+IBUS_1, IBUS_3, 0x2153,
-+IBUS_1, IBUS_4, 0x00BC,
-+IBUS_1, IBUS_5, 0x2155,
-+IBUS_1, IBUS_6, 0x2159,
-+IBUS_1, IBUS_8, 0x215B,
-+IBUS_1, IBUS_S, 0x00B9,
-+IBUS_1, IBUS_asciicircum, 0x00B9,
-+IBUS_1, IBUS_s, 0x00B9,
-+IBUS_2, IBUS_3, 0x2154,
-+IBUS_2, IBUS_5, 0x2156,
-+IBUS_2, IBUS_S, 0x00B2,
-+IBUS_2, IBUS_asciicircum, 0x00B2,
-+IBUS_2, IBUS_s, 0x00B2,
-+IBUS_3, IBUS_4, 0x00BE,
-+IBUS_3, IBUS_5, 0x2157,
-+IBUS_3, IBUS_8, 0x215C,
-+IBUS_3, IBUS_S, 0x00B3,
-+IBUS_3, IBUS_asciicircum, 0x00B3,
-+IBUS_3, IBUS_s, 0x00B3,
-+IBUS_4, IBUS_5, 0x2158,
-+IBUS_5, IBUS_6, 0x215A,
-+IBUS_5, IBUS_8, 0x215D,
-+IBUS_7, IBUS_8, 0x215E,
-+IBUS_colon, IBUS_parenleft, 0x2639,
-+IBUS_colon, IBUS_parenright, 0x263A,
-+IBUS_colon, IBUS_minus, 0x00F7,
-+IBUS_semicolon, IBUS_A, 0x0104,
-+IBUS_semicolon, IBUS_E, 0x0118,
-+IBUS_semicolon, IBUS_I, 0x012E,
-+IBUS_semicolon, IBUS_O, 0x01EA,
-+IBUS_semicolon, IBUS_U, 0x0172,
-+IBUS_semicolon, IBUS_a, 0x0105,
-+IBUS_semicolon, IBUS_e, 0x0119,
-+IBUS_semicolon, IBUS_i, 0x012F,
-+IBUS_semicolon, IBUS_o, 0x01EB,
-+IBUS_semicolon, IBUS_u, 0x0173,
-+IBUS_less, IBUS_space, 0x02C7,
-+IBUS_less, IBUS_quotedbl, 0x201C,
-+IBUS_less, IBUS_apostrophe, 0x2018,
-+IBUS_less, IBUS_minus, 0x2190,
-+IBUS_less, IBUS_slash, 0x005C,
-+IBUS_less, IBUS_3, 0x2665,
-+IBUS_less, IBUS_less, 0x00AB,
-+IBUS_less, IBUS_equal, 0x2264,
-+IBUS_less, IBUS_C, 0x010C,
-+IBUS_less, IBUS_D, 0x010E,
-+IBUS_less, IBUS_E, 0x011A,
-+IBUS_less, IBUS_L, 0x013D,
-+IBUS_less, IBUS_N, 0x0147,
-+IBUS_less, IBUS_R, 0x0158,
-+IBUS_less, IBUS_S, 0x0160,
-+IBUS_less, IBUS_T, 0x0164,
-+IBUS_less, IBUS_Z, 0x017D,
-+IBUS_less, IBUS_c, 0x010D,
-+IBUS_less, IBUS_d, 0x010F,
-+IBUS_less, IBUS_e, 0x011B,
-+IBUS_less, IBUS_l, 0x013E,
-+IBUS_less, IBUS_n, 0x0148,
-+IBUS_less, IBUS_r, 0x0159,
-+IBUS_less, IBUS_s, 0x0161,
-+IBUS_less, IBUS_t, 0x0165,
-+IBUS_less, IBUS_z, 0x017E,
-+IBUS_less, 0x0338, 0x226E,
-+IBUS_equal, IBUS_slash, 0x2260,
-+IBUS_equal, IBUS_C, 0x20AC,
-+IBUS_equal, IBUS_E, 0x20AC,
-+IBUS_equal, IBUS_L, 0x20A4,
-+IBUS_equal, IBUS_N, 0x20A6,
-+IBUS_equal, IBUS_O, 0x0150,
-+IBUS_equal, IBUS_U, 0x0170,
-+IBUS_equal, IBUS_W, 0x20A9,
-+IBUS_equal, IBUS_Y, 0x00A5,
-+IBUS_equal, IBUS_c, 0x20AC,
-+IBUS_equal, IBUS_e, 0x20AC,
-+IBUS_equal, IBUS_l, 0x00A3,
-+IBUS_equal, IBUS_o, 0x0151,
-+IBUS_equal, IBUS_u, 0x0171,
-+IBUS_equal, IBUS_y, 0x00A5,
-+IBUS_equal, 0x0338, 0x2260,
-+IBUS_equal, IBUS_Cyrillic_u, 0x04F3,
-+IBUS_equal, IBUS_Cyrillic_IE, 0x20AC,
-+IBUS_equal, IBUS_Cyrillic_ES, 0x20AC,
-+IBUS_equal, IBUS_Cyrillic_U, 0x04F2,
-+IBUS_greater, IBUS_space, 0x005E,
-+IBUS_greater, IBUS_quotedbl, 0x201D,
-+IBUS_greater, IBUS_apostrophe, 0x2019,
-+IBUS_greater, IBUS_equal, 0x2265,
-+IBUS_greater, IBUS_greater, 0x00BB,
-+IBUS_greater, IBUS_A, 0x00C2,
-+IBUS_greater, IBUS_E, 0x00CA,
-+IBUS_greater, IBUS_I, 0x00CE,
-+IBUS_greater, IBUS_O, 0x00D4,
-+IBUS_greater, IBUS_U, 0x00DB,
-+IBUS_greater, IBUS_a, 0x00E2,
-+IBUS_greater, IBUS_e, 0x00EA,
-+IBUS_greater, IBUS_i, 0x00EE,
-+IBUS_greater, IBUS_o, 0x00F4,
-+IBUS_greater, IBUS_u, 0x00FB,
-+IBUS_greater, 0x0338, 0x226F,
-+IBUS_question, IBUS_exclam, 0x203D,
-+IBUS_question, IBUS_question, 0x00BF,
-+IBUS_question, IBUS_A, 0x1EA2,
-+IBUS_question, IBUS_E, 0x1EBA,
-+IBUS_question, IBUS_I, 0x1EC8,
-+IBUS_question, IBUS_O, 0x1ECE,
-+IBUS_question, IBUS_U, 0x1EE6,
-+IBUS_question, IBUS_Y, 0x1EF6,
-+IBUS_question, IBUS_a, 0x1EA3,
-+IBUS_question, IBUS_e, 0x1EBB,
-+IBUS_question, IBUS_i, 0x1EC9,
-+IBUS_question, IBUS_o, 0x1ECF,
-+IBUS_question, IBUS_u, 0x1EE7,
-+IBUS_question, IBUS_y, 0x1EF7,
-+IBUS_question, IBUS_Acircumflex, 0x1EA8,
-+IBUS_question, IBUS_Ecircumflex, 0x1EC2,
-+IBUS_question, IBUS_Ocircumflex, 0x1ED4,
-+IBUS_question, IBUS_acircumflex, 0x1EA9,
-+IBUS_question, IBUS_ecircumflex, 0x1EC3,
-+IBUS_question, IBUS_ocircumflex, 0x1ED5,
-+IBUS_question, IBUS_Abreve, 0x1EB2,
-+IBUS_question, IBUS_abreve, 0x1EB3,
-+IBUS_A, IBUS_quotedbl, 0x00C4,
-+IBUS_A, IBUS_apostrophe, 0x00C1,
-+IBUS_A, IBUS_parenleft, 0x0102,
-+IBUS_A, IBUS_asterisk, 0x00C5,
-+IBUS_A, IBUS_comma, 0x0104,
-+IBUS_A, IBUS_minus, 0x00C3,
-+IBUS_A, IBUS_greater, 0x00C2,
-+IBUS_A, IBUS_A, 0x00C5,
-+IBUS_A, IBUS_E, 0x00C6,
-+IBUS_A, IBUS_T, 0x0040,
-+IBUS_A, IBUS_asciicircum, 0x00C2,
-+IBUS_A, IBUS_underscore, 0x00AA,
-+IBUS_A, IBUS_grave, 0x00C0,
-+IBUS_A, IBUS_asciitilde, 0x00C3,
-+IBUS_A, IBUS_diaeresis, 0x00C4,
-+IBUS_A, IBUS_acute, 0x00C1,
-+IBUS_B, IBUS_period, 0x1E02,
-+IBUS_C, IBUS_apostrophe, 0x0106,
-+IBUS_C, IBUS_comma, 0x00C7,
-+IBUS_C, IBUS_period, 0x010A,
-+IBUS_C, IBUS_slash, 0x20A1,
-+IBUS_C, IBUS_0, 0x00A9,
-+IBUS_C, IBUS_less, 0x010C,
-+IBUS_C, IBUS_equal, 0x20AC,
-+IBUS_C, IBUS_E, 0x20A0,
-+IBUS_C, IBUS_O, 0x00A9,
-+IBUS_C, IBUS_o, 0x00A9,
-+IBUS_C, IBUS_r, 0x20A2,
-+IBUS_C, IBUS_bar, 0x00A2,
-+IBUS_D, IBUS_minus, 0x0110,
-+IBUS_D, IBUS_period, 0x1E0A,
-+IBUS_D, IBUS_less, 0x010E,
-+IBUS_D, IBUS_H, 0x00D0,
-+IBUS_E, IBUS_quotedbl, 0x00CB,
-+IBUS_E, IBUS_apostrophe, 0x00C9,
-+IBUS_E, IBUS_comma, 0x0118,
-+IBUS_E, IBUS_minus, 0x0112,
-+IBUS_E, IBUS_period, 0x0116,
-+IBUS_E, IBUS_less, 0x011A,
-+IBUS_E, IBUS_equal, 0x20AC,
-+IBUS_E, IBUS_greater, 0x00CA,
-+IBUS_E, IBUS_asciicircum, 0x00CA,
-+IBUS_E, IBUS_underscore, 0x0112,
-+IBUS_E, IBUS_grave, 0x00C8,
-+IBUS_E, IBUS_diaeresis, 0x00CB,
-+IBUS_E, IBUS_acute, 0x00C9,
-+IBUS_F, IBUS_period, 0x1E1E,
-+IBUS_F, IBUS_r, 0x20A3,
-+IBUS_G, IBUS_parenleft, 0x011E,
-+IBUS_G, IBUS_comma, 0x0122,
-+IBUS_G, IBUS_period, 0x0120,
-+IBUS_G, IBUS_U, 0x011E,
-+IBUS_G, IBUS_breve, 0x011E,
-+IBUS_I, IBUS_quotedbl, 0x00CF,
-+IBUS_I, IBUS_apostrophe, 0x00CD,
-+IBUS_I, IBUS_comma, 0x012E,
-+IBUS_I, IBUS_minus, 0x012A,
-+IBUS_I, IBUS_period, 0x0130,
-+IBUS_I, IBUS_greater, 0x00CE,
-+IBUS_I, IBUS_asciicircum, 0x00CE,
-+IBUS_I, IBUS_underscore, 0x012A,
-+IBUS_I, IBUS_grave, 0x00CC,
-+IBUS_I, IBUS_asciitilde, 0x0128,
-+IBUS_I, IBUS_diaeresis, 0x00CF,
-+IBUS_I, IBUS_acute, 0x00CD,
-+IBUS_K, IBUS_comma, 0x0136,
-+IBUS_L, IBUS_apostrophe, 0x0139,
-+IBUS_L, IBUS_comma, 0x013B,
-+IBUS_L, IBUS_minus, 0x00A3,
-+IBUS_L, IBUS_slash, 0x0141,
-+IBUS_L, IBUS_less, 0x013D,
-+IBUS_L, IBUS_equal, 0x00A3,
-+IBUS_L, IBUS_V, 0x007C,
-+IBUS_M, IBUS_period, 0x1E40,
-+IBUS_N, IBUS_apostrophe, 0x0143,
-+IBUS_N, IBUS_comma, 0x0145,
-+IBUS_N, IBUS_minus, 0x00D1,
-+IBUS_N, IBUS_less, 0x0147,
-+IBUS_N, IBUS_equal, 0x20A6,
-+IBUS_N, IBUS_G, 0x014A,
-+IBUS_N, IBUS_O, 0x2116,
-+IBUS_N, IBUS_o, 0x2116,
-+IBUS_N, IBUS_asciitilde, 0x00D1,
-+IBUS_O, IBUS_quotedbl, 0x00D6,
-+IBUS_O, IBUS_apostrophe, 0x00D3,
-+IBUS_O, IBUS_minus, 0x00D5,
-+IBUS_O, IBUS_slash, 0x00D8,
-+IBUS_O, IBUS_greater, 0x00D4,
-+IBUS_O, IBUS_C, 0x00A9,
-+IBUS_O, IBUS_E, 0x0152,
-+IBUS_O, IBUS_R, 0x00AE,
-+IBUS_O, IBUS_S, 0x00A7,
-+IBUS_O, IBUS_X, 0x00A4,
-+IBUS_O, IBUS_asciicircum, 0x00D4,
-+IBUS_O, IBUS_underscore, 0x00BA,
-+IBUS_O, IBUS_grave, 0x00D2,
-+IBUS_O, IBUS_c, 0x00A9,
-+IBUS_O, IBUS_r, 0x00AE,
-+IBUS_O, IBUS_x, 0x00A4,
-+IBUS_O, IBUS_asciitilde, 0x00D5,
-+IBUS_O, IBUS_diaeresis, 0x00D6,
-+IBUS_O, IBUS_acute, 0x00D3,
-+IBUS_P, IBUS_exclam, 0x00B6,
-+IBUS_P, IBUS_period, 0x1E56,
-+IBUS_P, IBUS_P, 0x00B6,
-+IBUS_P, IBUS_t, 0x20A7,
-+IBUS_R, IBUS_apostrophe, 0x0154,
-+IBUS_R, IBUS_comma, 0x0156,
-+IBUS_R, IBUS_less, 0x0158,
-+IBUS_R, IBUS_O, 0x00AE,
-+IBUS_R, IBUS_s, 0x20A8,
-+IBUS_S, IBUS_exclam, 0x00A7,
-+IBUS_S, IBUS_apostrophe, 0x015A,
-+IBUS_S, IBUS_comma, 0x015E,
-+IBUS_S, IBUS_period, 0x1E60,
-+IBUS_S, IBUS_0, 0x00A7,
-+IBUS_S, IBUS_1, 0x00B9,
-+IBUS_S, IBUS_2, 0x00B2,
-+IBUS_S, IBUS_3, 0x00B3,
-+IBUS_S, IBUS_less, 0x0160,
-+IBUS_S, IBUS_M, 0x2120,
-+IBUS_S, IBUS_O, 0x00A7,
-+IBUS_S, IBUS_m, 0x2120,
-+IBUS_S, IBUS_cedilla, 0x015E,
-+IBUS_T, IBUS_minus, 0x0166,
-+IBUS_T, IBUS_period, 0x1E6A,
-+IBUS_T, IBUS_slash, 0x0166,
-+IBUS_T, IBUS_less, 0x0164,
-+IBUS_T, IBUS_H, 0x00DE,
-+IBUS_T, IBUS_M, 0x2122,
-+IBUS_T, IBUS_m, 0x2122,
-+IBUS_U, IBUS_quotedbl, 0x00DC,
-+IBUS_U, IBUS_apostrophe, 0x00DA,
-+IBUS_U, IBUS_asterisk, 0x016E,
-+IBUS_U, IBUS_comma, 0x0172,
-+IBUS_U, IBUS_minus, 0x016A,
-+IBUS_U, IBUS_slash, 0x00B5,
-+IBUS_U, IBUS_greater, 0x00DB,
-+IBUS_U, IBUS_A, 0x0102,
-+IBUS_U, IBUS_E, 0x0114,
-+IBUS_U, IBUS_G, 0x011E,
-+IBUS_U, IBUS_I, 0x012C,
-+IBUS_U, IBUS_O, 0x014E,
-+IBUS_U, IBUS_U, 0x016C,
-+IBUS_U, IBUS_asciicircum, 0x00DB,
-+IBUS_U, IBUS_underscore, 0x016A,
-+IBUS_U, IBUS_grave, 0x00D9,
-+IBUS_U, IBUS_a, 0x0103,
-+IBUS_U, IBUS_e, 0x0115,
-+IBUS_U, IBUS_g, 0x011F,
-+IBUS_U, IBUS_i, 0x012D,
-+IBUS_U, IBUS_o, 0x014F,
-+IBUS_U, IBUS_u, 0x016D,
-+IBUS_U, IBUS_asciitilde, 0x0168,
-+IBUS_U, IBUS_diaeresis, 0x00DC,
-+IBUS_U, IBUS_acute, 0x00DA,
-+IBUS_U, 0x0228, 0x1E1C,
-+IBUS_U, 0x0229, 0x1E1D,
-+IBUS_U, IBUS_Cyrillic_a, 0x04D1,
-+IBUS_U, IBUS_Cyrillic_ie, 0x04D7,
-+IBUS_U, IBUS_Cyrillic_i, 0x0439,
-+IBUS_U, IBUS_Cyrillic_u, 0x045E,
-+IBUS_U, IBUS_Cyrillic_zhe, 0x04C2,
-+IBUS_U, IBUS_Cyrillic_A, 0x04D0,
-+IBUS_U, IBUS_Cyrillic_IE, 0x04D6,
-+IBUS_U, IBUS_Cyrillic_I, 0x0419,
-+IBUS_U, IBUS_Cyrillic_U, 0x040E,
-+IBUS_U, IBUS_Cyrillic_ZHE, 0x04C1,
-+IBUS_U, IBUS_Greek_ALPHA, 0x1FB8,
-+IBUS_U, IBUS_Greek_IOTA, 0x1FD8,
-+IBUS_U, IBUS_Greek_UPSILON, 0x1FE8,
-+IBUS_U, IBUS_Greek_alpha, 0x1FB0,
-+IBUS_U, IBUS_Greek_iota, 0x1FD0,
-+IBUS_U, IBUS_Greek_upsilon, 0x1FE0,
-+IBUS_U, 0x1EA0, 0x1EB6,
-+IBUS_U, 0x1EA1, 0x1EB7,
-+IBUS_V, IBUS_L, 0x007C,
-+IBUS_W, IBUS_equal, 0x20A9,
-+IBUS_W, IBUS_asciicircum, 0x0174,
-+IBUS_X, IBUS_0, 0x00A4,
-+IBUS_X, IBUS_O, 0x00A4,
-+IBUS_X, IBUS_o, 0x00A4,
-+IBUS_Y, IBUS_quotedbl, 0x0178,
-+IBUS_Y, IBUS_apostrophe, 0x00DD,
-+IBUS_Y, IBUS_minus, 0x00A5,
-+IBUS_Y, IBUS_equal, 0x00A5,
-+IBUS_Y, IBUS_asciicircum, 0x0176,
-+IBUS_Y, IBUS_diaeresis, 0x0178,
-+IBUS_Y, IBUS_acute, 0x00DD,
-+IBUS_Z, IBUS_apostrophe, 0x0179,
-+IBUS_Z, IBUS_period, 0x017B,
-+IBUS_Z, IBUS_less, 0x017D,
-+IBUS_asciicircum, IBUS_space, 0x005E,
-+IBUS_asciicircum, IBUS_parenleft, 0x207D,
-+IBUS_asciicircum, IBUS_parenright, 0x207E,
-+IBUS_asciicircum, IBUS_plus, 0x207A,
-+IBUS_asciicircum, IBUS_minus, 0x00AF,
-+IBUS_asciicircum, IBUS_period, 0x00B7,
-+IBUS_asciicircum, IBUS_slash, 0x007C,
-+IBUS_asciicircum, IBUS_0, 0x2070,
-+IBUS_asciicircum, IBUS_1, 0x00B9,
-+IBUS_asciicircum, IBUS_2, 0x00B2,
-+IBUS_asciicircum, IBUS_3, 0x00B3,
-+IBUS_asciicircum, IBUS_4, 0x2074,
-+IBUS_asciicircum, IBUS_5, 0x2075,
-+IBUS_asciicircum, IBUS_6, 0x2076,
-+IBUS_asciicircum, IBUS_7, 0x2077,
-+IBUS_asciicircum, IBUS_8, 0x2078,
-+IBUS_asciicircum, IBUS_9, 0x2079,
-+IBUS_asciicircum, IBUS_equal, 0x207C,
-+IBUS_asciicircum, IBUS_A, 0x00C2,
-+IBUS_asciicircum, IBUS_C, 0x0108,
-+IBUS_asciicircum, IBUS_E, 0x00CA,
-+IBUS_asciicircum, IBUS_G, 0x011C,
-+IBUS_asciicircum, IBUS_H, 0x0124,
-+IBUS_asciicircum, IBUS_I, 0x00CE,
-+IBUS_asciicircum, IBUS_J, 0x0134,
-+IBUS_asciicircum, IBUS_O, 0x00D4,
-+IBUS_asciicircum, IBUS_S, 0x015C,
-+IBUS_asciicircum, IBUS_U, 0x00DB,
-+IBUS_asciicircum, IBUS_W, 0x0174,
-+IBUS_asciicircum, IBUS_Y, 0x0176,
-+IBUS_asciicircum, IBUS_Z, 0x1E90,
-+IBUS_asciicircum, IBUS_underscore, 0x00AF,
-+IBUS_asciicircum, IBUS_a, 0x00E2,
-+IBUS_asciicircum, IBUS_c, 0x0109,
-+IBUS_asciicircum, IBUS_e, 0x00EA,
-+IBUS_asciicircum, IBUS_g, 0x011D,
-+IBUS_asciicircum, IBUS_h, 0x0125,
-+IBUS_asciicircum, IBUS_i, 0x00EE,
-+IBUS_asciicircum, IBUS_j, 0x0135,
-+IBUS_asciicircum, IBUS_o, 0x00F4,
-+IBUS_asciicircum, IBUS_s, 0x015D,
-+IBUS_asciicircum, IBUS_u, 0x00FB,
-+IBUS_asciicircum, IBUS_w, 0x0175,
-+IBUS_asciicircum, IBUS_y, 0x0177,
-+IBUS_asciicircum, IBUS_z, 0x1E91,
-+IBUS_asciicircum, 0x1EA0, 0x1EAC,
-+IBUS_asciicircum, 0x1EA1, 0x1EAD,
-+IBUS_asciicircum, 0x1EB8, 0x1EC6,
-+IBUS_asciicircum, 0x1EB9, 0x1EC7,
-+IBUS_asciicircum, 0x1ECC, 0x1ED8,
-+IBUS_asciicircum, 0x1ECD, 0x1ED9,
-+IBUS_asciicircum, 0x2212, 0x207B,
-+IBUS_asciicircum, 0x4E00, 0x3192,
-+IBUS_asciicircum, 0x4E01, 0x319C,
-+IBUS_asciicircum, 0x4E09, 0x3194,
-+IBUS_asciicircum, 0x4E0A, 0x3196,
-+IBUS_asciicircum, 0x4E0B, 0x3198,
-+IBUS_asciicircum, 0x4E19, 0x319B,
-+IBUS_asciicircum, 0x4E2D, 0x3197,
-+IBUS_asciicircum, 0x4E59, 0x319A,
-+IBUS_asciicircum, 0x4E8C, 0x3193,
-+IBUS_asciicircum, 0x4EBA, 0x319F,
-+IBUS_asciicircum, 0x56DB, 0x3195,
-+IBUS_asciicircum, 0x5730, 0x319E,
-+IBUS_asciicircum, 0x5929, 0x319D,
-+IBUS_asciicircum, 0x7532, 0x3199,
-+IBUS_asciicircum, IBUS_KP_Space, 0x00B2,
-+IBUS_asciicircum, IBUS_KP_Add, 0x207A,
-+IBUS_asciicircum, IBUS_KP_0, 0x2070,
-+IBUS_asciicircum, IBUS_KP_1, 0x00B9,
-+IBUS_asciicircum, IBUS_KP_2, 0x00B2,
-+IBUS_asciicircum, IBUS_KP_3, 0x00B3,
-+IBUS_asciicircum, IBUS_KP_4, 0x2074,
-+IBUS_asciicircum, IBUS_KP_5, 0x2075,
-+IBUS_asciicircum, IBUS_KP_6, 0x2076,
-+IBUS_asciicircum, IBUS_KP_7, 0x2077,
-+IBUS_asciicircum, IBUS_KP_8, 0x2078,
-+IBUS_asciicircum, IBUS_KP_9, 0x2079,
-+IBUS_asciicircum, IBUS_KP_Equal, 0x207C,
-+IBUS_underscore, IBUS_parenleft, 0x208D,
-+IBUS_underscore, IBUS_parenright, 0x208E,
-+IBUS_underscore, IBUS_plus, 0x208A,
-+IBUS_underscore, IBUS_0, 0x2080,
-+IBUS_underscore, IBUS_1, 0x2081,
-+IBUS_underscore, IBUS_2, 0x2082,
-+IBUS_underscore, IBUS_3, 0x2083,
-+IBUS_underscore, IBUS_4, 0x2084,
-+IBUS_underscore, IBUS_5, 0x2085,
-+IBUS_underscore, IBUS_6, 0x2086,
-+IBUS_underscore, IBUS_7, 0x2087,
-+IBUS_underscore, IBUS_8, 0x2088,
-+IBUS_underscore, IBUS_9, 0x2089,
-+IBUS_underscore, IBUS_equal, 0x208C,
-+IBUS_underscore, IBUS_A, 0x0100,
-+IBUS_underscore, IBUS_E, 0x0112,
-+IBUS_underscore, IBUS_G, 0x1E20,
-+IBUS_underscore, IBUS_I, 0x012A,
-+IBUS_underscore, IBUS_O, 0x014C,
-+IBUS_underscore, IBUS_U, 0x016A,
-+IBUS_underscore, IBUS_Y, 0x0232,
-+IBUS_underscore, IBUS_asciicircum, 0x00AF,
-+IBUS_underscore, IBUS_underscore, 0x00AF,
-+IBUS_underscore, IBUS_a, 0x0101,
-+IBUS_underscore, IBUS_e, 0x0113,
-+IBUS_underscore, IBUS_g, 0x1E21,
-+IBUS_underscore, IBUS_i, 0x012B,
-+IBUS_underscore, IBUS_o, 0x014D,
-+IBUS_underscore, IBUS_u, 0x016B,
-+IBUS_underscore, IBUS_y, 0x0233,
-+IBUS_underscore, IBUS_Adiaeresis, 0x01DE,
-+IBUS_underscore, IBUS_AE, 0x01E2,
-+IBUS_underscore, IBUS_Otilde, 0x022C,
-+IBUS_underscore, IBUS_Odiaeresis, 0x022A,
-+IBUS_underscore, IBUS_Udiaeresis, 0x01D5,
-+IBUS_underscore, IBUS_adiaeresis, 0x01DF,
-+IBUS_underscore, IBUS_ae, 0x01E3,
-+IBUS_underscore, IBUS_otilde, 0x022D,
-+IBUS_underscore, IBUS_odiaeresis, 0x022B,
-+IBUS_underscore, IBUS_udiaeresis, 0x01D6,
-+IBUS_underscore, 0x01EA, 0x01EC,
-+IBUS_underscore, 0x01EB, 0x01ED,
-+IBUS_underscore, 0x0226, 0x01E0,
-+IBUS_underscore, 0x0227, 0x01E1,
-+IBUS_underscore, 0x022E, 0x0230,
-+IBUS_underscore, 0x022F, 0x0231,
-+IBUS_underscore, IBUS_Cyrillic_i, 0x04E3,
-+IBUS_underscore, IBUS_Cyrillic_u, 0x04EF,
-+IBUS_underscore, IBUS_Cyrillic_I, 0x04E2,
-+IBUS_underscore, IBUS_Cyrillic_U, 0x04EE,
-+IBUS_underscore, IBUS_Greek_ALPHA, 0x1FB9,
-+IBUS_underscore, IBUS_Greek_IOTA, 0x1FD9,
-+IBUS_underscore, IBUS_Greek_UPSILON, 0x1FE9,
-+IBUS_underscore, IBUS_Greek_alpha, 0x1FB1,
-+IBUS_underscore, IBUS_Greek_iota, 0x1FD1,
-+IBUS_underscore, IBUS_Greek_upsilon, 0x1FE1,
-+IBUS_underscore, 0x1E36, 0x1E38,
-+IBUS_underscore, 0x1E37, 0x1E39,
-+IBUS_underscore, 0x1E5A, 0x1E5C,
-+IBUS_underscore, 0x1E5B, 0x1E5D,
-+IBUS_underscore, 0x2212, 0x208B,
-+IBUS_underscore, IBUS_KP_Space, 0x2082,
-+IBUS_underscore, IBUS_KP_Add, 0x208A,
-+IBUS_underscore, IBUS_KP_0, 0x2080,
-+IBUS_underscore, IBUS_KP_1, 0x2081,
-+IBUS_underscore, IBUS_KP_2, 0x2082,
-+IBUS_underscore, IBUS_KP_3, 0x2083,
-+IBUS_underscore, IBUS_KP_4, 0x2084,
-+IBUS_underscore, IBUS_KP_5, 0x2085,
-+IBUS_underscore, IBUS_KP_6, 0x2086,
-+IBUS_underscore, IBUS_KP_7, 0x2087,
-+IBUS_underscore, IBUS_KP_8, 0x2088,
-+IBUS_underscore, IBUS_KP_9, 0x2089,
-+IBUS_underscore, IBUS_KP_Equal, 0x208C,
-+IBUS_grave, IBUS_space, 0x0060,
-+IBUS_grave, IBUS_A, 0x00C0,
-+IBUS_grave, IBUS_E, 0x00C8,
-+IBUS_grave, IBUS_I, 0x00CC,
-+IBUS_grave, IBUS_N, 0x01F8,
-+IBUS_grave, IBUS_O, 0x00D2,
-+IBUS_grave, IBUS_U, 0x00D9,
-+IBUS_grave, IBUS_W, 0x1E80,
-+IBUS_grave, IBUS_Y, 0x1EF2,
-+IBUS_grave, IBUS_a, 0x00E0,
-+IBUS_grave, IBUS_e, 0x00E8,
-+IBUS_grave, IBUS_i, 0x00EC,
-+IBUS_grave, IBUS_n, 0x01F9,
-+IBUS_grave, IBUS_o, 0x00F2,
-+IBUS_grave, IBUS_u, 0x00F9,
-+IBUS_grave, IBUS_w, 0x1E81,
-+IBUS_grave, IBUS_y, 0x1EF3,
-+IBUS_grave, IBUS_Acircumflex, 0x1EA6,
-+IBUS_grave, IBUS_Ecircumflex, 0x1EC0,
-+IBUS_grave, IBUS_Ocircumflex, 0x1ED2,
-+IBUS_grave, IBUS_Udiaeresis, 0x01DB,
-+IBUS_grave, IBUS_acircumflex, 0x1EA7,
-+IBUS_grave, IBUS_ecircumflex, 0x1EC1,
-+IBUS_grave, IBUS_ocircumflex, 0x1ED3,
-+IBUS_grave, IBUS_udiaeresis, 0x01DC,
-+IBUS_grave, IBUS_Abreve, 0x1EB0,
-+IBUS_grave, IBUS_abreve, 0x1EB1,
-+IBUS_grave, IBUS_Emacron, 0x1E14,
-+IBUS_grave, IBUS_emacron, 0x1E15,
-+IBUS_grave, IBUS_Omacron, 0x1E50,
-+IBUS_grave, IBUS_omacron, 0x1E51,
-+IBUS_grave, IBUS_Cyrillic_ie, 0x0450,
-+IBUS_grave, IBUS_Cyrillic_i, 0x045D,
-+IBUS_grave, IBUS_Cyrillic_IE, 0x0400,
-+IBUS_grave, IBUS_Cyrillic_I, 0x040D,
-+IBUS_grave, IBUS_Greek_iotadieresis, 0x1FD2,
-+IBUS_grave, IBUS_Greek_upsilondieresis, 0x1FE2,
-+IBUS_grave, IBUS_Greek_ALPHA, 0x1FBA,
-+IBUS_grave, IBUS_Greek_EPSILON, 0x1FC8,
-+IBUS_grave, IBUS_Greek_ETA, 0x1FCA,
-+IBUS_grave, IBUS_Greek_IOTA, 0x1FDA,
-+IBUS_grave, IBUS_Greek_OMICRON, 0x1FF8,
-+IBUS_grave, IBUS_Greek_UPSILON, 0x1FEA,
-+IBUS_grave, IBUS_Greek_OMEGA, 0x1FFA,
-+IBUS_grave, IBUS_Greek_alpha, 0x1F70,
-+IBUS_grave, IBUS_Greek_epsilon, 0x1F72,
-+IBUS_grave, IBUS_Greek_eta, 0x1F74,
-+IBUS_grave, IBUS_Greek_iota, 0x1F76,
-+IBUS_grave, IBUS_Greek_omicron, 0x1F78,
-+IBUS_grave, IBUS_Greek_upsilon, 0x1F7A,
-+IBUS_grave, IBUS_Greek_omega, 0x1F7C,
-+IBUS_grave, 0x1F00, 0x1F02,
-+IBUS_grave, 0x1F01, 0x1F03,
-+IBUS_grave, 0x1F08, 0x1F0A,
-+IBUS_grave, 0x1F09, 0x1F0B,
-+IBUS_grave, 0x1F10, 0x1F12,
-+IBUS_grave, 0x1F11, 0x1F13,
-+IBUS_grave, 0x1F18, 0x1F1A,
-+IBUS_grave, 0x1F19, 0x1F1B,
-+IBUS_grave, 0x1F20, 0x1F22,
-+IBUS_grave, 0x1F21, 0x1F23,
-+IBUS_grave, 0x1F28, 0x1F2A,
-+IBUS_grave, 0x1F29, 0x1F2B,
-+IBUS_grave, 0x1F30, 0x1F32,
-+IBUS_grave, 0x1F31, 0x1F33,
-+IBUS_grave, 0x1F38, 0x1F3A,
-+IBUS_grave, 0x1F39, 0x1F3B,
-+IBUS_grave, 0x1F40, 0x1F42,
-+IBUS_grave, 0x1F41, 0x1F43,
-+IBUS_grave, 0x1F48, 0x1F4A,
-+IBUS_grave, 0x1F49, 0x1F4B,
-+IBUS_grave, 0x1F50, 0x1F52,
-+IBUS_grave, 0x1F51, 0x1F53,
-+IBUS_grave, 0x1F59, 0x1F5B,
-+IBUS_grave, 0x1F60, 0x1F62,
-+IBUS_grave, 0x1F61, 0x1F63,
-+IBUS_grave, 0x1F68, 0x1F6A,
-+IBUS_grave, 0x1F69, 0x1F6B,
-+IBUS_a, IBUS_quotedbl, 0x00E4,
-+IBUS_a, IBUS_apostrophe, 0x00E1,
-+IBUS_a, IBUS_parenleft, 0x0103,
-+IBUS_a, IBUS_asterisk, 0x00E5,
-+IBUS_a, IBUS_comma, 0x0105,
-+IBUS_a, IBUS_minus, 0x0101,
-+IBUS_a, IBUS_greater, 0x00E2,
-+IBUS_a, IBUS_asciicircum, 0x00E2,
-+IBUS_a, IBUS_underscore, 0x00AA,
-+IBUS_a, IBUS_grave, 0x00E0,
-+IBUS_a, IBUS_a, 0x00E5,
-+IBUS_a, IBUS_e, 0x00E6,
-+IBUS_a, IBUS_asciitilde, 0x00E3,
-+IBUS_a, IBUS_diaeresis, 0x00E4,
-+IBUS_a, IBUS_acute, 0x00E1,
-+IBUS_b, IBUS_period, 0x1E03,
-+IBUS_b, IBUS_A, 0x0102,
-+IBUS_b, IBUS_E, 0x0114,
-+IBUS_b, IBUS_G, 0x011E,
-+IBUS_b, IBUS_I, 0x012C,
-+IBUS_b, IBUS_O, 0x014E,
-+IBUS_b, IBUS_U, 0x016C,
-+IBUS_b, IBUS_a, 0x0103,
-+IBUS_b, IBUS_e, 0x0115,
-+IBUS_b, IBUS_g, 0x011F,
-+IBUS_b, IBUS_i, 0x012D,
-+IBUS_b, IBUS_o, 0x014F,
-+IBUS_b, IBUS_u, 0x016D,
-+IBUS_b, 0x0228, 0x1E1C,
-+IBUS_b, 0x0229, 0x1E1D,
-+IBUS_b, IBUS_Cyrillic_a, 0x04D1,
-+IBUS_b, IBUS_Cyrillic_ie, 0x04D7,
-+IBUS_b, IBUS_Cyrillic_i, 0x0439,
-+IBUS_b, IBUS_Cyrillic_u, 0x045E,
-+IBUS_b, IBUS_Cyrillic_zhe, 0x04C2,
-+IBUS_b, IBUS_Cyrillic_A, 0x04D0,
-+IBUS_b, IBUS_Cyrillic_IE, 0x04D6,
-+IBUS_b, IBUS_Cyrillic_I, 0x0419,
-+IBUS_b, IBUS_Cyrillic_U, 0x040E,
-+IBUS_b, IBUS_Cyrillic_ZHE, 0x04C1,
-+IBUS_b, IBUS_Greek_ALPHA, 0x1FB8,
-+IBUS_b, IBUS_Greek_IOTA, 0x1FD8,
-+IBUS_b, IBUS_Greek_UPSILON, 0x1FE8,
-+IBUS_b, IBUS_Greek_alpha, 0x1FB0,
-+IBUS_b, IBUS_Greek_iota, 0x1FD0,
-+IBUS_b, IBUS_Greek_upsilon, 0x1FE0,
-+IBUS_b, 0x1EA0, 0x1EB6,
-+IBUS_b, 0x1EA1, 0x1EB7,
-+IBUS_c, IBUS_apostrophe, 0x0107,
-+IBUS_c, IBUS_comma, 0x00E7,
-+IBUS_c, IBUS_period, 0x010B,
-+IBUS_c, IBUS_slash, 0x00A2,
-+IBUS_c, IBUS_0, 0x00A9,
-+IBUS_c, IBUS_less, 0x010D,
-+IBUS_c, IBUS_equal, 0x20AC,
-+IBUS_c, IBUS_A, 0x01CD,
-+IBUS_c, IBUS_C, 0x010C,
-+IBUS_c, IBUS_D, 0x010E,
-+IBUS_c, IBUS_E, 0x011A,
-+IBUS_c, IBUS_G, 0x01E6,
-+IBUS_c, IBUS_H, 0x021E,
-+IBUS_c, IBUS_I, 0x01CF,
-+IBUS_c, IBUS_K, 0x01E8,
-+IBUS_c, IBUS_L, 0x013D,
-+IBUS_c, IBUS_N, 0x0147,
-+IBUS_c, IBUS_O, 0x01D1,
-+IBUS_c, IBUS_R, 0x0158,
-+IBUS_c, IBUS_S, 0x0160,
-+IBUS_c, IBUS_T, 0x0164,
-+IBUS_c, IBUS_U, 0x01D3,
-+IBUS_c, IBUS_Z, 0x017D,
-+IBUS_c, IBUS_a, 0x01CE,
-+IBUS_c, IBUS_c, 0x010D,
-+IBUS_c, IBUS_d, 0x010F,
-+IBUS_c, IBUS_e, 0x011B,
-+IBUS_c, IBUS_g, 0x01E7,
-+IBUS_c, IBUS_h, 0x021F,
-+IBUS_c, IBUS_i, 0x01D0,
-+IBUS_c, IBUS_j, 0x01F0,
-+IBUS_c, IBUS_k, 0x01E9,
-+IBUS_c, IBUS_l, 0x013E,
-+IBUS_c, IBUS_n, 0x0148,
-+IBUS_c, IBUS_o, 0x01D2,
-+IBUS_c, IBUS_r, 0x0159,
-+IBUS_c, IBUS_s, 0x0161,
-+IBUS_c, IBUS_t, 0x0165,
-+IBUS_c, IBUS_u, 0x01D4,
-+IBUS_c, IBUS_z, 0x017E,
-+IBUS_c, IBUS_bar, 0x00A2,
-+IBUS_c, IBUS_Udiaeresis, 0x01D9,
-+IBUS_c, IBUS_udiaeresis, 0x01DA,
-+IBUS_c, 0x01B7, 0x01EE,
-+IBUS_c, 0x0292, 0x01EF,
-+IBUS_d, IBUS_minus, 0x20AB,
-+IBUS_d, IBUS_period, 0x1E0B,
-+IBUS_d, IBUS_less, 0x010F,
-+IBUS_d, IBUS_h, 0x00F0,
-+IBUS_e, IBUS_quotedbl, 0x00EB,
-+IBUS_e, IBUS_apostrophe, 0x00E9,
-+IBUS_e, IBUS_comma, 0x0119,
-+IBUS_e, IBUS_minus, 0x0113,
-+IBUS_e, IBUS_period, 0x0117,
-+IBUS_e, IBUS_less, 0x011B,
-+IBUS_e, IBUS_equal, 0x20AC,
-+IBUS_e, IBUS_greater, 0x00EA,
-+IBUS_e, IBUS_asciicircum, 0x00EA,
-+IBUS_e, IBUS_underscore, 0x0113,
-+IBUS_e, IBUS_grave, 0x00E8,
-+IBUS_e, IBUS_e, 0x0259,
-+IBUS_e, IBUS_diaeresis, 0x00EB,
-+IBUS_e, IBUS_acute, 0x00E9,
-+IBUS_f, IBUS_period, 0x1E1F,
-+IBUS_f, IBUS_S, 0x017F,
-+IBUS_f, IBUS_s, 0x017F,
-+IBUS_g, IBUS_parenleft, 0x011F,
-+IBUS_g, IBUS_comma, 0x0123,
-+IBUS_g, IBUS_period, 0x0121,
-+IBUS_g, IBUS_U, 0x011F,
-+IBUS_g, IBUS_breve, 0x011F,
-+IBUS_i, IBUS_quotedbl, 0x00EF,
-+IBUS_i, IBUS_apostrophe, 0x00ED,
-+IBUS_i, IBUS_comma, 0x012F,
-+IBUS_i, IBUS_minus, 0x012B,
-+IBUS_i, IBUS_period, 0x0131,
-+IBUS_i, IBUS_greater, 0x00EE,
-+IBUS_i, IBUS_asciicircum, 0x00EE,
-+IBUS_i, IBUS_underscore, 0x012B,
-+IBUS_i, IBUS_grave, 0x00EC,
-+IBUS_i, IBUS_asciitilde, 0x0129,
-+IBUS_i, IBUS_diaeresis, 0x00EF,
-+IBUS_i, IBUS_acute, 0x00ED,
-+IBUS_k, IBUS_comma, 0x0137,
-+IBUS_k, IBUS_k, 0x0138,
-+IBUS_l, IBUS_apostrophe, 0x013A,
-+IBUS_l, IBUS_comma, 0x013C,
-+IBUS_l, IBUS_minus, 0x00A3,
-+IBUS_l, IBUS_slash, 0x0142,
-+IBUS_l, IBUS_less, 0x013E,
-+IBUS_l, IBUS_equal, 0x00A3,
-+IBUS_l, IBUS_v, 0x007C,
-+IBUS_m, IBUS_period, 0x1E41,
-+IBUS_m, IBUS_slash, 0x20A5,
-+IBUS_m, IBUS_u, 0x00B5,
-+IBUS_n, IBUS_apostrophe, 0x0144,
-+IBUS_n, IBUS_comma, 0x0146,
-+IBUS_n, IBUS_minus, 0x00F1,
-+IBUS_n, IBUS_less, 0x0148,
-+IBUS_n, IBUS_g, 0x014B,
-+IBUS_n, IBUS_asciitilde, 0x00F1,
-+IBUS_o, IBUS_quotedbl, 0x00F6,
-+IBUS_o, IBUS_apostrophe, 0x00F3,
-+IBUS_o, IBUS_minus, 0x014D,
-+IBUS_o, IBUS_slash, 0x00F8,
-+IBUS_o, IBUS_greater, 0x00F4,
-+IBUS_o, IBUS_A, 0x00C5,
-+IBUS_o, IBUS_C, 0x00A9,
-+IBUS_o, IBUS_R, 0x00AE,
-+IBUS_o, IBUS_U, 0x016E,
-+IBUS_o, IBUS_X, 0x00A4,
-+IBUS_o, IBUS_asciicircum, 0x00F4,
-+IBUS_o, IBUS_underscore, 0x00BA,
-+IBUS_o, IBUS_grave, 0x00F2,
-+IBUS_o, IBUS_a, 0x00E5,
-+IBUS_o, IBUS_c, 0x00A9,
-+IBUS_o, IBUS_e, 0x0153,
-+IBUS_o, IBUS_o, 0x00B0,
-+IBUS_o, IBUS_r, 0x00AE,
-+IBUS_o, IBUS_s, 0x00A7,
-+IBUS_o, IBUS_u, 0x016F,
-+IBUS_o, IBUS_w, 0x1E98,
-+IBUS_o, IBUS_x, 0x00A4,
-+IBUS_o, IBUS_y, 0x1E99,
-+IBUS_o, IBUS_asciitilde, 0x00F5,
-+IBUS_o, IBUS_diaeresis, 0x00F6,
-+IBUS_o, IBUS_acute, 0x00F3,
-+IBUS_p, IBUS_exclam, 0x00B6,
-+IBUS_p, IBUS_period, 0x1E57,
-+IBUS_r, IBUS_apostrophe, 0x0155,
-+IBUS_r, IBUS_comma, 0x0157,
-+IBUS_r, IBUS_less, 0x0159,
-+IBUS_s, IBUS_exclam, 0x00A7,
-+IBUS_s, IBUS_apostrophe, 0x015B,
-+IBUS_s, IBUS_comma, 0x015F,
-+IBUS_s, IBUS_period, 0x1E61,
-+IBUS_s, IBUS_0, 0x00A7,
-+IBUS_s, IBUS_1, 0x00B9,
-+IBUS_s, IBUS_2, 0x00B2,
-+IBUS_s, IBUS_3, 0x00B3,
-+IBUS_s, IBUS_less, 0x0161,
-+IBUS_s, IBUS_M, 0x2120,
-+IBUS_s, IBUS_m, 0x2120,
-+IBUS_s, IBUS_o, 0x00A7,
-+IBUS_s, IBUS_s, 0x00DF,
-+IBUS_s, IBUS_cedilla, 0x015F,
-+IBUS_t, IBUS_minus, 0x0167,
-+IBUS_t, IBUS_period, 0x1E6B,
-+IBUS_t, IBUS_slash, 0x0167,
-+IBUS_t, IBUS_less, 0x0165,
-+IBUS_t, IBUS_M, 0x2122,
-+IBUS_t, IBUS_h, 0x00FE,
-+IBUS_t, IBUS_m, 0x2122,
-+IBUS_u, IBUS_quotedbl, 0x00FC,
-+IBUS_u, IBUS_apostrophe, 0x00FA,
-+IBUS_u, IBUS_asterisk, 0x016F,
-+IBUS_u, IBUS_comma, 0x0173,
-+IBUS_u, IBUS_minus, 0x016B,
-+IBUS_u, IBUS_slash, 0x00B5,
-+IBUS_u, IBUS_greater, 0x00FB,
-+IBUS_u, IBUS_asciicircum, 0x00FB,
-+IBUS_u, IBUS_underscore, 0x016B,
-+IBUS_u, IBUS_grave, 0x00F9,
-+IBUS_u, IBUS_u, 0x016D,
-+IBUS_u, IBUS_asciitilde, 0x0169,
-+IBUS_u, IBUS_diaeresis, 0x00FC,
-+IBUS_u, IBUS_acute, 0x00FA,
-+IBUS_v, IBUS_Z, 0x017D,
-+IBUS_v, IBUS_l, 0x007C,
-+IBUS_v, IBUS_z, 0x017E,
-+IBUS_w, IBUS_asciicircum, 0x0175,
-+IBUS_x, IBUS_0, 0x00A4,
-+IBUS_x, IBUS_O, 0x00A4,
-+IBUS_x, IBUS_o, 0x00A4,
-+IBUS_x, IBUS_x, 0x00D7,
-+IBUS_y, IBUS_quotedbl, 0x00FF,
-+IBUS_y, IBUS_apostrophe, 0x00FD,
-+IBUS_y, IBUS_minus, 0x00A5,
-+IBUS_y, IBUS_equal, 0x00A5,
-+IBUS_y, IBUS_asciicircum, 0x0177,
-+IBUS_y, IBUS_diaeresis, 0x00FF,
-+IBUS_y, IBUS_acute, 0x00FD,
-+IBUS_z, IBUS_apostrophe, 0x017A,
-+IBUS_z, IBUS_period, 0x017C,
-+IBUS_z, IBUS_less, 0x017E,
-+IBUS_bar, IBUS_C, 0x00A2,
-+IBUS_bar, IBUS_c, 0x00A2,
-+IBUS_asciitilde, IBUS_space, 0x007E,
-+IBUS_asciitilde, IBUS_A, 0x00C3,
-+IBUS_asciitilde, IBUS_E, 0x1EBC,
-+IBUS_asciitilde, IBUS_I, 0x0128,
-+IBUS_asciitilde, IBUS_N, 0x00D1,
-+IBUS_asciitilde, IBUS_O, 0x00D5,
-+IBUS_asciitilde, IBUS_U, 0x0168,
-+IBUS_asciitilde, IBUS_V, 0x1E7C,
-+IBUS_asciitilde, IBUS_Y, 0x1EF8,
-+IBUS_asciitilde, IBUS_a, 0x00E3,
-+IBUS_asciitilde, IBUS_e, 0x1EBD,
-+IBUS_asciitilde, IBUS_i, 0x0129,
-+IBUS_asciitilde, IBUS_n, 0x00F1,
-+IBUS_asciitilde, IBUS_o, 0x00F5,
-+IBUS_asciitilde, IBUS_u, 0x0169,
-+IBUS_asciitilde, IBUS_v, 0x1E7D,
-+IBUS_asciitilde, IBUS_y, 0x1EF9,
-+IBUS_asciitilde, IBUS_Acircumflex, 0x1EAA,
-+IBUS_asciitilde, IBUS_Ecircumflex, 0x1EC4,
-+IBUS_asciitilde, IBUS_Ocircumflex, 0x1ED6,
-+IBUS_asciitilde, IBUS_acircumflex, 0x1EAB,
-+IBUS_asciitilde, IBUS_ecircumflex, 0x1EC5,
-+IBUS_asciitilde, IBUS_ocircumflex, 0x1ED7,
-+IBUS_asciitilde, IBUS_Abreve, 0x1EB4,
-+IBUS_asciitilde, IBUS_abreve, 0x1EB5,
-+IBUS_asciitilde, IBUS_Greek_iotadieresis, 0x1FD7,
-+IBUS_asciitilde, IBUS_Greek_upsilondieresis, 0x1FE7,
-+IBUS_asciitilde, IBUS_Greek_alpha, 0x1FB6,
-+IBUS_asciitilde, IBUS_Greek_eta, 0x1FC6,
-+IBUS_asciitilde, IBUS_Greek_iota, 0x1FD6,
-+IBUS_asciitilde, IBUS_Greek_upsilon, 0x1FE6,
-+IBUS_asciitilde, IBUS_Greek_omega, 0x1FF6,
-+IBUS_asciitilde, 0x1F00, 0x1F06,
-+IBUS_asciitilde, 0x1F01, 0x1F07,
-+IBUS_asciitilde, 0x1F08, 0x1F0E,
-+IBUS_asciitilde, 0x1F09, 0x1F0F,
-+IBUS_asciitilde, 0x1F20, 0x1F26,
-+IBUS_asciitilde, 0x1F21, 0x1F27,
-+IBUS_asciitilde, 0x1F28, 0x1F2E,
-+IBUS_asciitilde, 0x1F29, 0x1F2F,
-+IBUS_asciitilde, 0x1F30, 0x1F36,
-+IBUS_asciitilde, 0x1F31, 0x1F37,
-+IBUS_asciitilde, 0x1F38, 0x1F3E,
-+IBUS_asciitilde, 0x1F39, 0x1F3F,
-+IBUS_asciitilde, 0x1F50, 0x1F56,
-+IBUS_asciitilde, 0x1F51, 0x1F57,
-+IBUS_asciitilde, 0x1F59, 0x1F5F,
-+IBUS_asciitilde, 0x1F60, 0x1F66,
-+IBUS_asciitilde, 0x1F61, 0x1F67,
-+IBUS_asciitilde, 0x1F68, 0x1F6E,
-+IBUS_asciitilde, 0x1F69, 0x1F6F,
-+IBUS_diaeresis, IBUS_apostrophe, 0x0385,
-+IBUS_diaeresis, IBUS_A, 0x00C4,
-+IBUS_diaeresis, IBUS_E, 0x00CB,
-+IBUS_diaeresis, IBUS_I, 0x00CF,
-+IBUS_diaeresis, IBUS_O, 0x00D6,
-+IBUS_diaeresis, IBUS_U, 0x00DC,
-+IBUS_diaeresis, IBUS_Y, 0x0178,
-+IBUS_diaeresis, IBUS_grave, 0x1FED,
-+IBUS_diaeresis, IBUS_a, 0x00E4,
-+IBUS_diaeresis, IBUS_e, 0x00EB,
-+IBUS_diaeresis, IBUS_i, 0x00EF,
-+IBUS_diaeresis, IBUS_o, 0x00F6,
-+IBUS_diaeresis, IBUS_u, 0x00FC,
-+IBUS_diaeresis, IBUS_y, 0x00FF,
-+IBUS_diaeresis, IBUS_asciitilde, 0x1FC1,
-+IBUS_diaeresis, IBUS_acute, 0x0385,
-+IBUS_diaeresis, IBUS_dead_grave, 0x1FED,
-+IBUS_diaeresis, IBUS_dead_acute, 0x0385,
-+IBUS_diaeresis, IBUS_dead_tilde, 0x1FC1,
-+IBUS_macron, IBUS_A, 0x0100,
-+IBUS_macron, IBUS_E, 0x0112,
-+IBUS_macron, IBUS_G, 0x1E20,
-+IBUS_macron, IBUS_I, 0x012A,
-+IBUS_macron, IBUS_O, 0x014C,
-+IBUS_macron, IBUS_U, 0x016A,
-+IBUS_macron, IBUS_Y, 0x0232,
-+IBUS_macron, IBUS_a, 0x0101,
-+IBUS_macron, IBUS_e, 0x0113,
-+IBUS_macron, IBUS_g, 0x1E21,
-+IBUS_macron, IBUS_i, 0x012B,
-+IBUS_macron, IBUS_o, 0x014D,
-+IBUS_macron, IBUS_u, 0x016B,
-+IBUS_macron, IBUS_y, 0x0233,
-+IBUS_macron, IBUS_Adiaeresis, 0x01DE,
-+IBUS_macron, IBUS_AE, 0x01E2,
-+IBUS_macron, IBUS_Otilde, 0x022C,
-+IBUS_macron, IBUS_Odiaeresis, 0x022A,
-+IBUS_macron, IBUS_Udiaeresis, 0x01D5,
-+IBUS_macron, IBUS_adiaeresis, 0x01DF,
-+IBUS_macron, IBUS_ae, 0x01E3,
-+IBUS_macron, IBUS_otilde, 0x022D,
-+IBUS_macron, IBUS_odiaeresis, 0x022B,
-+IBUS_macron, IBUS_udiaeresis, 0x01D6,
-+IBUS_macron, 0x01EA, 0x01EC,
-+IBUS_macron, 0x01EB, 0x01ED,
-+IBUS_macron, 0x0226, 0x01E0,
-+IBUS_macron, 0x0227, 0x01E1,
-+IBUS_macron, 0x022E, 0x0230,
-+IBUS_macron, 0x022F, 0x0231,
-+IBUS_macron, IBUS_Cyrillic_i, 0x04E3,
-+IBUS_macron, IBUS_Cyrillic_u, 0x04EF,
-+IBUS_macron, IBUS_Cyrillic_I, 0x04E2,
-+IBUS_macron, IBUS_Cyrillic_U, 0x04EE,
-+IBUS_macron, IBUS_Greek_ALPHA, 0x1FB9,
-+IBUS_macron, IBUS_Greek_IOTA, 0x1FD9,
-+IBUS_macron, IBUS_Greek_UPSILON, 0x1FE9,
-+IBUS_macron, IBUS_Greek_alpha, 0x1FB1,
-+IBUS_macron, IBUS_Greek_iota, 0x1FD1,
-+IBUS_macron, IBUS_Greek_upsilon, 0x1FE1,
-+IBUS_macron, 0x1E36, 0x1E38,
-+IBUS_macron, 0x1E37, 0x1E39,
-+IBUS_macron, 0x1E5A, 0x1E5C,
-+IBUS_macron, 0x1E5B, 0x1E5D,
-+IBUS_acute, IBUS_A, 0x00C1,
-+IBUS_acute, IBUS_C, 0x0106,
-+IBUS_acute, IBUS_E, 0x00C9,
-+IBUS_acute, IBUS_G, 0x01F4,
-+IBUS_acute, IBUS_I, 0x00CD,
-+IBUS_acute, IBUS_K, 0x1E30,
-+IBUS_acute, IBUS_L, 0x0139,
-+IBUS_acute, IBUS_M, 0x1E3E,
-+IBUS_acute, IBUS_N, 0x0143,
-+IBUS_acute, IBUS_O, 0x00D3,
-+IBUS_acute, IBUS_P, 0x1E54,
-+IBUS_acute, IBUS_R, 0x0154,
-+IBUS_acute, IBUS_S, 0x015A,
-+IBUS_acute, IBUS_U, 0x00DA,
-+IBUS_acute, IBUS_W, 0x1E82,
-+IBUS_acute, IBUS_Y, 0x00DD,
-+IBUS_acute, IBUS_Z, 0x0179,
-+IBUS_acute, IBUS_a, 0x00E1,
-+IBUS_acute, IBUS_c, 0x0107,
-+IBUS_acute, IBUS_e, 0x00E9,
-+IBUS_acute, IBUS_g, 0x01F5,
-+IBUS_acute, IBUS_i, 0x00ED,
-+IBUS_acute, IBUS_k, 0x1E31,
-+IBUS_acute, IBUS_l, 0x013A,
-+IBUS_acute, IBUS_m, 0x1E3F,
-+IBUS_acute, IBUS_n, 0x0144,
-+IBUS_acute, IBUS_o, 0x00F3,
-+IBUS_acute, IBUS_p, 0x1E55,
-+IBUS_acute, IBUS_r, 0x0155,
-+IBUS_acute, IBUS_s, 0x015B,
-+IBUS_acute, IBUS_u, 0x00FA,
-+IBUS_acute, IBUS_w, 0x1E83,
-+IBUS_acute, IBUS_y, 0x00FD,
-+IBUS_acute, IBUS_z, 0x017A,
-+IBUS_acute, IBUS_Acircumflex, 0x1EA4,
-+IBUS_acute, IBUS_Aring, 0x01FA,
-+IBUS_acute, IBUS_AE, 0x01FC,
-+IBUS_acute, IBUS_Ccedilla, 0x1E08,
-+IBUS_acute, IBUS_Ecircumflex, 0x1EBE,
-+IBUS_acute, IBUS_Idiaeresis, 0x1E2E,
-+IBUS_acute, IBUS_Ocircumflex, 0x1ED0,
-+IBUS_acute, IBUS_Otilde, 0x1E4C,
-+IBUS_acute, IBUS_Ooblique, 0x01FE,
-+IBUS_acute, IBUS_Udiaeresis, 0x01D7,
-+IBUS_acute, IBUS_acircumflex, 0x1EA5,
-+IBUS_acute, IBUS_aring, 0x01FB,
-+IBUS_acute, IBUS_ae, 0x01FD,
-+IBUS_acute, IBUS_ccedilla, 0x1E09,
-+IBUS_acute, IBUS_ecircumflex, 0x1EBF,
-+IBUS_acute, IBUS_idiaeresis, 0x1E2F,
-+IBUS_acute, IBUS_ocircumflex, 0x1ED1,
-+IBUS_acute, IBUS_otilde, 0x1E4D,
-+IBUS_acute, IBUS_oslash, 0x01FF,
-+IBUS_acute, IBUS_udiaeresis, 0x01D8,
-+IBUS_acute, IBUS_Abreve, 0x1EAE,
-+IBUS_acute, IBUS_abreve, 0x1EAF,
-+IBUS_acute, IBUS_Emacron, 0x1E16,
-+IBUS_acute, IBUS_emacron, 0x1E17,
-+IBUS_acute, IBUS_Omacron, 0x1E52,
-+IBUS_acute, IBUS_Utilde, 0x1E78,
-+IBUS_acute, IBUS_omacron, 0x1E53,
-+IBUS_acute, IBUS_utilde, 0x1E79,
-+IBUS_acute, IBUS_Cyrillic_ghe, 0x0453,
-+IBUS_acute, IBUS_Cyrillic_ka, 0x045C,
-+IBUS_acute, IBUS_Cyrillic_GHE, 0x0403,
-+IBUS_acute, IBUS_Cyrillic_KA, 0x040C,
-+IBUS_acute, IBUS_Greek_iotadieresis, 0x0390,
-+IBUS_acute, IBUS_Greek_upsilondieresis, 0x03B0,
-+IBUS_acute, IBUS_Greek_ALPHA, 0x0386,
-+IBUS_acute, IBUS_Greek_EPSILON, 0x0388,
-+IBUS_acute, IBUS_Greek_ETA, 0x0389,
-+IBUS_acute, IBUS_Greek_IOTA, 0x038A,
-+IBUS_acute, IBUS_Greek_OMICRON, 0x038C,
-+IBUS_acute, IBUS_Greek_UPSILON, 0x038E,
-+IBUS_acute, IBUS_Greek_OMEGA, 0x038F,
-+IBUS_acute, IBUS_Greek_alpha, 0x03AC,
-+IBUS_acute, IBUS_Greek_epsilon, 0x03AD,
-+IBUS_acute, IBUS_Greek_eta, 0x03AE,
-+IBUS_acute, IBUS_Greek_iota, 0x03AF,
-+IBUS_acute, IBUS_Greek_omicron, 0x03CC,
-+IBUS_acute, IBUS_Greek_upsilon, 0x03CD,
-+IBUS_acute, IBUS_Greek_omega, 0x03CE,
-+IBUS_acute, 0x1F00, 0x1F04,
-+IBUS_acute, 0x1F01, 0x1F05,
-+IBUS_acute, 0x1F08, 0x1F0C,
-+IBUS_acute, 0x1F09, 0x1F0D,
-+IBUS_acute, 0x1F10, 0x1F14,
-+IBUS_acute, 0x1F11, 0x1F15,
-+IBUS_acute, 0x1F18, 0x1F1C,
-+IBUS_acute, 0x1F19, 0x1F1D,
-+IBUS_acute, 0x1F20, 0x1F24,
-+IBUS_acute, 0x1F21, 0x1F25,
-+IBUS_acute, 0x1F28, 0x1F2C,
-+IBUS_acute, 0x1F29, 0x1F2D,
-+IBUS_acute, 0x1F30, 0x1F34,
-+IBUS_acute, 0x1F31, 0x1F35,
-+IBUS_acute, 0x1F38, 0x1F3C,
-+IBUS_acute, 0x1F39, 0x1F3D,
-+IBUS_acute, 0x1F40, 0x1F44,
-+IBUS_acute, 0x1F41, 0x1F45,
-+IBUS_acute, 0x1F48, 0x1F4C,
-+IBUS_acute, 0x1F49, 0x1F4D,
-+IBUS_acute, 0x1F50, 0x1F54,
-+IBUS_acute, 0x1F51, 0x1F55,
-+IBUS_acute, 0x1F59, 0x1F5D,
-+IBUS_acute, 0x1F60, 0x1F64,
-+IBUS_acute, 0x1F61, 0x1F65,
-+IBUS_acute, 0x1F68, 0x1F6C,
-+IBUS_acute, 0x1F69, 0x1F6D,
-+IBUS_cedilla, IBUS_C, 0x00C7,
-+IBUS_cedilla, IBUS_D, 0x1E10,
-+IBUS_cedilla, IBUS_E, 0x0228,
-+IBUS_cedilla, IBUS_G, 0x0122,
-+IBUS_cedilla, IBUS_H, 0x1E28,
-+IBUS_cedilla, IBUS_K, 0x0136,
-+IBUS_cedilla, IBUS_L, 0x013B,
-+IBUS_cedilla, IBUS_N, 0x0145,
-+IBUS_cedilla, IBUS_R, 0x0156,
-+IBUS_cedilla, IBUS_S, 0x015E,
-+IBUS_cedilla, IBUS_T, 0x0162,
-+IBUS_cedilla, IBUS_c, 0x00E7,
-+IBUS_cedilla, IBUS_d, 0x1E11,
-+IBUS_cedilla, IBUS_e, 0x0229,
-+IBUS_cedilla, IBUS_g, 0x0123,
-+IBUS_cedilla, IBUS_h, 0x1E29,
-+IBUS_cedilla, IBUS_k, 0x0137,
-+IBUS_cedilla, IBUS_l, 0x013C,
-+IBUS_cedilla, IBUS_n, 0x0146,
-+IBUS_cedilla, IBUS_r, 0x0157,
-+IBUS_cedilla, IBUS_s, 0x015F,
-+IBUS_cedilla, IBUS_t, 0x0163,
-+IBUS_breve, IBUS_G, 0x011E,
-+IBUS_breve, IBUS_g, 0x011F,
-+0x05B4, IBUS_hebrew_yod, 0xFB1D,
-+0x05B7, 0x05F2, 0xFB1F,
-+0x05B7, IBUS_hebrew_aleph, 0xFB2E,
-+0x05B8, IBUS_hebrew_aleph, 0xFB2F,
-+0x05B9, IBUS_hebrew_waw, 0xFB4B,
-+0x05BC, IBUS_hebrew_aleph, 0xFB30,
-+0x05BC, IBUS_hebrew_beth, 0xFB31,
-+0x05BC, IBUS_hebrew_gimmel, 0xFB32,
-+0x05BC, IBUS_hebrew_daleth, 0xFB33,
-+0x05BC, IBUS_hebrew_he, 0xFB34,
-+0x05BC, IBUS_hebrew_waw, 0xFB35,
-+0x05BC, IBUS_hebrew_zayin, 0xFB36,
-+0x05BC, IBUS_hebrew_teth, 0xFB38,
-+0x05BC, IBUS_hebrew_yod, 0xFB39,
-+0x05BC, IBUS_hebrew_finalkaph, 0xFB3A,
-+0x05BC, IBUS_hebrew_kaph, 0xFB3B,
-+0x05BC, IBUS_hebrew_lamed, 0xFB3C,
-+0x05BC, IBUS_hebrew_mem, 0xFB3E,
-+0x05BC, IBUS_hebrew_nun, 0xFB40,
-+0x05BC, IBUS_hebrew_samekh, 0xFB41,
-+0x05BC, IBUS_hebrew_finalpe, 0xFB43,
-+0x05BC, IBUS_hebrew_pe, 0xFB44,
-+0x05BC, IBUS_hebrew_zadi, 0xFB46,
-+0x05BC, IBUS_hebrew_qoph, 0xFB47,
-+0x05BC, IBUS_hebrew_resh, 0xFB48,
-+0x05BC, IBUS_hebrew_shin, 0xFB49,
-+0x05BC, IBUS_hebrew_taw, 0xFB4A,
-+0x05BF, IBUS_hebrew_beth, 0xFB4C,
-+0x05BF, IBUS_hebrew_kaph, 0xFB4D,
-+0x05BF, IBUS_hebrew_pe, 0xFB4E,
-+0x05C1, IBUS_hebrew_shin, 0xFB2A,
-+0x05C1, 0xFB49, 0xFB2C,
-+0x05C2, IBUS_hebrew_shin, 0xFB2B,
-+0x05C2, 0xFB49, 0xFB2D,
-+0x0653, IBUS_Arabic_alef, 0x0622,
-+0x0654, IBUS_Arabic_alef, 0x0623,
-+0x0654, IBUS_Arabic_waw, 0x0624,
-+0x0654, IBUS_Arabic_yeh, 0x0626,
-+0x0654, 0x06C1, 0x06C2,
-+0x0654, 0x06D2, 0x06D3,
-+0x0654, 0x06D5, 0x06C0,
-+0x0655, IBUS_Arabic_alef, 0x0625,
-+IBUS_Cyrillic_pe, IBUS_Cyrillic_a, 0x00A7,
-+IBUS_Cyrillic_IE, IBUS_equal, 0x20AC,
-+IBUS_Cyrillic_EN, IBUS_Cyrillic_o, 0x2116,
-+IBUS_Cyrillic_EN, IBUS_Cyrillic_O, 0x2116,
-+IBUS_Cyrillic_ES, IBUS_equal, 0x20AC,
-+IBUS_Greek_ALPHA, IBUS_apostrophe, 0x0386,
-+IBUS_Greek_EPSILON, IBUS_apostrophe, 0x0388,
-+IBUS_Greek_ETA, IBUS_apostrophe, 0x0389,
-+IBUS_Greek_IOTA, IBUS_quotedbl, 0x03AA,
-+IBUS_Greek_IOTA, IBUS_apostrophe, 0x038A,
-+IBUS_Greek_OMICRON, IBUS_apostrophe, 0x038C,
-+IBUS_Greek_UPSILON, IBUS_quotedbl, 0x03AB,
-+IBUS_Greek_UPSILON, IBUS_apostrophe, 0x038E,
-+IBUS_Greek_OMEGA, IBUS_apostrophe, 0x038F,
-+IBUS_Greek_alpha, IBUS_apostrophe, 0x03AC,
-+IBUS_Greek_epsilon, IBUS_apostrophe, 0x03AD,
-+IBUS_Greek_eta, IBUS_apostrophe, 0x03AE,
-+IBUS_Greek_iota, IBUS_quotedbl, 0x03CA,
-+IBUS_Greek_iota, IBUS_apostrophe, 0x03AF,
-+IBUS_Greek_iota, IBUS_Greek_alphaaccent, 0x1FB4,
-+IBUS_Greek_iota, IBUS_Greek_etaaccent, 0x1FC4,
-+IBUS_Greek_iota, IBUS_Greek_omegaaccent, 0x1FF4,
-+IBUS_Greek_iota, IBUS_Greek_ALPHA, 0x1FBC,
-+IBUS_Greek_iota, IBUS_Greek_ETA, 0x1FCC,
-+IBUS_Greek_iota, IBUS_Greek_OMEGA, 0x1FFC,
-+IBUS_Greek_iota, IBUS_Greek_alpha, 0x1FB3,
-+IBUS_Greek_iota, IBUS_Greek_eta, 0x1FC3,
-+IBUS_Greek_iota, IBUS_Greek_omega, 0x1FF3,
-+IBUS_Greek_iota, 0x1F00, 0x1F80,
-+IBUS_Greek_iota, 0x1F01, 0x1F81,
-+IBUS_Greek_iota, 0x1F02, 0x1F82,
-+IBUS_Greek_iota, 0x1F03, 0x1F83,
-+IBUS_Greek_iota, 0x1F04, 0x1F84,
-+IBUS_Greek_iota, 0x1F05, 0x1F85,
-+IBUS_Greek_iota, 0x1F06, 0x1F86,
-+IBUS_Greek_iota, 0x1F07, 0x1F87,
-+IBUS_Greek_iota, 0x1F08, 0x1F88,
-+IBUS_Greek_iota, 0x1F09, 0x1F89,
-+IBUS_Greek_iota, 0x1F0A, 0x1F8A,
-+IBUS_Greek_iota, 0x1F0B, 0x1F8B,
-+IBUS_Greek_iota, 0x1F0C, 0x1F8C,
-+IBUS_Greek_iota, 0x1F0D, 0x1F8D,
-+IBUS_Greek_iota, 0x1F0E, 0x1F8E,
-+IBUS_Greek_iota, 0x1F0F, 0x1F8F,
-+IBUS_Greek_iota, 0x1F20, 0x1F90,
-+IBUS_Greek_iota, 0x1F21, 0x1F91,
-+IBUS_Greek_iota, 0x1F22, 0x1F92,
-+IBUS_Greek_iota, 0x1F23, 0x1F93,
-+IBUS_Greek_iota, 0x1F24, 0x1F94,
-+IBUS_Greek_iota, 0x1F25, 0x1F95,
-+IBUS_Greek_iota, 0x1F26, 0x1F96,
-+IBUS_Greek_iota, 0x1F27, 0x1F97,
-+IBUS_Greek_iota, 0x1F28, 0x1F98,
-+IBUS_Greek_iota, 0x1F29, 0x1F99,
-+IBUS_Greek_iota, 0x1F2A, 0x1F9A,
-+IBUS_Greek_iota, 0x1F2B, 0x1F9B,
-+IBUS_Greek_iota, 0x1F2C, 0x1F9C,
-+IBUS_Greek_iota, 0x1F2D, 0x1F9D,
-+IBUS_Greek_iota, 0x1F2E, 0x1F9E,
-+IBUS_Greek_iota, 0x1F2F, 0x1F9F,
-+IBUS_Greek_iota, 0x1F60, 0x1FA0,
-+IBUS_Greek_iota, 0x1F61, 0x1FA1,
-+IBUS_Greek_iota, 0x1F62, 0x1FA2,
-+IBUS_Greek_iota, 0x1F63, 0x1FA3,
-+IBUS_Greek_iota, 0x1F64, 0x1FA4,
-+IBUS_Greek_iota, 0x1F65, 0x1FA5,
-+IBUS_Greek_iota, 0x1F66, 0x1FA6,
-+IBUS_Greek_iota, 0x1F67, 0x1FA7,
-+IBUS_Greek_iota, 0x1F68, 0x1FA8,
-+IBUS_Greek_iota, 0x1F69, 0x1FA9,
-+IBUS_Greek_iota, 0x1F6A, 0x1FAA,
-+IBUS_Greek_iota, 0x1F6B, 0x1FAB,
-+IBUS_Greek_iota, 0x1F6C, 0x1FAC,
-+IBUS_Greek_iota, 0x1F6D, 0x1FAD,
-+IBUS_Greek_iota, 0x1F6E, 0x1FAE,
-+IBUS_Greek_iota, 0x1F6F, 0x1FAF,
-+IBUS_Greek_iota, 0x1F70, 0x1FB2,
-+IBUS_Greek_iota, 0x1F74, 0x1FC2,
-+IBUS_Greek_iota, 0x1F7C, 0x1FF2,
-+IBUS_Greek_iota, 0x1FB6, 0x1FB7,
-+IBUS_Greek_iota, 0x1FC6, 0x1FC7,
-+IBUS_Greek_iota, 0x1FF6, 0x1FF7,
-+IBUS_Greek_omicron, IBUS_apostrophe, 0x03CC,
-+IBUS_Greek_upsilon, IBUS_quotedbl, 0x03CB,
-+IBUS_Greek_upsilon, IBUS_apostrophe, 0x03CD,
-+IBUS_Greek_omega, IBUS_apostrophe, 0x03CE,
-+IBUS_lessthanequal, 0x0338, 0x2270,
-+IBUS_greaterthanequal, 0x0338, 0x2271,
-+IBUS_approximate, 0x0338, 0x2247,
-+IBUS_identical, 0x0338, 0x2262,
-+IBUS_includedin, 0x0338, 0x2284,
-+IBUS_includes, 0x0338, 0x2285,
-+0x093C, 0x0915, 0x0958,
-+0x093C, 0x0916, 0x0959,
-+0x093C, 0x0917, 0x095A,
-+0x093C, 0x091C, 0x095B,
-+0x093C, 0x0921, 0x095C,
-+0x093C, 0x0922, 0x095D,
-+0x093C, 0x0928, 0x0929,
-+0x093C, 0x092B, 0x095E,
-+0x093C, 0x092F, 0x095F,
-+0x093C, 0x0930, 0x0931,
-+0x093C, 0x0933, 0x0934,
-+0x09BC, 0x09A1, 0x09DC,
-+0x09BC, 0x09A2, 0x09DD,
-+0x09BC, 0x09AF, 0x09DF,
-+0x09C7, 0x09BE, 0x09CB,
-+0x09C7, 0x09D7, 0x09CC,
-+0x0A3C, 0x0A16, 0x0A59,
-+0x0A3C, 0x0A17, 0x0A5A,
-+0x0A3C, 0x0A1C, 0x0A5B,
-+0x0A3C, 0x0A2B, 0x0A5E,
-+0x0A3C, 0x0A32, 0x0A33,
-+0x0A3C, 0x0A38, 0x0A36,
-+0x0B3C, 0x0B21, 0x0B5C,
-+0x0B3C, 0x0B22, 0x0B5D,
-+0x0B47, 0x0B3E, 0x0B4B,
-+0x0B47, 0x0B56, 0x0B48,
-+0x0B47, 0x0B57, 0x0B4C,
-+IBUS_leftcaret, 0x0338, 0x226E,
-+IBUS_rightcaret, 0x0338, 0x226F,
-+IBUS_underbar, IBUS_parenleft, 0x208D,
-+IBUS_underbar, IBUS_parenright, 0x208E,
-+IBUS_underbar, IBUS_plus, 0x208A,
-+IBUS_underbar, IBUS_0, 0x2080,
-+IBUS_underbar, IBUS_1, 0x2081,
-+IBUS_underbar, IBUS_2, 0x2082,
-+IBUS_underbar, IBUS_3, 0x2083,
-+IBUS_underbar, IBUS_4, 0x2084,
-+IBUS_underbar, IBUS_5, 0x2085,
-+IBUS_underbar, IBUS_6, 0x2086,
-+IBUS_underbar, IBUS_7, 0x2087,
-+IBUS_underbar, IBUS_8, 0x2088,
-+IBUS_underbar, IBUS_9, 0x2089,
-+IBUS_underbar, IBUS_equal, 0x208C,
-+0x0BC6, 0x0BBE, 0x0BCA,
-+0x0BC6, 0x0BD7, 0x0BCC,
-+IBUS_underbar, 0x2212, 0x208B,
-+IBUS_underbar, IBUS_KP_Space, 0x2082,
-+IBUS_underbar, IBUS_KP_Add, 0x208A,
-+IBUS_underbar, IBUS_KP_0, 0x2080,
-+IBUS_underbar, IBUS_KP_1, 0x2081,
-+IBUS_underbar, IBUS_KP_2, 0x2082,
-+IBUS_underbar, IBUS_KP_3, 0x2083,
-+IBUS_underbar, IBUS_KP_4, 0x2084,
-+IBUS_underbar, IBUS_KP_5, 0x2085,
-+IBUS_underbar, IBUS_KP_6, 0x2086,
-+IBUS_underbar, IBUS_KP_7, 0x2087,
-+IBUS_underbar, IBUS_KP_8, 0x2088,
-+IBUS_underbar, IBUS_KP_9, 0x2089,
-+IBUS_underbar, IBUS_KP_Equal, 0x208C,
-+0x0BC7, 0x0BBE, 0x0BCB,
-+0x0BD7, 0x0B92, 0x0B94,
-+IBUS_rightshoe, 0x0338, 0x2285,
-+IBUS_leftshoe, 0x0338, 0x2284,
-+IBUS_righttack, 0x0338, 0x22AC,
-+0x0C46, 0x0C56, 0x0C48,
-+0x0CBF, 0x0CD5, 0x0CC0,
-+0x0CC6, 0x0CC2, 0x0CCA,
-+0x0CC6, 0x0CD5, 0x0CC7,
-+0x0CC6, 0x0CD6, 0x0CC8,
-+0x0CCA, 0x0CD5, 0x0CCB,
-+0x0D46, 0x0D3E, 0x0D4A,
-+0x0D46, 0x0D57, 0x0D4C,
-+0x0D47, 0x0D3E, 0x0D4B,
-+0x0DD9, 0x0DCA, 0x0DDA,
-+0x0DD9, 0x0DCF, 0x0DDC,
-+0x0DD9, 0x0DDF, 0x0DDE,
-+0x0DDC, 0x0DCA, 0x0DDD,
-+0x0F71, 0x0F72, 0x0F73,
-+0x0F71, 0x0F74, 0x0F75,
-+0x0F71, 0x0F80, 0x0F81,
-+0x0F90, 0x0FB5, 0x0FB9,
-+0x0F92, 0x0FB7, 0x0F93,
-+0x0F9C, 0x0FB7, 0x0F9D,
-+0x0FA1, 0x0FB7, 0x0FA2,
-+0x0FA6, 0x0FB7, 0x0FA7,
-+0x0FAB, 0x0FB7, 0x0FAC,
-+0x0FB2, 0x0F80, 0x0F76,
-+0x0FB3, 0x0F80, 0x0F78,
-+0x0FB5, 0x0F40, 0x0F69,
-+0x0FB7, 0x0F42, 0x0F43,
-+0x0FB7, 0x0F4C, 0x0F4D,
-+0x0FB7, 0x0F51, 0x0F52,
-+0x0FB7, 0x0F56, 0x0F57,
-+0x0FB7, 0x0F5B, 0x0F5C,
-+0x102E, 0x1025, 0x1026,
-+0x1100, 0x1100, 0x1101,
-+0x1102, 0x1100, 0x1113,
-+0x1102, 0x1102, 0x1114,
-+0x1102, 0x1103, 0x1115,
-+0x1102, 0x1107, 0x1116,
-+0x1103, 0x1100, 0x1117,
-+0x1103, 0x1103, 0x1104,
-+0x1105, 0x1102, 0x1118,
-+0x1105, 0x1105, 0x1119,
-+0x1105, 0x110B, 0x111B,
-+0x1105, 0x1112, 0x111A,
-+0x1106, 0x1107, 0x111C,
-+0x1106, 0x110B, 0x111D,
-+0x1107, 0x1100, 0x111E,
-+0x1107, 0x1102, 0x111F,
-+0x1107, 0x1103, 0x1120,
-+0x1107, 0x1107, 0x1108,
-+0x1107, 0x1109, 0x1121,
-+0x1107, 0x110A, 0x1125,
-+0x1107, 0x110B, 0x112B,
-+0x1107, 0x110C, 0x1127,
-+0x1107, 0x110E, 0x1128,
-+0x1107, 0x1110, 0x1129,
-+0x1107, 0x1111, 0x112A,
-+0x1107, 0x112B, 0x112C,
-+0x1107, 0x112D, 0x1122,
-+0x1107, 0x112F, 0x1123,
-+0x1107, 0x1132, 0x1124,
-+0x1107, 0x1136, 0x1126,
-+0x1108, 0x110B, 0x112C,
-+0x1109, 0x1100, 0x112D,
-+0x1109, 0x1102, 0x112E,
-+0x1109, 0x1103, 0x112F,
-+0x1109, 0x1105, 0x1130,
-+0x1109, 0x1106, 0x1131,
-+0x1109, 0x1107, 0x1132,
-+0x1109, 0x1109, 0x110A,
-+0x1109, 0x110A, 0x1134,
-+0x1109, 0x110B, 0x1135,
-+0x1109, 0x110C, 0x1136,
-+0x1109, 0x110E, 0x1137,
-+0x1109, 0x110F, 0x1138,
-+0x1109, 0x1110, 0x1139,
-+0x1109, 0x1111, 0x113A,
-+0x1109, 0x1112, 0x113B,
-+0x1109, 0x111E, 0x1133,
-+0x110A, 0x1109, 0x1134,
-+0x110B, 0x1100, 0x1141,
-+0x110B, 0x1103, 0x1142,
-+0x110B, 0x1106, 0x1143,
-+0x110B, 0x1107, 0x1144,
-+0x110B, 0x1109, 0x1145,
-+0x110B, 0x110B, 0x1147,
-+0x110B, 0x110C, 0x1148,
-+0x110B, 0x110E, 0x1149,
-+0x110B, 0x1110, 0x114A,
-+0x110B, 0x1111, 0x114B,
-+0x110B, 0x1140, 0x1146,
-+0x110C, 0x110B, 0x114D,
-+0x110C, 0x110C, 0x110D,
-+0x110E, 0x110F, 0x1152,
-+0x110E, 0x1112, 0x1153,
-+0x1111, 0x1107, 0x1156,
-+0x1111, 0x110B, 0x1157,
-+0x1112, 0x1112, 0x1158,
-+0x1121, 0x1100, 0x1122,
-+0x1121, 0x1103, 0x1123,
-+0x1121, 0x1107, 0x1124,
-+0x1121, 0x1109, 0x1125,
-+0x1121, 0x110C, 0x1126,
-+0x1132, 0x1100, 0x1133,
-+0x113C, 0x113C, 0x113D,
-+0x113E, 0x113E, 0x113F,
-+0x114E, 0x114E, 0x114F,
-+0x1150, 0x1150, 0x1151,
-+0x1161, 0x1169, 0x1176,
-+0x1161, 0x116E, 0x1177,
-+0x1161, 0x1175, 0x1162,
-+0x1163, 0x1169, 0x1178,
-+0x1163, 0x116D, 0x1179,
-+0x1163, 0x1175, 0x1164,
-+0x1165, 0x1169, 0x117A,
-+0x1165, 0x116E, 0x117B,
-+0x1165, 0x1173, 0x117C,
-+0x1165, 0x1175, 0x1166,
-+0x1167, 0x1169, 0x117D,
-+0x1167, 0x116E, 0x117E,
-+0x1167, 0x1175, 0x1168,
-+0x1169, 0x1161, 0x116A,
-+0x1169, 0x1162, 0x116B,
-+0x1169, 0x1165, 0x117F,
-+0x1169, 0x1166, 0x1180,
-+0x1169, 0x1168, 0x1181,
-+0x1169, 0x1169, 0x1182,
-+0x1169, 0x116E, 0x1183,
-+0x1169, 0x1175, 0x116C,
-+0x116A, 0x1175, 0x116B,
-+0x116D, 0x1163, 0x1184,
-+0x116D, 0x1164, 0x1185,
-+0x116D, 0x1167, 0x1186,
-+0x116D, 0x1169, 0x1187,
-+0x116D, 0x1175, 0x1188,
-+0x116E, 0x1161, 0x1189,
-+0x116E, 0x1162, 0x118A,
-+0x116E, 0x1165, 0x116F,
-+0x116E, 0x1166, 0x1170,
-+0x116E, 0x1168, 0x118C,
-+0x116E, 0x116E, 0x118D,
-+0x116E, 0x1175, 0x1171,
-+0x116E, 0x117C, 0x118B,
-+0x116F, 0x1173, 0x118B,
-+0x116F, 0x1175, 0x1170,
-+0x1172, 0x1161, 0x118E,
-+0x1172, 0x1165, 0x118F,
-+0x1172, 0x1166, 0x1190,
-+0x1172, 0x1167, 0x1191,
-+0x1172, 0x1168, 0x1192,
-+0x1172, 0x116E, 0x1193,
-+0x1172, 0x1175, 0x1194,
-+0x1173, 0x116E, 0x1195,
-+0x1173, 0x1173, 0x1196,
-+0x1173, 0x1175, 0x1174,
-+0x1174, 0x116E, 0x1197,
-+0x1175, 0x1161, 0x1198,
-+0x1175, 0x1163, 0x1199,
-+0x1175, 0x1169, 0x119A,
-+0x1175, 0x116E, 0x119B,
-+0x1175, 0x1173, 0x119C,
-+0x1175, 0x119E, 0x119D,
-+0x119E, 0x1165, 0x119F,
-+0x119E, 0x116E, 0x11A0,
-+0x119E, 0x1175, 0x11A1,
-+0x119E, 0x119E, 0x11A2,
-+0x11A8, 0x11A8, 0x11A9,
-+0x11A8, 0x11AF, 0x11C3,
-+0x11A8, 0x11BA, 0x11AA,
-+0x11A8, 0x11E7, 0x11C4,
-+0x11AA, 0x11A8, 0x11C4,
-+0x11AB, 0x11A8, 0x11C5,
-+0x11AB, 0x11AE, 0x11C6,
-+0x11AB, 0x11BA, 0x11C7,
-+0x11AB, 0x11BD, 0x11AC,
-+0x11AB, 0x11C0, 0x11C9,
-+0x11AB, 0x11C2, 0x11AD,
-+0x11AB, 0x11EB, 0x11C8,
-+0x11AE, 0x11A8, 0x11CA,
-+0x11AE, 0x11AF, 0x11CB,
-+0x11AF, 0x11A8, 0x11B0,
-+0x11AF, 0x11AA, 0x11CC,
-+0x11AF, 0x11AB, 0x11CD,
-+0x11AF, 0x11AE, 0x11CE,
-+0x11AF, 0x11AF, 0x11D0,
-+0x11AF, 0x11B7, 0x11B1,
-+0x11AF, 0x11B8, 0x11B2,
-+0x11AF, 0x11B9, 0x11D3,
-+0x11AF, 0x11BA, 0x11B3,
-+0x11AF, 0x11BB, 0x11D6,
-+0x11AF, 0x11BF, 0x11D8,
-+0x11AF, 0x11C0, 0x11B4,
-+0x11AF, 0x11C1, 0x11B5,
-+0x11AF, 0x11C2, 0x11B6,
-+0x11AF, 0x11DA, 0x11D1,
-+0x11AF, 0x11DD, 0x11D2,
-+0x11AF, 0x11E5, 0x11D4,
-+0x11AF, 0x11E6, 0x11D5,
-+0x11AF, 0x11EB, 0x11D7,
-+0x11AF, 0x11F9, 0x11D9,
-+0x11B0, 0x11BA, 0x11CC,
-+0x11B1, 0x11A8, 0x11D1,
-+0x11B1, 0x11BA, 0x11D2,
-+0x11B2, 0x11BA, 0x11D3,
-+0x11B2, 0x11BC, 0x11D5,
-+0x11B2, 0x11C2, 0x11D4,
-+0x11B3, 0x11BA, 0x11D6,
-+0x11B7, 0x11A8, 0x11DA,
-+0x11B7, 0x11AF, 0x11DB,
-+0x11B7, 0x11B8, 0x11DC,
-+0x11B7, 0x11BA, 0x11DD,
-+0x11B7, 0x11BB, 0x11DE,
-+0x11B7, 0x11BC, 0x11E2,
-+0x11B7, 0x11BE, 0x11E0,
-+0x11B7, 0x11C2, 0x11E1,
-+0x11B7, 0x11EB, 0x11DF,
-+0x11B8, 0x11AF, 0x11E3,
-+0x11B8, 0x11BA, 0x11B9,
-+0x11B8, 0x11BC, 0x11E6,
-+0x11B8, 0x11C1, 0x11E4,
-+0x11B8, 0x11C2, 0x11E5,
-+0x11BA, 0x11A8, 0x11E7,
-+0x11BA, 0x11AE, 0x11E8,
-+0x11BA, 0x11AF, 0x11E9,
-+0x11BA, 0x11B8, 0x11EA,
-+0x11BA, 0x11BA, 0x11BB,
-+0x11BC, 0x11A8, 0x11EC,
-+0x11BC, 0x11A9, 0x11ED,
-+0x11BC, 0x11BC, 0x11EE,
-+0x11BC, 0x11BF, 0x11EF,
-+0x11C1, 0x11B8, 0x11F3,
-+0x11C1, 0x11BC, 0x11F4,
-+0x11C2, 0x11AB, 0x11F5,
-+0x11C2, 0x11AF, 0x11F6,
-+0x11C2, 0x11B7, 0x11F7,
-+0x11C2, 0x11B8, 0x11F8,
-+0x11CE, 0x11C2, 0x11CF,
-+0x11DD, 0x11BA, 0x11DE,
-+0x11EC, 0x11A8, 0x11ED,
-+0x11F0, 0x11BA, 0x11F1,
-+0x11F0, 0x11EB, 0x11F2,
-+0x1FBF, IBUS_apostrophe, 0x1FCE,
-+0x1FBF, IBUS_grave, 0x1FCD,
-+0x1FBF, IBUS_asciitilde, 0x1FCF,
-+0x1FBF, IBUS_acute, 0x1FCE,
-+0x1FBF, IBUS_dead_grave, 0x1FCD,
-+0x1FBF, IBUS_dead_acute, 0x1FCE,
-+0x1FBF, IBUS_dead_tilde, 0x1FCF,
-+0x1FFE, IBUS_apostrophe, 0x1FDE,
-+0x1FFE, IBUS_grave, 0x1FDD,
-+0x1FFE, IBUS_asciitilde, 0x1FDF,
-+0x1FFE, IBUS_acute, 0x1FDE,
-+0x1FFE, IBUS_dead_grave, 0x1FDD,
-+0x1FFE, IBUS_dead_acute, 0x1FDE,
-+0x1FFE, IBUS_dead_tilde, 0x1FDF,
-+0x2203, 0x0338, 0x2204,
-+0x2208, 0x0338, 0x2209,
-+0x220B, 0x0338, 0x220C,
-+0x2223, 0x0338, 0x2224,
-+0x2225, 0x0338, 0x2226,
-+0x223C, 0x0338, 0x2241,
-+0x2243, 0x0338, 0x2244,
-+0x2248, 0x0338, 0x2249,
-+0x224D, 0x0338, 0x226D,
-+0x2272, 0x0338, 0x2274,
-+0x2273, 0x0338, 0x2275,
-+0x2276, 0x0338, 0x2278,
-+0x2277, 0x0338, 0x2279,
-+0x227A, 0x0338, 0x2280,
-+0x227B, 0x0338, 0x2281,
-+0x227C, 0x0338, 0x22E0,
-+0x227D, 0x0338, 0x22E1,
-+0x2286, 0x0338, 0x2288,
-+0x2287, 0x0338, 0x2289,
-+0x2291, 0x0338, 0x22E2,
-+0x2292, 0x0338, 0x22E3,
-+0x22A8, 0x0338, 0x22AD,
-+0x22A9, 0x0338, 0x22AE,
-+0x22AB, 0x0338, 0x22AF,
-+0x22B2, 0x0338, 0x22EA,
-+0x22B3, 0x0338, 0x22EB,
-+0x22B4, 0x0338, 0x22EC,
-+0x22B5, 0x0338, 0x22ED,
-+0x2ADD, 0x0338, 0x2ADC,
-+IBUS_KP_Divide, IBUS_D, 0x0110,
-+IBUS_KP_Divide, IBUS_G, 0x01E4,
-+IBUS_KP_Divide, IBUS_H, 0x0126,
-+IBUS_KP_Divide, IBUS_I, 0x0197,
-+IBUS_KP_Divide, IBUS_L, 0x0141,
-+IBUS_KP_Divide, IBUS_O, 0x00D8,
-+IBUS_KP_Divide, IBUS_T, 0x0166,
-+IBUS_KP_Divide, IBUS_Z, 0x01B5,
-+IBUS_KP_Divide, IBUS_b, 0x0180,
-+IBUS_KP_Divide, IBUS_d, 0x0111,
-+IBUS_KP_Divide, IBUS_g, 0x01E5,
-+IBUS_KP_Divide, IBUS_h, 0x0127,
-+IBUS_KP_Divide, IBUS_i, 0x0268,
-+IBUS_KP_Divide, IBUS_l, 0x0142,
-+IBUS_KP_Divide, IBUS_o, 0x00F8,
-+IBUS_KP_Divide, IBUS_t, 0x0167,
-+IBUS_KP_Divide, IBUS_z, 0x01B6,
-+IBUS_KP_Divide, 0x0294, 0x02A1,
-+IBUS_KP_Divide, 0x04AE, 0x04B0,
-+IBUS_KP_Divide, 0x04AF, 0x04B1,
-+IBUS_KP_Divide, IBUS_Cyrillic_ghe, 0x0493,
-+IBUS_KP_Divide, IBUS_Cyrillic_ka, 0x049F,
-+IBUS_KP_Divide, IBUS_Cyrillic_GHE, 0x0492,
-+IBUS_KP_Divide, IBUS_Cyrillic_KA, 0x049E,
-+IBUS_KP_Divide, IBUS_leftarrow, 0x219A,
-+IBUS_KP_Divide, IBUS_rightarrow, 0x219B,
-+IBUS_KP_Divide, 0x2194, 0x21AE,
-+IBUS_KP_Equal, 0x0338, 0x2260,
-+IBUS_exclam, IBUS_plus, IBUS_O, 0x1EE2,
-+IBUS_exclam, IBUS_plus, IBUS_U, 0x1EF0,
-+IBUS_exclam, IBUS_plus, IBUS_o, 0x1EE3,
-+IBUS_exclam, IBUS_plus, IBUS_u, 0x1EF1,
-+IBUS_exclam, IBUS_dead_horn, IBUS_O, 0x1EE2,
-+IBUS_exclam, IBUS_dead_horn, IBUS_U, 0x1EF0,
-+IBUS_exclam, IBUS_dead_horn, IBUS_o, 0x1EE3,
-+IBUS_exclam, IBUS_dead_horn, IBUS_u, 0x1EF1,
-+IBUS_quotedbl, IBUS_apostrophe, IBUS_space, 0x0385,
-+IBUS_quotedbl, IBUS_apostrophe, IBUS_Greek_iota, 0x0390,
-+IBUS_quotedbl, IBUS_apostrophe, IBUS_Greek_upsilon, 0x03B0,
-+IBUS_quotedbl, IBUS_underscore, IBUS_U, 0x1E7A,
-+IBUS_quotedbl, IBUS_underscore, IBUS_u, 0x1E7B,
-+IBUS_quotedbl, IBUS_asciitilde, IBUS_O, 0x1E4E,
-+IBUS_quotedbl, IBUS_asciitilde, IBUS_o, 0x1E4F,
-+IBUS_quotedbl, IBUS_macron, IBUS_U, 0x1E7A,
-+IBUS_quotedbl, IBUS_macron, IBUS_u, 0x1E7B,
-+IBUS_quotedbl, IBUS_dead_tilde, IBUS_O, 0x1E4E,
-+IBUS_quotedbl, IBUS_dead_tilde, IBUS_o, 0x1E4F,
-+IBUS_quotedbl, IBUS_dead_macron, IBUS_U, 0x1E7A,
-+IBUS_quotedbl, IBUS_dead_macron, IBUS_u, 0x1E7B,
-+IBUS_apostrophe, IBUS_quotedbl, IBUS_space, 0x0385,
-+IBUS_apostrophe, IBUS_quotedbl, IBUS_I, 0x1E2E,
-+IBUS_apostrophe, IBUS_quotedbl, IBUS_U, 0x01D7,
-+IBUS_apostrophe, IBUS_quotedbl, IBUS_i, 0x1E2F,
-+IBUS_apostrophe, IBUS_quotedbl, IBUS_u, 0x01D8,
-+IBUS_apostrophe, IBUS_quotedbl, IBUS_Greek_iota, 0x0390,
-+IBUS_apostrophe, IBUS_quotedbl, IBUS_Greek_upsilon, 0x03B0,
-+IBUS_apostrophe, IBUS_parenleft, IBUS_Greek_ALPHA, 0x1F0D,
-+IBUS_apostrophe, IBUS_parenleft, IBUS_Greek_EPSILON, 0x1F1D,
-+IBUS_apostrophe, IBUS_parenleft, IBUS_Greek_ETA, 0x1F2D,
-+IBUS_apostrophe, IBUS_parenleft, IBUS_Greek_IOTA, 0x1F3D,
-+IBUS_apostrophe, IBUS_parenleft, IBUS_Greek_OMICRON, 0x1F4D,
-+IBUS_apostrophe, IBUS_parenleft, IBUS_Greek_UPSILON, 0x1F5D,
-+IBUS_apostrophe, IBUS_parenleft, IBUS_Greek_OMEGA, 0x1F6D,
-+IBUS_apostrophe, IBUS_parenleft, IBUS_Greek_alpha, 0x1F05,
-+IBUS_apostrophe, IBUS_parenleft, IBUS_Greek_epsilon, 0x1F15,
-+IBUS_apostrophe, IBUS_parenleft, IBUS_Greek_eta, 0x1F25,
-+IBUS_apostrophe, IBUS_parenleft, IBUS_Greek_iota, 0x1F35,
-+IBUS_apostrophe, IBUS_parenleft, IBUS_Greek_omicron, 0x1F45,
-+IBUS_apostrophe, IBUS_parenleft, IBUS_Greek_upsilon, 0x1F55,
-+IBUS_apostrophe, IBUS_parenleft, IBUS_Greek_omega, 0x1F65,
-+IBUS_apostrophe, IBUS_parenright, IBUS_Greek_ALPHA, 0x1F0C,
-+IBUS_apostrophe, IBUS_parenright, IBUS_Greek_EPSILON, 0x1F1C,
-+IBUS_apostrophe, IBUS_parenright, IBUS_Greek_ETA, 0x1F2C,
-+IBUS_apostrophe, IBUS_parenright, IBUS_Greek_IOTA, 0x1F3C,
-+IBUS_apostrophe, IBUS_parenright, IBUS_Greek_OMICRON, 0x1F4C,
-+IBUS_apostrophe, IBUS_parenright, IBUS_Greek_OMEGA, 0x1F6C,
-+IBUS_apostrophe, IBUS_parenright, IBUS_Greek_alpha, 0x1F04,
-+IBUS_apostrophe, IBUS_parenright, IBUS_Greek_epsilon, 0x1F14,
-+IBUS_apostrophe, IBUS_parenright, IBUS_Greek_eta, 0x1F24,
-+IBUS_apostrophe, IBUS_parenright, IBUS_Greek_iota, 0x1F34,
-+IBUS_apostrophe, IBUS_parenright, IBUS_Greek_omicron, 0x1F44,
-+IBUS_apostrophe, IBUS_parenright, IBUS_Greek_upsilon, 0x1F54,
-+IBUS_apostrophe, IBUS_parenright, IBUS_Greek_omega, 0x1F64,
-+IBUS_apostrophe, IBUS_plus, IBUS_O, 0x1EDA,
-+IBUS_apostrophe, IBUS_plus, IBUS_U, 0x1EE8,
-+IBUS_apostrophe, IBUS_plus, IBUS_o, 0x1EDB,
-+IBUS_apostrophe, IBUS_plus, IBUS_u, 0x1EE9,
-+IBUS_apostrophe, IBUS_slash, IBUS_O, 0x01FE,
-+IBUS_apostrophe, IBUS_slash, IBUS_o, 0x01FF,
-+IBUS_apostrophe, IBUS_asciicircum, IBUS_A, 0x1EA4,
-+IBUS_apostrophe, IBUS_asciicircum, IBUS_E, 0x1EBE,
-+IBUS_apostrophe, IBUS_asciicircum, IBUS_O, 0x1ED0,
-+IBUS_apostrophe, IBUS_asciicircum, IBUS_a, 0x1EA5,
-+IBUS_apostrophe, IBUS_asciicircum, IBUS_e, 0x1EBF,
-+IBUS_apostrophe, IBUS_asciicircum, IBUS_o, 0x1ED1,
-+IBUS_apostrophe, IBUS_underscore, IBUS_E, 0x1E16,
-+IBUS_apostrophe, IBUS_underscore, IBUS_O, 0x1E52,
-+IBUS_apostrophe, IBUS_underscore, IBUS_e, 0x1E17,
-+IBUS_apostrophe, IBUS_underscore, IBUS_o, 0x1E53,
-+IBUS_apostrophe, IBUS_b, IBUS_A, 0x1EAE,
-+IBUS_apostrophe, IBUS_b, IBUS_a, 0x1EAF,
-+IBUS_apostrophe, IBUS_asciitilde, IBUS_O, 0x1E4C,
-+IBUS_apostrophe, IBUS_asciitilde, IBUS_U, 0x1E78,
-+IBUS_apostrophe, IBUS_asciitilde, IBUS_o, 0x1E4D,
-+IBUS_apostrophe, IBUS_asciitilde, IBUS_u, 0x1E79,
-+IBUS_apostrophe, IBUS_macron, IBUS_E, 0x1E16,
-+IBUS_apostrophe, IBUS_macron, IBUS_O, 0x1E52,
-+IBUS_apostrophe, IBUS_macron, IBUS_e, 0x1E17,
-+IBUS_apostrophe, IBUS_macron, IBUS_o, 0x1E53,
-+IBUS_apostrophe, IBUS_cedilla, IBUS_C, 0x1E08,
-+IBUS_apostrophe, IBUS_cedilla, IBUS_c, 0x1E09,
-+IBUS_apostrophe, IBUS_dead_circumflex, IBUS_A, 0x1EA4,
-+IBUS_apostrophe, IBUS_dead_circumflex, IBUS_E, 0x1EBE,
-+IBUS_apostrophe, IBUS_dead_circumflex, IBUS_O, 0x1ED0,
-+IBUS_apostrophe, IBUS_dead_circumflex, IBUS_a, 0x1EA5,
-+IBUS_apostrophe, IBUS_dead_circumflex, IBUS_e, 0x1EBF,
-+IBUS_apostrophe, IBUS_dead_circumflex, IBUS_o, 0x1ED1,
-+IBUS_apostrophe, IBUS_dead_tilde, IBUS_O, 0x1E4C,
-+IBUS_apostrophe, IBUS_dead_tilde, IBUS_U, 0x1E78,
-+IBUS_apostrophe, IBUS_dead_tilde, IBUS_o, 0x1E4D,
-+IBUS_apostrophe, IBUS_dead_tilde, IBUS_u, 0x1E79,
-+IBUS_apostrophe, IBUS_dead_macron, IBUS_E, 0x1E16,
-+IBUS_apostrophe, IBUS_dead_macron, IBUS_O, 0x1E52,
-+IBUS_apostrophe, IBUS_dead_macron, IBUS_e, 0x1E17,
-+IBUS_apostrophe, IBUS_dead_macron, IBUS_o, 0x1E53,
-+IBUS_apostrophe, IBUS_dead_breve, IBUS_A, 0x1EAE,
-+IBUS_apostrophe, IBUS_dead_breve, IBUS_a, 0x1EAF,
-+IBUS_apostrophe, IBUS_dead_diaeresis, IBUS_I, 0x1E2E,
-+IBUS_apostrophe, IBUS_dead_diaeresis, IBUS_U, 0x01D7,
-+IBUS_apostrophe, IBUS_dead_diaeresis, IBUS_i, 0x1E2F,
-+IBUS_apostrophe, IBUS_dead_diaeresis, IBUS_u, 0x01D8,
-+IBUS_apostrophe, IBUS_dead_diaeresis, IBUS_Greek_iota, 0x0390,
-+IBUS_apostrophe, IBUS_dead_diaeresis, IBUS_Greek_upsilon, 0x03B0,
-+IBUS_apostrophe, IBUS_dead_abovering, IBUS_A, 0x01FA,
-+IBUS_apostrophe, IBUS_dead_abovering, IBUS_a, 0x01FB,
-+IBUS_apostrophe, IBUS_dead_cedilla, IBUS_C, 0x1E08,
-+IBUS_apostrophe, IBUS_dead_cedilla, IBUS_c, 0x1E09,
-+IBUS_apostrophe, IBUS_dead_horn, IBUS_O, 0x1EDA,
-+IBUS_apostrophe, IBUS_dead_horn, IBUS_U, 0x1EE8,
-+IBUS_apostrophe, IBUS_dead_horn, IBUS_o, 0x1EDB,
-+IBUS_apostrophe, IBUS_dead_horn, IBUS_u, 0x1EE9,
-+IBUS_apostrophe, IBUS_dead_psili, IBUS_Greek_ALPHA, 0x1F0C,
-+IBUS_apostrophe, IBUS_dead_psili, IBUS_Greek_EPSILON, 0x1F1C,
-+IBUS_apostrophe, IBUS_dead_psili, IBUS_Greek_ETA, 0x1F2C,
-+IBUS_apostrophe, IBUS_dead_psili, IBUS_Greek_IOTA, 0x1F3C,
-+IBUS_apostrophe, IBUS_dead_psili, IBUS_Greek_OMICRON, 0x1F4C,
-+IBUS_apostrophe, IBUS_dead_psili, IBUS_Greek_OMEGA, 0x1F6C,
-+IBUS_apostrophe, IBUS_dead_psili, IBUS_Greek_alpha, 0x1F04,
-+IBUS_apostrophe, IBUS_dead_psili, IBUS_Greek_epsilon, 0x1F14,
-+IBUS_apostrophe, IBUS_dead_psili, IBUS_Greek_eta, 0x1F24,
-+IBUS_apostrophe, IBUS_dead_psili, IBUS_Greek_iota, 0x1F34,
-+IBUS_apostrophe, IBUS_dead_psili, IBUS_Greek_omicron, 0x1F44,
-+IBUS_apostrophe, IBUS_dead_psili, IBUS_Greek_upsilon, 0x1F54,
-+IBUS_apostrophe, IBUS_dead_psili, IBUS_Greek_omega, 0x1F64,
-+IBUS_apostrophe, IBUS_dead_dasia, IBUS_Greek_ALPHA, 0x1F0D,
-+IBUS_apostrophe, IBUS_dead_dasia, IBUS_Greek_EPSILON, 0x1F1D,
-+IBUS_apostrophe, IBUS_dead_dasia, IBUS_Greek_ETA, 0x1F2D,
-+IBUS_apostrophe, IBUS_dead_dasia, IBUS_Greek_IOTA, 0x1F3D,
-+IBUS_apostrophe, IBUS_dead_dasia, IBUS_Greek_OMICRON, 0x1F4D,
-+IBUS_apostrophe, IBUS_dead_dasia, IBUS_Greek_UPSILON, 0x1F5D,
-+IBUS_apostrophe, IBUS_dead_dasia, IBUS_Greek_OMEGA, 0x1F6D,
-+IBUS_apostrophe, IBUS_dead_dasia, IBUS_Greek_alpha, 0x1F05,
-+IBUS_apostrophe, IBUS_dead_dasia, IBUS_Greek_epsilon, 0x1F15,
-+IBUS_apostrophe, IBUS_dead_dasia, IBUS_Greek_eta, 0x1F25,
-+IBUS_apostrophe, IBUS_dead_dasia, IBUS_Greek_iota, 0x1F35,
-+IBUS_apostrophe, IBUS_dead_dasia, IBUS_Greek_omicron, 0x1F45,
-+IBUS_apostrophe, IBUS_dead_dasia, IBUS_Greek_upsilon, 0x1F55,
-+IBUS_apostrophe, IBUS_dead_dasia, IBUS_Greek_omega, 0x1F65,
-+IBUS_apostrophe, IBUS_KP_Divide, IBUS_O, 0x01FE,
-+IBUS_apostrophe, IBUS_KP_Divide, IBUS_o, 0x01FF,
-+IBUS_parenleft, IBUS_0, IBUS_parenright, 0x24EA,
-+IBUS_parenleft, IBUS_1, IBUS_parenright, 0x2460,
-+IBUS_parenleft, IBUS_2, IBUS_parenright, 0x2461,
-+IBUS_parenleft, IBUS_3, IBUS_parenright, 0x2462,
-+IBUS_parenleft, IBUS_4, IBUS_parenright, 0x2463,
-+IBUS_parenleft, IBUS_5, IBUS_parenright, 0x2464,
-+IBUS_parenleft, IBUS_6, IBUS_parenright, 0x2465,
-+IBUS_parenleft, IBUS_7, IBUS_parenright, 0x2466,
-+IBUS_parenleft, IBUS_8, IBUS_parenright, 0x2467,
-+IBUS_parenleft, IBUS_9, IBUS_parenright, 0x2468,
-+IBUS_parenleft, IBUS_A, IBUS_parenright, 0x24B6,
-+IBUS_parenleft, IBUS_B, IBUS_parenright, 0x24B7,
-+IBUS_parenleft, IBUS_C, IBUS_parenright, 0x24B8,
-+IBUS_parenleft, IBUS_D, IBUS_parenright, 0x24B9,
-+IBUS_parenleft, IBUS_E, IBUS_parenright, 0x24BA,
-+IBUS_parenleft, IBUS_F, IBUS_parenright, 0x24BB,
-+IBUS_parenleft, IBUS_G, IBUS_parenright, 0x24BC,
-+IBUS_parenleft, IBUS_H, IBUS_parenright, 0x24BD,
-+IBUS_parenleft, IBUS_I, IBUS_parenright, 0x24BE,
-+IBUS_parenleft, IBUS_J, IBUS_parenright, 0x24BF,
-+IBUS_parenleft, IBUS_K, IBUS_parenright, 0x24C0,
-+IBUS_parenleft, IBUS_L, IBUS_parenright, 0x24C1,
-+IBUS_parenleft, IBUS_M, IBUS_parenright, 0x24C2,
-+IBUS_parenleft, IBUS_N, IBUS_parenright, 0x24C3,
-+IBUS_parenleft, IBUS_O, IBUS_parenright, 0x24C4,
-+IBUS_parenleft, IBUS_P, IBUS_parenright, 0x24C5,
-+IBUS_parenleft, IBUS_Q, IBUS_parenright, 0x24C6,
-+IBUS_parenleft, IBUS_R, IBUS_parenright, 0x24C7,
-+IBUS_parenleft, IBUS_S, IBUS_parenright, 0x24C8,
-+IBUS_parenleft, IBUS_T, IBUS_parenright, 0x24C9,
-+IBUS_parenleft, IBUS_U, IBUS_parenright, 0x24CA,
-+IBUS_parenleft, IBUS_V, IBUS_parenright, 0x24CB,
-+IBUS_parenleft, IBUS_W, IBUS_parenright, 0x24CC,
-+IBUS_parenleft, IBUS_X, IBUS_parenright, 0x24CD,
-+IBUS_parenleft, IBUS_Y, IBUS_parenright, 0x24CE,
-+IBUS_parenleft, IBUS_Z, IBUS_parenright, 0x24CF,
-+IBUS_parenleft, IBUS_a, IBUS_parenright, 0x24D0,
-+IBUS_parenleft, IBUS_b, IBUS_parenright, 0x24D1,
-+IBUS_parenleft, IBUS_c, IBUS_parenright, 0x24D2,
-+IBUS_parenleft, IBUS_d, IBUS_parenright, 0x24D3,
-+IBUS_parenleft, IBUS_e, IBUS_parenright, 0x24D4,
-+IBUS_parenleft, IBUS_f, IBUS_parenright, 0x24D5,
-+IBUS_parenleft, IBUS_g, IBUS_parenright, 0x24D6,
-+IBUS_parenleft, IBUS_h, IBUS_parenright, 0x24D7,
-+IBUS_parenleft, IBUS_i, IBUS_parenright, 0x24D8,
-+IBUS_parenleft, IBUS_j, IBUS_parenright, 0x24D9,
-+IBUS_parenleft, IBUS_k, IBUS_parenright, 0x24DA,
-+IBUS_parenleft, IBUS_l, IBUS_parenright, 0x24DB,
-+IBUS_parenleft, IBUS_m, IBUS_parenright, 0x24DC,
-+IBUS_parenleft, IBUS_n, IBUS_parenright, 0x24DD,
-+IBUS_parenleft, IBUS_o, IBUS_parenright, 0x24DE,
-+IBUS_parenleft, IBUS_p, IBUS_parenright, 0x24DF,
-+IBUS_parenleft, IBUS_q, IBUS_parenright, 0x24E0,
-+IBUS_parenleft, IBUS_r, IBUS_parenright, 0x24E1,
-+IBUS_parenleft, IBUS_s, IBUS_parenright, 0x24E2,
-+IBUS_parenleft, IBUS_t, IBUS_parenright, 0x24E3,
-+IBUS_parenleft, IBUS_u, IBUS_parenright, 0x24E4,
-+IBUS_parenleft, IBUS_v, IBUS_parenright, 0x24E5,
-+IBUS_parenleft, IBUS_w, IBUS_parenright, 0x24E6,
-+IBUS_parenleft, IBUS_x, IBUS_parenright, 0x24E7,
-+IBUS_parenleft, IBUS_y, IBUS_parenright, 0x24E8,
-+IBUS_parenleft, IBUS_z, IBUS_parenright, 0x24E9,
-+IBUS_parenleft, IBUS_kana_WO, IBUS_parenright, 0x32FE,
-+IBUS_parenleft, IBUS_kana_A, IBUS_parenright, 0x32D0,
-+IBUS_parenleft, IBUS_kana_I, IBUS_parenright, 0x32D1,
-+IBUS_parenleft, IBUS_kana_U, IBUS_parenright, 0x32D2,
-+IBUS_parenleft, IBUS_kana_E, IBUS_parenright, 0x32D3,
-+IBUS_parenleft, IBUS_kana_O, IBUS_parenright, 0x32D4,
-+IBUS_parenleft, IBUS_kana_KA, IBUS_parenright, 0x32D5,
-+IBUS_parenleft, IBUS_kana_KI, IBUS_parenright, 0x32D6,
-+IBUS_parenleft, IBUS_kana_KU, IBUS_parenright, 0x32D7,
-+IBUS_parenleft, IBUS_kana_KE, IBUS_parenright, 0x32D8,
-+IBUS_parenleft, IBUS_kana_KO, IBUS_parenright, 0x32D9,
-+IBUS_parenleft, IBUS_kana_SA, IBUS_parenright, 0x32DA,
-+IBUS_parenleft, IBUS_kana_SHI, IBUS_parenright, 0x32DB,
-+IBUS_parenleft, IBUS_kana_SU, IBUS_parenright, 0x32DC,
-+IBUS_parenleft, IBUS_kana_SE, IBUS_parenright, 0x32DD,
-+IBUS_parenleft, IBUS_kana_SO, IBUS_parenright, 0x32DE,
-+IBUS_parenleft, IBUS_kana_TA, IBUS_parenright, 0x32DF,
-+IBUS_parenleft, IBUS_kana_CHI, IBUS_parenright, 0x32E0,
-+IBUS_parenleft, IBUS_kana_TSU, IBUS_parenright, 0x32E1,
-+IBUS_parenleft, IBUS_kana_TE, IBUS_parenright, 0x32E2,
-+IBUS_parenleft, IBUS_kana_TO, IBUS_parenright, 0x32E3,
-+IBUS_parenleft, IBUS_kana_NA, IBUS_parenright, 0x32E4,
-+IBUS_parenleft, IBUS_kana_NI, IBUS_parenright, 0x32E5,
-+IBUS_parenleft, IBUS_kana_NU, IBUS_parenright, 0x32E6,
-+IBUS_parenleft, IBUS_kana_NE, IBUS_parenright, 0x32E7,
-+IBUS_parenleft, IBUS_kana_NO, IBUS_parenright, 0x32E8,
-+IBUS_parenleft, IBUS_kana_HA, IBUS_parenright, 0x32E9,
-+IBUS_parenleft, IBUS_kana_HI, IBUS_parenright, 0x32EA,
-+IBUS_parenleft, IBUS_kana_FU, IBUS_parenright, 0x32EB,
-+IBUS_parenleft, IBUS_kana_HE, IBUS_parenright, 0x32EC,
-+IBUS_parenleft, IBUS_kana_HO, IBUS_parenright, 0x32ED,
-+IBUS_parenleft, IBUS_kana_MA, IBUS_parenright, 0x32EE,
-+IBUS_parenleft, IBUS_kana_MI, IBUS_parenright, 0x32EF,
-+IBUS_parenleft, IBUS_kana_MU, IBUS_parenright, 0x32F0,
-+IBUS_parenleft, IBUS_kana_ME, IBUS_parenright, 0x32F1,
-+IBUS_parenleft, IBUS_kana_MO, IBUS_parenright, 0x32F2,
-+IBUS_parenleft, IBUS_kana_YA, IBUS_parenright, 0x32F3,
-+IBUS_parenleft, IBUS_kana_YU, IBUS_parenright, 0x32F4,
-+IBUS_parenleft, IBUS_kana_YO, IBUS_parenright, 0x32F5,
-+IBUS_parenleft, IBUS_kana_RA, IBUS_parenright, 0x32F6,
-+IBUS_parenleft, IBUS_kana_RI, IBUS_parenright, 0x32F7,
-+IBUS_parenleft, IBUS_kana_RU, IBUS_parenright, 0x32F8,
-+IBUS_parenleft, IBUS_kana_RE, IBUS_parenright, 0x32F9,
-+IBUS_parenleft, IBUS_kana_RO, IBUS_parenright, 0x32FA,
-+IBUS_parenleft, IBUS_kana_WA, IBUS_parenright, 0x32FB,
-+IBUS_parenleft, 0x1100, IBUS_parenright, 0x3260,
-+IBUS_parenleft, 0x1102, IBUS_parenright, 0x3261,
-+IBUS_parenleft, 0x1103, IBUS_parenright, 0x3262,
-+IBUS_parenleft, 0x1105, IBUS_parenright, 0x3263,
-+IBUS_parenleft, 0x1106, IBUS_parenright, 0x3264,
-+IBUS_parenleft, 0x1107, IBUS_parenright, 0x3265,
-+IBUS_parenleft, 0x1109, IBUS_parenright, 0x3266,
-+IBUS_parenleft, 0x110B, IBUS_parenright, 0x3267,
-+IBUS_parenleft, 0x110C, IBUS_parenright, 0x3268,
-+IBUS_parenleft, 0x110E, IBUS_parenright, 0x3269,
-+IBUS_parenleft, 0x110F, IBUS_parenright, 0x326A,
-+IBUS_parenleft, 0x1110, IBUS_parenright, 0x326B,
-+IBUS_parenleft, 0x1111, IBUS_parenright, 0x326C,
-+IBUS_parenleft, 0x1112, IBUS_parenright, 0x326D,
-+IBUS_parenleft, 0x30F0, IBUS_parenright, 0x32FC,
-+IBUS_parenleft, 0x30F1, IBUS_parenright, 0x32FD,
-+IBUS_parenleft, 0x4E00, IBUS_parenright, 0x3280,
-+IBUS_parenleft, 0x4E03, IBUS_parenright, 0x3286,
-+IBUS_parenleft, 0x4E09, IBUS_parenright, 0x3282,
-+IBUS_parenleft, 0x4E0A, IBUS_parenright, 0x32A4,
-+IBUS_parenleft, 0x4E0B, IBUS_parenright, 0x32A6,
-+IBUS_parenleft, 0x4E2D, IBUS_parenright, 0x32A5,
-+IBUS_parenleft, 0x4E5D, IBUS_parenright, 0x3288,
-+IBUS_parenleft, 0x4E8C, IBUS_parenright, 0x3281,
-+IBUS_parenleft, 0x4E94, IBUS_parenright, 0x3284,
-+IBUS_parenleft, 0x4F01, IBUS_parenright, 0x32AD,
-+IBUS_parenleft, 0x4F11, IBUS_parenright, 0x32A1,
-+IBUS_parenleft, 0x512A, IBUS_parenright, 0x329D,
-+IBUS_parenleft, 0x516B, IBUS_parenright, 0x3287,
-+IBUS_parenleft, 0x516D, IBUS_parenright, 0x3285,
-+IBUS_parenleft, 0x5199, IBUS_parenright, 0x32A2,
-+IBUS_parenleft, 0x52B4, IBUS_parenright, 0x3298,
-+IBUS_parenleft, 0x533B, IBUS_parenright, 0x32A9,
-+IBUS_parenleft, 0x5341, IBUS_parenright, 0x3289,
-+IBUS_parenleft, 0x5354, IBUS_parenright, 0x32AF,
-+IBUS_parenleft, 0x5370, IBUS_parenright, 0x329E,
-+IBUS_parenleft, 0x53F3, IBUS_parenright, 0x32A8,
-+IBUS_parenleft, 0x540D, IBUS_parenright, 0x3294,
-+IBUS_parenleft, 0x56DB, IBUS_parenright, 0x3283,
-+IBUS_parenleft, 0x571F, IBUS_parenright, 0x328F,
-+IBUS_parenleft, 0x591C, IBUS_parenright, 0x32B0,
-+IBUS_parenleft, 0x5973, IBUS_parenright, 0x329B,
-+IBUS_parenleft, 0x5B66, IBUS_parenright, 0x32AB,
-+IBUS_parenleft, 0x5B97, IBUS_parenright, 0x32AA,
-+IBUS_parenleft, 0x5DE6, IBUS_parenright, 0x32A7,
-+IBUS_parenleft, 0x65E5, IBUS_parenright, 0x3290,
-+IBUS_parenleft, 0x6708, IBUS_parenright, 0x328A,
-+IBUS_parenleft, 0x6709, IBUS_parenright, 0x3292,
-+IBUS_parenleft, 0x6728, IBUS_parenright, 0x328D,
-+IBUS_parenleft, 0x682A, IBUS_parenright, 0x3291,
-+IBUS_parenleft, 0x6B63, IBUS_parenright, 0x32A3,
-+IBUS_parenleft, 0x6C34, IBUS_parenright, 0x328C,
-+IBUS_parenleft, 0x6CE8, IBUS_parenright, 0x329F,
-+IBUS_parenleft, 0x706B, IBUS_parenright, 0x328B,
-+IBUS_parenleft, 0x7279, IBUS_parenright, 0x3295,
-+IBUS_parenleft, 0x7537, IBUS_parenright, 0x329A,
-+IBUS_parenleft, 0x76E3, IBUS_parenright, 0x32AC,
-+IBUS_parenleft, 0x793E, IBUS_parenright, 0x3293,
-+IBUS_parenleft, 0x795D, IBUS_parenright, 0x3297,
-+IBUS_parenleft, 0x79D8, IBUS_parenright, 0x3299,
-+IBUS_parenleft, 0x8CA1, IBUS_parenright, 0x3296,
-+IBUS_parenleft, 0x8CC7, IBUS_parenright, 0x32AE,
-+IBUS_parenleft, 0x9069, IBUS_parenright, 0x329C,
-+IBUS_parenleft, 0x91D1, IBUS_parenright, 0x328E,
-+IBUS_parenleft, 0x9805, IBUS_parenright, 0x32A0,
-+IBUS_parenleft, IBUS_KP_Space, IBUS_parenright, 0x2461,
-+IBUS_parenleft, IBUS_KP_0, IBUS_parenright, 0x24EA,
-+IBUS_parenleft, IBUS_KP_1, IBUS_parenright, 0x2460,
-+IBUS_parenleft, IBUS_KP_2, IBUS_parenright, 0x2461,
-+IBUS_parenleft, IBUS_KP_3, IBUS_parenright, 0x2462,
-+IBUS_parenleft, IBUS_KP_4, IBUS_parenright, 0x2463,
-+IBUS_parenleft, IBUS_KP_5, IBUS_parenright, 0x2464,
-+IBUS_parenleft, IBUS_KP_6, IBUS_parenright, 0x2465,
-+IBUS_parenleft, IBUS_KP_7, IBUS_parenright, 0x2466,
-+IBUS_parenleft, IBUS_KP_8, IBUS_parenright, 0x2467,
-+IBUS_parenleft, IBUS_KP_9, IBUS_parenright, 0x2468,
-+IBUS_minus, IBUS_minus, IBUS_space, 0x00AD,
-+IBUS_minus, IBUS_minus, IBUS_minus, 0x2014,
-+IBUS_minus, IBUS_minus, IBUS_period, 0x2013,
-+IBUS_period, IBUS_exclam, IBUS_S, 0x1E68,
-+IBUS_period, IBUS_exclam, IBUS_s, 0x1E69,
-+IBUS_period, IBUS_apostrophe, IBUS_S, 0x1E64,
-+IBUS_period, IBUS_apostrophe, IBUS_s, 0x1E65,
-+IBUS_period, IBUS_acute, IBUS_S, 0x1E64,
-+IBUS_period, IBUS_acute, IBUS_s, 0x1E65,
-+IBUS_period, IBUS_dead_acute, IBUS_S, 0x1E64,
-+IBUS_period, IBUS_dead_acute, IBUS_s, 0x1E65,
-+IBUS_period, IBUS_dead_caron, IBUS_S, 0x1E66,
-+IBUS_period, IBUS_dead_caron, IBUS_s, 0x1E67,
-+IBUS_period, IBUS_dead_belowdot, IBUS_S, 0x1E68,
-+IBUS_period, IBUS_dead_belowdot, IBUS_s, 0x1E69,
-+IBUS_question, IBUS_plus, IBUS_O, 0x1EDE,
-+IBUS_question, IBUS_plus, IBUS_U, 0x1EEC,
-+IBUS_question, IBUS_plus, IBUS_o, 0x1EDF,
-+IBUS_question, IBUS_plus, IBUS_u, 0x1EED,
-+IBUS_question, IBUS_asciicircum, IBUS_A, 0x1EA8,
-+IBUS_question, IBUS_asciicircum, IBUS_E, 0x1EC2,
-+IBUS_question, IBUS_asciicircum, IBUS_O, 0x1ED4,
-+IBUS_question, IBUS_asciicircum, IBUS_a, 0x1EA9,
-+IBUS_question, IBUS_asciicircum, IBUS_e, 0x1EC3,
-+IBUS_question, IBUS_asciicircum, IBUS_o, 0x1ED5,
-+IBUS_question, IBUS_b, IBUS_A, 0x1EB2,
-+IBUS_question, IBUS_b, IBUS_a, 0x1EB3,
-+IBUS_question, IBUS_dead_circumflex, IBUS_A, 0x1EA8,
-+IBUS_question, IBUS_dead_circumflex, IBUS_E, 0x1EC2,
-+IBUS_question, IBUS_dead_circumflex, IBUS_O, 0x1ED4,
-+IBUS_question, IBUS_dead_circumflex, IBUS_a, 0x1EA9,
-+IBUS_question, IBUS_dead_circumflex, IBUS_e, 0x1EC3,
-+IBUS_question, IBUS_dead_circumflex, IBUS_o, 0x1ED5,
-+IBUS_question, IBUS_dead_breve, IBUS_A, 0x1EB2,
-+IBUS_question, IBUS_dead_breve, IBUS_a, 0x1EB3,
-+IBUS_question, IBUS_dead_horn, IBUS_O, 0x1EDE,
-+IBUS_question, IBUS_dead_horn, IBUS_U, 0x1EEC,
-+IBUS_question, IBUS_dead_horn, IBUS_o, 0x1EDF,
-+IBUS_question, IBUS_dead_horn, IBUS_u, 0x1EED,
-+IBUS_U, IBUS_exclam, IBUS_A, 0x1EB6,
-+IBUS_U, IBUS_exclam, IBUS_a, 0x1EB7,
-+IBUS_U, IBUS_comma, IBUS_E, 0x1E1C,
-+IBUS_U, IBUS_comma, IBUS_e, 0x1E1D,
-+IBUS_U, IBUS_cedilla, IBUS_E, 0x1E1C,
-+IBUS_U, IBUS_cedilla, IBUS_e, 0x1E1D,
-+IBUS_U, IBUS_dead_cedilla, IBUS_E, 0x1E1C,
-+IBUS_U, IBUS_dead_cedilla, IBUS_e, 0x1E1D,
-+IBUS_U, IBUS_dead_belowdot, IBUS_A, 0x1EB6,
-+IBUS_U, IBUS_dead_belowdot, IBUS_a, 0x1EB7,
-+IBUS_asciicircum, IBUS_exclam, IBUS_A, 0x1EAC,
-+IBUS_asciicircum, IBUS_exclam, IBUS_E, 0x1EC6,
-+IBUS_asciicircum, IBUS_exclam, IBUS_O, 0x1ED8,
-+IBUS_asciicircum, IBUS_exclam, IBUS_a, 0x1EAD,
-+IBUS_asciicircum, IBUS_exclam, IBUS_e, 0x1EC7,
-+IBUS_asciicircum, IBUS_exclam, IBUS_o, 0x1ED9,
-+IBUS_asciicircum, IBUS_underscore, IBUS_a, 0x00AA,
-+IBUS_asciicircum, IBUS_underscore, IBUS_h, 0x02B0,
-+IBUS_asciicircum, IBUS_underscore, IBUS_i, 0x2071,
-+IBUS_asciicircum, IBUS_underscore, IBUS_j, 0x02B2,
-+IBUS_asciicircum, IBUS_underscore, IBUS_l, 0x02E1,
-+IBUS_asciicircum, IBUS_underscore, IBUS_n, 0x207F,
-+IBUS_asciicircum, IBUS_underscore, IBUS_o, 0x00BA,
-+IBUS_asciicircum, IBUS_underscore, IBUS_r, 0x02B3,
-+IBUS_asciicircum, IBUS_underscore, IBUS_s, 0x02E2,
-+IBUS_asciicircum, IBUS_underscore, IBUS_w, 0x02B7,
-+IBUS_asciicircum, IBUS_underscore, IBUS_x, 0x02E3,
-+IBUS_asciicircum, IBUS_underscore, IBUS_y, 0x02B8,
-+IBUS_asciicircum, IBUS_underscore, 0x0263, 0x02E0,
-+IBUS_asciicircum, IBUS_underscore, 0x0266, 0x02B1,
-+IBUS_asciicircum, IBUS_underscore, 0x0279, 0x02B4,
-+IBUS_asciicircum, IBUS_underscore, 0x027B, 0x02B5,
-+IBUS_asciicircum, IBUS_underscore, 0x0281, 0x02B6,
-+IBUS_asciicircum, IBUS_underscore, 0x0295, 0x02E4,
-+IBUS_asciicircum, IBUS_underbar, IBUS_a, 0x00AA,
-+IBUS_asciicircum, IBUS_underbar, IBUS_h, 0x02B0,
-+IBUS_asciicircum, IBUS_underbar, IBUS_i, 0x2071,
-+IBUS_asciicircum, IBUS_underbar, IBUS_j, 0x02B2,
-+IBUS_asciicircum, IBUS_underbar, IBUS_l, 0x02E1,
-+IBUS_asciicircum, IBUS_underbar, IBUS_n, 0x207F,
-+IBUS_asciicircum, IBUS_underbar, IBUS_o, 0x00BA,
-+IBUS_asciicircum, IBUS_underbar, IBUS_r, 0x02B3,
-+IBUS_asciicircum, IBUS_underbar, IBUS_s, 0x02E2,
-+IBUS_asciicircum, IBUS_underbar, IBUS_w, 0x02B7,
-+IBUS_asciicircum, IBUS_underbar, IBUS_x, 0x02E3,
-+IBUS_asciicircum, IBUS_underbar, IBUS_y, 0x02B8,
-+IBUS_asciicircum, IBUS_underbar, 0x0263, 0x02E0,
-+IBUS_asciicircum, IBUS_underbar, 0x0266, 0x02B1,
-+IBUS_asciicircum, IBUS_underbar, 0x0279, 0x02B4,
-+IBUS_asciicircum, IBUS_underbar, 0x027B, 0x02B5,
-+IBUS_asciicircum, IBUS_underbar, 0x0281, 0x02B6,
-+IBUS_asciicircum, IBUS_underbar, 0x0295, 0x02E4,
-+IBUS_asciicircum, IBUS_dead_belowdot, IBUS_A, 0x1EAC,
-+IBUS_asciicircum, IBUS_dead_belowdot, IBUS_E, 0x1EC6,
-+IBUS_asciicircum, IBUS_dead_belowdot, IBUS_O, 0x1ED8,
-+IBUS_asciicircum, IBUS_dead_belowdot, IBUS_a, 0x1EAD,
-+IBUS_asciicircum, IBUS_dead_belowdot, IBUS_e, 0x1EC7,
-+IBUS_asciicircum, IBUS_dead_belowdot, IBUS_o, 0x1ED9,
-+IBUS_underscore, IBUS_exclam, IBUS_L, 0x1E38,
-+IBUS_underscore, IBUS_exclam, IBUS_R, 0x1E5C,
-+IBUS_underscore, IBUS_exclam, IBUS_l, 0x1E39,
-+IBUS_underscore, IBUS_exclam, IBUS_r, 0x1E5D,
-+IBUS_underscore, IBUS_quotedbl, IBUS_A, 0x01DE,
-+IBUS_underscore, IBUS_quotedbl, IBUS_O, 0x022A,
-+IBUS_underscore, IBUS_quotedbl, IBUS_U, 0x01D5,
-+IBUS_underscore, IBUS_quotedbl, IBUS_a, 0x01DF,
-+IBUS_underscore, IBUS_quotedbl, IBUS_o, 0x022B,
-+IBUS_underscore, IBUS_quotedbl, IBUS_u, 0x01D6,
-+IBUS_underscore, IBUS_period, IBUS_A, 0x01E0,
-+IBUS_underscore, IBUS_period, IBUS_O, 0x0230,
-+IBUS_underscore, IBUS_period, IBUS_a, 0x01E1,
-+IBUS_underscore, IBUS_period, IBUS_o, 0x0231,
-+IBUS_underscore, IBUS_semicolon, IBUS_O, 0x01EC,
-+IBUS_underscore, IBUS_semicolon, IBUS_o, 0x01ED,
-+IBUS_underscore, IBUS_asciitilde, IBUS_O, 0x022C,
-+IBUS_underscore, IBUS_asciitilde, IBUS_o, 0x022D,
-+IBUS_underscore, IBUS_dead_tilde, IBUS_O, 0x022C,
-+IBUS_underscore, IBUS_dead_tilde, IBUS_o, 0x022D,
-+IBUS_underscore, IBUS_dead_abovedot, IBUS_A, 0x01E0,
-+IBUS_underscore, IBUS_dead_abovedot, IBUS_O, 0x0230,
-+IBUS_underscore, IBUS_dead_abovedot, IBUS_a, 0x01E1,
-+IBUS_underscore, IBUS_dead_abovedot, IBUS_o, 0x0231,
-+IBUS_underscore, IBUS_dead_diaeresis, IBUS_A, 0x01DE,
-+IBUS_underscore, IBUS_dead_diaeresis, IBUS_O, 0x022A,
-+IBUS_underscore, IBUS_dead_diaeresis, IBUS_U, 0x01D5,
-+IBUS_underscore, IBUS_dead_diaeresis, IBUS_a, 0x01DF,
-+IBUS_underscore, IBUS_dead_diaeresis, IBUS_o, 0x022B,
-+IBUS_underscore, IBUS_dead_diaeresis, IBUS_u, 0x01D6,
-+IBUS_underscore, IBUS_dead_ogonek, IBUS_O, 0x01EC,
-+IBUS_underscore, IBUS_dead_ogonek, IBUS_o, 0x01ED,
-+IBUS_underscore, IBUS_dead_belowdot, IBUS_L, 0x1E38,
-+IBUS_underscore, IBUS_dead_belowdot, IBUS_R, 0x1E5C,
-+IBUS_underscore, IBUS_dead_belowdot, IBUS_l, 0x1E39,
-+IBUS_underscore, IBUS_dead_belowdot, IBUS_r, 0x1E5D,
-+IBUS_grave, IBUS_quotedbl, IBUS_U, 0x01DB,
-+IBUS_grave, IBUS_quotedbl, IBUS_u, 0x01DC,
-+IBUS_grave, IBUS_quotedbl, IBUS_Greek_iota, 0x1FD2,
-+IBUS_grave, IBUS_quotedbl, IBUS_Greek_upsilon, 0x1FE2,
-+IBUS_grave, IBUS_parenleft, IBUS_Greek_ALPHA, 0x1F0B,
-+IBUS_grave, IBUS_parenleft, IBUS_Greek_EPSILON, 0x1F1B,
-+IBUS_grave, IBUS_parenleft, IBUS_Greek_ETA, 0x1F2B,
-+IBUS_grave, IBUS_parenleft, IBUS_Greek_IOTA, 0x1F3B,
-+IBUS_grave, IBUS_parenleft, IBUS_Greek_OMICRON, 0x1F4B,
-+IBUS_grave, IBUS_parenleft, IBUS_Greek_UPSILON, 0x1F5B,
-+IBUS_grave, IBUS_parenleft, IBUS_Greek_OMEGA, 0x1F6B,
-+IBUS_grave, IBUS_parenleft, IBUS_Greek_alpha, 0x1F03,
-+IBUS_grave, IBUS_parenleft, IBUS_Greek_epsilon, 0x1F13,
-+IBUS_grave, IBUS_parenleft, IBUS_Greek_eta, 0x1F23,
-+IBUS_grave, IBUS_parenleft, IBUS_Greek_iota, 0x1F33,
-+IBUS_grave, IBUS_parenleft, IBUS_Greek_omicron, 0x1F43,
-+IBUS_grave, IBUS_parenleft, IBUS_Greek_upsilon, 0x1F53,
-+IBUS_grave, IBUS_parenleft, IBUS_Greek_omega, 0x1F63,
-+IBUS_grave, IBUS_parenright, IBUS_Greek_ALPHA, 0x1F0A,
-+IBUS_grave, IBUS_parenright, IBUS_Greek_EPSILON, 0x1F1A,
-+IBUS_grave, IBUS_parenright, IBUS_Greek_ETA, 0x1F2A,
-+IBUS_grave, IBUS_parenright, IBUS_Greek_IOTA, 0x1F3A,
-+IBUS_grave, IBUS_parenright, IBUS_Greek_OMICRON, 0x1F4A,
-+IBUS_grave, IBUS_parenright, IBUS_Greek_OMEGA, 0x1F6A,
-+IBUS_grave, IBUS_parenright, IBUS_Greek_alpha, 0x1F02,
-+IBUS_grave, IBUS_parenright, IBUS_Greek_epsilon, 0x1F12,
-+IBUS_grave, IBUS_parenright, IBUS_Greek_eta, 0x1F22,
-+IBUS_grave, IBUS_parenright, IBUS_Greek_iota, 0x1F32,
-+IBUS_grave, IBUS_parenright, IBUS_Greek_omicron, 0x1F42,
-+IBUS_grave, IBUS_parenright, IBUS_Greek_upsilon, 0x1F52,
-+IBUS_grave, IBUS_parenright, IBUS_Greek_omega, 0x1F62,
-+IBUS_grave, IBUS_plus, IBUS_O, 0x1EDC,
-+IBUS_grave, IBUS_plus, IBUS_U, 0x1EEA,
-+IBUS_grave, IBUS_plus, IBUS_o, 0x1EDD,
-+IBUS_grave, IBUS_plus, IBUS_u, 0x1EEB,
-+IBUS_grave, IBUS_asciicircum, IBUS_A, 0x1EA6,
-+IBUS_grave, IBUS_asciicircum, IBUS_E, 0x1EC0,
-+IBUS_grave, IBUS_asciicircum, IBUS_O, 0x1ED2,
-+IBUS_grave, IBUS_asciicircum, IBUS_a, 0x1EA7,
-+IBUS_grave, IBUS_asciicircum, IBUS_e, 0x1EC1,
-+IBUS_grave, IBUS_asciicircum, IBUS_o, 0x1ED3,
-+IBUS_grave, IBUS_underscore, IBUS_E, 0x1E14,
-+IBUS_grave, IBUS_underscore, IBUS_O, 0x1E50,
-+IBUS_grave, IBUS_underscore, IBUS_e, 0x1E15,
-+IBUS_grave, IBUS_underscore, IBUS_o, 0x1E51,
-+IBUS_grave, IBUS_b, IBUS_A, 0x1EB0,
-+IBUS_grave, IBUS_b, IBUS_a, 0x1EB1,
-+IBUS_grave, IBUS_macron, IBUS_E, 0x1E14,
-+IBUS_grave, IBUS_macron, IBUS_O, 0x1E50,
-+IBUS_grave, IBUS_macron, IBUS_e, 0x1E15,
-+IBUS_grave, IBUS_macron, IBUS_o, 0x1E51,
-+IBUS_grave, IBUS_dead_circumflex, IBUS_A, 0x1EA6,
-+IBUS_grave, IBUS_dead_circumflex, IBUS_E, 0x1EC0,
-+IBUS_grave, IBUS_dead_circumflex, IBUS_O, 0x1ED2,
-+IBUS_grave, IBUS_dead_circumflex, IBUS_a, 0x1EA7,
-+IBUS_grave, IBUS_dead_circumflex, IBUS_e, 0x1EC1,
-+IBUS_grave, IBUS_dead_circumflex, IBUS_o, 0x1ED3,
-+IBUS_grave, IBUS_dead_macron, IBUS_E, 0x1E14,
-+IBUS_grave, IBUS_dead_macron, IBUS_O, 0x1E50,
-+IBUS_grave, IBUS_dead_macron, IBUS_e, 0x1E15,
-+IBUS_grave, IBUS_dead_macron, IBUS_o, 0x1E51,
-+IBUS_grave, IBUS_dead_breve, IBUS_A, 0x1EB0,
-+IBUS_grave, IBUS_dead_breve, IBUS_a, 0x1EB1,
-+IBUS_grave, IBUS_dead_diaeresis, IBUS_U, 0x01DB,
-+IBUS_grave, IBUS_dead_diaeresis, IBUS_u, 0x01DC,
-+IBUS_grave, IBUS_dead_diaeresis, IBUS_Greek_iota, 0x1FD2,
-+IBUS_grave, IBUS_dead_diaeresis, IBUS_Greek_upsilon, 0x1FE2,
-+IBUS_grave, IBUS_dead_horn, IBUS_O, 0x1EDC,
-+IBUS_grave, IBUS_dead_horn, IBUS_U, 0x1EEA,
-+IBUS_grave, IBUS_dead_horn, IBUS_o, 0x1EDD,
-+IBUS_grave, IBUS_dead_horn, IBUS_u, 0x1EEB,
-+IBUS_grave, IBUS_dead_psili, IBUS_Greek_ALPHA, 0x1F0A,
-+IBUS_grave, IBUS_dead_psili, IBUS_Greek_EPSILON, 0x1F1A,
-+IBUS_grave, IBUS_dead_psili, IBUS_Greek_ETA, 0x1F2A,
-+IBUS_grave, IBUS_dead_psili, IBUS_Greek_IOTA, 0x1F3A,
-+IBUS_grave, IBUS_dead_psili, IBUS_Greek_OMICRON, 0x1F4A,
-+IBUS_grave, IBUS_dead_psili, IBUS_Greek_OMEGA, 0x1F6A,
-+IBUS_grave, IBUS_dead_psili, IBUS_Greek_alpha, 0x1F02,
-+IBUS_grave, IBUS_dead_psili, IBUS_Greek_epsilon, 0x1F12,
-+IBUS_grave, IBUS_dead_psili, IBUS_Greek_eta, 0x1F22,
-+IBUS_grave, IBUS_dead_psili, IBUS_Greek_iota, 0x1F32,
-+IBUS_grave, IBUS_dead_psili, IBUS_Greek_omicron, 0x1F42,
-+IBUS_grave, IBUS_dead_psili, IBUS_Greek_upsilon, 0x1F52,
-+IBUS_grave, IBUS_dead_psili, IBUS_Greek_omega, 0x1F62,
-+IBUS_grave, IBUS_dead_dasia, IBUS_Greek_ALPHA, 0x1F0B,
-+IBUS_grave, IBUS_dead_dasia, IBUS_Greek_EPSILON, 0x1F1B,
-+IBUS_grave, IBUS_dead_dasia, IBUS_Greek_ETA, 0x1F2B,
-+IBUS_grave, IBUS_dead_dasia, IBUS_Greek_IOTA, 0x1F3B,
-+IBUS_grave, IBUS_dead_dasia, IBUS_Greek_OMICRON, 0x1F4B,
-+IBUS_grave, IBUS_dead_dasia, IBUS_Greek_UPSILON, 0x1F5B,
-+IBUS_grave, IBUS_dead_dasia, IBUS_Greek_OMEGA, 0x1F6B,
-+IBUS_grave, IBUS_dead_dasia, IBUS_Greek_alpha, 0x1F03,
-+IBUS_grave, IBUS_dead_dasia, IBUS_Greek_epsilon, 0x1F13,
-+IBUS_grave, IBUS_dead_dasia, IBUS_Greek_eta, 0x1F23,
-+IBUS_grave, IBUS_dead_dasia, IBUS_Greek_iota, 0x1F33,
-+IBUS_grave, IBUS_dead_dasia, IBUS_Greek_omicron, 0x1F43,
-+IBUS_grave, IBUS_dead_dasia, IBUS_Greek_upsilon, 0x1F53,
-+IBUS_grave, IBUS_dead_dasia, IBUS_Greek_omega, 0x1F63,
-+IBUS_b, IBUS_exclam, IBUS_A, 0x1EB6,
-+IBUS_b, IBUS_exclam, IBUS_a, 0x1EB7,
-+IBUS_b, IBUS_comma, IBUS_E, 0x1E1C,
-+IBUS_b, IBUS_comma, IBUS_e, 0x1E1D,
-+IBUS_b, IBUS_cedilla, IBUS_E, 0x1E1C,
-+IBUS_b, IBUS_cedilla, IBUS_e, 0x1E1D,
-+IBUS_b, IBUS_dead_cedilla, IBUS_E, 0x1E1C,
-+IBUS_b, IBUS_dead_cedilla, IBUS_e, 0x1E1D,
-+IBUS_b, IBUS_dead_belowdot, IBUS_A, 0x1EB6,
-+IBUS_b, IBUS_dead_belowdot, IBUS_a, 0x1EB7,
-+IBUS_c, IBUS_quotedbl, IBUS_U, 0x01D9,
-+IBUS_c, IBUS_quotedbl, IBUS_u, 0x01DA,
-+IBUS_c, IBUS_dead_diaeresis, IBUS_U, 0x01D9,
-+IBUS_c, IBUS_dead_diaeresis, IBUS_u, 0x01DA,
-+IBUS_o, IBUS_apostrophe, IBUS_A, 0x01FA,
-+IBUS_o, IBUS_apostrophe, IBUS_a, 0x01FB,
-+IBUS_asciitilde, IBUS_quotedbl, IBUS_Greek_iota, 0x1FD7,
-+IBUS_asciitilde, IBUS_quotedbl, IBUS_Greek_upsilon, 0x1FE7,
-+IBUS_asciitilde, IBUS_parenleft, IBUS_Greek_ALPHA, 0x1F0F,
-+IBUS_asciitilde, IBUS_parenleft, IBUS_Greek_ETA, 0x1F2F,
-+IBUS_asciitilde, IBUS_parenleft, IBUS_Greek_IOTA, 0x1F3F,
-+IBUS_asciitilde, IBUS_parenleft, IBUS_Greek_UPSILON, 0x1F5F,
-+IBUS_asciitilde, IBUS_parenleft, IBUS_Greek_OMEGA, 0x1F6F,
-+IBUS_asciitilde, IBUS_parenleft, IBUS_Greek_alpha, 0x1F07,
-+IBUS_asciitilde, IBUS_parenleft, IBUS_Greek_eta, 0x1F27,
-+IBUS_asciitilde, IBUS_parenleft, IBUS_Greek_iota, 0x1F37,
-+IBUS_asciitilde, IBUS_parenleft, IBUS_Greek_upsilon, 0x1F57,
-+IBUS_asciitilde, IBUS_parenleft, IBUS_Greek_omega, 0x1F67,
-+IBUS_asciitilde, IBUS_parenright, IBUS_Greek_ALPHA, 0x1F0E,
-+IBUS_asciitilde, IBUS_parenright, IBUS_Greek_ETA, 0x1F2E,
-+IBUS_asciitilde, IBUS_parenright, IBUS_Greek_IOTA, 0x1F3E,
-+IBUS_asciitilde, IBUS_parenright, IBUS_Greek_OMEGA, 0x1F6E,
-+IBUS_asciitilde, IBUS_parenright, IBUS_Greek_alpha, 0x1F06,
-+IBUS_asciitilde, IBUS_parenright, IBUS_Greek_eta, 0x1F26,
-+IBUS_asciitilde, IBUS_parenright, IBUS_Greek_iota, 0x1F36,
-+IBUS_asciitilde, IBUS_parenright, IBUS_Greek_upsilon, 0x1F56,
-+IBUS_asciitilde, IBUS_parenright, IBUS_Greek_omega, 0x1F66,
-+IBUS_asciitilde, IBUS_plus, IBUS_O, 0x1EE0,
-+IBUS_asciitilde, IBUS_plus, IBUS_U, 0x1EEE,
-+IBUS_asciitilde, IBUS_plus, IBUS_o, 0x1EE1,
-+IBUS_asciitilde, IBUS_plus, IBUS_u, 0x1EEF,
-+IBUS_asciitilde, IBUS_asciicircum, IBUS_A, 0x1EAA,
-+IBUS_asciitilde, IBUS_asciicircum, IBUS_E, 0x1EC4,
-+IBUS_asciitilde, IBUS_asciicircum, IBUS_O, 0x1ED6,
-+IBUS_asciitilde, IBUS_asciicircum, IBUS_a, 0x1EAB,
-+IBUS_asciitilde, IBUS_asciicircum, IBUS_e, 0x1EC5,
-+IBUS_asciitilde, IBUS_asciicircum, IBUS_o, 0x1ED7,
-+IBUS_asciitilde, IBUS_b, IBUS_A, 0x1EB4,
-+IBUS_asciitilde, IBUS_b, IBUS_a, 0x1EB5,
-+IBUS_asciitilde, IBUS_dead_circumflex, IBUS_A, 0x1EAA,
-+IBUS_asciitilde, IBUS_dead_circumflex, IBUS_E, 0x1EC4,
-+IBUS_asciitilde, IBUS_dead_circumflex, IBUS_O, 0x1ED6,
-+IBUS_asciitilde, IBUS_dead_circumflex, IBUS_a, 0x1EAB,
-+IBUS_asciitilde, IBUS_dead_circumflex, IBUS_e, 0x1EC5,
-+IBUS_asciitilde, IBUS_dead_circumflex, IBUS_o, 0x1ED7,
-+IBUS_asciitilde, IBUS_dead_breve, IBUS_A, 0x1EB4,
-+IBUS_asciitilde, IBUS_dead_breve, IBUS_a, 0x1EB5,
-+IBUS_asciitilde, IBUS_dead_diaeresis, IBUS_Greek_iota, 0x1FD7,
-+IBUS_asciitilde, IBUS_dead_diaeresis, IBUS_Greek_upsilon, 0x1FE7,
-+IBUS_asciitilde, IBUS_dead_horn, IBUS_O, 0x1EE0,
-+IBUS_asciitilde, IBUS_dead_horn, IBUS_U, 0x1EEE,
-+IBUS_asciitilde, IBUS_dead_horn, IBUS_o, 0x1EE1,
-+IBUS_asciitilde, IBUS_dead_horn, IBUS_u, 0x1EEF,
-+IBUS_asciitilde, IBUS_dead_psili, IBUS_Greek_ALPHA, 0x1F0E,
-+IBUS_asciitilde, IBUS_dead_psili, IBUS_Greek_ETA, 0x1F2E,
-+IBUS_asciitilde, IBUS_dead_psili, IBUS_Greek_IOTA, 0x1F3E,
-+IBUS_asciitilde, IBUS_dead_psili, IBUS_Greek_OMEGA, 0x1F6E,
-+IBUS_asciitilde, IBUS_dead_psili, IBUS_Greek_alpha, 0x1F06,
-+IBUS_asciitilde, IBUS_dead_psili, IBUS_Greek_eta, 0x1F26,
-+IBUS_asciitilde, IBUS_dead_psili, IBUS_Greek_iota, 0x1F36,
-+IBUS_asciitilde, IBUS_dead_psili, IBUS_Greek_upsilon, 0x1F56,
-+IBUS_asciitilde, IBUS_dead_psili, IBUS_Greek_omega, 0x1F66,
-+IBUS_asciitilde, IBUS_dead_dasia, IBUS_Greek_ALPHA, 0x1F0F,
-+IBUS_asciitilde, IBUS_dead_dasia, IBUS_Greek_ETA, 0x1F2F,
-+IBUS_asciitilde, IBUS_dead_dasia, IBUS_Greek_IOTA, 0x1F3F,
-+IBUS_asciitilde, IBUS_dead_dasia, IBUS_Greek_UPSILON, 0x1F5F,
-+IBUS_asciitilde, IBUS_dead_dasia, IBUS_Greek_OMEGA, 0x1F6F,
-+IBUS_asciitilde, IBUS_dead_dasia, IBUS_Greek_alpha, 0x1F07,
-+IBUS_asciitilde, IBUS_dead_dasia, IBUS_Greek_eta, 0x1F27,
-+IBUS_asciitilde, IBUS_dead_dasia, IBUS_Greek_iota, 0x1F37,
-+IBUS_asciitilde, IBUS_dead_dasia, IBUS_Greek_upsilon, 0x1F57,
-+IBUS_asciitilde, IBUS_dead_dasia, IBUS_Greek_omega, 0x1F67,
-+IBUS_macron, IBUS_exclam, IBUS_L, 0x1E38,
-+IBUS_macron, IBUS_exclam, IBUS_R, 0x1E5C,
-+IBUS_macron, IBUS_exclam, IBUS_l, 0x1E39,
-+IBUS_macron, IBUS_exclam, IBUS_r, 0x1E5D,
-+IBUS_macron, IBUS_quotedbl, IBUS_A, 0x01DE,
-+IBUS_macron, IBUS_quotedbl, IBUS_O, 0x022A,
-+IBUS_macron, IBUS_quotedbl, IBUS_U, 0x01D5,
-+IBUS_macron, IBUS_quotedbl, IBUS_a, 0x01DF,
-+IBUS_macron, IBUS_quotedbl, IBUS_o, 0x022B,
-+IBUS_macron, IBUS_quotedbl, IBUS_u, 0x01D6,
-+IBUS_macron, IBUS_period, IBUS_A, 0x01E0,
-+IBUS_macron, IBUS_period, IBUS_O, 0x0230,
-+IBUS_macron, IBUS_period, IBUS_a, 0x01E1,
-+IBUS_macron, IBUS_period, IBUS_o, 0x0231,
-+IBUS_macron, IBUS_semicolon, IBUS_O, 0x01EC,
-+IBUS_macron, IBUS_semicolon, IBUS_o, 0x01ED,
-+IBUS_macron, IBUS_asciitilde, IBUS_O, 0x022C,
-+IBUS_macron, IBUS_asciitilde, IBUS_o, 0x022D,
-+IBUS_macron, IBUS_dead_tilde, IBUS_O, 0x022C,
-+IBUS_macron, IBUS_dead_tilde, IBUS_o, 0x022D,
-+IBUS_macron, IBUS_dead_abovedot, IBUS_A, 0x01E0,
-+IBUS_macron, IBUS_dead_abovedot, IBUS_O, 0x0230,
-+IBUS_macron, IBUS_dead_abovedot, IBUS_a, 0x01E1,
-+IBUS_macron, IBUS_dead_abovedot, IBUS_o, 0x0231,
-+IBUS_macron, IBUS_dead_diaeresis, IBUS_A, 0x01DE,
-+IBUS_macron, IBUS_dead_diaeresis, IBUS_O, 0x022A,
-+IBUS_macron, IBUS_dead_diaeresis, IBUS_U, 0x01D5,
-+IBUS_macron, IBUS_dead_diaeresis, IBUS_a, 0x01DF,
-+IBUS_macron, IBUS_dead_diaeresis, IBUS_o, 0x022B,
-+IBUS_macron, IBUS_dead_diaeresis, IBUS_u, 0x01D6,
-+IBUS_macron, IBUS_dead_ogonek, IBUS_O, 0x01EC,
-+IBUS_macron, IBUS_dead_ogonek, IBUS_o, 0x01ED,
-+IBUS_macron, IBUS_dead_belowdot, IBUS_L, 0x1E38,
-+IBUS_macron, IBUS_dead_belowdot, IBUS_R, 0x1E5C,
-+IBUS_macron, IBUS_dead_belowdot, IBUS_l, 0x1E39,
-+IBUS_macron, IBUS_dead_belowdot, IBUS_r, 0x1E5D,
-+IBUS_acute, IBUS_quotedbl, IBUS_I, 0x1E2E,
-+IBUS_acute, IBUS_quotedbl, IBUS_U, 0x01D7,
-+IBUS_acute, IBUS_quotedbl, IBUS_i, 0x1E2F,
-+IBUS_acute, IBUS_quotedbl, IBUS_u, 0x01D8,
-+IBUS_acute, IBUS_quotedbl, IBUS_Greek_iota, 0x0390,
-+IBUS_acute, IBUS_quotedbl, IBUS_Greek_upsilon, 0x03B0,
-+IBUS_acute, IBUS_parenleft, IBUS_Greek_ALPHA, 0x1F0D,
-+IBUS_acute, IBUS_parenleft, IBUS_Greek_EPSILON, 0x1F1D,
-+IBUS_acute, IBUS_parenleft, IBUS_Greek_ETA, 0x1F2D,
-+IBUS_acute, IBUS_parenleft, IBUS_Greek_IOTA, 0x1F3D,
-+IBUS_acute, IBUS_parenleft, IBUS_Greek_OMICRON, 0x1F4D,
-+IBUS_acute, IBUS_parenleft, IBUS_Greek_UPSILON, 0x1F5D,
-+IBUS_acute, IBUS_parenleft, IBUS_Greek_OMEGA, 0x1F6D,
-+IBUS_acute, IBUS_parenleft, IBUS_Greek_alpha, 0x1F05,
-+IBUS_acute, IBUS_parenleft, IBUS_Greek_epsilon, 0x1F15,
-+IBUS_acute, IBUS_parenleft, IBUS_Greek_eta, 0x1F25,
-+IBUS_acute, IBUS_parenleft, IBUS_Greek_iota, 0x1F35,
-+IBUS_acute, IBUS_parenleft, IBUS_Greek_omicron, 0x1F45,
-+IBUS_acute, IBUS_parenleft, IBUS_Greek_upsilon, 0x1F55,
-+IBUS_acute, IBUS_parenleft, IBUS_Greek_omega, 0x1F65,
-+IBUS_acute, IBUS_parenright, IBUS_Greek_ALPHA, 0x1F0C,
-+IBUS_acute, IBUS_parenright, IBUS_Greek_EPSILON, 0x1F1C,
-+IBUS_acute, IBUS_parenright, IBUS_Greek_ETA, 0x1F2C,
-+IBUS_acute, IBUS_parenright, IBUS_Greek_IOTA, 0x1F3C,
-+IBUS_acute, IBUS_parenright, IBUS_Greek_OMICRON, 0x1F4C,
-+IBUS_acute, IBUS_parenright, IBUS_Greek_OMEGA, 0x1F6C,
-+IBUS_acute, IBUS_parenright, IBUS_Greek_alpha, 0x1F04,
-+IBUS_acute, IBUS_parenright, IBUS_Greek_epsilon, 0x1F14,
-+IBUS_acute, IBUS_parenright, IBUS_Greek_eta, 0x1F24,
-+IBUS_acute, IBUS_parenright, IBUS_Greek_iota, 0x1F34,
-+IBUS_acute, IBUS_parenright, IBUS_Greek_omicron, 0x1F44,
-+IBUS_acute, IBUS_parenright, IBUS_Greek_upsilon, 0x1F54,
-+IBUS_acute, IBUS_parenright, IBUS_Greek_omega, 0x1F64,
-+IBUS_acute, IBUS_plus, IBUS_O, 0x1EDA,
-+IBUS_acute, IBUS_plus, IBUS_U, 0x1EE8,
-+IBUS_acute, IBUS_plus, IBUS_o, 0x1EDB,
-+IBUS_acute, IBUS_plus, IBUS_u, 0x1EE9,
-+IBUS_acute, IBUS_comma, IBUS_C, 0x1E08,
-+IBUS_acute, IBUS_comma, IBUS_c, 0x1E09,
-+IBUS_acute, IBUS_slash, IBUS_O, 0x01FE,
-+IBUS_acute, IBUS_slash, IBUS_o, 0x01FF,
-+IBUS_acute, IBUS_asciicircum, IBUS_A, 0x1EA4,
-+IBUS_acute, IBUS_asciicircum, IBUS_E, 0x1EBE,
-+IBUS_acute, IBUS_asciicircum, IBUS_O, 0x1ED0,
-+IBUS_acute, IBUS_asciicircum, IBUS_a, 0x1EA5,
-+IBUS_acute, IBUS_asciicircum, IBUS_e, 0x1EBF,
-+IBUS_acute, IBUS_asciicircum, IBUS_o, 0x1ED1,
-+IBUS_acute, IBUS_underscore, IBUS_E, 0x1E16,
-+IBUS_acute, IBUS_underscore, IBUS_O, 0x1E52,
-+IBUS_acute, IBUS_underscore, IBUS_e, 0x1E17,
-+IBUS_acute, IBUS_underscore, IBUS_o, 0x1E53,
-+IBUS_acute, IBUS_b, IBUS_A, 0x1EAE,
-+IBUS_acute, IBUS_b, IBUS_a, 0x1EAF,
-+IBUS_acute, IBUS_asciitilde, IBUS_O, 0x1E4C,
-+IBUS_acute, IBUS_asciitilde, IBUS_U, 0x1E78,
-+IBUS_acute, IBUS_asciitilde, IBUS_o, 0x1E4D,
-+IBUS_acute, IBUS_asciitilde, IBUS_u, 0x1E79,
-+IBUS_acute, IBUS_macron, IBUS_E, 0x1E16,
-+IBUS_acute, IBUS_macron, IBUS_O, 0x1E52,
-+IBUS_acute, IBUS_macron, IBUS_e, 0x1E17,
-+IBUS_acute, IBUS_macron, IBUS_o, 0x1E53,
-+IBUS_acute, IBUS_cedilla, IBUS_C, 0x1E08,
-+IBUS_acute, IBUS_cedilla, IBUS_c, 0x1E09,
-+IBUS_acute, IBUS_dead_circumflex, IBUS_A, 0x1EA4,
-+IBUS_acute, IBUS_dead_circumflex, IBUS_E, 0x1EBE,
-+IBUS_acute, IBUS_dead_circumflex, IBUS_O, 0x1ED0,
-+IBUS_acute, IBUS_dead_circumflex, IBUS_a, 0x1EA5,
-+IBUS_acute, IBUS_dead_circumflex, IBUS_e, 0x1EBF,
-+IBUS_acute, IBUS_dead_circumflex, IBUS_o, 0x1ED1,
-+IBUS_acute, IBUS_dead_tilde, IBUS_O, 0x1E4C,
-+IBUS_acute, IBUS_dead_tilde, IBUS_U, 0x1E78,
-+IBUS_acute, IBUS_dead_tilde, IBUS_o, 0x1E4D,
-+IBUS_acute, IBUS_dead_tilde, IBUS_u, 0x1E79,
-+IBUS_acute, IBUS_dead_macron, IBUS_E, 0x1E16,
-+IBUS_acute, IBUS_dead_macron, IBUS_O, 0x1E52,
-+IBUS_acute, IBUS_dead_macron, IBUS_e, 0x1E17,
-+IBUS_acute, IBUS_dead_macron, IBUS_o, 0x1E53,
-+IBUS_acute, IBUS_dead_breve, IBUS_A, 0x1EAE,
-+IBUS_acute, IBUS_dead_breve, IBUS_a, 0x1EAF,
-+IBUS_acute, IBUS_dead_diaeresis, IBUS_I, 0x1E2E,
-+IBUS_acute, IBUS_dead_diaeresis, IBUS_U, 0x01D7,
-+IBUS_acute, IBUS_dead_diaeresis, IBUS_i, 0x1E2F,
-+IBUS_acute, IBUS_dead_diaeresis, IBUS_u, 0x01D8,
-+IBUS_acute, IBUS_dead_diaeresis, IBUS_Greek_iota, 0x0390,
-+IBUS_acute, IBUS_dead_diaeresis, IBUS_Greek_upsilon, 0x03B0,
-+IBUS_acute, IBUS_dead_abovering, IBUS_A, 0x01FA,
-+IBUS_acute, IBUS_dead_abovering, IBUS_a, 0x01FB,
-+IBUS_acute, IBUS_dead_cedilla, IBUS_C, 0x1E08,
-+IBUS_acute, IBUS_dead_cedilla, IBUS_c, 0x1E09,
-+IBUS_acute, IBUS_dead_horn, IBUS_O, 0x1EDA,
-+IBUS_acute, IBUS_dead_horn, IBUS_U, 0x1EE8,
-+IBUS_acute, IBUS_dead_horn, IBUS_o, 0x1EDB,
-+IBUS_acute, IBUS_dead_horn, IBUS_u, 0x1EE9,
-+IBUS_acute, IBUS_dead_psili, IBUS_Greek_ALPHA, 0x1F0C,
-+IBUS_acute, IBUS_dead_psili, IBUS_Greek_EPSILON, 0x1F1C,
-+IBUS_acute, IBUS_dead_psili, IBUS_Greek_ETA, 0x1F2C,
-+IBUS_acute, IBUS_dead_psili, IBUS_Greek_IOTA, 0x1F3C,
-+IBUS_acute, IBUS_dead_psili, IBUS_Greek_OMICRON, 0x1F4C,
-+IBUS_acute, IBUS_dead_psili, IBUS_Greek_OMEGA, 0x1F6C,
-+IBUS_acute, IBUS_dead_psili, IBUS_Greek_alpha, 0x1F04,
-+IBUS_acute, IBUS_dead_psili, IBUS_Greek_epsilon, 0x1F14,
-+IBUS_acute, IBUS_dead_psili, IBUS_Greek_eta, 0x1F24,
-+IBUS_acute, IBUS_dead_psili, IBUS_Greek_iota, 0x1F34,
-+IBUS_acute, IBUS_dead_psili, IBUS_Greek_omicron, 0x1F44,
-+IBUS_acute, IBUS_dead_psili, IBUS_Greek_upsilon, 0x1F54,
-+IBUS_acute, IBUS_dead_psili, IBUS_Greek_omega, 0x1F64,
-+IBUS_acute, IBUS_dead_dasia, IBUS_Greek_ALPHA, 0x1F0D,
-+IBUS_acute, IBUS_dead_dasia, IBUS_Greek_EPSILON, 0x1F1D,
-+IBUS_acute, IBUS_dead_dasia, IBUS_Greek_ETA, 0x1F2D,
-+IBUS_acute, IBUS_dead_dasia, IBUS_Greek_IOTA, 0x1F3D,
-+IBUS_acute, IBUS_dead_dasia, IBUS_Greek_OMICRON, 0x1F4D,
-+IBUS_acute, IBUS_dead_dasia, IBUS_Greek_UPSILON, 0x1F5D,
-+IBUS_acute, IBUS_dead_dasia, IBUS_Greek_OMEGA, 0x1F6D,
-+IBUS_acute, IBUS_dead_dasia, IBUS_Greek_alpha, 0x1F05,
-+IBUS_acute, IBUS_dead_dasia, IBUS_Greek_epsilon, 0x1F15,
-+IBUS_acute, IBUS_dead_dasia, IBUS_Greek_eta, 0x1F25,
-+IBUS_acute, IBUS_dead_dasia, IBUS_Greek_iota, 0x1F35,
-+IBUS_acute, IBUS_dead_dasia, IBUS_Greek_omicron, 0x1F45,
-+IBUS_acute, IBUS_dead_dasia, IBUS_Greek_upsilon, 0x1F55,
-+IBUS_acute, IBUS_dead_dasia, IBUS_Greek_omega, 0x1F65,
-+IBUS_acute, IBUS_KP_Divide, IBUS_O, 0x01FE,
-+IBUS_acute, IBUS_KP_Divide, IBUS_o, 0x01FF,
-+0x05C1, 0x05BC, IBUS_hebrew_shin, 0xFB2C,
-+0x05C2, 0x05BC, IBUS_hebrew_shin, 0xFB2D,
-+IBUS_Greek_iota, IBUS_apostrophe, IBUS_Greek_alpha, 0x1FB4,
-+IBUS_Greek_iota, IBUS_apostrophe, IBUS_Greek_eta, 0x1FC4,
-+IBUS_Greek_iota, IBUS_apostrophe, IBUS_Greek_omega, 0x1FF4,
-+IBUS_Greek_iota, IBUS_apostrophe, 0x1F00, 0x1F84,
-+IBUS_Greek_iota, IBUS_apostrophe, 0x1F01, 0x1F85,
-+IBUS_Greek_iota, IBUS_apostrophe, 0x1F08, 0x1F8C,
-+IBUS_Greek_iota, IBUS_apostrophe, 0x1F09, 0x1F8D,
-+IBUS_Greek_iota, IBUS_apostrophe, 0x1F20, 0x1F94,
-+IBUS_Greek_iota, IBUS_apostrophe, 0x1F21, 0x1F95,
-+IBUS_Greek_iota, IBUS_apostrophe, 0x1F28, 0x1F9C,
-+IBUS_Greek_iota, IBUS_apostrophe, 0x1F29, 0x1F9D,
-+IBUS_Greek_iota, IBUS_apostrophe, 0x1F60, 0x1FA4,
-+IBUS_Greek_iota, IBUS_apostrophe, 0x1F61, 0x1FA5,
-+IBUS_Greek_iota, IBUS_apostrophe, 0x1F68, 0x1FAC,
-+IBUS_Greek_iota, IBUS_apostrophe, 0x1F69, 0x1FAD,
-+IBUS_Greek_iota, IBUS_parenleft, IBUS_Greek_ALPHA, 0x1F89,
-+IBUS_Greek_iota, IBUS_parenleft, IBUS_Greek_ETA, 0x1F99,
-+IBUS_Greek_iota, IBUS_parenleft, IBUS_Greek_OMEGA, 0x1FA9,
-+IBUS_Greek_iota, IBUS_parenleft, IBUS_Greek_alpha, 0x1F81,
-+IBUS_Greek_iota, IBUS_parenleft, IBUS_Greek_eta, 0x1F91,
-+IBUS_Greek_iota, IBUS_parenleft, IBUS_Greek_omega, 0x1FA1,
-+IBUS_Greek_iota, IBUS_parenright, IBUS_Greek_ALPHA, 0x1F88,
-+IBUS_Greek_iota, IBUS_parenright, IBUS_Greek_ETA, 0x1F98,
-+IBUS_Greek_iota, IBUS_parenright, IBUS_Greek_OMEGA, 0x1FA8,
-+IBUS_Greek_iota, IBUS_parenright, IBUS_Greek_alpha, 0x1F80,
-+IBUS_Greek_iota, IBUS_parenright, IBUS_Greek_eta, 0x1F90,
-+IBUS_Greek_iota, IBUS_parenright, IBUS_Greek_omega, 0x1FA0,
-+IBUS_Greek_iota, IBUS_grave, IBUS_Greek_alpha, 0x1FB2,
-+IBUS_Greek_iota, IBUS_grave, IBUS_Greek_eta, 0x1FC2,
-+IBUS_Greek_iota, IBUS_grave, IBUS_Greek_omega, 0x1FF2,
-+IBUS_Greek_iota, IBUS_grave, 0x1F00, 0x1F82,
-+IBUS_Greek_iota, IBUS_grave, 0x1F01, 0x1F83,
-+IBUS_Greek_iota, IBUS_grave, 0x1F08, 0x1F8A,
-+IBUS_Greek_iota, IBUS_grave, 0x1F09, 0x1F8B,
-+IBUS_Greek_iota, IBUS_grave, 0x1F20, 0x1F92,
-+IBUS_Greek_iota, IBUS_grave, 0x1F21, 0x1F93,
-+IBUS_Greek_iota, IBUS_grave, 0x1F28, 0x1F9A,
-+IBUS_Greek_iota, IBUS_grave, 0x1F29, 0x1F9B,
-+IBUS_Greek_iota, IBUS_grave, 0x1F60, 0x1FA2,
-+IBUS_Greek_iota, IBUS_grave, 0x1F61, 0x1FA3,
-+IBUS_Greek_iota, IBUS_grave, 0x1F68, 0x1FAA,
-+IBUS_Greek_iota, IBUS_grave, 0x1F69, 0x1FAB,
-+IBUS_Greek_iota, IBUS_asciitilde, IBUS_Greek_alpha, 0x1FB7,
-+IBUS_Greek_iota, IBUS_asciitilde, IBUS_Greek_eta, 0x1FC7,
-+IBUS_Greek_iota, IBUS_asciitilde, IBUS_Greek_omega, 0x1FF7,
-+IBUS_Greek_iota, IBUS_asciitilde, 0x1F00, 0x1F86,
-+IBUS_Greek_iota, IBUS_asciitilde, 0x1F01, 0x1F87,
-+IBUS_Greek_iota, IBUS_asciitilde, 0x1F08, 0x1F8E,
-+IBUS_Greek_iota, IBUS_asciitilde, 0x1F09, 0x1F8F,
-+IBUS_Greek_iota, IBUS_asciitilde, 0x1F20, 0x1F96,
-+IBUS_Greek_iota, IBUS_asciitilde, 0x1F21, 0x1F97,
-+IBUS_Greek_iota, IBUS_asciitilde, 0x1F28, 0x1F9E,
-+IBUS_Greek_iota, IBUS_asciitilde, 0x1F29, 0x1F9F,
-+IBUS_Greek_iota, IBUS_asciitilde, 0x1F60, 0x1FA6,
-+IBUS_Greek_iota, IBUS_asciitilde, 0x1F61, 0x1FA7,
-+IBUS_Greek_iota, IBUS_asciitilde, 0x1F68, 0x1FAE,
-+IBUS_Greek_iota, IBUS_asciitilde, 0x1F69, 0x1FAF,
-+IBUS_Greek_iota, IBUS_acute, IBUS_Greek_alpha, 0x1FB4,
-+IBUS_Greek_iota, IBUS_acute, IBUS_Greek_eta, 0x1FC4,
-+IBUS_Greek_iota, IBUS_acute, IBUS_Greek_omega, 0x1FF4,
-+IBUS_Greek_iota, IBUS_acute, 0x1F00, 0x1F84,
-+IBUS_Greek_iota, IBUS_acute, 0x1F01, 0x1F85,
-+IBUS_Greek_iota, IBUS_acute, 0x1F08, 0x1F8C,
-+IBUS_Greek_iota, IBUS_acute, 0x1F09, 0x1F8D,
-+IBUS_Greek_iota, IBUS_acute, 0x1F20, 0x1F94,
-+IBUS_Greek_iota, IBUS_acute, 0x1F21, 0x1F95,
-+IBUS_Greek_iota, IBUS_acute, 0x1F28, 0x1F9C,
-+IBUS_Greek_iota, IBUS_acute, 0x1F29, 0x1F9D,
-+IBUS_Greek_iota, IBUS_acute, 0x1F60, 0x1FA4,
-+IBUS_Greek_iota, IBUS_acute, 0x1F61, 0x1FA5,
-+IBUS_Greek_iota, IBUS_acute, 0x1F68, 0x1FAC,
-+IBUS_Greek_iota, IBUS_acute, 0x1F69, 0x1FAD,
-+IBUS_Greek_iota, IBUS_dead_grave, IBUS_Greek_alpha, 0x1FB2,
-+IBUS_Greek_iota, IBUS_dead_grave, IBUS_Greek_eta, 0x1FC2,
-+IBUS_Greek_iota, IBUS_dead_grave, IBUS_Greek_omega, 0x1FF2,
-+IBUS_Greek_iota, IBUS_dead_grave, 0x1F00, 0x1F82,
-+IBUS_Greek_iota, IBUS_dead_grave, 0x1F01, 0x1F83,
-+IBUS_Greek_iota, IBUS_dead_grave, 0x1F08, 0x1F8A,
-+IBUS_Greek_iota, IBUS_dead_grave, 0x1F09, 0x1F8B,
-+IBUS_Greek_iota, IBUS_dead_grave, 0x1F20, 0x1F92,
-+IBUS_Greek_iota, IBUS_dead_grave, 0x1F21, 0x1F93,
-+IBUS_Greek_iota, IBUS_dead_grave, 0x1F28, 0x1F9A,
-+IBUS_Greek_iota, IBUS_dead_grave, 0x1F29, 0x1F9B,
-+IBUS_Greek_iota, IBUS_dead_grave, 0x1F60, 0x1FA2,
-+IBUS_Greek_iota, IBUS_dead_grave, 0x1F61, 0x1FA3,
-+IBUS_Greek_iota, IBUS_dead_grave, 0x1F68, 0x1FAA,
-+IBUS_Greek_iota, IBUS_dead_grave, 0x1F69, 0x1FAB,
-+IBUS_Greek_iota, IBUS_dead_acute, IBUS_Greek_alpha, 0x1FB4,
-+IBUS_Greek_iota, IBUS_dead_acute, IBUS_Greek_eta, 0x1FC4,
-+IBUS_Greek_iota, IBUS_dead_acute, IBUS_Greek_omega, 0x1FF4,
-+IBUS_Greek_iota, IBUS_dead_acute, 0x1F00, 0x1F84,
-+IBUS_Greek_iota, IBUS_dead_acute, 0x1F01, 0x1F85,
-+IBUS_Greek_iota, IBUS_dead_acute, 0x1F08, 0x1F8C,
-+IBUS_Greek_iota, IBUS_dead_acute, 0x1F09, 0x1F8D,
-+IBUS_Greek_iota, IBUS_dead_acute, 0x1F20, 0x1F94,
-+IBUS_Greek_iota, IBUS_dead_acute, 0x1F21, 0x1F95,
-+IBUS_Greek_iota, IBUS_dead_acute, 0x1F28, 0x1F9C,
-+IBUS_Greek_iota, IBUS_dead_acute, 0x1F29, 0x1F9D,
-+IBUS_Greek_iota, IBUS_dead_acute, 0x1F60, 0x1FA4,
-+IBUS_Greek_iota, IBUS_dead_acute, 0x1F61, 0x1FA5,
-+IBUS_Greek_iota, IBUS_dead_acute, 0x1F68, 0x1FAC,
-+IBUS_Greek_iota, IBUS_dead_acute, 0x1F69, 0x1FAD,
-+IBUS_Greek_iota, IBUS_dead_tilde, IBUS_Greek_alpha, 0x1FB7,
-+IBUS_Greek_iota, IBUS_dead_tilde, IBUS_Greek_eta, 0x1FC7,
-+IBUS_Greek_iota, IBUS_dead_tilde, IBUS_Greek_omega, 0x1FF7,
-+IBUS_Greek_iota, IBUS_dead_tilde, 0x1F00, 0x1F86,
-+IBUS_Greek_iota, IBUS_dead_tilde, 0x1F01, 0x1F87,
-+IBUS_Greek_iota, IBUS_dead_tilde, 0x1F08, 0x1F8E,
-+IBUS_Greek_iota, IBUS_dead_tilde, 0x1F09, 0x1F8F,
-+IBUS_Greek_iota, IBUS_dead_tilde, 0x1F20, 0x1F96,
-+IBUS_Greek_iota, IBUS_dead_tilde, 0x1F21, 0x1F97,
-+IBUS_Greek_iota, IBUS_dead_tilde, 0x1F28, 0x1F9E,
-+IBUS_Greek_iota, IBUS_dead_tilde, 0x1F29, 0x1F9F,
-+IBUS_Greek_iota, IBUS_dead_tilde, 0x1F60, 0x1FA6,
-+IBUS_Greek_iota, IBUS_dead_tilde, 0x1F61, 0x1FA7,
-+IBUS_Greek_iota, IBUS_dead_tilde, 0x1F68, 0x1FAE,
-+IBUS_Greek_iota, IBUS_dead_tilde, 0x1F69, 0x1FAF,
-+IBUS_Greek_iota, IBUS_dead_psili, IBUS_Greek_ALPHA, 0x1F88,
-+IBUS_Greek_iota, IBUS_dead_psili, IBUS_Greek_ETA, 0x1F98,
-+IBUS_Greek_iota, IBUS_dead_psili, IBUS_Greek_OMEGA, 0x1FA8,
-+IBUS_Greek_iota, IBUS_dead_psili, IBUS_Greek_alpha, 0x1F80,
-+IBUS_Greek_iota, IBUS_dead_psili, IBUS_Greek_eta, 0x1F90,
-+IBUS_Greek_iota, IBUS_dead_psili, IBUS_Greek_omega, 0x1FA0,
-+IBUS_Greek_iota, IBUS_dead_dasia, IBUS_Greek_ALPHA, 0x1F89,
-+IBUS_Greek_iota, IBUS_dead_dasia, IBUS_Greek_ETA, 0x1F99,
-+IBUS_Greek_iota, IBUS_dead_dasia, IBUS_Greek_OMEGA, 0x1FA9,
-+IBUS_Greek_iota, IBUS_dead_dasia, IBUS_Greek_alpha, 0x1F81,
-+IBUS_Greek_iota, IBUS_dead_dasia, IBUS_Greek_eta, 0x1F91,
-+IBUS_Greek_iota, IBUS_dead_dasia, IBUS_Greek_omega, 0x1FA1,
-+IBUS_parenleft, IBUS_1, IBUS_0, IBUS_parenright, 0x2469,
-+IBUS_parenleft, IBUS_1, IBUS_1, IBUS_parenright, 0x246A,
-+IBUS_parenleft, IBUS_1, IBUS_2, IBUS_parenright, 0x246B,
-+IBUS_parenleft, IBUS_1, IBUS_3, IBUS_parenright, 0x246C,
-+IBUS_parenleft, IBUS_1, IBUS_4, IBUS_parenright, 0x246D,
-+IBUS_parenleft, IBUS_1, IBUS_5, IBUS_parenright, 0x246E,
-+IBUS_parenleft, IBUS_1, IBUS_6, IBUS_parenright, 0x246F,
-+IBUS_parenleft, IBUS_1, IBUS_7, IBUS_parenright, 0x2470,
-+IBUS_parenleft, IBUS_1, IBUS_8, IBUS_parenright, 0x2471,
-+IBUS_parenleft, IBUS_1, IBUS_9, IBUS_parenright, 0x2472,
-+IBUS_parenleft, IBUS_1, IBUS_KP_Space, IBUS_parenright, 0x246B,
-+IBUS_parenleft, IBUS_1, IBUS_KP_0, IBUS_parenright, 0x2469,
-+IBUS_parenleft, IBUS_1, IBUS_KP_1, IBUS_parenright, 0x246A,
-+IBUS_parenleft, IBUS_1, IBUS_KP_2, IBUS_parenright, 0x246B,
-+IBUS_parenleft, IBUS_1, IBUS_KP_3, IBUS_parenright, 0x246C,
-+IBUS_parenleft, IBUS_1, IBUS_KP_4, IBUS_parenright, 0x246D,
-+IBUS_parenleft, IBUS_1, IBUS_KP_5, IBUS_parenright, 0x246E,
-+IBUS_parenleft, IBUS_1, IBUS_KP_6, IBUS_parenright, 0x246F,
-+IBUS_parenleft, IBUS_1, IBUS_KP_7, IBUS_parenright, 0x2470,
-+IBUS_parenleft, IBUS_1, IBUS_KP_8, IBUS_parenright, 0x2471,
-+IBUS_parenleft, IBUS_1, IBUS_KP_9, IBUS_parenright, 0x2472,
-+IBUS_parenleft, IBUS_2, IBUS_0, IBUS_parenright, 0x2473,
-+IBUS_parenleft, IBUS_2, IBUS_1, IBUS_parenright, 0x3251,
-+IBUS_parenleft, IBUS_2, IBUS_2, IBUS_parenright, 0x3252,
-+IBUS_parenleft, IBUS_2, IBUS_3, IBUS_parenright, 0x3253,
-+IBUS_parenleft, IBUS_2, IBUS_4, IBUS_parenright, 0x3254,
-+IBUS_parenleft, IBUS_2, IBUS_5, IBUS_parenright, 0x3255,
-+IBUS_parenleft, IBUS_2, IBUS_6, IBUS_parenright, 0x3256,
-+IBUS_parenleft, IBUS_2, IBUS_7, IBUS_parenright, 0x3257,
-+IBUS_parenleft, IBUS_2, IBUS_8, IBUS_parenright, 0x3258,
-+IBUS_parenleft, IBUS_2, IBUS_9, IBUS_parenright, 0x3259,
-+IBUS_parenleft, IBUS_2, IBUS_KP_Space, IBUS_parenright, 0x3252,
-+IBUS_parenleft, IBUS_2, IBUS_KP_0, IBUS_parenright, 0x2473,
-+IBUS_parenleft, IBUS_2, IBUS_KP_1, IBUS_parenright, 0x3251,
-+IBUS_parenleft, IBUS_2, IBUS_KP_2, IBUS_parenright, 0x3252,
-+IBUS_parenleft, IBUS_2, IBUS_KP_3, IBUS_parenright, 0x3253,
-+IBUS_parenleft, IBUS_2, IBUS_KP_4, IBUS_parenright, 0x3254,
-+IBUS_parenleft, IBUS_2, IBUS_KP_5, IBUS_parenright, 0x3255,
-+IBUS_parenleft, IBUS_2, IBUS_KP_6, IBUS_parenright, 0x3256,
-+IBUS_parenleft, IBUS_2, IBUS_KP_7, IBUS_parenright, 0x3257,
-+IBUS_parenleft, IBUS_2, IBUS_KP_8, IBUS_parenright, 0x3258,
-+IBUS_parenleft, IBUS_2, IBUS_KP_9, IBUS_parenright, 0x3259,
-+IBUS_parenleft, IBUS_3, IBUS_0, IBUS_parenright, 0x325A,
-+IBUS_parenleft, IBUS_3, IBUS_1, IBUS_parenright, 0x325B,
-+IBUS_parenleft, IBUS_3, IBUS_2, IBUS_parenright, 0x325C,
-+IBUS_parenleft, IBUS_3, IBUS_3, IBUS_parenright, 0x325D,
-+IBUS_parenleft, IBUS_3, IBUS_4, IBUS_parenright, 0x325E,
-+IBUS_parenleft, IBUS_3, IBUS_5, IBUS_parenright, 0x325F,
-+IBUS_parenleft, IBUS_3, IBUS_6, IBUS_parenright, 0x32B1,
-+IBUS_parenleft, IBUS_3, IBUS_7, IBUS_parenright, 0x32B2,
-+IBUS_parenleft, IBUS_3, IBUS_8, IBUS_parenright, 0x32B3,
-+IBUS_parenleft, IBUS_3, IBUS_9, IBUS_parenright, 0x32B4,
-+IBUS_parenleft, IBUS_3, IBUS_KP_Space, IBUS_parenright, 0x325C,
-+IBUS_parenleft, IBUS_3, IBUS_KP_0, IBUS_parenright, 0x325A,
-+IBUS_parenleft, IBUS_3, IBUS_KP_1, IBUS_parenright, 0x325B,
-+IBUS_parenleft, IBUS_3, IBUS_KP_2, IBUS_parenright, 0x325C,
-+IBUS_parenleft, IBUS_3, IBUS_KP_3, IBUS_parenright, 0x325D,
-+IBUS_parenleft, IBUS_3, IBUS_KP_4, IBUS_parenright, 0x325E,
-+IBUS_parenleft, IBUS_3, IBUS_KP_5, IBUS_parenright, 0x325F,
-+IBUS_parenleft, IBUS_3, IBUS_KP_6, IBUS_parenright, 0x32B1,
-+IBUS_parenleft, IBUS_3, IBUS_KP_7, IBUS_parenright, 0x32B2,
-+IBUS_parenleft, IBUS_3, IBUS_KP_8, IBUS_parenright, 0x32B3,
-+IBUS_parenleft, IBUS_3, IBUS_KP_9, IBUS_parenright, 0x32B4,
-+IBUS_parenleft, IBUS_4, IBUS_0, IBUS_parenright, 0x32B5,
-+IBUS_parenleft, IBUS_4, IBUS_1, IBUS_parenright, 0x32B6,
-+IBUS_parenleft, IBUS_4, IBUS_2, IBUS_parenright, 0x32B7,
-+IBUS_parenleft, IBUS_4, IBUS_3, IBUS_parenright, 0x32B8,
-+IBUS_parenleft, IBUS_4, IBUS_4, IBUS_parenright, 0x32B9,
-+IBUS_parenleft, IBUS_4, IBUS_5, IBUS_parenright, 0x32BA,
-+IBUS_parenleft, IBUS_4, IBUS_6, IBUS_parenright, 0x32BB,
-+IBUS_parenleft, IBUS_4, IBUS_7, IBUS_parenright, 0x32BC,
-+IBUS_parenleft, IBUS_4, IBUS_8, IBUS_parenright, 0x32BD,
-+IBUS_parenleft, IBUS_4, IBUS_9, IBUS_parenright, 0x32BE,
-+IBUS_parenleft, IBUS_4, IBUS_KP_Space, IBUS_parenright, 0x32B7,
-+IBUS_parenleft, IBUS_4, IBUS_KP_0, IBUS_parenright, 0x32B5,
-+IBUS_parenleft, IBUS_4, IBUS_KP_1, IBUS_parenright, 0x32B6,
-+IBUS_parenleft, IBUS_4, IBUS_KP_2, IBUS_parenright, 0x32B7,
-+IBUS_parenleft, IBUS_4, IBUS_KP_3, IBUS_parenright, 0x32B8,
-+IBUS_parenleft, IBUS_4, IBUS_KP_4, IBUS_parenright, 0x32B9,
-+IBUS_parenleft, IBUS_4, IBUS_KP_5, IBUS_parenright, 0x32BA,
-+IBUS_parenleft, IBUS_4, IBUS_KP_6, IBUS_parenright, 0x32BB,
-+IBUS_parenleft, IBUS_4, IBUS_KP_7, IBUS_parenright, 0x32BC,
-+IBUS_parenleft, IBUS_4, IBUS_KP_8, IBUS_parenright, 0x32BD,
-+IBUS_parenleft, IBUS_4, IBUS_KP_9, IBUS_parenright, 0x32BE,
-+IBUS_parenleft, IBUS_5, IBUS_KP_0, IBUS_parenright, 0x32BF,
-+IBUS_parenleft, 0x1100, 0x1161, IBUS_parenright, 0x326E,
-+IBUS_parenleft, 0x1102, 0x1161, IBUS_parenright, 0x326F,
-+IBUS_parenleft, 0x1103, 0x1161, IBUS_parenright, 0x3270,
-+IBUS_parenleft, 0x1105, 0x1161, IBUS_parenright, 0x3271,
-+IBUS_parenleft, 0x1106, 0x1161, IBUS_parenright, 0x3272,
-+IBUS_parenleft, 0x1107, 0x1161, IBUS_parenright, 0x3273,
-+IBUS_parenleft, 0x1109, 0x1161, IBUS_parenright, 0x3274,
-+IBUS_parenleft, 0x110B, 0x1161, IBUS_parenright, 0x3275,
-+IBUS_parenleft, 0x110C, 0x1161, IBUS_parenright, 0x3276,
-+IBUS_parenleft, 0x110E, 0x1161, IBUS_parenright, 0x3277,
-+IBUS_parenleft, 0x110F, 0x1161, IBUS_parenright, 0x3278,
-+IBUS_parenleft, 0x1110, 0x1161, IBUS_parenright, 0x3279,
-+IBUS_parenleft, 0x1111, 0x1161, IBUS_parenright, 0x327A,
-+IBUS_parenleft, 0x1112, 0x1161, IBUS_parenright, 0x327B,
-+IBUS_parenleft, IBUS_KP_Space, IBUS_0, IBUS_parenright, 0x2473,
-+IBUS_parenleft, IBUS_KP_Space, IBUS_1, IBUS_parenright, 0x3251,
-+IBUS_parenleft, IBUS_KP_Space, IBUS_2, IBUS_parenright, 0x3252,
-+IBUS_parenleft, IBUS_KP_Space, IBUS_3, IBUS_parenright, 0x3253,
-+IBUS_parenleft, IBUS_KP_Space, IBUS_4, IBUS_parenright, 0x3254,
-+IBUS_parenleft, IBUS_KP_Space, IBUS_5, IBUS_parenright, 0x3255,
-+IBUS_parenleft, IBUS_KP_Space, IBUS_6, IBUS_parenright, 0x3256,
-+IBUS_parenleft, IBUS_KP_Space, IBUS_7, IBUS_parenright, 0x3257,
-+IBUS_parenleft, IBUS_KP_Space, IBUS_8, IBUS_parenright, 0x3258,
-+IBUS_parenleft, IBUS_KP_Space, IBUS_9, IBUS_parenright, 0x3259,
-+IBUS_parenleft, IBUS_KP_Space, IBUS_KP_Space, IBUS_parenright, 0x3252,
-+IBUS_parenleft, IBUS_KP_Space, IBUS_KP_0, IBUS_parenright, 0x2473,
-+IBUS_parenleft, IBUS_KP_Space, IBUS_KP_1, IBUS_parenright, 0x3251,
-+IBUS_parenleft, IBUS_KP_Space, IBUS_KP_2, IBUS_parenright, 0x3252,
-+IBUS_parenleft, IBUS_KP_Space, IBUS_KP_3, IBUS_parenright, 0x3253,
-+IBUS_parenleft, IBUS_KP_Space, IBUS_KP_4, IBUS_parenright, 0x3254,
-+IBUS_parenleft, IBUS_KP_Space, IBUS_KP_5, IBUS_parenright, 0x3255,
-+IBUS_parenleft, IBUS_KP_Space, IBUS_KP_6, IBUS_parenright, 0x3256,
-+IBUS_parenleft, IBUS_KP_Space, IBUS_KP_7, IBUS_parenright, 0x3257,
-+IBUS_parenleft, IBUS_KP_Space, IBUS_KP_8, IBUS_parenright, 0x3258,
-+IBUS_parenleft, IBUS_KP_Space, IBUS_KP_9, IBUS_parenright, 0x3259,
-+IBUS_parenleft, IBUS_KP_1, IBUS_0, IBUS_parenright, 0x2469,
-+IBUS_parenleft, IBUS_KP_1, IBUS_1, IBUS_parenright, 0x246A,
-+IBUS_parenleft, IBUS_KP_1, IBUS_2, IBUS_parenright, 0x246B,
-+IBUS_parenleft, IBUS_KP_1, IBUS_3, IBUS_parenright, 0x246C,
-+IBUS_parenleft, IBUS_KP_1, IBUS_4, IBUS_parenright, 0x246D,
-+IBUS_parenleft, IBUS_KP_1, IBUS_5, IBUS_parenright, 0x246E,
-+IBUS_parenleft, IBUS_KP_1, IBUS_6, IBUS_parenright, 0x246F,
-+IBUS_parenleft, IBUS_KP_1, IBUS_7, IBUS_parenright, 0x2470,
-+IBUS_parenleft, IBUS_KP_1, IBUS_8, IBUS_parenright, 0x2471,
-+IBUS_parenleft, IBUS_KP_1, IBUS_9, IBUS_parenright, 0x2472,
-+IBUS_parenleft, IBUS_KP_1, IBUS_KP_Space, IBUS_parenright, 0x246B,
-+IBUS_parenleft, IBUS_KP_1, IBUS_KP_0, IBUS_parenright, 0x2469,
-+IBUS_parenleft, IBUS_KP_1, IBUS_KP_1, IBUS_parenright, 0x246A,
-+IBUS_parenleft, IBUS_KP_1, IBUS_KP_2, IBUS_parenright, 0x246B,
-+IBUS_parenleft, IBUS_KP_1, IBUS_KP_3, IBUS_parenright, 0x246C,
-+IBUS_parenleft, IBUS_KP_1, IBUS_KP_4, IBUS_parenright, 0x246D,
-+IBUS_parenleft, IBUS_KP_1, IBUS_KP_5, IBUS_parenright, 0x246E,
-+IBUS_parenleft, IBUS_KP_1, IBUS_KP_6, IBUS_parenright, 0x246F,
-+IBUS_parenleft, IBUS_KP_1, IBUS_KP_7, IBUS_parenright, 0x2470,
-+IBUS_parenleft, IBUS_KP_1, IBUS_KP_8, IBUS_parenright, 0x2471,
-+IBUS_parenleft, IBUS_KP_1, IBUS_KP_9, IBUS_parenright, 0x2472,
-+IBUS_parenleft, IBUS_KP_2, IBUS_0, IBUS_parenright, 0x2473,
-+IBUS_parenleft, IBUS_KP_2, IBUS_1, IBUS_parenright, 0x3251,
-+IBUS_parenleft, IBUS_KP_2, IBUS_2, IBUS_parenright, 0x3252,
-+IBUS_parenleft, IBUS_KP_2, IBUS_3, IBUS_parenright, 0x3253,
-+IBUS_parenleft, IBUS_KP_2, IBUS_4, IBUS_parenright, 0x3254,
-+IBUS_parenleft, IBUS_KP_2, IBUS_5, IBUS_parenright, 0x3255,
-+IBUS_parenleft, IBUS_KP_2, IBUS_6, IBUS_parenright, 0x3256,
-+IBUS_parenleft, IBUS_KP_2, IBUS_7, IBUS_parenright, 0x3257,
-+IBUS_parenleft, IBUS_KP_2, IBUS_8, IBUS_parenright, 0x3258,
-+IBUS_parenleft, IBUS_KP_2, IBUS_9, IBUS_parenright, 0x3259,
-+IBUS_parenleft, IBUS_KP_2, IBUS_KP_Space, IBUS_parenright, 0x3252,
-+IBUS_parenleft, IBUS_KP_2, IBUS_KP_0, IBUS_parenright, 0x2473,
-+IBUS_parenleft, IBUS_KP_2, IBUS_KP_1, IBUS_parenright, 0x3251,
-+IBUS_parenleft, IBUS_KP_2, IBUS_KP_2, IBUS_parenright, 0x3252,
-+IBUS_parenleft, IBUS_KP_2, IBUS_KP_3, IBUS_parenright, 0x3253,
-+IBUS_parenleft, IBUS_KP_2, IBUS_KP_4, IBUS_parenright, 0x3254,
-+IBUS_parenleft, IBUS_KP_2, IBUS_KP_5, IBUS_parenright, 0x3255,
-+IBUS_parenleft, IBUS_KP_2, IBUS_KP_6, IBUS_parenright, 0x3256,
-+IBUS_parenleft, IBUS_KP_2, IBUS_KP_7, IBUS_parenright, 0x3257,
-+IBUS_parenleft, IBUS_KP_2, IBUS_KP_8, IBUS_parenright, 0x3258,
-+IBUS_parenleft, IBUS_KP_2, IBUS_KP_9, IBUS_parenright, 0x3259,
-+IBUS_parenleft, IBUS_KP_3, IBUS_0, IBUS_parenright, 0x325A,
-+IBUS_parenleft, IBUS_KP_3, IBUS_1, IBUS_parenright, 0x325B,
-+IBUS_parenleft, IBUS_KP_3, IBUS_2, IBUS_parenright, 0x325C,
-+IBUS_parenleft, IBUS_KP_3, IBUS_3, IBUS_parenright, 0x325D,
-+IBUS_parenleft, IBUS_KP_3, IBUS_4, IBUS_parenright, 0x325E,
-+IBUS_parenleft, IBUS_KP_3, IBUS_5, IBUS_parenright, 0x325F,
-+IBUS_parenleft, IBUS_KP_3, IBUS_6, IBUS_parenright, 0x32B1,
-+IBUS_parenleft, IBUS_KP_3, IBUS_7, IBUS_parenright, 0x32B2,
-+IBUS_parenleft, IBUS_KP_3, IBUS_8, IBUS_parenright, 0x32B3,
-+IBUS_parenleft, IBUS_KP_3, IBUS_9, IBUS_parenright, 0x32B4,
-+IBUS_parenleft, IBUS_KP_3, IBUS_KP_Space, IBUS_parenright, 0x325C,
-+IBUS_parenleft, IBUS_KP_3, IBUS_KP_0, IBUS_parenright, 0x325A,
-+IBUS_parenleft, IBUS_KP_3, IBUS_KP_1, IBUS_parenright, 0x325B,
-+IBUS_parenleft, IBUS_KP_3, IBUS_KP_2, IBUS_parenright, 0x325C,
-+IBUS_parenleft, IBUS_KP_3, IBUS_KP_3, IBUS_parenright, 0x325D,
-+IBUS_parenleft, IBUS_KP_3, IBUS_KP_4, IBUS_parenright, 0x325E,
-+IBUS_parenleft, IBUS_KP_3, IBUS_KP_5, IBUS_parenright, 0x325F,
-+IBUS_parenleft, IBUS_KP_3, IBUS_KP_6, IBUS_parenright, 0x32B1,
-+IBUS_parenleft, IBUS_KP_3, IBUS_KP_7, IBUS_parenright, 0x32B2,
-+IBUS_parenleft, IBUS_KP_3, IBUS_KP_8, IBUS_parenright, 0x32B3,
-+IBUS_parenleft, IBUS_KP_3, IBUS_KP_9, IBUS_parenright, 0x32B4,
-+IBUS_parenleft, IBUS_KP_4, IBUS_0, IBUS_parenright, 0x32B5,
-+IBUS_parenleft, IBUS_KP_4, IBUS_1, IBUS_parenright, 0x32B6,
-+IBUS_parenleft, IBUS_KP_4, IBUS_2, IBUS_parenright, 0x32B7,
-+IBUS_parenleft, IBUS_KP_4, IBUS_3, IBUS_parenright, 0x32B8,
-+IBUS_parenleft, IBUS_KP_4, IBUS_4, IBUS_parenright, 0x32B9,
-+IBUS_parenleft, IBUS_KP_4, IBUS_5, IBUS_parenright, 0x32BA,
-+IBUS_parenleft, IBUS_KP_4, IBUS_6, IBUS_parenright, 0x32BB,
-+IBUS_parenleft, IBUS_KP_4, IBUS_7, IBUS_parenright, 0x32BC,
-+IBUS_parenleft, IBUS_KP_4, IBUS_8, IBUS_parenright, 0x32BD,
-+IBUS_parenleft, IBUS_KP_4, IBUS_9, IBUS_parenright, 0x32BE,
-+IBUS_parenleft, IBUS_KP_4, IBUS_KP_Space, IBUS_parenright, 0x32B7,
-+IBUS_parenleft, IBUS_KP_4, IBUS_KP_0, IBUS_parenright, 0x32B5,
-+IBUS_parenleft, IBUS_KP_4, IBUS_KP_1, IBUS_parenright, 0x32B6,
-+IBUS_parenleft, IBUS_KP_4, IBUS_KP_2, IBUS_parenright, 0x32B7,
-+IBUS_parenleft, IBUS_KP_4, IBUS_KP_3, IBUS_parenright, 0x32B8,
-+IBUS_parenleft, IBUS_KP_4, IBUS_KP_4, IBUS_parenright, 0x32B9,
-+IBUS_parenleft, IBUS_KP_4, IBUS_KP_5, IBUS_parenright, 0x32BA,
-+IBUS_parenleft, IBUS_KP_4, IBUS_KP_6, IBUS_parenright, 0x32BB,
-+IBUS_parenleft, IBUS_KP_4, IBUS_KP_7, IBUS_parenright, 0x32BC,
-+IBUS_parenleft, IBUS_KP_4, IBUS_KP_8, IBUS_parenright, 0x32BD,
-+IBUS_parenleft, IBUS_KP_4, IBUS_KP_9, IBUS_parenright, 0x32BE,
-+IBUS_parenleft, IBUS_KP_5, IBUS_KP_0, IBUS_parenright, 0x32BF,
-+IBUS_C, IBUS_C, IBUS_C, IBUS_P, 0x262D,
-+IBUS_Greek_iota, IBUS_apostrophe, IBUS_parenleft, IBUS_Greek_ALPHA, 0x1F8D,
-+IBUS_Greek_iota, IBUS_apostrophe, IBUS_parenleft, IBUS_Greek_ETA, 0x1F9D,
-+IBUS_Greek_iota, IBUS_apostrophe, IBUS_parenleft, IBUS_Greek_OMEGA, 0x1FAD,
-+IBUS_Greek_iota, IBUS_apostrophe, IBUS_parenleft, IBUS_Greek_alpha, 0x1F85,
-+IBUS_Greek_iota, IBUS_apostrophe, IBUS_parenleft, IBUS_Greek_eta, 0x1F95,
-+IBUS_Greek_iota, IBUS_apostrophe, IBUS_parenleft, IBUS_Greek_omega, 0x1FA5,
-+IBUS_Greek_iota, IBUS_apostrophe, IBUS_parenright, IBUS_Greek_ALPHA, 0x1F8C,
-+IBUS_Greek_iota, IBUS_apostrophe, IBUS_parenright, IBUS_Greek_ETA, 0x1F9C,
-+IBUS_Greek_iota, IBUS_apostrophe, IBUS_parenright, IBUS_Greek_OMEGA, 0x1FAC,
-+IBUS_Greek_iota, IBUS_apostrophe, IBUS_parenright, IBUS_Greek_alpha, 0x1F84,
-+IBUS_Greek_iota, IBUS_apostrophe, IBUS_parenright, IBUS_Greek_eta, 0x1F94,
-+IBUS_Greek_iota, IBUS_apostrophe, IBUS_parenright, IBUS_Greek_omega, 0x1FA4,
-+IBUS_Greek_iota, IBUS_apostrophe, IBUS_dead_psili, IBUS_Greek_ALPHA, 0x1F8C,
-+IBUS_Greek_iota, IBUS_apostrophe, IBUS_dead_psili, IBUS_Greek_ETA, 0x1F9C,
-+IBUS_Greek_iota, IBUS_apostrophe, IBUS_dead_psili, IBUS_Greek_OMEGA, 0x1FAC,
-+IBUS_Greek_iota, IBUS_apostrophe, IBUS_dead_psili, IBUS_Greek_alpha, 0x1F84,
-+IBUS_Greek_iota, IBUS_apostrophe, IBUS_dead_psili, IBUS_Greek_eta, 0x1F94,
-+IBUS_Greek_iota, IBUS_apostrophe, IBUS_dead_psili, IBUS_Greek_omega, 0x1FA4,
-+IBUS_Greek_iota, IBUS_apostrophe, IBUS_dead_dasia, IBUS_Greek_ALPHA, 0x1F8D,
-+IBUS_Greek_iota, IBUS_apostrophe, IBUS_dead_dasia, IBUS_Greek_ETA, 0x1F9D,
-+IBUS_Greek_iota, IBUS_apostrophe, IBUS_dead_dasia, IBUS_Greek_OMEGA, 0x1FAD,
-+IBUS_Greek_iota, IBUS_apostrophe, IBUS_dead_dasia, IBUS_Greek_alpha, 0x1F85,
-+IBUS_Greek_iota, IBUS_apostrophe, IBUS_dead_dasia, IBUS_Greek_eta, 0x1F95,
-+IBUS_Greek_iota, IBUS_apostrophe, IBUS_dead_dasia, IBUS_Greek_omega, 0x1FA5,
-+IBUS_Greek_iota, IBUS_grave, IBUS_parenleft, IBUS_Greek_ALPHA, 0x1F8B,
-+IBUS_Greek_iota, IBUS_grave, IBUS_parenleft, IBUS_Greek_ETA, 0x1F9B,
-+IBUS_Greek_iota, IBUS_grave, IBUS_parenleft, IBUS_Greek_OMEGA, 0x1FAB,
-+IBUS_Greek_iota, IBUS_grave, IBUS_parenleft, IBUS_Greek_alpha, 0x1F83,
-+IBUS_Greek_iota, IBUS_grave, IBUS_parenleft, IBUS_Greek_eta, 0x1F93,
-+IBUS_Greek_iota, IBUS_grave, IBUS_parenleft, IBUS_Greek_omega, 0x1FA3,
-+IBUS_Greek_iota, IBUS_grave, IBUS_parenright, IBUS_Greek_ALPHA, 0x1F8A,
-+IBUS_Greek_iota, IBUS_grave, IBUS_parenright, IBUS_Greek_ETA, 0x1F9A,
-+IBUS_Greek_iota, IBUS_grave, IBUS_parenright, IBUS_Greek_OMEGA, 0x1FAA,
-+IBUS_Greek_iota, IBUS_grave, IBUS_parenright, IBUS_Greek_alpha, 0x1F82,
-+IBUS_Greek_iota, IBUS_grave, IBUS_parenright, IBUS_Greek_eta, 0x1F92,
-+IBUS_Greek_iota, IBUS_grave, IBUS_parenright, IBUS_Greek_omega, 0x1FA2,
-+IBUS_Greek_iota, IBUS_grave, IBUS_dead_psili, IBUS_Greek_ALPHA, 0x1F8A,
-+IBUS_Greek_iota, IBUS_grave, IBUS_dead_psili, IBUS_Greek_ETA, 0x1F9A,
-+IBUS_Greek_iota, IBUS_grave, IBUS_dead_psili, IBUS_Greek_OMEGA, 0x1FAA,
-+IBUS_Greek_iota, IBUS_grave, IBUS_dead_psili, IBUS_Greek_alpha, 0x1F82,
-+IBUS_Greek_iota, IBUS_grave, IBUS_dead_psili, IBUS_Greek_eta, 0x1F92,
-+IBUS_Greek_iota, IBUS_grave, IBUS_dead_psili, IBUS_Greek_omega, 0x1FA2,
-+IBUS_Greek_iota, IBUS_grave, IBUS_dead_dasia, IBUS_Greek_ALPHA, 0x1F8B,
-+IBUS_Greek_iota, IBUS_grave, IBUS_dead_dasia, IBUS_Greek_ETA, 0x1F9B,
-+IBUS_Greek_iota, IBUS_grave, IBUS_dead_dasia, IBUS_Greek_OMEGA, 0x1FAB,
-+IBUS_Greek_iota, IBUS_grave, IBUS_dead_dasia, IBUS_Greek_alpha, 0x1F83,
-+IBUS_Greek_iota, IBUS_grave, IBUS_dead_dasia, IBUS_Greek_eta, 0x1F93,
-+IBUS_Greek_iota, IBUS_grave, IBUS_dead_dasia, IBUS_Greek_omega, 0x1FA3,
-+IBUS_Greek_iota, IBUS_asciitilde, IBUS_parenleft, IBUS_Greek_ALPHA, 0x1F8F,
-+IBUS_Greek_iota, IBUS_asciitilde, IBUS_parenleft, IBUS_Greek_ETA, 0x1F9F,
-+IBUS_Greek_iota, IBUS_asciitilde, IBUS_parenleft, IBUS_Greek_OMEGA, 0x1FAF,
-+IBUS_Greek_iota, IBUS_asciitilde, IBUS_parenleft, IBUS_Greek_alpha, 0x1F87,
-+IBUS_Greek_iota, IBUS_asciitilde, IBUS_parenleft, IBUS_Greek_eta, 0x1F97,
-+IBUS_Greek_iota, IBUS_asciitilde, IBUS_parenleft, IBUS_Greek_omega, 0x1FA7,
-+IBUS_Greek_iota, IBUS_asciitilde, IBUS_parenright, IBUS_Greek_ALPHA, 0x1F8E,
-+IBUS_Greek_iota, IBUS_asciitilde, IBUS_parenright, IBUS_Greek_ETA, 0x1F9E,
-+IBUS_Greek_iota, IBUS_asciitilde, IBUS_parenright, IBUS_Greek_OMEGA, 0x1FAE,
-+IBUS_Greek_iota, IBUS_asciitilde, IBUS_parenright, IBUS_Greek_alpha, 0x1F86,
-+IBUS_Greek_iota, IBUS_asciitilde, IBUS_parenright, IBUS_Greek_eta, 0x1F96,
-+IBUS_Greek_iota, IBUS_asciitilde, IBUS_parenright, IBUS_Greek_omega, 0x1FA6,
-+IBUS_Greek_iota, IBUS_asciitilde, IBUS_dead_psili, IBUS_Greek_ALPHA, 0x1F8E,
-+IBUS_Greek_iota, IBUS_asciitilde, IBUS_dead_psili, IBUS_Greek_ETA, 0x1F9E,
-+IBUS_Greek_iota, IBUS_asciitilde, IBUS_dead_psili, IBUS_Greek_OMEGA, 0x1FAE,
-+IBUS_Greek_iota, IBUS_asciitilde, IBUS_dead_psili, IBUS_Greek_alpha, 0x1F86,
-+IBUS_Greek_iota, IBUS_asciitilde, IBUS_dead_psili, IBUS_Greek_eta, 0x1F96,
-+IBUS_Greek_iota, IBUS_asciitilde, IBUS_dead_psili, IBUS_Greek_omega, 0x1FA6,
-+IBUS_Greek_iota, IBUS_asciitilde, IBUS_dead_dasia, IBUS_Greek_ALPHA, 0x1F8F,
-+IBUS_Greek_iota, IBUS_asciitilde, IBUS_dead_dasia, IBUS_Greek_ETA, 0x1F9F,
-+IBUS_Greek_iota, IBUS_asciitilde, IBUS_dead_dasia, IBUS_Greek_OMEGA, 0x1FAF,
-+IBUS_Greek_iota, IBUS_asciitilde, IBUS_dead_dasia, IBUS_Greek_alpha, 0x1F87,
-+IBUS_Greek_iota, IBUS_asciitilde, IBUS_dead_dasia, IBUS_Greek_eta, 0x1F97,
-+IBUS_Greek_iota, IBUS_asciitilde, IBUS_dead_dasia, IBUS_Greek_omega, 0x1FA7,
-+IBUS_Greek_iota, IBUS_acute, IBUS_parenleft, IBUS_Greek_ALPHA, 0x1F8D,
-+IBUS_Greek_iota, IBUS_acute, IBUS_parenleft, IBUS_Greek_ETA, 0x1F9D,
-+IBUS_Greek_iota, IBUS_acute, IBUS_parenleft, IBUS_Greek_OMEGA, 0x1FAD,
-+IBUS_Greek_iota, IBUS_acute, IBUS_parenleft, IBUS_Greek_alpha, 0x1F85,
-+IBUS_Greek_iota, IBUS_acute, IBUS_parenleft, IBUS_Greek_eta, 0x1F95,
-+IBUS_Greek_iota, IBUS_acute, IBUS_parenleft, IBUS_Greek_omega, 0x1FA5,
-+IBUS_Greek_iota, IBUS_acute, IBUS_parenright, IBUS_Greek_ALPHA, 0x1F8C,
-+IBUS_Greek_iota, IBUS_acute, IBUS_parenright, IBUS_Greek_ETA, 0x1F9C,
-+IBUS_Greek_iota, IBUS_acute, IBUS_parenright, IBUS_Greek_OMEGA, 0x1FAC,
-+IBUS_Greek_iota, IBUS_acute, IBUS_parenright, IBUS_Greek_alpha, 0x1F84,
-+IBUS_Greek_iota, IBUS_acute, IBUS_parenright, IBUS_Greek_eta, 0x1F94,
-+IBUS_Greek_iota, IBUS_acute, IBUS_parenright, IBUS_Greek_omega, 0x1FA4,
-+IBUS_Greek_iota, IBUS_acute, IBUS_dead_psili, IBUS_Greek_ALPHA, 0x1F8C,
-+IBUS_Greek_iota, IBUS_acute, IBUS_dead_psili, IBUS_Greek_ETA, 0x1F9C,
-+IBUS_Greek_iota, IBUS_acute, IBUS_dead_psili, IBUS_Greek_OMEGA, 0x1FAC,
-+IBUS_Greek_iota, IBUS_acute, IBUS_dead_psili, IBUS_Greek_alpha, 0x1F84,
-+IBUS_Greek_iota, IBUS_acute, IBUS_dead_psili, IBUS_Greek_eta, 0x1F94,
-+IBUS_Greek_iota, IBUS_acute, IBUS_dead_psili, IBUS_Greek_omega, 0x1FA4,
-+IBUS_Greek_iota, IBUS_acute, IBUS_dead_dasia, IBUS_Greek_ALPHA, 0x1F8D,
-+IBUS_Greek_iota, IBUS_acute, IBUS_dead_dasia, IBUS_Greek_ETA, 0x1F9D,
-+IBUS_Greek_iota, IBUS_acute, IBUS_dead_dasia, IBUS_Greek_OMEGA, 0x1FAD,
-+IBUS_Greek_iota, IBUS_acute, IBUS_dead_dasia, IBUS_Greek_alpha, 0x1F85,
-+IBUS_Greek_iota, IBUS_acute, IBUS_dead_dasia, IBUS_Greek_eta, 0x1F95,
-+IBUS_Greek_iota, IBUS_acute, IBUS_dead_dasia, IBUS_Greek_omega, 0x1FA5,
-+IBUS_Greek_iota, IBUS_dead_grave, IBUS_parenleft, IBUS_Greek_ALPHA, 0x1F8B,
-+IBUS_Greek_iota, IBUS_dead_grave, IBUS_parenleft, IBUS_Greek_ETA, 0x1F9B,
-+IBUS_Greek_iota, IBUS_dead_grave, IBUS_parenleft, IBUS_Greek_OMEGA, 0x1FAB,
-+IBUS_Greek_iota, IBUS_dead_grave, IBUS_parenleft, IBUS_Greek_alpha, 0x1F83,
-+IBUS_Greek_iota, IBUS_dead_grave, IBUS_parenleft, IBUS_Greek_eta, 0x1F93,
-+IBUS_Greek_iota, IBUS_dead_grave, IBUS_parenleft, IBUS_Greek_omega, 0x1FA3,
-+IBUS_Greek_iota, IBUS_dead_grave, IBUS_parenright, IBUS_Greek_ALPHA, 0x1F8A,
-+IBUS_Greek_iota, IBUS_dead_grave, IBUS_parenright, IBUS_Greek_ETA, 0x1F9A,
-+IBUS_Greek_iota, IBUS_dead_grave, IBUS_parenright, IBUS_Greek_OMEGA, 0x1FAA,
-+IBUS_Greek_iota, IBUS_dead_grave, IBUS_parenright, IBUS_Greek_alpha, 0x1F82,
-+IBUS_Greek_iota, IBUS_dead_grave, IBUS_parenright, IBUS_Greek_eta, 0x1F92,
-+IBUS_Greek_iota, IBUS_dead_grave, IBUS_parenright, IBUS_Greek_omega, 0x1FA2,
-+IBUS_Greek_iota, IBUS_dead_grave, IBUS_dead_psili, IBUS_Greek_ALPHA, 0x1F8A,
-+IBUS_Greek_iota, IBUS_dead_grave, IBUS_dead_psili, IBUS_Greek_ETA, 0x1F9A,
-+IBUS_Greek_iota, IBUS_dead_grave, IBUS_dead_psili, IBUS_Greek_OMEGA, 0x1FAA,
-+IBUS_Greek_iota, IBUS_dead_grave, IBUS_dead_psili, IBUS_Greek_alpha, 0x1F82,
-+IBUS_Greek_iota, IBUS_dead_grave, IBUS_dead_psili, IBUS_Greek_eta, 0x1F92,
-+IBUS_Greek_iota, IBUS_dead_grave, IBUS_dead_psili, IBUS_Greek_omega, 0x1FA2,
-+IBUS_Greek_iota, IBUS_dead_grave, IBUS_dead_dasia, IBUS_Greek_ALPHA, 0x1F8B,
-+IBUS_Greek_iota, IBUS_dead_grave, IBUS_dead_dasia, IBUS_Greek_ETA, 0x1F9B,
-+IBUS_Greek_iota, IBUS_dead_grave, IBUS_dead_dasia, IBUS_Greek_OMEGA, 0x1FAB,
-+IBUS_Greek_iota, IBUS_dead_grave, IBUS_dead_dasia, IBUS_Greek_alpha, 0x1F83,
-+IBUS_Greek_iota, IBUS_dead_grave, IBUS_dead_dasia, IBUS_Greek_eta, 0x1F93,
-+IBUS_Greek_iota, IBUS_dead_grave, IBUS_dead_dasia, IBUS_Greek_omega, 0x1FA3,
-+IBUS_Greek_iota, IBUS_dead_acute, IBUS_parenleft, IBUS_Greek_ALPHA, 0x1F8D,
-+IBUS_Greek_iota, IBUS_dead_acute, IBUS_parenleft, IBUS_Greek_ETA, 0x1F9D,
-+IBUS_Greek_iota, IBUS_dead_acute, IBUS_parenleft, IBUS_Greek_OMEGA, 0x1FAD,
-+IBUS_Greek_iota, IBUS_dead_acute, IBUS_parenleft, IBUS_Greek_alpha, 0x1F85,
-+IBUS_Greek_iota, IBUS_dead_acute, IBUS_parenleft, IBUS_Greek_eta, 0x1F95,
-+IBUS_Greek_iota, IBUS_dead_acute, IBUS_parenleft, IBUS_Greek_omega, 0x1FA5,
-+IBUS_Greek_iota, IBUS_dead_acute, IBUS_parenright, IBUS_Greek_ALPHA, 0x1F8C,
-+IBUS_Greek_iota, IBUS_dead_acute, IBUS_parenright, IBUS_Greek_ETA, 0x1F9C,
-+IBUS_Greek_iota, IBUS_dead_acute, IBUS_parenright, IBUS_Greek_OMEGA, 0x1FAC,
-+IBUS_Greek_iota, IBUS_dead_acute, IBUS_parenright, IBUS_Greek_alpha, 0x1F84,
-+IBUS_Greek_iota, IBUS_dead_acute, IBUS_parenright, IBUS_Greek_eta, 0x1F94,
-+IBUS_Greek_iota, IBUS_dead_acute, IBUS_parenright, IBUS_Greek_omega, 0x1FA4,
-+IBUS_Greek_iota, IBUS_dead_acute, IBUS_dead_psili, IBUS_Greek_ALPHA, 0x1F8C,
-+IBUS_Greek_iota, IBUS_dead_acute, IBUS_dead_psili, IBUS_Greek_ETA, 0x1F9C,
-+IBUS_Greek_iota, IBUS_dead_acute, IBUS_dead_psili, IBUS_Greek_OMEGA, 0x1FAC,
-+IBUS_Greek_iota, IBUS_dead_acute, IBUS_dead_psili, IBUS_Greek_alpha, 0x1F84,
-+IBUS_Greek_iota, IBUS_dead_acute, IBUS_dead_psili, IBUS_Greek_eta, 0x1F94,
-+IBUS_Greek_iota, IBUS_dead_acute, IBUS_dead_psili, IBUS_Greek_omega, 0x1FA4,
-+IBUS_Greek_iota, IBUS_dead_acute, IBUS_dead_dasia, IBUS_Greek_ALPHA, 0x1F8D,
-+IBUS_Greek_iota, IBUS_dead_acute, IBUS_dead_dasia, IBUS_Greek_ETA, 0x1F9D,
-+IBUS_Greek_iota, IBUS_dead_acute, IBUS_dead_dasia, IBUS_Greek_OMEGA, 0x1FAD,
-+IBUS_Greek_iota, IBUS_dead_acute, IBUS_dead_dasia, IBUS_Greek_alpha, 0x1F85,
-+IBUS_Greek_iota, IBUS_dead_acute, IBUS_dead_dasia, IBUS_Greek_eta, 0x1F95,
-+IBUS_Greek_iota, IBUS_dead_acute, IBUS_dead_dasia, IBUS_Greek_omega, 0x1FA5,
-+IBUS_Greek_iota, IBUS_dead_tilde, IBUS_parenleft, IBUS_Greek_ALPHA, 0x1F8F,
-+IBUS_Greek_iota, IBUS_dead_tilde, IBUS_parenleft, IBUS_Greek_ETA, 0x1F9F,
-+IBUS_Greek_iota, IBUS_dead_tilde, IBUS_parenleft, IBUS_Greek_OMEGA, 0x1FAF,
-+IBUS_Greek_iota, IBUS_dead_tilde, IBUS_parenleft, IBUS_Greek_alpha, 0x1F87,
-+IBUS_Greek_iota, IBUS_dead_tilde, IBUS_parenleft, IBUS_Greek_eta, 0x1F97,
-+IBUS_Greek_iota, IBUS_dead_tilde, IBUS_parenleft, IBUS_Greek_omega, 0x1FA7,
-+IBUS_Greek_iota, IBUS_dead_tilde, IBUS_parenright, IBUS_Greek_ALPHA, 0x1F8E,
-+IBUS_Greek_iota, IBUS_dead_tilde, IBUS_parenright, IBUS_Greek_ETA, 0x1F9E,
-+IBUS_Greek_iota, IBUS_dead_tilde, IBUS_parenright, IBUS_Greek_OMEGA, 0x1FAE,
-+IBUS_Greek_iota, IBUS_dead_tilde, IBUS_parenright, IBUS_Greek_alpha, 0x1F86,
-+IBUS_Greek_iota, IBUS_dead_tilde, IBUS_parenright, IBUS_Greek_eta, 0x1F96,
-+IBUS_Greek_iota, IBUS_dead_tilde, IBUS_parenright, IBUS_Greek_omega, 0x1FA6,
-+IBUS_Greek_iota, IBUS_dead_tilde, IBUS_dead_psili, IBUS_Greek_ALPHA, 0x1F8E,
-+IBUS_Greek_iota, IBUS_dead_tilde, IBUS_dead_psili, IBUS_Greek_ETA, 0x1F9E,
-+IBUS_Greek_iota, IBUS_dead_tilde, IBUS_dead_psili, IBUS_Greek_OMEGA, 0x1FAE,
-+IBUS_Greek_iota, IBUS_dead_tilde, IBUS_dead_psili, IBUS_Greek_alpha, 0x1F86,
-+IBUS_Greek_iota, IBUS_dead_tilde, IBUS_dead_psili, IBUS_Greek_eta, 0x1F96,
-+IBUS_Greek_iota, IBUS_dead_tilde, IBUS_dead_psili, IBUS_Greek_omega, 0x1FA6,
-+IBUS_Greek_iota, IBUS_dead_tilde, IBUS_dead_dasia, IBUS_Greek_ALPHA, 0x1F8F,
-+IBUS_Greek_iota, IBUS_dead_tilde, IBUS_dead_dasia, IBUS_Greek_ETA, 0x1F9F,
-+IBUS_Greek_iota, IBUS_dead_tilde, IBUS_dead_dasia, IBUS_Greek_OMEGA, 0x1FAF,
-+IBUS_Greek_iota, IBUS_dead_tilde, IBUS_dead_dasia, IBUS_Greek_alpha, 0x1F87,
-+IBUS_Greek_iota, IBUS_dead_tilde, IBUS_dead_dasia, IBUS_Greek_eta, 0x1F97,
-+};
-+
-+#endif /* __GTK_IM_CONTEXT_SIMPLE_SEQS_H__ */
++    }
++    print (footer);
++}
+ 
+ class DummyEngine : IBus.EngineSimple {
+ }
+@@ -28,6 +105,13 @@ class DummyEngine : IBus.EngineSimple {
+ public int main(string[] args) {
+     IBus.init();
+ 
++    if (args.length >= 2) {
++        if (args[1] == "--xml" || args[1] == "-x") {
++            print_component();
++            return 0;
++        }
++    }
 +
-diff --git a/xkb/ibus-engine-xkb-main.c b/xkb/ibus-engine-xkb-main.c
+     IBus.Bus bus = new IBus.Bus();
+     if (!bus.is_connected()) {
+         warning("ibus-daemon does not exist.");
+diff --git a/engine/simple.xml.in.in b/engine/simple.xml.in.in
+index 25db578..7de949a 100644
+--- a/engine/simple.xml.in.in
++++ b/engine/simple.xml.in.in
+@@ -7,534 +7,5 @@
+ 	<license>GPL</license>
+ 	<homepage>http://code.google.com/p/ibus</homepage>
+ 	<textdomain>ibus</textdomain>
+-	<engines>
+-		<engine>
+-			<name>xkb:us::eng</name>
+-			<language>eng</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>us</layout>
+-			<longname>English (US)</longname>
+-			<description>English (US)</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:us:intl:eng</name>
+-			<language>eng</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>us(intl)</layout>
+-			<longname>English (US, international with dead keys)</longname>
+-			<description>English (US, international with dead keys)</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:us:colemak:eng</name>
+-			<language>eng</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>us(colemak)</layout>
+-			<longname>English (Colemak)</longname>
+-			<description>English (Colemak)</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:us:dvorak:eng</name>
+-			<language>eng</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>us(dvorak)</layout>
+-			<longname>English (Dvorak)</longname>
+-			<description>English (Dvorak)</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:us:altgr-intl:eng</name>
+-			<language>eng</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>us(altgr-intl)</layout>
+-			<longname>English (international AltGr dead keys)</longname>
+-			<description>English (international AltGr dead keys)</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:us:altgr-intl:eng</name>
+-			<language>eng</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>us(altgr-intl)</layout>
+-			<longname>English (international AltGr dead keys)</longname>
+-			<description>English (international AltGr dead keys)</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:be::ger</name>
+-			<language>ger</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>be</layout>
+-			<longname>Belgian</longname>
+-			<description>Belgian</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:be::nld</name>
+-			<language>nld</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>be</layout>
+-			<longname>Belgian</longname>
+-			<description>Belgian</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:be::fra</name>
+-			<language>fra</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>be</layout>
+-			<longname>Belgian</longname>
+-			<description>Belgian</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:br::por</name>
+-			<language>por</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>br</layout>
+-			<longname>Portuguese (Brazil)</longname>
+-			<description>Portuguese (Brazil)</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:bg::bul</name>
+-			<language>bul</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>bg</layout>
+-			<longname>Bulgarian</longname>
+-			<description>Bulgarian</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:bg:phonetic:bul</name>
+-			<language>bul</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>bg(phonetic)</layout>
+-			<longname>Bulgarian (traditional phonetic)</longname>
+-			<description>Bulgarian (traditional phonetic)</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:ca::fra</name>
+-			<language>fra</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>ca</layout>
+-			<longname>French (Canada)</longname>
+-			<description>French (Canada)</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:ca:eng:eng</name>
+-			<language>eng</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>ca(eng)</layout>
+-			<longname>English (Canada)</longname>
+-			<description>English (Canada)</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:hr::scr</name>
+-			<language>scr</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>hr</layout>
+-			<longname>Croatian</longname>
+-			<description>Croatian</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:cz::cze</name>
+-			<language>cze</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>cz</layout>
+-			<longname>Czech</longname>
+-			<description>Czech</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:dk::dan</name>
+-			<language>dan</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>dk</layout>
+-			<longname>Danish</longname>
+-			<description>Danish</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:ee::est</name>
+-			<language>est</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>ee</layout>
+-			<longname>Estonian</longname>
+-			<description>Estonian</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:fi::fin</name>
+-			<language>fin</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>fi</layout>
+-			<longname>Finnish</longname>
+-			<description>Finnish</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:fr::fra</name>
+-			<language>fra</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>fr</layout>
+-			<longname>French</longname>
+-			<description>French</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:de::ger</name>
+-			<language>ger</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>de</layout>
+-			<longname>German</longname>
+-			<description>German</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:de:neo:ger</name>
+-			<language>ger</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>de(neo)</layout>
+-			<longname>German (Neo 2)</longname>
+-			<description>German (Neo 2)</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:gr::gre</name>
+-			<language>gre</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>gr</layout>
+-			<longname>Greek</longname>
+-			<description>Greek</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:hu::hun</name>
+-			<language>hun</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>hu</layout>
+-			<longname>Hungarian</longname>
+-			<description>Hungarian</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:il::heb</name>
+-			<language>heb</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>il</layout>
+-			<longname>Hebrew</longname>
+-			<description>Hebrew</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:it::ita</name>
+-			<language>ita</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>it</layout>
+-			<longname>Italian</longname>
+-			<description>Italian</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:jp::jpn</name>
+-			<language>jpn</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>jp</layout>
+-			<longname>Japanese</longname>
+-			<description>Japanese</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:latam::spa</name>
+-			<language>spa</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>latam</layout>
+-			<longname>Spanish (Latin American)</longname>
+-			<description>Spanish (Latin American)</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:lt::lit</name>
+-			<language>lit</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>lt</layout>
+-			<longname>Lithuanian</longname>
+-			<description>Lithuanian</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:lv:apostrophe:lav</name>
+-			<language>lav</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>lv(apostrophe)</layout>
+-			<longname>Latvian (apostrophe variant)</longname>
+-			<description>Latvian (apostrophe variant)</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:pl::pol</name>
+-			<language>pol</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>pl</layout>
+-			<longname>Polish</longname>
+-			<description>Polish</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:pt::por</name>
+-			<language>por</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>pt</layout>
+-			<longname>Portuguese</longname>
+-			<description>Portuguese</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:ro::rum</name>
+-			<language>rum</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>ro</layout>
+-			<longname>Romanian</longname>
+-			<description>Romanian</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:ru::rus</name>
+-			<language>rus</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>ru</layout>
+-			<longname>Russian</longname>
+-			<description>Russian</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:ru:phonetic:rus</name>
+-			<language>rus</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>ru(phonetic)</layout>
+-			<longname>Russian (phonetic)</longname>
+-			<description>Russian (phonetic)</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:rs::srp</name>
+-			<language>srp</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>rs</layout>
+-			<longname>Serbian</longname>
+-			<description>Serbian</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:si::slv</name>
+-			<language>slv</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>si</layout>
+-			<longname>Slovenian</longname>
+-			<description>Slovenian</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:sk::slo</name>
+-			<language>slo</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>sk</layout>
+-			<longname>Slovak</longname>
+-			<description>Slovak</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:es::spa</name>
+-			<language>spa</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>es</layout>
+-			<longname>Spanish</longname>
+-			<description>Spanish</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:es:cat:cat</name>
+-			<language>cat</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>es(cat)</layout>
+-			<longname>Catalan (Spain, with middle-dot L)</longname>
+-			<description>Catalan (Spain, with middle-dot L)</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:se::swe</name>
+-			<language>swe</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>se</layout>
+-			<longname>Swedish</longname>
+-			<description>Swedish</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:ch::ger</name>
+-			<language>ger</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>ch</layout>
+-			<longname>German (Switzerland)</longname>
+-			<description>German (Switzerland)</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:ch:fr:fra</name>
+-			<language>fra</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>ch(fr)</layout>
+-			<longname>French (Switzerland)</longname>
+-			<description>French (Switzerland)</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:tr::tur</name>
+-			<language>tur</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>tr</layout>
+-			<longname>Turkish</longname>
+-			<description>Turkish</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:ua::ukr</name>
+-			<language>ukr</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>ua</layout>
+-			<longname>Ukrainian</longname>
+-			<description>Ukrainian</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:gb:extd:eng</name>
+-			<language>eng</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>gb(extd)</layout>
+-			<longname>English (UK, extended WinKeys)</longname>
+-			<description>English (UK, extended WinKeys)</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:gb:dvorak:eng</name>
+-			<language>eng</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>gb(dvorak)</layout>
+-			<longname>English (UK, Dvorak)</longname>
+-			<description>English (UK, Dvorak)</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-		<engine>
+-			<name>xkb:kr:kr104:kor</name>
+-			<language>kor</language>
+-			<license>GPL</license>
+-			<author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
+-			<layout>kr(kr104)</layout>
+-			<longname>Korean (101/104 key compatible)</longname>
+-			<description>Korean (101/104 key compatible)</description>
+-                        <icon>ibus-keyboard</icon>
+-			<rank>99</rank>
+-		</engine>
+-	</engines>
++	<engines exec=\"${libexecdir}/ibus-engine-simple --xml\" />
+ </component>
+diff --git a/engine/xkblib.c b/engine/xkblib.c
 new file mode 100644
-index 0000000..5866b40
+index 0000000..bb25455
 --- /dev/null
-+++ b/xkb/ibus-engine-xkb-main.c
-@@ -0,0 +1,303 @@
++++ b/engine/xkblib.c
+@@ -0,0 +1,327 @@
 +/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
 +/* vim:set et sts=4: */
 +/* bus - The Input Bus
-+ * Copyright (C) 2011 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2011 Peng Huang <shawn.p.huang@gmail.com>
-+ * Copyright (C) 2011 Red Hat, Inc.
++ * Copyright (C) 2012 Takao Fujiwara <takao.fujiwara1@gmail.com>
++ * Copyright (C) 2012 Peng Huang <shawn.p.huang@gmail.com>
++ * Copyright (C) 2012 Red Hat, Inc.
 + *
 + * This library is free software; you can redistribute it and/or
 + * modify it under the terms of the GNU Lesser General Public
@@ -7813,295 +1098,319 @@ index 0000000..5866b40
 +#include <config.h>
 +#endif
 +
-+#include <ibus.h>
-+#include <glib/gi18n-lib.h>
-+#include <stdlib.h>
++#include <glib.h>
++#include <X11/Xlib.h>
++#include <X11/Xatom.h>
++#include <X11/XKBlib.h>
++#include <stdio.h> /* for XKBrules.h */
++#include <X11/extensions/XKBrules.h>
++#include <X11/extensions/XKBstr.h>
++#include <string.h>
 +
-+#ifdef ENABLE_NLS
-+#include <locale.h>
++#include "xkblib.h"
++
++#ifndef XKB_RULES_XML_FILE
++#define XKB_RULES_XML_FILE "/usr/share/X11/xkb/rules/evdev.xml"
 +#endif
 +
-+#include "xkbxml.h"
-+#include "ibusxkbxml.h"
-+#include "ibus-simple-engine.h"
++static gchar          **default_layouts;
++static gchar          **default_variants;
++static gchar          **default_options;
++static int              default_layout_group;
++
++static Display *
++get_xdisplay (Display *xdisplay)
++{
++    static Display *saved_xdisplay = NULL;
++    if (xdisplay != NULL) {
++        saved_xdisplay = xdisplay;
++    }
++    return saved_xdisplay;
++}
++
++static void
++init_xkb_default_layouts (Display *xdisplay)
++{
++    XkbStateRec state;
++    Atom xkb_rules_name, type;
++    int format;
++    unsigned long l, nitems, bytes_after;
++    unsigned char *prop = NULL;
 +
++    xkb_rules_name = XInternAtom (xdisplay, "_XKB_RULES_NAMES", TRUE);
++    if (xkb_rules_name == None) {
++        g_warning ("Could not get XKB rules atom");
++        return;
++    }
++    if (XGetWindowProperty (xdisplay,
++                            XDefaultRootWindow (xdisplay),
++                            xkb_rules_name,
++                            0, 1024, FALSE, XA_STRING,
++                            &type, &format, &nitems, &bytes_after, &prop) != Success) {
++        g_warning ("Could not get X property");
++        return;
++    }
++    if (nitems < 3) {
++        g_warning ("Could not get group layout from X property");
++        return;
++    }
++    for (l = 0; l < 2; l++) {
++        prop += strlen ((const char *) prop) + 1;
++    }
++    if (prop == NULL || *prop == '\0') {
++        g_warning ("No layouts form X property");
++        return;
++    }
++    default_layouts = g_strsplit ((gchar *) prop, ",", -1);
++    prop += strlen ((const char *) prop) + 1;
++    default_variants = g_strsplit ((gchar *) prop, ",", -1);
++    prop += strlen ((const char *) prop) + 1;
++    default_options = g_strsplit ((gchar *) prop, ",", -1);
 +
-+static IBusBus *bus = NULL;
-+static IBusFactory *factory = NULL;
-+static gboolean ibus = FALSE;
-+static gboolean xml = FALSE;
++    if (XkbGetState (xdisplay, XkbUseCoreKbd, &state) != Success) {
++        g_warning ("Could not get state");
++        return;
++    }
++    default_layout_group = state.group;
++}
 +
-+static const GOptionEntry entries[] =
++static Bool
++set_xkb_rules (Display *xdisplay,
++               const char *rules_file, const char *model,
++               const char *all_layouts, const char *all_variants,
++               const char *all_options)
 +{
-+    { "ibus", 'i', 0, G_OPTION_ARG_NONE, &ibus, "component is executed by ibus", NULL },
-+    { "xml", 'x', 0, G_OPTION_ARG_NONE, &xml, "print component xml", NULL },
-+    { NULL },
-+};
++    gchar *rules_path;
++    XkbRF_RulesPtr rules;
++    XkbRF_VarDefsRec rdefs;
++    XkbComponentNamesRec rnames;
++    XkbDescPtr xkb;
 +
-+static void
-+ibus_disconnected_cb (IBusBus  *bus,
-+                      gpointer  user_data)
++    rules_path = g_strdup ("./rules/evdev");
++    rules = XkbRF_Load (rules_path, "C", TRUE, TRUE);
++    if (rules == NULL) {
++        g_return_val_if_fail (XKB_RULES_XML_FILE != NULL, FALSE);
++
++        g_free (rules_path);
++        if (g_str_has_suffix (XKB_RULES_XML_FILE, ".xml")) {
++            rules_path = g_strndup (XKB_RULES_XML_FILE,
++                                    strlen (XKB_RULES_XML_FILE) - 4);
++        } else {
++            rules_path = g_strdup (XKB_RULES_XML_FILE);
++        }
++        rules = XkbRF_Load (rules_path, "C", TRUE, TRUE);
++    }
++    g_return_val_if_fail (rules != NULL, FALSE);
++
++    memset (&rdefs, 0, sizeof (XkbRF_VarDefsRec));
++    memset (&rnames, 0, sizeof (XkbComponentNamesRec));
++    rdefs.model = model ? g_strdup (model) : NULL;
++    rdefs.layout = all_layouts ? g_strdup (all_layouts) : NULL;
++    rdefs.variant = all_variants ? g_strdup (all_variants) : NULL;
++    rdefs.options = all_options ? g_strdup (all_options) : NULL;
++    XkbRF_GetComponents (rules, &rdefs, &rnames);
++    xkb = XkbGetKeyboardByName (xdisplay, XkbUseCoreKbd, &rnames,
++                                XkbGBN_AllComponentsMask,
++                                XkbGBN_AllComponentsMask &
++                                (~XkbGBN_GeometryMask), True);
++    if (!xkb) {
++        g_warning ("Cannot load new keyboard description.");
++        return FALSE;
++    }
++    XkbRF_SetNamesProp (xdisplay, rules_path, &rdefs);
++    g_free (rules_path);
++    g_free (rdefs.model);
++    g_free (rdefs.layout);
++    g_free (rdefs.variant);
++    g_free (rdefs.options);
++
++    return TRUE;
++}
++
++static Bool
++update_xkb_properties (Display *xdisplay,
++                       const char *rules_file, const char *model,
++                       const char *all_layouts, const char *all_variants,
++                       const char *all_options)
 +{
-+    g_debug ("bus disconnected");
-+    ibus_quit ();
++    int len;
++    char *pval;
++    char *next;
++    Atom rules_atom;
++    Window root_window;
++
++    len = (rules_file ? strlen (rules_file) : 0);
++    len += (model ? strlen (model) : 0);
++    len += (all_layouts ? strlen (all_layouts) : 0);
++    len += (all_variants ? strlen (all_variants) : 0);
++    len += (all_options ? strlen (all_options) : 0);
++
++    if (len < 1) {
++        return TRUE;
++    }
++    len += 5; /* trailing NULs */
++
++    rules_atom = XInternAtom (xdisplay, _XKB_RF_NAMES_PROP_ATOM, False);
++    root_window = XDefaultRootWindow (xdisplay);
++    pval = next = g_new0 (char, len + 1);
++    if (!pval) {
++        return TRUE;
++    }
++
++    if (rules_file) {
++        strcpy (next, rules_file);
++        next += strlen (rules_file);
++    }
++    *next++ = '\0';
++    if (model) {
++        strcpy (next, model);
++        next += strlen (model);
++    }
++    *next++ = '\0';
++    if (all_layouts) {
++        strcpy (next, all_layouts);
++        next += strlen (all_layouts);
++    }
++    *next++ = '\0';
++    if (all_variants) {
++        strcpy (next, all_variants);
++        next += strlen (all_variants);
++    }
++    *next++ = '\0';
++    if (all_options) {
++        strcpy (next, all_options);
++        next += strlen (all_options);
++    }
++    *next++ = '\0';
++    if ((next - pval) != len) {
++        g_free (pval);
++        return TRUE;
++    }
++
++    XChangeProperty (xdisplay, root_window,
++                    rules_atom, XA_STRING, 8, PropModeReplace,
++                    (unsigned char *) pval, len);
++    XSync(xdisplay, False);
++
++    return TRUE;
 +}
 +
-+IBusEngine *
-+_factory_create_engine_cb (IBusFactory *factory,
-+                           const gchar *engine_name,
-+                           gpointer     data)
++void
++ibus_xkb_init (Display *xdisplay)
 +{
-+    IBusEngine *engine = NULL;
-+    gchar *object_path = NULL;
-+    static int id = 0;
++    get_xdisplay (xdisplay);
++    init_xkb_default_layouts (xdisplay);
++}
 +
-+    g_return_val_if_fail (engine_name != NULL, NULL);
++void
++ibus_xkb_finit (void)
++{
++    g_strfreev (default_layouts);
++    default_layouts = NULL;
++    g_strfreev (default_variants);
++    default_variants = NULL;
++    g_strfreev (default_options);
++    default_options = NULL;
++}
 +
-+    if (g_strcmp0 (engine_name, "xkb:layout:us") == 0) {
++gchar *
++ibus_xkb_get_current_layout (void)
++{
++    if (default_layouts == NULL) {
++        g_warning ("Your system seems not to support XKB.");
 +        return NULL;
 +    }
 +
-+    object_path = g_strdup_printf ("/org/freedesktop/IBus/XKBEngine/%d",
-+                                   ++id);
-+    engine = ibus_engine_new_type (IBUS_TYPE_SIMPLE_ENGINE,
-+                                   engine_name,
-+                                   object_path,
-+                                   ibus_service_get_connection (IBUS_SERVICE (factory)));
-+    g_free (object_path);
-+    return engine;
++    return g_strjoinv (",", (gchar **) default_layouts);
 +}
 +
-+static void
-+start_component (int argc, char **argv)
++gchar *
++ibus_xkb_get_current_variant (void)
 +{
-+    IBusComponent *component;
-+
-+    ibus_init ();
-+
-+    bus = ibus_bus_new ();
-+    g_signal_connect (bus, "disconnected", G_CALLBACK (ibus_disconnected_cb), NULL);
-+
-+    component = ibus_component_new ("org.freedesktop.IBus.XKB",
-+                                    "XKB Component",
-+                                    VERSION,
-+                                    "LGPL2.1",
-+                                    "Takao Fujiwara <takao.fujiwara1@gmail.com>",
-+                                    "http://code.google.com/p/ibus/",
-+                                    "",
-+                                    GETTEXT_PACKAGE);
-+    ibus_component_add_engine (component,
-+                               ibus_xkb_engine_desc_new ("eng",
-+                                                         "us",
-+                                                         "USA",
-+                                                         NULL,
-+                                                         NULL,
-+                                                         NULL));
-+
-+    factory = ibus_factory_new (ibus_bus_get_connection (bus));
-+
-+    ibus_factory_add_engine (factory, "xkb:layout:us", IBUS_TYPE_SIMPLE_ENGINE);
-+
-+    g_signal_connect (G_OBJECT (factory), "create-engine",
-+                      G_CALLBACK (_factory_create_engine_cb),
-+                      NULL);
-+    if (ibus) {
-+        ibus_bus_request_name (bus, "org.freedesktop.IBus.XKB", 0);
++    if (default_variants == NULL) {
++        return NULL;
 +    }
-+    else {
-+        ibus_bus_register_component (bus, component);
++
++    return g_strjoinv (",", (gchar **) default_variants);
++}
++
++gchar *
++ibus_xkb_get_current_option (void)
++{
++    if (default_options == NULL) {
++        return NULL;
 +    }
 +
-+    g_object_unref (component);
-+
-+    ibus_main ();
++    return g_strjoinv (",", (gchar **) default_options);
 +}
 +
-+static gboolean
-+is_included_engine_in_preload (const GList * preload_xkb_engines,
-+                               const gchar *layout,
-+                               const gchar *variant)
++gboolean
++ibus_xkb_set_layout  (const char *layouts,
++                      const char *variants,
++                      const char *options)
 +{
-+    const GList *list = preload_xkb_engines;
-+    gchar *key = NULL;
-+    gboolean retval = FALSE;
-+
-+    g_return_val_if_fail (layout != NULL, FALSE);
++    Display *xdisplay;
++    gboolean retval;
++    gchar *layouts_line;
 +
-+    if (variant == NULL) {
-+        key = g_strdup (layout);
-+    } else {
-+        key = g_strdup_printf ("%s(%s)", layout, variant);
-+    }
-+    while (list) {
-+        if (list->data == NULL) {
-+            continue;
-+        }
-+        if (g_strcmp0 ((const gchar *) list->data,
-+                       (const gchar *) key) == 0) {
-+            retval = TRUE;
-+            break;
-+        }
-+        list = list->next;
++    if (default_layouts == NULL) {
++        g_warning ("Your system seems not to support XKB.");
++        return FALSE;
 +    }
-+    g_free (key);
-+    return retval;
-+}
-+
-+static void
-+print_component ()
-+{
-+    IBusXKBLayoutConfig *layout_config;
-+    IBusXKBConfigRegistry *config_registry;
-+    GHashTable *layout_list;
-+    GHashTable *layout_lang;
-+    GHashTable *layout_desc;
-+    GHashTable *variant_desc;
-+    IBusComponent *component;
-+    IBusEngineDesc *engine;
-+    const GList *preload_xkb_engines = NULL;
-+    GList *keys;
-+    GList *variants;
-+    GList *langs;
-+    gboolean is_preload;
-+    gchar *layout_name;
-+    const gchar *desc;
-+    gchar *output;
-+    GString *str;
-+
-+#ifdef XKBLAYOUTCONFIG_FILE
-+    layout_config = ibus_xkb_layout_config_new (XKBLAYOUTCONFIG_FILE);
-+    preload_xkb_engines = ibus_xkb_layout_config_get_preload_layouts (layout_config);
-+#endif
 +
-+    config_registry = ibus_xkb_config_registry_new ();
-+    layout_list = (GHashTable *) ibus_xkb_config_registry_get_layout_list (config_registry);
-+    layout_lang = (GHashTable *) ibus_xkb_config_registry_get_layout_lang (config_registry);
-+    layout_desc = (GHashTable *) ibus_xkb_config_registry_get_layout_desc (config_registry);
-+    variant_desc = (GHashTable *) ibus_xkb_config_registry_get_variant_desc (config_registry);
-+    component = ibus_xkb_component_new ();
-+    for (keys = g_hash_table_get_keys (layout_list); keys; keys = keys->next) {
-+        if (keys->data == NULL) {
-+            continue;
-+        }
-+        desc = (const gchar *) g_hash_table_lookup (layout_desc, keys->data);
-+        langs = (GList *) g_hash_table_lookup (layout_lang, keys->data);
-+        for (;langs; langs = langs->next) {
-+            if (langs->data == NULL) {
-+                continue;
-+            }
-+            is_preload = FALSE;
-+            if (!preload_xkb_engines) {
-+                is_preload = TRUE;
-+            } else {
-+                is_preload = is_included_engine_in_preload (preload_xkb_engines,
-+                                                            (const gchar *) keys->data,
-+                                                            NULL);
-+            }
-+            if (is_preload) {
-+                engine = ibus_xkb_engine_desc_new ((const gchar *) langs->data,
-+                                                   (const gchar *) keys->data,
-+                                                   desc,
-+                                                   NULL,
-+                                                   NULL,
-+                                                   NULL);
-+                ibus_component_add_engine (component, engine);
-+            }
-+        }
-+        variants = (GList *) g_hash_table_lookup (layout_list, keys->data);
-+        for (;variants; variants = variants->next) {
-+            if (variants->data == NULL) {
-+                continue;
-+            }
-+            layout_name = g_strdup_printf ("%s(%s)", (gchar *) keys->data,
-+                                                     (gchar *) variants->data);
-+            langs = (GList *) g_hash_table_lookup (layout_lang, layout_name);
-+            if (langs == NULL) {
-+                g_free (layout_name);
-+                layout_name = g_strdup ((gchar *) keys->data);
-+                langs = (GList *) g_hash_table_lookup (layout_lang, layout_name);
-+            }
-+            g_free (layout_name);
-+            for (;langs; langs = langs->next) {
-+                if (langs->data == NULL) {
-+                    continue;
-+                }
-+                is_preload = FALSE;
-+                if (!preload_xkb_engines) {
-+                   is_preload = TRUE;
-+                } else {
-+                    is_preload = is_included_engine_in_preload (preload_xkb_engines,
-+                                                                (const gchar *) keys->data,
-+                                                                (const gchar *) variants->data);
-+                }
-+                if (is_preload) {
-+                    engine = ibus_xkb_engine_desc_new ((const gchar *) langs->data,
-+                                                       (const gchar *) keys->data,
-+                                                       desc,
-+                                                       (const gchar *) variants->data,
-+                                                       (const gchar *) g_hash_table_lookup (variant_desc, variants->data),
-+                                                       NULL);
-+                    ibus_component_add_engine (component, engine);
-+                }
-+            }
-+        }
++    if (layouts == NULL || g_strcmp0 (layouts, "default") == 0) {
++        layouts_line = g_strjoinv (",", (gchar **) default_layouts);
++    } else {
++        layouts_line = g_strdup (layouts);
 +    }
-+    g_object_unref (G_OBJECT (config_registry));
-+#ifdef XKBLAYOUTCONFIG_FILE
-+    g_object_unref (G_OBJECT (layout_config));
-+#endif
 +
-+    str = g_string_new (NULL);
-+    ibus_component_output_engines (component , str, 0);
-+    g_object_unref (G_OBJECT (component));
++    xdisplay = get_xdisplay (NULL);
++    retval = set_xkb_rules (xdisplay,
++                            "evdev", "evdev",
++                            layouts_line, variants, options);
++    update_xkb_properties (xdisplay,
++                           "evdev", "evdev",
++                           layouts_line, variants, options);
++    g_free (layouts_line);
 +
-+    output = g_string_free (str, FALSE);
-+    g_print ("%s\n", output);
-+    g_free (output);
++    return retval;
 +}
 +
 +int
-+main (int argc, char **argv)
++ibus_xkb_get_current_group (void)
 +{
-+    GError *error = NULL;
-+    GOptionContext *context;
-+
-+#ifdef ENABLE_NLS
-+    setlocale (LC_ALL, "");
-+    bindtextdomain (GETTEXT_PACKAGE, IBUS_LOCALEDIR);
-+    bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
-+#endif
-+
-+    g_type_init ();
-+
-+    context = g_option_context_new ("- ibus xkb engine component");
++    Display *xdisplay = get_xdisplay (NULL);
++    XkbStateRec state;
 +
-+    g_option_context_add_main_entries (context, entries, "ibus-xbl");
++    if (default_layouts == NULL) {
++        g_warning ("Your system seems not to support XKB.");
++        return 0;
++    }
 +
-+    if (!g_option_context_parse (context, &argc, &argv, &error)) {
-+        g_print ("Option parsing failed: %s\n", error->message);
-+        exit (-1);
++    if (xdisplay == NULL) {
++        g_warning ("ibus-xkb is not initialized.");
++        return 0;
 +    }
 +
-+    if (xml) {
-+        print_component ();
++    if (XkbGetState (xdisplay, XkbUseCoreKbd, &state) != Success) {
++        g_warning ("Could not get state");
 +        return 0;
 +    }
-+    start_component (argc, argv);
 +
-+    return 0;
++    return state.group;
 +}
-diff --git a/xkb/ibus-engine-xkb-main.h b/xkb/ibus-engine-xkb-main.h
+diff --git a/engine/xkblib.h b/engine/xkblib.h
 new file mode 100644
-index 0000000..255e952
+index 0000000..36597c3
 --- /dev/null
-+++ b/xkb/ibus-engine-xkb-main.h
-@@ -0,0 +1,32 @@
++++ b/engine/xkblib.h
+@@ -0,0 +1,41 @@
 +/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
 +/* vim:set et sts=4: */
 +/* bus - The Input Bus
-+ * Copyright (C) 2011 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2011 Peng Huang <shawn.p.huang@gmail.com>
-+ * Copyright (C) 2011 Red Hat, Inc.
++ * Copyright (C) 2012 Takao Fujiwara <takao.fujiwara1@gmail.com>
++ * Copyright (C) 2012 Peng Huang <shawn.p.huang@gmail.com>
++ * Copyright (C) 2012 Red Hat, Inc.
 + *
 + * This library is free software; you can redistribute it and/or
 + * modify it under the terms of the GNU Lesser General Public
@@ -8118,1060 +1427,604 @@ index 0000000..255e952
 + * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 + * Boston, MA 02111-1307, USA.
 + */
-+#ifndef __IBUS_ENGINE_XKB_MAIN_H_
-+#define __IBUS_ENGINE_XKB_MAIN_H_
++#ifndef __XKBLIB_H_
++#define __XKBLIB_H_
++
++#include <X11/Xlib.h>
 +
 +G_BEGIN_DECLS
 +
-+typedef struct _IBusXKBEngine IBusXKBEngine;
-+typedef struct _IBusXKBEngineClass IBusXKBEngineClass;
++void             ibus_xkb_init                   (Display *xdisplay);
++void             ibus_xkb_finit                  (void);
++gchar           *ibus_xkb_get_current_layout     (void);
++gchar           *ibus_xkb_get_current_variant    (void);
++gchar           *ibus_xkb_get_current_option     (void);
++gboolean         ibus_xkb_set_layout             (const char *layouts,
++                                                  const char *variants,
++                                                  const char *options);
++int              ibus_xkb_get_current_group      (void);
 +
 +G_END_DECLS
 +#endif
-diff --git a/xkb/ibus-simple-engine.c b/xkb/ibus-simple-engine.c
+diff --git a/ibus-1.0.pc.in b/ibus-1.0.pc.in
+index 9f593ab..66b902a 100644
+--- a/ibus-1.0.pc.in
++++ b/ibus-1.0.pc.in
+@@ -1,9 +1,13 @@
+ prefix=@prefix@
+ exec_prefix=@exec_prefix@
+ libdir=@libdir@
++libexecdir=@libexecdir@
+ includedir=@includedir@
+ datadir=@datadir@
+ pkgdatadir=@datadir@/ibus
++have_ibus_xkb=@HAVE_IBUS_XKB@
++ibus_xkb=${libexecdir}/ibus-xkb
++have_ibus_gkbd=@HAVE_IBUS_GKBD@
+ 
+ Name: IBus
+ Description: IBus Library
+diff --git a/setup/main.py b/setup/main.py
+index 7cd3e37..47a34e3 100644
+--- a/setup/main.py
++++ b/setup/main.py
+@@ -182,7 +182,20 @@ class Setup(object):
+                 self.__checkbutton_use_global_engine_toggled_cb)
+ 
+         # init engine page
+-        self.__engines = self.__bus.list_engines()
++        self.__engines = []
++        value = self.__config.get_value("general", "load_xkb_layouts")
++        load_layouts = []
++        if value != None:
++            load_layouts = map(lambda l: str(l), list(value))
++        if len(load_layouts) == 0:
++            self.__engines = self.__bus.list_engines()
++        else:
++            for engine in self.__bus.list_engines():
++                if not engine.props.name.startswith('xkb:'):
++                    self.__engines.append(engine)
++                elif engine.props.layout in load_layouts:
++                    self.__engines.append(engine)
++
+         self.__combobox = self.__builder.get_object("combobox_engines")
+         self.__combobox.set_engines(self.__engines)
+ 
+@@ -254,7 +267,7 @@ class Setup(object):
+             args = setup.split()
+             args.insert(1, path.basename(args[0]))
+             return args
+-        name = str(engine.name)
++        name = str(engine.props.name)
+         libexecdir = os.environ['IBUS_LIBEXECDIR']
+         setup_path = (libexecdir + '/' + 'ibus-setup-' if libexecdir != None \
+             else 'ibus-setup-') + name.split(':')[0]
+@@ -275,11 +288,11 @@ class Setup(object):
+         self.__builder.get_object("button_engine_up").set_sensitive(engine not in engines[:1])
+         self.__builder.get_object("button_engine_down").set_sensitive(engine not in engines[-1:])
+ 
+-        # obj = self.__builder.get_object("button_engine_preferences")
+-        # if len(self.__get_engine_setup_exec_args(engine)) != 0:
+-        #     obj.set_sensitive(True)
+-        # else:
+-        #     obj.set_sensitive(False)
++        obj = self.__builder.get_object("button_engine_preferences")
++        if len(self.__get_engine_setup_exec_args(engine)) != 0:
++            obj.set_sensitive(True)
++        else:
++            obj.set_sensitive(False)
+ 
+         if prop.name == "engines":
+             engine_names = map(lambda e: e.get_name(), engines)
+@@ -302,7 +315,7 @@ class Setup(object):
+         args = self.__get_engine_setup_exec_args(engine)
+         if len(args) == 0:
+             return
+-        name = engine.name
++        name = engine.props.name
+         if name in self.__engine_setup_exec_list.keys():
+             try:
+                 wpid, sts = os.waitpid(self.__engine_setup_exec_list[name],
+diff --git a/src/Makefile.am b/src/Makefile.am
+index a53c277..0c8a820 100644
+--- a/src/Makefile.am
++++ b/src/Makefile.am
+@@ -190,6 +190,11 @@ typelibs_DATA = $(INTROSPECTION_GIRS:.gir=.typelib)
+ CLEANFILES += $(dist_gir_DATA) $(typelibs_DATA)
+ endif
+ 
++if ENABLE_XKB
++ibus_sources += ibusxkbxml.c
++ibus_headers += ibusxkbxml.h
++endif
++
+ # gen enum types
+ ibusenumtypes.h: $(ibus_headers) ibusenumtypes.h.template
+ 	$(AM_V_GEN) ( top_builddir=`cd $(top_builddir) && pwd`; \
+diff --git a/src/ibus.h b/src/ibus.h
+index ef811a4..f82a162 100644
+--- a/src/ibus.h
++++ b/src/ibus.h
+@@ -47,6 +47,7 @@
+ #include <ibuskeys.h>
+ #include <ibusenumtypes.h>
+ #include <ibushotkey.h>
++#include <ibusxkbxml.h>
+ #include <ibusxml.h>
+ #include <ibusenginedesc.h>
+ #include <ibusobservedpath.h>
+diff --git a/src/ibusxkbxml.c b/src/ibusxkbxml.c
 new file mode 100644
-index 0000000..4b5bd83
+index 0000000..af30c0c
 --- /dev/null
-+++ b/xkb/ibus-simple-engine.c
-@@ -0,0 +1,1007 @@
++++ b/src/ibusxkbxml.c
+@@ -0,0 +1,454 @@
 +/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
 +/* vim:set et sts=4: */
++/* bus - The Input Bus
++ * Copyright (C) 2012 Takao Fujiwara <takao.fujiwara1@gmail.com>
++ * Copyright (C) 2012 Peng Huang <shawn.p.huang@gmail.com>
++ * Copyright (C) 2012 Red Hat, Inc.
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
 +#ifdef HAVE_CONFIG_H
-+#  include "config.h"
-+#endif
-+#include "ibus-simple-engine.h"
-+#include <glib/gi18n-lib.h>
-+#include <stdlib.h>
-+#include <memory.h>
-+
-+#ifdef ENABLE_NLS
-+#include <locale.h>
++#include <config.h>
 +#endif
 +
-+#define MAX_COMPOSE_LEN 7
-+
-+typedef enum {
-+    IBUS_COMPOSE_TABLE_NONE             = 0,
-+    IBUS_COMPOSE_TABLE_CEDILLA,
-+} IBusComposeAddOnTableType;
-+
-+typedef struct _IBusSimpleEngine IBusSimpleEngine;
-+typedef struct _IBusSimpleEngineClass IBusSimpleEngineClass;
-+
-+struct _IBusSimpleEngine {
-+    IBusEngine parent;
-+
-+    IBusPropList *prop_list;
-+
-+    guint      compose_buffer[MAX_COMPOSE_LEN + 1];
-+    gunichar   tentative_match;
-+    gint       tentative_match_len;
-+
-+    guint      in_hex_sequence : 1;
-+    guint      modifiers_dropped : 1;
-+};
++#include <glib.h>
 +
-+struct _IBusSimpleEngineClass {
-+    IBusEngineClass parent;
-+    IBusComposeAddOnTableType compose_addon_table_type;
-+};
++#include "ibus.h"
++#include "ibusxkbxml.h"
 +
-+typedef struct _GtkComposeTableCompact GtkComposeTableCompact;
-+struct _GtkComposeTableCompact
-+{
-+    const guint16 *data;
-+    gint max_seq_len;
-+    gint n_index_size;
-+    gint n_index_stride;
-+};
++#ifndef XKB_RULES_XML_FILE
++#define XKB_RULES_XML_FILE "/usr/share/X11/xkb/rules/evdev.xml"
++#endif
 +
-+/* This file contains the table of the compose sequences,
-+ * static const guint16 gtk_compose_seqs_compact[] = {}
-+ * IT is generated from the compose-parse.py script.
-+ */
-+#include "gtkimcontextsimpleseqs.h"
++#define IBUS_XKB_CONFIG_REGISTRY_GET_PRIVATE(o)  \
++   (G_TYPE_INSTANCE_GET_PRIVATE ((o), IBUS_TYPE_XKB_CONFIG_REGISTRY, IBusXKBConfigRegistryPrivate))
 +
-+/* From the values below, the value 23 means the number of different first keysyms
-+ * that exist in the Compose file (from Xorg). When running compose-parse.py without
-+ * parameters, you get the count that you can put here. Needed when updating the
-+ * gtkimcontextsimpleseqs.h header file (contains the compose sequences).
-+ */
-+static const GtkComposeTableCompact gtk_compose_table_compact = {
-+    gtk_compose_seqs_compact,
-+    5,
-+    24,
-+    6
-+};
++typedef struct _IBusXKBConfigRegistryPrivate IBusXKBConfigRegistryPrivate;
 +
-+static const guint16 gtk_compose_ignore[] = {
-+    IBUS_Shift_L,
-+    IBUS_Shift_R,
-+    IBUS_Control_L,
-+    IBUS_Control_R,
-+    IBUS_Caps_Lock,
-+    IBUS_Shift_Lock,
-+    IBUS_Meta_L,
-+    IBUS_Meta_R,
-+    IBUS_Alt_L,
-+    IBUS_Alt_R,
-+    IBUS_Super_L,
-+    IBUS_Super_R,
-+    IBUS_Hyper_L,
-+    IBUS_Hyper_R,
-+    IBUS_Mode_switch,
-+    IBUS_ISO_Level3_Shift
++struct _IBusXKBConfigRegistryPrivate {
++    GHashTable *layout_list;
++    GHashTable *layout_lang;
++    GHashTable *layout_desc;
++    GHashTable *variant_desc;
 +};
 +
-+/* Copied from gtk+2.0-2.20.1/modules/input/imcedilla.c to fix crosbug.com/11421.
-+ * Overwrite the original Gtk+'s compose table in gtk+-2.x.y/gtk/gtkimcontextsimple.c. */
-+
-+/* The difference between this and the default input method is the handling
-+ * of C+acute - this method produces C WITH CEDILLA rather than C WITH ACUTE.
-+ * For languages that use CCedilla and not acute, this is the preferred mapping,
-+ * and is particularly important for pt_BR, where the us-intl keyboard is
-+ * used extensively.
-+ */
-+static guint16 cedilla_compose_seqs[] = {
-+  IBUS_dead_acute,      IBUS_C,   0,      0,      0,      0x00C7, /* LATIN_CAPITAL_LETTER_C_WITH_CEDILLA */
-+  IBUS_dead_acute,      IBUS_c,   0,      0,      0,      0x00E7, /* LATIN_SMALL_LETTER_C_WITH_CEDILLA */
-+  IBUS_Multi_key,       IBUS_apostrophe, IBUS_C,  0,      0,      0x00C7, /* LATIN_CAPITAL_LETTER_C_WITH_CEDILLA */
-+  IBUS_Multi_key,       IBUS_apostrophe, IBUS_c,  0,      0,      0x00E7, /* LATIN_SMALL_LETTER_C_WITH_CEDILLA */
-+  IBUS_Multi_key,       IBUS_C,  IBUS_apostrophe, 0,      0,      0x00C7, /* LATIN_CAPITAL_LETTER_C_WITH_CEDILLA */
-+  IBUS_Multi_key,       IBUS_c,  IBUS_apostrophe, 0,      0,      0x00E7, /* LATIN_SMALL_LETTER_C_WITH_CEDILLA */
-+};
 +
 +/* functions prototype */
-+static void     ibus_simple_engine_class_init   (IBusSimpleEngineClass  *klass);
-+static void     ibus_simple_engine_init         (IBusSimpleEngine       *simple);
-+static void     ibus_simple_engine_destroy      (IBusSimpleEngine       *simple);
-+static void     ibus_simple_engine_reset        (IBusEngine             *engine);
-+static void     ibus_simple_engine_enable       (IBusEngine             *engine);
-+static void     ibus_simple_engine_disable      (IBusEngine             *engine);
-+static void     ibus_simple_engine_focus_in     (IBusEngine             *engine);
-+static void     ibus_simple_engine_focus_out    (IBusEngine             *engine);
-+static void     ibus_simple_engine_reset        (IBusEngine             *engine);
-+static void     ibus_simple_engine_property_activate
-+                                                (IBusEngine             *engine,
-+                                                 const gchar            *prop_name,
-+                                                 guint                   prop_state);
-+static gboolean ibus_simple_engine_process_key_event
-+                                                (IBusEngine             *engine,
-+                                                 guint                   keyval,
-+                                                 guint                   keycode,
-+                                                 guint                   modifiers);
-+static void     ibus_simple_engine_commit_char (IBusSimpleEngine        *simple,
-+                                                gunichar                 ch);
-+static void     ibus_simple_engine_update_preedit_text
-+                                               (IBusSimpleEngine        *simple);
-+
-+G_DEFINE_TYPE (IBusSimpleEngine, ibus_simple_engine, IBUS_TYPE_ENGINE)
-+
-+static void
-+ibus_simple_engine_class_init (IBusSimpleEngineClass *klass)
-+{
-+    IBusObjectClass *ibus_object_class = IBUS_OBJECT_CLASS (klass);
-+    IBusEngineClass *engine_class = IBUS_ENGINE_CLASS (klass);
-+    gchar *lang = NULL;
-+
-+    ibus_object_class->destroy = (IBusObjectDestroyFunc) ibus_simple_engine_destroy;
-+
-+    engine_class->reset     = ibus_simple_engine_reset;
-+    engine_class->enable    = ibus_simple_engine_enable;
-+    engine_class->disable   = ibus_simple_engine_disable;
-+    engine_class->focus_in  = ibus_simple_engine_focus_in;
-+    engine_class->focus_out = ibus_simple_engine_focus_out;
-+    engine_class->property_activate
-+                            = ibus_simple_engine_property_activate;
-+    engine_class->process_key_event
-+                            = ibus_simple_engine_process_key_event;
-+
-+    klass->compose_addon_table_type = IBUS_COMPOSE_TABLE_NONE;
-+ 
-+#ifdef ENABLE_NLS
-+    lang = g_strdup (setlocale (LC_CTYPE, NULL));
-+#endif
-+    if (lang == NULL) {
-+        lang = g_strdup (g_getenv ("LANG"));
-+    }
-+    if (lang && g_ascii_strncasecmp (lang, "pt_BR", strlen ("pt_BR")) == 0) {
-+        klass->compose_addon_table_type = IBUS_COMPOSE_TABLE_CEDILLA;
-+    }
-+    g_free (lang);
-+}
-+
-+static void
-+ibus_simple_engine_init (IBusSimpleEngine *simple)
-+{
-+#ifdef ENABLE_SETUP_GUI
-+    IBusText *label;
-+    IBusText *tooltip;
-+    IBusProperty *prop;
-+
-+    simple->prop_list = ibus_prop_list_new ();
-+
-+    g_object_ref_sink (simple->prop_list);
-+    label = ibus_text_new_from_string (_("Setup"));
-+    tooltip = ibus_text_new_from_string (_("Configure XKB engine"));
-+    prop = ibus_property_new ("setup",
-+                              PROP_TYPE_NORMAL,
-+                              label,
-+                              "gtk-preferences",
-+                              tooltip,
-+                              TRUE, TRUE,
-+                              PROP_STATE_UNCHECKED,
-+                              NULL);
-+    g_object_ref_sink (prop);
-+    ibus_prop_list_append (simple->prop_list, prop);
-+#endif
-+}
-+
-+static void
-+ibus_simple_engine_destroy (IBusSimpleEngine *simple)
-+{
-+#ifdef ENABLE_SETUP_GUI
-+    if (simple->prop_list) {
-+        g_object_unref (simple->prop_list);
-+        simple->prop_list = NULL;
-+    }
-+#endif
-+
-+    ((IBusObjectClass *) ibus_simple_engine_parent_class)->destroy ((IBusObject *)simple);
-+}
-+
-+static void
-+ibus_simple_engine_reset (IBusEngine *engine)
-+{
-+    IBusSimpleEngine *simple = (IBusSimpleEngine *)engine;
-+    simple->compose_buffer[0] = 0;
-+
-+    if (simple->tentative_match || simple->in_hex_sequence) {
-+        simple->in_hex_sequence = FALSE;
-+        simple->tentative_match = 0;
-+        simple->tentative_match_len = 0;
-+        ibus_engine_hide_preedit_text ((IBusEngine *)simple);
-+    }
-+}
-+
-+static void
-+ibus_simple_engine_enable (IBusEngine *engine)
-+{
-+    IBUS_ENGINE_CLASS (ibus_simple_engine_parent_class)->enable (engine);
-+}
-+
-+static void
-+ibus_simple_engine_disable (IBusEngine *engine)
-+{
-+    IBUS_ENGINE_CLASS (ibus_simple_engine_parent_class)->disable (engine);
-+}
-+
-+static void
-+ibus_simple_engine_focus_in (IBusEngine *engine)
-+{
-+#ifdef ENABLE_SETUP_GUI
-+    IBusSimpleEngine *simple = (IBusSimpleEngine *) engine;
++static void         ibus_xkb_config_registry_destroy
++                                           (IBusXKBConfigRegistry *xkb_config);
 +
-+    ibus_engine_register_properties (engine, simple->prop_list);
-+#endif
-+    IBUS_ENGINE_CLASS (ibus_simple_engine_parent_class)->focus_in (engine);
-+}
++G_DEFINE_TYPE (IBusXKBConfigRegistry, ibus_xkb_config_registry, IBUS_TYPE_OBJECT)
 +
 +static void
-+ibus_simple_engine_focus_out (IBusEngine *engine)
++parse_xkb_xml_languagelist_node (IBusXKBConfigRegistryPrivate *priv,
++                                 XMLNode *parent_node,
++                                 const gchar *layout_name)
 +{
-+    IBUS_ENGINE_CLASS (ibus_simple_engine_parent_class)->focus_out (engine);
-+}
++    XMLNode *node = parent_node;
++    XMLNode *sub_node;
++    GList *p;
++    GList *lang_list = NULL;
 +
-+static void
-+ibus_simple_engine_property_activate (IBusEngine  *engine,
-+                                      const gchar *prop_name,
-+                                      guint        prop_state)
-+{
-+    if (g_strcmp0 (prop_name, "setup") == 0) {
-+        gchar *argv[2] = { NULL, NULL};
-+        gchar *path;
-+        const gchar *libexecdir = g_getenv ("LIBEXECDIR");
-+        GError *error = NULL;
-+
-+        if (libexecdir == NULL) {
-+            libexecdir = LIBEXECDIR;
-+        }
-+        path = g_build_filename (libexecdir, "ibus-setup-xkb", NULL);
-+        argv[0] = path;
-+        if (!g_spawn_async (NULL, argv, NULL, 0, NULL, NULL, NULL, &error)) {
-+            if (error) {
-+                g_warning ("exec failure: %s", error->message);
-+                g_error_free (error);
-+            }
++    g_assert (node != NULL);
++    g_assert (layout_name != NULL);
++    for (p = node->sub_nodes; p; p = p->next) {
++        sub_node = (XMLNode *) p->data;
++        if (g_strcmp0 (sub_node->name, "iso639Id") == 0) {
++            lang_list = g_list_append (lang_list,
++                                       (gpointer) g_strdup (sub_node->text));
++            continue;
 +        }
-+        g_free (path);
++    }
++    if (lang_list == NULL) {
++        /* some nodes have no lang */
 +        return;
 +    }
-+    IBUS_ENGINE_CLASS (ibus_simple_engine_parent_class)->property_activate (engine, prop_name, prop_state);
-+}
-+
-+static void
-+ibus_simple_engine_commit_char (IBusSimpleEngine *simple,
-+                                    gunichar             ch)
-+{
-+    g_return_if_fail (g_unichar_validate (ch));
-+
-+    if (simple->tentative_match || simple->in_hex_sequence) {
-+        simple->in_hex_sequence = FALSE;
-+        simple->tentative_match = 0;
-+        simple->tentative_match_len = 0;
-+        ibus_simple_engine_update_preedit_text (simple);
++    if (g_hash_table_lookup (priv->layout_lang, layout_name) != NULL) {
++        g_warning ("duplicated name %s exists", layout_name);
++        return;
 +    }
-+
-+    ibus_engine_commit_text ((IBusEngine *)simple,
-+            ibus_text_new_from_unichar (ch));
++    g_hash_table_insert (priv->layout_lang,
++                         (gpointer) g_strdup (layout_name),
++                         (gpointer) lang_list);
 +}
 +
-+static void
-+ibus_simple_engine_update_preedit_text (IBusSimpleEngine *simple)
++static const gchar *
++parse_xkb_xml_configitem_node (IBusXKBConfigRegistryPrivate *priv,
++                               XMLNode *parent_node)
 +{
-+    gunichar outbuf[MAX_COMPOSE_LEN + 2];
-+    int len = 0;
-+
-+    if (simple->in_hex_sequence) {
-+        int hexchars = 0;
-+
-+        outbuf[0] = L'u';
-+        len = 1;
++    XMLNode *node = parent_node;
++    XMLNode *sub_node;
++    GList *p;
++    gchar *name = NULL;
++    gchar *description = NULL;
 +
-+        while (simple->compose_buffer[hexchars] != 0) {
-+            outbuf[len] = ibus_keyval_to_unicode (simple->compose_buffer[hexchars]);
-+            ++len;
-+            ++hexchars;
++    g_assert (node != NULL);
++    for (p = node->sub_nodes; p; p = p->next) {
++        sub_node = (XMLNode *) p->data;
++        if (g_strcmp0 (sub_node->name, "name") == 0) {
++            name = sub_node->text;
++            continue;
++        }
++        if (g_strcmp0 (sub_node->name, "description") == 0) {
++            description = sub_node->text;
++            continue;
++        }
++        if (g_strcmp0 (sub_node->name, "languageList") == 0) {
++            if (name == NULL) {
++                g_warning ("layout name is NULL in node %s", node->name);
++                continue;
++            }
++            parse_xkb_xml_languagelist_node (priv, sub_node, name);
++            continue;
 +        }
-+        g_assert (len <= MAX_COMPOSE_LEN + 1);
 +    }
-+    else if (simple->tentative_match)
-+        outbuf[len++] = simple->tentative_match;
-+
-+    outbuf[len] = L'\0';
-+    if (len == 0) {
-+        ibus_engine_hide_preedit_text ((IBusEngine *)simple);
++    if (name == NULL) {
++        g_warning ("No name in layout node");
++        return NULL;
 +    }
-+    else {
-+        IBusText *text = ibus_text_new_from_ucs4 (outbuf);
-+        ibus_text_append_attribute (text,
-+                IBUS_ATTR_TYPE_UNDERLINE, IBUS_ATTR_UNDERLINE_SINGLE, 0, len);
-+        g_debug ("UpdatePreedit text=%s", text->text);
-+        ibus_engine_update_preedit_text ((IBusEngine *)simple, text, len, TRUE);
++    if (g_hash_table_lookup (priv->layout_desc, name) != NULL) {
++        g_warning ("duplicated name %s exists", name);
++        return name;
 +    }
-+}
-+
++    g_hash_table_insert (priv->layout_desc,
++                         (gpointer) g_strdup (name),
++                         (gpointer) g_strdup (description));
 +
-+/* In addition to the table-driven sequences, we allow Unicode hex
-+ * codes to be entered. The method chosen here is similar to the
-+ * one recommended in ISO 14755, but not exactly the same, since we
-+ * don't want to steal 16 valuable key combinations.
-+ *
-+ * A hex Unicode sequence must be started with Ctrl-Shift-U, followed
-+ * by a sequence of hex digits entered with Ctrl-Shift still held.
-+ * Releasing one of the modifiers or pressing space while the modifiers
-+ * are still held commits the character. It is possible to erase
-+ * digits using backspace.
-+ *
-+ * As an extension to the above, we also allow to start the sequence
-+ * with Ctrl-Shift-U, then release the modifiers before typing any
-+ * digits, and enter the digits without modifiers.
-+ */
-+#define HEX_MOD_MASK (IBUS_CONTROL_MASK | IBUS_SHIFT_MASK)
++    return name;
++}
 +
-+static gboolean
-+check_hex (IBusSimpleEngine *simple,
-+           gint                 n_compose)
++static const gchar *
++parse_xkb_xml_variant_configitem_node (IBusXKBConfigRegistryPrivate *priv,
++                            XMLNode *parent_node,
++                            const gchar *layout_name)
 +{
-+    gint i;
-+    GString *str;
-+    gulong n;
-+    gchar *nptr = NULL;
-+    gchar buf[7];
-+
-+    simple->tentative_match = 0;
-+    simple->tentative_match_len = 0;
-+
-+    str = g_string_new (NULL);
-+
-+    i = 0;
-+    while (i < n_compose) {
-+        gunichar ch;
-+
-+        ch = ibus_keyval_to_unicode (simple->compose_buffer[i]);
-+
-+        if (ch == 0)
-+            return FALSE;
-+
-+        if (!g_unichar_isxdigit (ch))
-+            return FALSE;
-+
-+        buf[g_unichar_to_utf8 (ch, buf)] = '\0';
-+
-+        g_string_append (str, buf);
++    XMLNode *node = parent_node;
++    XMLNode *sub_node;
++    GList *p;
++    gchar *name = NULL;
++    gchar *description = NULL;
++    gchar *variant_lang_name = NULL;
 +
-+        ++i;
++    g_assert (node != NULL);
++    g_assert (layout_name != NULL);
++    for (p = node->sub_nodes; p; p = p->next) {
++        sub_node = (XMLNode *) p->data;
++        if (g_strcmp0 (sub_node->name, "name") == 0) {
++            name = sub_node->text;
++            continue;
++        }
++        if (g_strcmp0 (sub_node->name, "description") == 0) {
++            description = sub_node->text;
++            continue;
++        }
++        if (g_strcmp0 (sub_node->name, "languageList") == 0) {
++            if (name == NULL) {
++                g_warning ("layout name is NULL in node %s", node->name);
++                continue;
++            }
++            variant_lang_name = g_strdup_printf ("%s(%s)", layout_name, name);
++            parse_xkb_xml_languagelist_node (priv, sub_node, variant_lang_name);
++            g_free (variant_lang_name);
++            continue;
++        }
 +    }
-+
-+    n = strtoul (str->str, &nptr, 16);
-+
-+    /* if strtoul fails it probably means non-latin digits were used;
-+     * we should in principle handle that, but we probably don't.
-+     */
-+    if (nptr - str->str < str->len) {
-+        g_string_free (str, TRUE);
-+        return FALSE;
-+    } else
-+        g_string_free (str, TRUE);
-+
-+    if (g_unichar_validate (n)) {
-+        simple->tentative_match = n;
-+        simple->tentative_match_len = n_compose;
++    if (name == NULL) {
++        g_warning ("No name in layout node");
++        return NULL;
 +    }
-+
-+    return TRUE;
-+}
-+
-+static int
-+compare_seq_index (const void *key, const void *value)
-+{
-+    const guint *keysyms = key;
-+    const guint16 *seq = value;
-+
-+    if (keysyms[0] < seq[0])
-+        return -1;
-+    else if (keysyms[0] > seq[0])
-+        return 1;
-+    return 0;
++    if (g_hash_table_lookup (priv->variant_desc, name) != NULL) {
++        /* This is an expected case. */
++        return name;
++    }
++    variant_lang_name = g_strdup_printf ("%s(%s)", layout_name, name);
++    g_hash_table_insert (priv->variant_desc,
++                         (gpointer) variant_lang_name,
++                         (gpointer) g_strdup (description));
++    return name;
 +}
 +
-+static int
-+compare_seq (const void *key, const void *value)
++static const gchar *
++parse_xkb_xml_variant_node (IBusXKBConfigRegistryPrivate *priv,
++                            XMLNode *parent_node,
++                            const gchar *layout_name)
 +{
-+    int i = 0;
-+    const guint *keysyms = key;
-+    const guint16 *seq = value;
-+
-+    while (keysyms[i]) {
-+        if (keysyms[i] < seq[i])
-+            return -1;
-+        else if (keysyms[i] > seq[i])
-+            return 1;
++    XMLNode *node = parent_node;
++    XMLNode *sub_node;
++    GList *p;
++    const gchar *variant_name = NULL;
 +
-+        i++;
++    g_assert (node != NULL);
++    g_assert (layout_name != NULL);
++    for (p = node->sub_nodes; p; p = p->next) {
++        sub_node = (XMLNode *) p->data;
++        if (g_strcmp0 (sub_node->name, "configItem") == 0) {
++            variant_name = parse_xkb_xml_variant_configitem_node (priv, sub_node, layout_name);
++            continue;
++        }
 +    }
-+
-+    return 0;
++    return variant_name;
 +}
 +
-+
-+static gboolean
-+check_addon_table (IBusSimpleEngine *simple,
-+                   gint              n_compose)
++static GList *
++parse_xkb_xml_variantlist_node (IBusXKBConfigRegistryPrivate *priv,
++                                XMLNode *parent_node,
++                                const gchar *layout_name,
++                                GList *variant_list)
 +{
-+    IBusComposeAddOnTableType table_type;
-+    const guint16 *data = NULL;
-+    gint max_seq_len = 0;
-+    gint n_seqs = 0;
-+    gint row_stride = 0;
-+    guint16 *seq;
-+
-+    g_assert (IBUS_IS_SIMPLE_ENGINE (simple));
-+
-+    table_type = IBUS_SIMPLE_ENGINE_GET_CLASS (simple)->compose_addon_table_type;
-+
-+    if (table_type == IBUS_COMPOSE_TABLE_CEDILLA) {
-+        data = cedilla_compose_seqs;
-+        max_seq_len = 4;
-+        n_seqs = G_N_ELEMENTS (cedilla_compose_seqs) / (4 + 2);
-+    }
-+    else {
-+        return FALSE;
-+    }
-+
-+    /* Will never match, if the sequence in the compose buffer is longer
-+     * than the sequences in the table.  Further, compare_seq (key, val)
-+     * will overrun val if key is longer than val. */
-+    if (n_compose > max_seq_len) {
-+        return FALSE;
-+    }
-+
-+    row_stride = max_seq_len + 2;
-+    seq = bsearch (simple->compose_buffer,
-+                   data, n_seqs,
-+                   sizeof (guint16) *  row_stride,
-+                   compare_seq);
-+
-+    if (seq) {
-+        guint16 *prev_seq;
-+
-+        /* Back up to the first sequence that matches to make sure
-+         * we find the exact match if their is one.
-+         */
-+        while (seq > data) {
-+            prev_seq = seq - row_stride;
-+            if (compare_seq (simple->compose_buffer, prev_seq) != 0) {
-+                break;
-+            }
-+            seq = prev_seq;
-+        }
-+
-+        /* complete sequence */
-+        if (n_compose == max_seq_len || seq[n_compose] == 0) {
-+            guint16 *next_seq;
-+            gunichar value =
-+                0x10000 * seq[max_seq_len] + seq[max_seq_len + 1];
-+
-+            /* We found a tentative match. See if there are any longer
-+             * sequences containing this subsequence
-+             */
-+            next_seq = seq + row_stride;
-+            if (next_seq < data + row_stride * n_seqs) {
-+                if (compare_seq (simple->compose_buffer, next_seq) == 0) {
-+                    simple->tentative_match = value;
-+                    simple->tentative_match_len = n_compose;
-+
-+                    ibus_simple_engine_update_preedit_text (simple);
++    XMLNode *node = parent_node;
++    XMLNode *sub_node;
++    GList *p;
++    const gchar *variant_name = NULL;
 +
-+                    return TRUE;
-+                }
++    g_assert (node != NULL);
++    g_assert (layout_name != NULL);
++    for (p = node->sub_nodes; p; p = p->next) {
++        sub_node = (XMLNode *) p->data;
++        if (g_strcmp0 (sub_node->name, "variant") == 0) {
++            variant_name = parse_xkb_xml_variant_node (priv, sub_node, layout_name);
++            if (variant_name != NULL) {
++                variant_list = g_list_append (variant_list,
++                                              (gpointer) g_strdup (variant_name));
 +            }
-+
-+            ibus_simple_engine_commit_char (simple, value);
-+            g_debug ("U+%04X\n", value);
-+            simple->compose_buffer[0] = 0;
++            continue;
 +        }
-+        return TRUE;
 +    }
-+    return FALSE;
++    return variant_list;
 +}
 +
-+static gboolean
-+check_compact_table (IBusSimpleEngine          *simple,
-+                     const GtkComposeTableCompact *table,
-+                     gint                          n_compose)
++static void
++parse_xkb_xml_layout_node (IBusXKBConfigRegistryPrivate *priv,
++                           XMLNode *parent_node)
 +{
-+    gint row_stride;
-+    guint16 *seq_index;
-+    guint16 *seq;
-+    gint i;
-+
-+    /* Will never match, if the sequence in the compose buffer is longer
-+     * than the sequences in the table.  Further, compare_seq (key, val)
-+     * will overrun val if key is longer than val. */
-+    if (n_compose > table->max_seq_len)
-+        return FALSE;
-+
-+    g_debug ("check_compact_table(n_compose=%d) [%04x, %04x, %04x, %04x]",
-+            n_compose,
-+            simple->compose_buffer[0],
-+            simple->compose_buffer[1],
-+            simple->compose_buffer[2],
-+            simple->compose_buffer[3]);
-+
-+    seq_index = bsearch (simple->compose_buffer,
-+                         table->data,
-+                         table->n_index_size,
-+                         sizeof (guint16) *  table->n_index_stride,
-+                         compare_seq_index);
-+
-+    if (seq_index == NULL) {
-+        g_debug ("compact: no\n");
-+        return FALSE;
-+    }
-+
-+    if (n_compose == 1) {
-+        g_debug ("compact: yes\n");
-+        return TRUE;
-+    }
++    XMLNode *node = parent_node;
++    XMLNode *sub_node;
++    GList *p;
++    const gchar *name = NULL;
++    GList *variant_list = NULL;
 +
-+    g_debug ("compact: %04x ", *seq_index);
-+    seq = NULL;
-+
-+    for (i = n_compose - 1; i < table->max_seq_len; i++) {
-+        row_stride = i + 1;
-+
-+        if (seq_index[i + 1] - seq_index[i] > 0) {
-+            seq = bsearch (simple->compose_buffer + 1,
-+                           table->data + seq_index[i],
-+                           (seq_index[i + 1] - seq_index[i]) / row_stride,
-+                           sizeof (guint16) * row_stride,
-+                           compare_seq);
-+            g_debug ("seq = %p", seq);
-+
-+            if (seq) {
-+                if (i == n_compose - 1)
-+                    break;
-+                else {
-+                    ibus_simple_engine_update_preedit_text (simple);
-+                    g_debug ("yes\n");
-+                    return TRUE;
-+                }
++    g_assert (node != NULL);
++    for (p = node->sub_nodes; p; p = p->next) {
++        sub_node = (XMLNode *) p->data;
++        if (g_strcmp0 (sub_node->name, "configItem") == 0) {
++            name = parse_xkb_xml_configitem_node (priv, sub_node);
++            continue;
++        }
++        if (g_strcmp0 (sub_node->name, "variantList") == 0) {
++            if (name == NULL) {
++                g_warning ("layout name is NULL in node %s", node->name);
++                continue;
 +            }
++            variant_list = parse_xkb_xml_variantlist_node (priv, sub_node,
++                                                           name,
++                                                           variant_list);
++            continue;
 +        }
 +    }
-+
-+    if (!seq) {
-+        g_debug ("no\n");
-+        return FALSE;
-+    }
-+    else {
-+        gunichar value;
-+
-+        value = seq[row_stride - 1];
-+        ibus_simple_engine_commit_char (simple, value);
-+        simple->compose_buffer[0] = 0;
-+
-+        g_debug ("U+%04X\n", value);
-+        return TRUE;
++    if (g_hash_table_lookup (priv->layout_list, name) != NULL) {
++        g_warning ("duplicated name %s exists", name);
++        return;
 +    }
++    g_hash_table_insert (priv->layout_list,
++                         (gpointer) g_strdup (name),
++                         (gpointer) variant_list);
 +}
 +
-+/* Checks if a keysym is a dead key. Dead key keysym values are defined in
-+ * ../gdk/gdkkeysyms.h and the first is GDK_KEY_dead_grave. As X.Org is updated,
-+ * more dead keys are added and we need to update the upper limit.
-+ * Currently, the upper limit is GDK_KEY_dead_dasia+1. The +1 has to do with
-+ * a temporary issue in the X.Org header files.
-+ * In future versions it will be just the keysym (no +1).
-+ */
-+#define IS_DEAD_KEY(k) \
-+      ((k) >= IBUS_dead_grave && (k) <= (IBUS_dead_dasia+1))
-+
-+/* This function receives a sequence of Unicode characters and tries to
-+ * normalize it (NFC). We check for the case the the resulting string
-+ * has length 1 (single character).
-+ * NFC normalisation normally rearranges diacritic marks, unless these
-+ * belong to the same Canonical Combining Class.
-+ * If they belong to the same canonical combining class, we produce all
-+ * permutations of the diacritic marks, then attempt to normalize.
-+ */
-+static gboolean
-+check_normalize_nfc (gunichar* combination_buffer, gint n_compose)
++static void
++parse_xkb_xml_top_node (IBusXKBConfigRegistryPrivate *priv,
++                        XMLNode *parent_node)
 +{
-+    gunichar combination_buffer_temp[MAX_COMPOSE_LEN];
-+    gchar *combination_utf8_temp = NULL;
-+    gchar *nfc_temp = NULL;
-+    gint n_combinations;
-+    gunichar temp_swap;
-+    gint i;
-+
-+    n_combinations = 1;
-+
-+    for (i = 1; i < n_compose; i++ )
-+        n_combinations *= i;
-+
-+    /* Xorg reuses dead_tilde for the perispomeni diacritic mark.
-+     * We check if base character belongs to Greek Unicode block,
-+     * and if so, we replace tilde with perispomeni. */
-+    if (combination_buffer[0] >= 0x390 && combination_buffer[0] <= 0x3FF) {
-+        for (i = 1; i < n_compose; i++ )
-+            if (combination_buffer[i] == 0x303)
-+                combination_buffer[i] = 0x342;
-+    }
-+
-+    memcpy (combination_buffer_temp, combination_buffer, MAX_COMPOSE_LEN * sizeof (gunichar) );
-+
-+    for (i = 0; i < n_combinations; i++ ) {
-+        g_unicode_canonical_ordering (combination_buffer_temp, n_compose);
-+        combination_utf8_temp = g_ucs4_to_utf8 (combination_buffer_temp, -1, NULL, NULL, NULL);
-+        nfc_temp = g_utf8_normalize (combination_utf8_temp, -1, G_NORMALIZE_NFC);
-+
-+        if (g_utf8_strlen (nfc_temp, -1) == 1) {
-+            memcpy (combination_buffer, combination_buffer_temp, MAX_COMPOSE_LEN * sizeof (gunichar) );
++    XMLNode *node = parent_node;
++    XMLNode *sub_node;
++    GList *p;
 +
-+            g_free (combination_utf8_temp);
-+            g_free (nfc_temp);
++    g_assert (priv != NULL);
++    g_assert (node != NULL);
 +
-+            return TRUE;
++    if (g_strcmp0 (node->name, "xkbConfigRegistry") != 0) {
++        g_warning ("node has no xkbConfigRegistry name");
++        return;
++    }
++    for (p = node->sub_nodes; p; p = p->next) {
++        sub_node = (XMLNode *) p->data;
++        if (g_strcmp0 (sub_node->name, "layoutList") == 0) {
++            break;
 +        }
-+
-+        g_free (combination_utf8_temp);
-+        g_free (nfc_temp);
-+
-+        if (n_compose > 2) {
-+            temp_swap = combination_buffer_temp[i % (n_compose - 1) + 1];
-+            combination_buffer_temp[i % (n_compose - 1) + 1] = combination_buffer_temp[(i+1) % (n_compose - 1) + 1];
-+            combination_buffer_temp[(i+1) % (n_compose - 1) + 1] = temp_swap;
++    }
++    if (p == NULL) {
++        g_warning ("xkbConfigRegistry node has no layoutList node");
++        return;
++    }
++    node = sub_node;
++    for (p = node->sub_nodes; p; p = p->next) {
++        sub_node = (XMLNode *) p->data;
++        if (g_strcmp0 (sub_node->name, "layout") == 0) {
++            parse_xkb_xml_layout_node (priv, sub_node);
++            continue;
 +        }
-+        else
-+            break;
 +    }
-+
-+    return FALSE;
 +}
 +
-+static gboolean
-+check_algorithmically (IBusSimpleEngine *simple,
-+                       gint                n_compose)
-+
++static void
++free_lang_list (GList *list)
 +{
-+    gint i;
-+    gunichar combination_buffer[MAX_COMPOSE_LEN];
-+    gchar *combination_utf8, *nfc;
-+
-+    if (n_compose >= MAX_COMPOSE_LEN)
-+        return FALSE;
-+
-+    for (i = 0; i < n_compose && IS_DEAD_KEY (simple->compose_buffer[i]); i++)
-+        ;
-+    if (i == n_compose)
-+        return TRUE;
-+
-+    if (i > 0 && i == n_compose - 1) {
-+        combination_buffer[0] = ibus_keyval_to_unicode (simple->compose_buffer[i]);
-+        combination_buffer[n_compose] = 0;
-+        i--;
-+        while (i >= 0) {
-+        switch (simple->compose_buffer[i]) {
-+#define CASE(keysym, unicode) \
-+        case IBUS_dead_##keysym: combination_buffer[i+1] = unicode; break
-+        CASE (grave, 0x0300);
-+        CASE (acute, 0x0301);
-+        CASE (circumflex, 0x0302);
-+        CASE (tilde, 0x0303);    /* Also used with perispomeni, 0x342. */
-+        CASE (macron, 0x0304);
-+        CASE (breve, 0x0306);
-+        CASE (abovedot, 0x0307);
-+        CASE (diaeresis, 0x0308);
-+        CASE (hook, 0x0309);
-+        CASE (abovering, 0x030A);
-+        CASE (doubleacute, 0x030B);
-+        CASE (caron, 0x030C);
-+        CASE (abovecomma, 0x0313);         /* Equivalent to psili */
-+        CASE (abovereversedcomma, 0x0314); /* Equivalent to dasia */
-+        CASE (horn, 0x031B);    /* Legacy use for psili, 0x313 (or 0x343). */
-+        CASE (belowdot, 0x0323);
-+        CASE (cedilla, 0x0327);
-+        CASE (ogonek, 0x0328);    /* Legacy use for dasia, 0x314.*/
-+        CASE (iota, 0x0345);
-+        CASE (voiced_sound, 0x3099);    /* Per Markus Kuhn keysyms.txt file. */
-+        CASE (semivoiced_sound, 0x309A);    /* Per Markus Kuhn keysyms.txt file. */
-+
-+        /* The following cases are to be removed once xkeyboard-config,
-+          * xorg are fully updated.
-+          */
-+            /* Workaround for typo in 1.4.x xserver-xorg */
-+        case 0xfe66: combination_buffer[i+1] = 0x314; break;
-+        /* CASE (dasia, 0x314); */
-+        /* CASE (perispomeni, 0x342); */
-+        /* CASE (psili, 0x343); */
-+#undef CASE
-+        default:
-+            combination_buffer[i+1] = ibus_keyval_to_unicode (simple->compose_buffer[i]);
-+        }
-+        i--;
-+    }
-+
-+        /* If the buffer normalizes to a single character,
-+         * then modify the order of combination_buffer accordingly, if necessary,
-+         * and return TRUE.
-+         */
-+        if (check_normalize_nfc (combination_buffer, n_compose)) {
-+            gunichar value;
-+            combination_utf8 = g_ucs4_to_utf8 (combination_buffer, -1, NULL, NULL, NULL);
-+            nfc = g_utf8_normalize (combination_utf8, -1, G_NORMALIZE_NFC);
-+
-+            value = g_utf8_get_char (nfc);
-+            ibus_simple_engine_commit_char (simple, value);
-+            simple->compose_buffer[0] = 0;
-+
-+            g_free (combination_utf8);
-+            g_free (nfc);
-+
-+            return TRUE;
-+        }
++    GList *l = list;
++    while (l) {
++        g_free (l->data);
++        l->data = NULL;
++        l = l->next;
 +    }
-+
-+    return FALSE;
++    g_list_free (list);
 +}
 +
-+static gboolean
-+no_sequence_matches (IBusSimpleEngine *simple,
-+                     gint                 n_compose,
-+                     guint                keyval,
-+                     guint                keycode,
-+                     guint                modifiers)
++static void
++parse_xkb_config_registry_file (IBusXKBConfigRegistryPrivate *priv,
++                                const gchar *file)
 +{
-+    gunichar ch;
-+
-+    /* No compose sequences found, check first if we have a partial
-+     * match pending.
-+     */
-+    if (simple->tentative_match) {
-+        gint len = simple->tentative_match_len;
-+        int i;
-+
-+        ibus_simple_engine_commit_char (simple,
-+                                            simple->tentative_match);
-+        simple->compose_buffer[0] = 0;
-+
-+        for (i=0; i < n_compose - len - 1; i++) {
-+            ibus_simple_engine_process_key_event (
-+                    (IBusEngine *)simple,
-+                    simple->compose_buffer[len + i],
-+                    0, 0);
-+        }
++    XMLNode *node;
 +
-+        return ibus_simple_engine_process_key_event (
-+                (IBusEngine *)simple, keyval, keycode, modifiers);
-+    }
-+    else {
-+        simple->compose_buffer[0] = 0;
-+        if (n_compose > 1) {
-+            /* Invalid sequence */
-+            // FIXME beep_window (event->window);
-+            return TRUE;
-+        }
++    g_assert (file != NULL);
 +
-+        ch = ibus_keyval_to_unicode (keyval);
-+        /* IBUS_CHANGE: RH#769133
-+         * Since we use ibus xkb engines as the disable state,
-+         * do not commit the characters locally without in_hex_sequence. */
-+        if (ch != 0 && !g_unichar_iscntrl (ch) &&
-+            simple->in_hex_sequence) {
-+            ibus_simple_engine_commit_char (simple, ch);
-+            return TRUE;
-+        }
-+        else
-+            return FALSE;
-+    }
++    priv->layout_list = g_hash_table_new_full (g_str_hash,
++                                               (GEqualFunc) g_str_equal,
++                                               (GDestroyNotify) g_free,
++                                               (GDestroyNotify) free_lang_list);
++    priv->layout_desc = g_hash_table_new_full (g_str_hash,
++                                               (GEqualFunc) g_str_equal,
++                                               (GDestroyNotify) g_free,
++                                               (GDestroyNotify) g_free);
++    priv->layout_lang = g_hash_table_new_full (g_str_hash,
++                                               (GEqualFunc) g_str_equal,
++                                               (GDestroyNotify) g_free,
++                                               (GDestroyNotify) free_lang_list);
++    priv->variant_desc = g_hash_table_new_full (g_str_hash,
++                                               (GEqualFunc) g_str_equal,
++                                               (GDestroyNotify) g_free,
++                                               (GDestroyNotify) g_free);
++    node = ibus_xml_parse_file (file);
++    parse_xkb_xml_top_node (priv, node);
++    ibus_xml_free (node);
 +}
 +
-+gboolean
-+ibus_simple_engine_process_key_event (IBusEngine *engine,
-+                                      guint       keyval,
-+                                      guint       keycode,
-+                                      guint       modifiers)
++static void
++ibus_xkb_config_registry_init (IBusXKBConfigRegistry *xkb_config)
 +{
-+    IBusSimpleEngine *simple = (IBusSimpleEngine *)engine;
-+    gint n_compose = 0;
-+    gboolean have_hex_mods;
-+    gboolean is_hex_start;
-+    gboolean is_hex_end;
-+    gboolean is_backspace;
-+    gboolean is_escape;
-+    guint hex_keyval;
-+    gint i;
-+
-+    while (simple->compose_buffer[n_compose] != 0)
-+        n_compose++;
-+
-+    if (n_compose >= MAX_COMPOSE_LEN)
-+        return TRUE;
++    IBusXKBConfigRegistryPrivate *priv;
++    const gchar *file = XKB_RULES_XML_FILE;
 +
-+    if (modifiers & IBUS_RELEASE_MASK) {
-+        if (simple->in_hex_sequence &&
-+            (keyval == IBUS_Control_L || keyval == IBUS_Control_R ||
-+             keyval == IBUS_Shift_L || keyval == IBUS_Shift_R)) {
-+            if (simple->tentative_match &&
-+                g_unichar_validate (simple->tentative_match)) {
-+                ibus_simple_engine_commit_char (simple,
-+                                                    simple->tentative_match);
-+            }
-+            else if (n_compose == 0) {
-+                simple->modifiers_dropped = TRUE;
-+            }
-+            else {
-+                /* invalid hex sequence */
-+                /* FIXME beep_window (event->window); */
-+                simple->tentative_match = 0;
-+                simple->in_hex_sequence = FALSE;
-+                simple->compose_buffer[0] = 0;
-+
-+                ibus_simple_engine_update_preedit_text (simple);
-+            }
++    priv = IBUS_XKB_CONFIG_REGISTRY_GET_PRIVATE (xkb_config);
++    parse_xkb_config_registry_file (priv, file);
++}
 +
-+            return TRUE;
-+        }
-+        else
-+            return FALSE;
-+    }
++static void
++ibus_xkb_config_registry_destroy (IBusXKBConfigRegistry *xkb_config)
++{
++    IBusXKBConfigRegistryPrivate *priv;
 +
-+    /* Ignore modifier key presses */
-+    for (i = 0; i < G_N_ELEMENTS (gtk_compose_ignore); i++)
-+        if (keyval == gtk_compose_ignore[i])
-+            return FALSE;
-+
-+    if (simple->in_hex_sequence && simple->modifiers_dropped)
-+        have_hex_mods = TRUE;
-+    else
-+        have_hex_mods = (modifiers & (HEX_MOD_MASK)) == HEX_MOD_MASK;
-+
-+    is_hex_start = keyval == IBUS_U;
-+    is_hex_end = (keyval == IBUS_space ||
-+                  keyval == IBUS_KP_Space ||
-+                  keyval == IBUS_Return ||
-+                  keyval == IBUS_ISO_Enter ||
-+                  keyval == IBUS_KP_Enter);
-+    is_backspace = keyval == IBUS_BackSpace;
-+    is_escape = keyval == IBUS_Escape;
-+    hex_keyval = keyval;
-+
-+    /* If we are already in a non-hex sequence, or
-+     * this keystroke is not hex modifiers + hex digit, don't filter
-+     * key events with accelerator modifiers held down. We only treat
-+     * Control and Alt as accel modifiers here, since Super, Hyper and
-+     * Meta are often co-located with Mode_Switch, Multi_Key or
-+     * ISO_Level3_Switch.
-+     */
-+    if (!have_hex_mods ||
-+        (n_compose > 0 && !simple->in_hex_sequence) ||
-+        (n_compose == 0 && !simple->in_hex_sequence && !is_hex_start) ||
-+        (simple->in_hex_sequence && !hex_keyval &&
-+         !is_hex_start && !is_hex_end && !is_escape && !is_backspace)) {
-+        if (modifiers & (IBUS_MOD1_MASK | IBUS_CONTROL_MASK) ||
-+            (simple->in_hex_sequence && simple->modifiers_dropped &&
-+             (keyval == IBUS_Return ||
-+              keyval == IBUS_ISO_Enter ||
-+              keyval == IBUS_KP_Enter))) {
-+              return FALSE;
-+        }
-+    }
++    g_return_if_fail (xkb_config != NULL);
 +
-+    /* Handle backspace */
-+    if (simple->in_hex_sequence && have_hex_mods && is_backspace) {
-+        if (n_compose > 0) {
-+        n_compose--;
-+            simple->compose_buffer[n_compose] = 0;
-+            check_hex (simple, n_compose);
-+    }
-+        else {
-+        simple->in_hex_sequence = FALSE;
-+    }
++    priv = IBUS_XKB_CONFIG_REGISTRY_GET_PRIVATE (xkb_config);
 +
-+        ibus_simple_engine_update_preedit_text (simple);
++    g_hash_table_destroy (priv->layout_list);
++    priv->layout_list = NULL;
++    g_hash_table_destroy (priv->layout_lang);
++    priv->layout_lang= NULL;
++    g_hash_table_destroy (priv->layout_desc);
++    priv->layout_desc= NULL;
++    g_hash_table_destroy (priv->variant_desc);
++    priv->variant_desc = NULL;
 +
-+        return TRUE;
-+    }
++    IBUS_OBJECT_CLASS(ibus_xkb_config_registry_parent_class)->destroy (IBUS_OBJECT (xkb_config));
++}
 +
-+    /* Check for hex sequence restart */
-+    if (simple->in_hex_sequence && have_hex_mods && is_hex_start) {
-+        if (simple->tentative_match &&
-+            g_unichar_validate (simple->tentative_match)) {
-+            ibus_simple_engine_commit_char (simple, simple->tentative_match);
-+        }
-+        else {
-+            /* invalid hex sequence */
-+            if (n_compose > 0) {
-+                // FIXME beep_window (event->window);
-+                simple->tentative_match = 0;
-+                simple->in_hex_sequence = FALSE;
-+                simple->compose_buffer[0] = 0;
-+            }
-+        }
-+    }
++static void
++ibus_xkb_config_registry_class_init (IBusXKBConfigRegistryClass *klass)
++{
++    IBusObjectClass *ibus_object_class = IBUS_OBJECT_CLASS (klass);
 +
-+    /* Check for hex sequence start */
-+    if (!simple->in_hex_sequence && have_hex_mods && is_hex_start) {
-+        simple->compose_buffer[0] = 0;
-+        simple->in_hex_sequence = TRUE;
-+        simple->modifiers_dropped = FALSE;
-+        simple->tentative_match = 0;
++    g_type_class_add_private (klass, sizeof (IBusXKBConfigRegistryPrivate));
 +
-+        g_debug ("Start HEX MODE");
++    ibus_object_class->destroy = (IBusObjectDestroyFunc) ibus_xkb_config_registry_destroy;
++}
 +
-+        ibus_simple_engine_update_preedit_text (simple);
++IBusXKBConfigRegistry *
++ibus_xkb_config_registry_new (void)
++{
++    IBusXKBConfigRegistry *xkb_config;
 +
-+        return TRUE;
-+    }
++    xkb_config = IBUS_XKB_CONFIG_REGISTRY (g_object_new (IBUS_TYPE_XKB_CONFIG_REGISTRY, NULL));
++    return xkb_config;
++}
 +
-+    /* Then, check for compose sequences */
-+    if (simple->in_hex_sequence) {
-+        if (hex_keyval)
-+            simple->compose_buffer[n_compose++] = hex_keyval;
-+        else if (is_escape) {
-+            // FIXME
-+            ibus_simple_engine_reset (engine);
++#define TABLE_FUNC(field_name) const GHashTable *                       \
++ibus_xkb_config_registry_get_##field_name  (IBusXKBConfigRegistry *xkb_config) \
++{                                                                       \
++    IBusXKBConfigRegistryPrivate *priv;                                 \
++                                                                        \
++    g_return_val_if_fail (xkb_config != NULL, NULL);                    \
++    priv = IBUS_XKB_CONFIG_REGISTRY_GET_PRIVATE (xkb_config);           \
++    return priv->field_name;                                            \
++}
 +
-+            return TRUE;
-+        }
-+        else if (!is_hex_end) {
-+            // FIXME
-+            /* non-hex character in hex sequence */
-+            // beep_window (event->window);
-+            return TRUE;
-+        }
-+    }
-+    else
-+        simple->compose_buffer[n_compose++] = keyval;
-+
-+    simple->compose_buffer[n_compose] = 0;
-+
-+    if (simple->in_hex_sequence) {
-+        /* If the modifiers are still held down, consider the sequence again */
-+        if (have_hex_mods) {
-+            /* space or return ends the sequence, and we eat the key */
-+            if (n_compose > 0 && is_hex_end) {
-+                if (simple->tentative_match &&
-+                    g_unichar_validate (simple->tentative_match)) {
-+                    ibus_simple_engine_commit_char (simple,
-+                            simple->tentative_match);
-+                    simple->compose_buffer[0] = 0;
-+                }
-+                else {
-+                    // FIXME
-+                    /* invalid hex sequence */
-+                    // beep_window (event->window);
-+                    simple->tentative_match = 0;
-+                    simple->in_hex_sequence = FALSE;
-+                    simple->compose_buffer[0] = 0;
-+                }
-+            }
-+            else if (!check_hex (simple, n_compose))
-+                // FIXME
-+                // beep_window (event->window);
-+                ;
-+            ibus_simple_engine_update_preedit_text (simple);
++TABLE_FUNC (layout_list)
++TABLE_FUNC (layout_lang)
++TABLE_FUNC (layout_desc)
++TABLE_FUNC (variant_desc)
 +
-+            return TRUE;
-+        }
-+    }
-+    else {
-+        // TODO CONT
-+        if (check_addon_table (simple, n_compose)) {
-+            return TRUE;
-+        }
-+        if (check_compact_table (simple, &gtk_compose_table_compact, n_compose))
-+            return TRUE;
++#undef TABLE_FUNC
 +
-+        if (check_algorithmically (simple, n_compose))
-+            return TRUE;
-+    }
++GList *
++ibus_xkb_config_registry_layout_list_get_layouts (IBusXKBConfigRegistry *xkb_config)
++{
++    GHashTable *table;
++    GList *list = NULL;
 +
-+    /* The current compose_buffer doesn't match anything */
-+    return no_sequence_matches (simple, n_compose, keyval, keycode, modifiers);
++    table = (GHashTable *)
++        ibus_xkb_config_registry_get_layout_list (xkb_config);
++    list = (GList *) g_hash_table_get_keys (table);
++    return list;
 +}
-diff --git a/xkb/ibus-simple-engine.h b/xkb/ibus-simple-engine.h
-new file mode 100644
-index 0000000..dbc725a
---- /dev/null
-+++ b/xkb/ibus-simple-engine.h
-@@ -0,0 +1,13 @@
-+#ifndef __IBUS_SIMPLE_ENGINE_H__
-+#define __IBUS_SIMPLE_ENGINE_H__
 +
-+#include <ibus.h>
++#define TABLE_LOOKUP_LIST_FUNC(field_name, value) GList *               \
++ibus_xkb_config_registry_##field_name##_get_##value  (IBusXKBConfigRegistry *xkb_config, const gchar *key) \
++{                                                                       \
++    GHashTable *table;                                                  \
++    GList *list = NULL;                                                 \
++                                                                        \
++    table = (GHashTable *)                                              \
++        ibus_xkb_config_registry_get_##field_name (xkb_config);         \
++    list = (GList *) g_hash_table_lookup (table, key);                  \
++    return g_list_copy (list);                                          \
++}
 +
-+#define IBUS_TYPE_SIMPLE_ENGINE (ibus_simple_engine_get_type ())
-+#define IBUS_IS_SIMPLE_ENGINE(obj)              (G_TYPE_CHECK_INSTANCE_TYPE ((obj), IBUS_TYPE_SIMPLE_ENGINE))
-+#define IBUS_SIMPLE_ENGINE_GET_CLASS(obj)   \
-+    (G_TYPE_INSTANCE_GET_CLASS ((obj), IBUS_TYPE_SIMPLE_ENGINE, IBusSimpleEngineClass))
++#define TABLE_LOOKUP_STRING_FUNC(field_name, value) gchar *             \
++ibus_xkb_config_registry_##field_name##_get_##value  (IBusXKBConfigRegistry *xkb_config, const gchar *key) \
++{                                                                       \
++    GHashTable *table;                                                  \
++    const gchar *desc = NULL;                                           \
++                                                                        \
++    table = (GHashTable *)                                              \
++        ibus_xkb_config_registry_get_##field_name (xkb_config);         \
++    desc = (const gchar *) g_hash_table_lookup (table, key);            \
++    return g_strdup (desc);                                             \
++}
 +
-+GType   ibus_simple_engine_get_type    (void);
++TABLE_LOOKUP_LIST_FUNC (layout_list, variants)
++TABLE_LOOKUP_LIST_FUNC (layout_lang, langs)
++TABLE_LOOKUP_STRING_FUNC (layout_desc, desc)
++TABLE_LOOKUP_STRING_FUNC (variant_desc, desc)
 +
-+#endif // __IBUS_SIMPLE_ENGINE_H__
-diff --git a/xkb/ibus-xkb-main.c b/xkb/ibus-xkb-main.c
++#undef TABLE_LOOKUP_LIST_FUNC
++#undef TABLE_LOOKUP_STRING_FUNC
+diff --git a/src/ibusxkbxml.h b/src/ibusxkbxml.h
 new file mode 100644
-index 0000000..ef57553
+index 0000000..6f5b7bd
 --- /dev/null
-+++ b/xkb/ibus-xkb-main.c
-@@ -0,0 +1,112 @@
++++ b/src/ibusxkbxml.h
+@@ -0,0 +1,187 @@
 +/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
 +/* vim:set et sts=4: */
 +/* bus - The Input Bus
-+ * Copyright (C) 2011 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2011 Peng Huang <shawn.p.huang@gmail.com>
-+ * Copyright (C) 2011 Red Hat, Inc.
++ * Copyright (C) 2012 Takao Fujiwara <takao.fujiwara1@gmail.com>
++ * Copyright (C) 2012 Peng Huang <shawn.p.huang@gmail.com>
++ * Copyright (C) 2012 Red Hat, Inc.
 + *
 + * This library is free software; you can redistribute it and/or
 + * modify it under the terms of the GNU Lesser General Public
@@ -9188,980 +2041,1177 @@ index 0000000..ef57553
 + * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 + * Boston, MA 02111-1307, USA.
 + */
-+#ifdef HAVE_CONFIG_H
-+#include <config.h>
++#ifndef __IBUS_XKBXML_H_
++#define __IBUS_XKBXML_H_
++
++#if !defined (__IBUS_H_INSIDE__) && !defined (IBUS_COMPILATION)
++#error "Only <ibus.h> can be included directly"
 +#endif
 +
-+#include <glib.h>
-+#include <glib/gprintf.h>
-+#include <glib/gi18n.h>
-+#include <X11/Xlib.h>
++#include "ibus.h"
++
++/*
++ * Type macros.
++ */
++/* define IBusXKBConfigRegistry macros */
++#define IBUS_TYPE_XKB_CONFIG_REGISTRY                   \
++    (ibus_xkb_config_registry_get_type ())
++#define IBUS_XKB_CONFIG_REGISTRY(obj)                   \
++    (G_TYPE_CHECK_INSTANCE_CAST ((obj), IBUS_TYPE_XKB_CONFIG_REGISTRY, IBusXKBConfigRegistry))
++#define IBUS_XKB_CONFIG_REGISTRY_CLASS(klass)           \
++    (G_TYPE_CHECK_CLASS_CAST ((klass), IBUS_TYPE_XKB_CONFIG_REGISTRY, IBusXKBConfigRegistryClass))
++#define IBUS_IS_XKB_CONFIG_REGISTRY(obj)                \
++    (G_TYPE_CHECK_INSTANCE_TYPE ((obj), IBUS_TYPE_XKB_CONFIG_REGISTRY))
++#define IBUS_IS_XKB_CONFIG_REGISTRY_CLASS(klass)        \
++    (G_TYPE_CHECK_CLASS_TYPE ((klass), IBUS_TYPE_XKB_CONFIG_REGISTRY))
++#define IBUS_XKB_CONFIG_REGISTRY_GET_CLASS(obj)         \
++    (G_TYPE_INSTANCE_GET_CLASS ((obj), IBUS_TYPE_XKB_CONFIG_REGISTRY, IBusXKBConfigRegistryClass))
++
++G_BEGIN_DECLS
++
++typedef struct _IBusXKBConfigRegistry IBusXKBConfigRegistry;
++typedef struct _IBusXKBConfigRegistryClass IBusXKBConfigRegistryClass;
++
++struct _IBusXKBConfigRegistry {
++    IBusObject parent;
++};
++
++struct _IBusXKBConfigRegistryClass {
++    IBusObjectClass parent;
++    /* signals */
++    /*< private >*/
++    /* padding */
++    gpointer pdummy[8];
++};
++
++
++GType            ibus_xkb_config_registry_get_type
++                                                 (void);
++
++/**
++ * ibus_xkb_config_registry_new:
++ * @returns: A newly allocated IBusXKBConfigRegistry
++ *
++ * New an IBusXKBConfigRegistry.
++ */
++IBusXKBConfigRegistry *
++                 ibus_xkb_config_registry_new
++                                                 (void);
++
++/**
++ * ibus_xkb_config_registry_get_layout_list: (skip)
++ * @xkb_config: An IBusXKBConfigRegistry.
++ * @returns: A const GHashTable
++ *
++ * a const GHashTable
++ */
++const GHashTable *
++                 ibus_xkb_config_registry_get_layout_list
++                                                 (IBusXKBConfigRegistry *xkb_config);
++
++/**
++ * ibus_xkb_config_registry_get_layout_lang: (skip)
++ * @xkb_config: An IBusXKBConfigRegistry.
++ * @returns: A const GHashTable
++ *
++ * a const GHashTable
++ */
++const GHashTable *
++                 ibus_xkb_config_registry_get_layout_lang
++                                                 (IBusXKBConfigRegistry *xkb_config);
 +
-+#ifdef ENABLE_NLS
-+#include <locale.h>
-+#endif
++/**
++ * ibus_xkb_config_registry_get_layout_desc: (skip)
++ * @xkb_config: An IBusXKBConfigRegistry.
++ * @returns: A const GHashTable
++ *
++ * a const GHashTable
++ */
++const GHashTable *
++                 ibus_xkb_config_registry_get_layout_desc
++                                                 (IBusXKBConfigRegistry *xkb_config);
 +
-+#include "xkblib.h"
++/**
++ * ibus_xkb_config_registry_get_variant_desc: (skip)
++ * @xkb_config: An IBusXKBConfigRegistry.
++ * @returns: A const GHashTable
++ *
++ * a const GHashTable
++ */
++const GHashTable *
++                 ibus_xkb_config_registry_get_variant_desc
++                                                 (IBusXKBConfigRegistry *xkb_config);
 +
-+static gboolean get_layout = FALSE;
-+static gboolean get_group = FALSE;
-+static gchar *layout = NULL;
-+static gchar *model = NULL;
-+static gchar *option = NULL;
-+static int group = 0;
++/**
++ * ibus_xkb_config_registry_layout_list_get_layouts:
++ * @xkb_config: An IBusXKBConfigRegistry.
++ * @returns: (transfer container) (element-type utf8): A GList of layouts
++ *
++ * a GList of layouts
++ */
++GList *
++                 ibus_xkb_config_registry_layout_list_get_layouts
++                                                 (IBusXKBConfigRegistry *xkb_config);
 +
-+static const GOptionEntry entries[] =
-+{
-+    { "get", 'g', 0, G_OPTION_ARG_NONE, &get_layout, N_("Get current xkb layout"), NULL },
-+    /* Translators: the "layout" should not be translated due to a variable. */
-+    { "layout", 'l', 0, G_OPTION_ARG_STRING, &layout, N_("Set xkb layout"), "layout" },
-+    { "model", 'm', 0, G_OPTION_ARG_STRING, &model, N_("Set xkb model"), "model" },
-+    { "option", 'o', 0, G_OPTION_ARG_STRING, &option, N_("Set xkb option"), "option" },
-+    { "get-group", 'G', 0, G_OPTION_ARG_NONE, &get_group, N_("Get current xkb state"), NULL },
-+    { NULL },
-+};
++/**
++ * ibus_xkb_config_registry_layout_list_get_variants:
++ * @xkb_config: An IBusXKBConfigRegistry.
++ * @layout: A layout.
++ * @returns: (transfer container) (element-type utf8): A GList
++ *
++ * a GList
++ */
++GList *
++                 ibus_xkb_config_registry_layout_list_get_variants
++                                                 (IBusXKBConfigRegistry *xkb_config,
++                                                  const gchar           *layout);
 +
-+int
-+main (int argc, char *argv[])
-+{
-+    GOptionContext *context;
-+    GError *error = NULL;
-+    Display *xdisplay;
++/**
++ * ibus_xkb_config_registry_layout_lang_get_langs:
++ * @xkb_config: An IBusXKBConfigRegistry.
++ * @layout: A layout.
++ * @returns: (transfer container) (element-type utf8): A GList
++ *
++ * a GList
++ */
++GList *
++                 ibus_xkb_config_registry_layout_lang_get_langs
++                                                 (IBusXKBConfigRegistry *xkb_config,
++                                                  const gchar           *layout);
 +
-+#ifdef ENABLE_NLS
-+    setlocale (LC_ALL, "");
++/**
++ * ibus_xkb_config_registry_layout_desc_get_desc:
++ * @xkb_config: An IBusXKBConfigRegistry.
++ * @layout: A layout.
++ * @returns: A layout description
++ *
++ * a layout description
++ */
++gchar *
++                 ibus_xkb_config_registry_layout_desc_get_desc
++                                                 (IBusXKBConfigRegistry *xkb_config,
++                                                  const gchar           *layout);
 +
-+    bindtextdomain (GETTEXT_PACKAGE, IBUS_LOCALEDIR);
-+    bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
++/**
++ * ibus_xkb_config_registry_variant_desc_get_desc:
++ * @xkb_config: An IBusXKBConfigRegistry.
++ * @variant: A variant.
++ * @returns: A variant description
++ *
++ * a variant description
++ */
++gchar *
++                 ibus_xkb_config_registry_variant_desc_get_desc
++                                                 (IBusXKBConfigRegistry *xkb_config,
++                                                  const gchar           *variant);
++G_END_DECLS
 +#endif
+diff --git a/ui/gtk3/Gkbd-3.0.metadata b/ui/gtk3/Gkbd-3.0.metadata
+new file mode 100644
+index 0000000..661e6fd
+--- /dev/null
++++ b/ui/gtk3/Gkbd-3.0.metadata
+@@ -0,0 +1 @@
++Configuration cheader_filename="libgnomekbd/gkbd-configuration.h"
+diff --git a/ui/gtk3/Makefile.am b/ui/gtk3/Makefile.am
+index 0fb9d3c..b6907d7 100644
+--- a/ui/gtk3/Makefile.am
++++ b/ui/gtk3/Makefile.am
+@@ -42,6 +42,9 @@ INCLUDES = \
+ 	-I$(top_builddir)/src \
+ 	$(NULL)
+ 
++HAVE_IBUS_XKB_C = $(strip $(subst false, FALSE, $(subst true, TRUE, $(HAVE_IBUS_XKB))))
++HAVE_IBUS_GKBD_C = $(strip $(subst false, FALSE, $(subst true, TRUE, $(HAVE_IBUS_GKBD))))
++
+ AM_CFLAGS = \
+ 	@GLIB2_CFLAGS@ \
+ 	@GIO2_CFLAGS@ \
+@@ -56,6 +59,10 @@ AM_CFLAGS = \
+ 	-DBINDIR=\"@bindir@\" \
+     -DIBUS_DISABLE_DEPRECATED \
+ 	-DIBUS_VERSION=\"@IBUS_VERSION@\" \
++	-DHAVE_IBUS_XKB=$(HAVE_IBUS_XKB_C) \
++	-DHAVE_IBUS_GKBD=$(HAVE_IBUS_GKBD_C) \
++	-DIBUS_XKB_COMMAND=\"$(libexecdir)/ibus-xkb\" \
++	-DXKB_LAYOUTS_MAX_LENGTH=4 \
+ 	-Wno-unused-variable \
+ 	-Wno-unused-but-set-variable \
+ 	-Wno-unused-function \
+@@ -86,6 +93,7 @@ ibus_ui_gtk3_SOURCES = \
+ 	application.vala \
+ 	candidatearea.vala \
+ 	candidatepanel.vala \
++	gkbdlayout.vala \
+ 	handle.vala \
+ 	iconwidget.vala \
+ 	keybindingmanager.vala \
+@@ -94,6 +102,7 @@ ibus_ui_gtk3_SOURCES = \
+ 	property.vala \
+ 	separator.vala \
+ 	switcher.vala \
++	xkblayout.vala \
+ 	grabkeycode.c \
+ 	$(NULL)
+ 
+@@ -101,11 +110,49 @@ ibus_ui_gtk3_LDADD = \
+ 	$(AM_LDADD) \
+ 	$(NULL)
+ 
++if ENABLE_LIBGNOMEKBD
++AM_CFLAGS += \
++	@LIBGNOMEKBDUI_CFLAGS@ \
++	@ATK_CFLAGS@ \
++	$(NULL)
 +
-+    context = g_option_context_new ("- ibus daemon");
-+
-+    g_option_context_set_translation_domain (context, GETTEXT_PACKAGE);
-+    g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE);
++AM_LDADD += \
++	@LIBGNOMEKBDUI_LIBS@ \
++	@ATK_LIBS@ \
++	$(NULL)
 +
-+    if (!g_option_context_parse (context, &argc, &argv, &error)) {
-+        g_printerr ("Option parsing failed: %s\n", error->message);
-+        return -1;
-+    }
++AM_VALAFLAGS += \
++	--vapidir=. \
++	--pkg=glib-2.0 \
++	--pkg=gmodule-2.0 \
++	--pkg=gkbd \
++	$(NULL)
 +
-+    xdisplay = XOpenDisplay (NULL);
-+    if (xdisplay == NULL) {
-+        g_warning ("Could not open display");
-+        return -1;
-+    }
-+    ibus_xkb_init (xdisplay);
++VAPIGEN = vapigen
 +
-+    if (layout) {
-+        ibus_xkb_set_layout (layout, model, option);
-+    }
-+    if (get_layout) {
-+        layout = ibus_xkb_get_current_layout ();
-+        model = ibus_xkb_get_current_model ();
-+        option = ibus_xkb_get_current_option ();
-+        g_printf ("layout: %s\n"
-+                  "model: %s\n"
-+                  "option: %s\n",
-+                  layout ? layout : "",
-+                  model ? model : "",
-+                  option ? option : "");
-+        g_free (layout);
-+        g_free (model);
-+        g_free (option);
-+    }
-+    if (get_group) {
-+        group = ibus_xkb_get_current_group ();
-+        g_printf ("group: %d\n", group);
-+    }
++$(srcdir)/gkbd.vapi:
++	$(VAPIGEN) --metadatadir . --library gkbd \
++	    --pkg gtk+-3.0 --pkg glib-2.0 --pkg gmodule-2.0 \
++	    /usr/share/gir-1.0/Gkbd-3.0.gir
++	$(NULL)
 +
-+    ibus_xkb_finit ();
++$(srcdir)/gkbdlayout.vala: $(srcdir)/gkbd.vapi
++	@cp $(srcdir)/gkbdlayout.vala.true $(srcdir)/gkbdlayout.vala
++else
++$(srcdir)/gkbdlayout.vala:
++	@cp $(srcdir)/gkbdlayout.vala.false $(srcdir)/gkbdlayout.vala
++endif
 +
-+    return 0;
-+}
-diff --git a/xkb/xkblayout.xml.in b/xkb/xkblayout.xml.in
-new file mode 100644
-index 0000000..0b5a4dc
---- /dev/null
-+++ b/xkb/xkblayout.xml.in
-@@ -0,0 +1,16 @@
-+<?xml version="1.0" encoding="utf-8"?>
-+<component>
-+        <name>org.freedesktop.IBus.XKB</name>
-+        <description>XKB Component</description>
-+        <exec>@libexecdir@/ibus-engine-xkb --ibus</exec>
-+        <version>0.0.0</version>
-+        <author>Takao Fujiwara &lt;takao.fujiwara1@gmail.com&gt;</author>
-+        <license>LGPL2.1</license>
-+        <homepage>http://code.google.com/p/ibus/</homepage>
-+        <textdomain>ibus</textdomain>
-+        <observed-paths>
-+                <path>@datadir@/ibus/xkb/xkblayoutconfig.xml</path>
-+                <path>~/.config/ibus/xkb/xkblayoutconfig.xml</path>
-+        </observed-paths>
-+        <engines exec="@libexecdir@/ibus-engine-xkb --xml"/>
-+</component>
-diff --git a/xkb/xkblayoutconfig.xml.in b/xkb/xkblayoutconfig.xml.in
-new file mode 100644
-index 0000000..b1212d1
---- /dev/null
-+++ b/xkb/xkblayoutconfig.xml.in
-@@ -0,0 +1,6 @@
-+<?xml version="1.0" encoding="utf-8"?>
-+<xkblayout>
-+  <config>
-+    <preload_layouts>@XKB_PRELOAD_LAYOUTS@</preload_layouts>
-+  </config>
-+</xkblayout>
-diff --git a/xkb/xkblib.c b/xkb/xkblib.c
+ CLEANFILES = \
++	gkbd.vapi \
++	gkbdlayout.vala \
+ 	gtkpanel.xml \
+ 	$(NULL)
+ 
+ EXTRA_DIST = \
++	Gkbd-3.0.metadata \
++	gkbdlayout.vala.false \
++	gkbdlayout.vala.true \
+ 	gtkpanel.xml.in.in \
+ 	$(NULL)
+ 
+diff --git a/ui/gtk3/gkbdlayout.vala.false b/ui/gtk3/gkbdlayout.vala.false
 new file mode 100644
-index 0000000..293cdaf
+index 0000000..a387de9
 --- /dev/null
-+++ b/xkb/xkblib.c
-@@ -0,0 +1,327 @@
-+/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
-+/* vim:set et sts=4: */
-+/* bus - The Input Bus
-+ * Copyright (C) 2011 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2011 Peng Huang <shawn.p.huang@gmail.com>
-+ * Copyright (C) 2011 Red Hat, Inc.
++++ b/ui/gtk3/gkbdlayout.vala.false
+@@ -0,0 +1,63 @@
++/* vim:set et sts=4 sw=4:
++ *
++ * ibus - The Input Bus
++ *
++ * Copyright 2012 Red Hat, Inc.
++ * Copyright(c) 2012 Peng Huang <shawn.p.huang@gmail.com>
++ * Copyright(c) 2012 Takao Fujiwara <tfujiwar@redhat.com>
 + *
 + * This library is free software; you can redistribute it and/or
 + * modify it under the terms of the GNU Lesser General Public
 + * License as published by the Free Software Foundation; either
-+ * version 2 of the License, or (at your option) any later version.
++ * version 2 of the License, or(at your option) any later version.
 + *
 + * This library is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
-+ * Lesser General Public License for more details.
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU Lesser General Public License for more details.
 + *
 + * You should have received a copy of the GNU Lesser General Public
-+ * License along with this library; if not, write to the
-+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-+ * Boston, MA 02111-1307, USA.
++ * License along with this program; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
++ * Boston, MA  02111-1307  USA
 + */
-+#ifdef HAVE_CONFIG_H
-+#include <config.h>
-+#endif
-+
-+#include <glib.h>
-+#include <X11/Xlib.h>
-+#include <X11/Xatom.h>
-+#include <X11/XKBlib.h>
-+#include <stdio.h> /* for XKBrules.h */
-+#include <X11/extensions/XKBrules.h>
-+#include <X11/extensions/XKBstr.h>
-+#include <string.h>
-+
-+#include "xkblib.h"
-+
-+#ifndef XKB_RULES_XML_FILE
-+#define XKB_RULES_XML_FILE "/usr/share/X11/xkb/rules/evdev.xml"
-+#endif
-+
-+static gchar          **default_layouts;
-+static gchar          **default_models;
-+static gchar          **default_options;
-+static int              default_layout_group;
-+
-+static Display *
-+get_xdisplay (Display *xdisplay)
-+{
-+    static Display *saved_xdisplay = NULL;
-+    if (xdisplay != NULL) {
-+        saved_xdisplay = xdisplay;
-+    }
-+    return saved_xdisplay;
-+}
 +
-+static void
-+init_xkb_default_layouts (Display *xdisplay)
++public class GkbdLayout
 +{
-+    XkbStateRec state;
-+    Atom xkb_rules_name, type;
-+    int format;
-+    unsigned long l, nitems, bytes_after;
-+    unsigned char *prop = NULL;
++    public signal void changed();
++    public signal void group_changed (int object);
 +
-+    xkb_rules_name = XInternAtom (xdisplay, "_XKB_RULES_NAMES", TRUE);
-+    if (xkb_rules_name == None) {
-+        g_warning ("Could not get XKB rules atom");
-+        return;
-+    }
-+    if (XGetWindowProperty (xdisplay,
-+                            XDefaultRootWindow (xdisplay),
-+                            xkb_rules_name,
-+                            0, 1024, FALSE, XA_STRING,
-+                            &type, &format, &nitems, &bytes_after, &prop) != Success) {
-+        g_warning ("Could not get X property");
-+        return;
-+    }
-+    if (nitems < 3) {
-+        g_warning ("Could not get group layout from X property");
-+        return;
++    public GkbdLayout() {
 +    }
-+    for (l = 0; l < 2; l++) {
-+        prop += strlen ((const char *) prop) + 1;
-+    }
-+    if (prop == NULL || *prop == '\0') {
-+        g_warning ("No layouts form X property");
-+        return;
-+    }
-+    default_layouts = g_strsplit ((gchar *) prop, ",", -1);
-+    prop += strlen ((const char *) prop) + 1;
-+    default_models = g_strsplit ((gchar *) prop, ",", -1);
-+    prop += strlen ((const char *) prop) + 1;
-+    default_options = g_strsplit ((gchar *) prop, ",", -1);
 +
-+    if (XkbGetState (xdisplay, XkbUseCoreKbd, &state) != Success) {
-+        g_warning ("Could not get state");
-+        return;
++    public string[] get_layouts() {
++        return new string[0];
 +    }
-+    default_layout_group = state.group;
-+}
 +
-+static Bool
-+set_xkb_rules (Display *xdisplay,
-+               const char *rules_file, const char *model,
-+               const char *all_layouts, const char *all_variants,
-+               const char *all_options)
-+{
-+    gchar *rules_path;
-+    XkbRF_RulesPtr rules;
-+    XkbRF_VarDefsRec rdefs;
-+    XkbComponentNamesRec rnames;
-+    XkbDescPtr xkb;
-+
-+    rules_path = g_strdup ("./rules/evdev");
-+    rules = XkbRF_Load (rules_path, "C", TRUE, TRUE);
-+    if (rules == NULL) {
-+        g_return_val_if_fail (XKB_RULES_XML_FILE != NULL, FALSE);
++    public string[] get_group_names() {
++        return new string[0];
++    }
 +
-+        g_free (rules_path);
-+        if (g_str_has_suffix (XKB_RULES_XML_FILE, ".xml")) {
-+            rules_path = g_strndup (XKB_RULES_XML_FILE,
-+                                    strlen (XKB_RULES_XML_FILE) - 4);
-+        } else {
-+            rules_path = g_strdup (XKB_RULES_XML_FILE);
-+        }
-+        rules = XkbRF_Load (rules_path, "C", TRUE, TRUE);
++    public void lock_group(int id) {
 +    }
-+    g_return_val_if_fail (rules != NULL, FALSE);
 +
-+    memset (&rdefs, 0, sizeof (XkbRF_VarDefsRec));
-+    memset (&rnames, 0, sizeof (XkbComponentNamesRec));
-+    rdefs.model = model ? g_strdup (model) : NULL;
-+    rdefs.layout = all_layouts ? g_strdup (all_layouts) : NULL;
-+    rdefs.variant = all_variants ? g_strdup (all_variants) : NULL;
-+    rdefs.options = all_options ? g_strdup (all_options) : NULL;
-+    XkbRF_GetComponents (rules, &rdefs, &rnames);
-+    xkb = XkbGetKeyboardByName (xdisplay, XkbUseCoreKbd, &rnames,
-+                                XkbGBN_AllComponentsMask,
-+                                XkbGBN_AllComponentsMask &
-+                                (~XkbGBN_GeometryMask), True);
-+    if (!xkb) {
-+        g_warning ("Cannot load new keyboard description.");
-+        return FALSE;
++    public void start_listen() {
 +    }
-+    XkbRF_SetNamesProp (xdisplay, rules_path, &rdefs);
-+    g_free (rules_path);
-+    g_free (rdefs.model);
-+    g_free (rdefs.layout);
-+    g_free (rdefs.variant);
-+    g_free (rdefs.options);
 +
-+    return TRUE;
++    public void stop_listen() {
++    }
++
++    /*
++    public static int main(string[] args) {
++        GkbdLayout ibus_layouts = new GkbdLayout();
++
++        string[] layouts = ibus_layouts.get_layouts();
++        string[] names = ibus_layouts.get_group_names();
++        for (int i = 0; layouts != null && i < layouts.length; i++) {
++            stdout.printf("%s %s\n", layouts[i], names[i]);
++        }
++
++        return 0;
++    }
++    */
 +}
+diff --git a/ui/gtk3/gkbdlayout.vala.true b/ui/gtk3/gkbdlayout.vala.true
+new file mode 100644
+index 0000000..adacd81
+--- /dev/null
++++ b/ui/gtk3/gkbdlayout.vala.true
+@@ -0,0 +1,111 @@
++/* vim:set et sts=4 sw=4:
++ *
++ * ibus - The Input Bus
++ *
++ * Copyright 2012 Red Hat, Inc.
++ * Copyright(c) 2012 Peng Huang <shawn.p.huang@gmail.com>
++ * Copyright(c) 2012 Takao Fujiwara <tfujiwar@redhat.com>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or(at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this program; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
++ * Boston, MA  02111-1307  USA
++ */
 +
-+static Bool
-+update_xkb_properties (Display *xdisplay,
-+                       const char *rules_file, const char *model,
-+                       const char *all_layouts, const char *all_variants,
-+                       const char *all_options)
++using Gkbd;
++using Gtk;
++
++public class GkbdLayout
 +{
-+    int len;
-+    char *pval;
-+    char *next;
-+    Atom rules_atom;
-+    Window root_window;
++    public signal void changed();
++    public signal void group_changed (int object);
 +
-+    len = (rules_file ? strlen (rules_file) : 0);
-+    len += (model ? strlen (model) : 0);
-+    len += (all_layouts ? strlen (all_layouts) : 0);
-+    len += (all_variants ? strlen (all_variants) : 0);
-+    len += (all_options ? strlen (all_options) : 0);
++    private Gkbd.Configuration m_config = null;
 +
-+    if (len < 1) {
-+        return TRUE;
++    public GkbdLayout() {
++        m_config = Gkbd.Configuration.get();
++        if (m_config != null) {
++            m_config.changed.connect(config_changed_cb);
++            m_config.group_changed.connect(config_group_changed_cb);
++        }
 +    }
-+    len += 5; /* trailing NULs */
 +
-+    rules_atom = XInternAtom (xdisplay, _XKB_RF_NAMES_PROP_ATOM, False);
-+    root_window = XDefaultRootWindow (xdisplay);
-+    pval = next = g_new0 (char, len + 1);
-+    if (!pval) {
-+        return TRUE;
++    ~GkbdLayout() {
++        if (m_config != null) {
++            m_config.changed.disconnect(config_changed_cb);
++            m_config.group_changed.disconnect(config_group_changed_cb);
++            /* gkbd_configuration_get reuses the object and do not
++             * destroy m_config here. */
++            m_config.ref();
++            m_config = null;
++        }
 +    }
 +
-+    if (rules_file) {
-+        strcpy (next, rules_file);
-+        next += strlen (rules_file);
-+    }
-+    *next++ = '\0';
-+    if (model) {
-+        strcpy (next, model);
-+        next += strlen (model);
++    private void config_changed_cb() {
++        changed();
 +    }
-+    *next++ = '\0';
-+    if (all_layouts) {
-+        strcpy (next, all_layouts);
-+        next += strlen (all_layouts);
++
++    private void config_group_changed_cb(int object) {
++        group_changed(object);
 +    }
-+    *next++ = '\0';
-+    if (all_variants) {
-+        strcpy (next, all_variants);
-+        next += strlen (all_variants);
++
++    public string[] get_layouts() {
++        if (m_config == null) {
++            return new string[0];
++        }
++        return m_config.get_short_group_names();
 +    }
-+    *next++ = '\0';
-+    if (all_options) {
-+        strcpy (next, all_options);
-+        next += strlen (all_options);
++
++    public string[] get_group_names() {
++        if (m_config == null) {
++            return new string[0];
++        }
++        return m_config.get_group_names();
 +    }
-+    *next++ = '\0';
-+    if ((next - pval) != len) {
-+        g_free (pval);
-+        return TRUE;
++
++    public void lock_group(int id) {
++        if (m_config == null) {
++            return;
++        }
++        m_config.lock_group(id);
 +    }
 +
-+    XChangeProperty (xdisplay, root_window,
-+                    rules_atom, XA_STRING, 8, PropModeReplace,
-+                    (unsigned char *) pval, len);
-+    XSync(xdisplay, False);
++    public void start_listen() {
++        if (m_config == null) {
++            return;
++        }
++        m_config.start_listen();
++    }
 +
-+    return TRUE;
-+}
++    public void stop_listen() {
++        if (m_config == null) {
++            return;
++        }
++        m_config.stop_listen();
++    }
 +
-+void
-+ibus_xkb_init (Display *xdisplay)
-+{
-+    get_xdisplay (xdisplay);
-+    init_xkb_default_layouts (xdisplay);
-+}
++    /*
++    public static int main(string[] args) {
++        Gtk.init(ref args);
++        GkbdLayout ibus_layouts = new GkbdLayout();
 +
-+void
-+ibus_xkb_finit (void)
-+{
-+    g_strfreev (default_layouts);
-+    default_layouts = NULL;
-+    g_strfreev (default_models);
-+    default_models = NULL;
-+    g_strfreev (default_options);
-+    default_options = NULL;
-+}
++        string[] layouts = ibus_layouts.get_layouts();
++        string[] names = ibus_layouts.get_group_names();
++        for (int i = 0; layouts != null && i < layouts.length; i++) {
++            stdout.printf("%s %s\n", layouts[i], names[i]);
++        }
 +
-+gchar *
-+ibus_xkb_get_current_layout (void)
-+{
-+    if (default_layouts == NULL) {
-+        g_warning ("Your system seems not to support XKB.");
-+        return NULL;
++        return 0;
 +    }
++    */
++}
+diff --git a/ui/gtk3/panel.vala b/ui/gtk3/panel.vala
+index e851b24..5847fd0 100644
+--- a/ui/gtk3/panel.vala
++++ b/ui/gtk3/panel.vala
+@@ -40,6 +40,13 @@ class Panel : IBus.PanelService {
+     private PropertyManager m_property_manager;
+     private GLib.Pid m_setup_pid = 0;
+     private Gtk.AboutDialog m_about_dialog;
++    private GkbdLayout m_gkbdlayout = null;
++    private XKBLayout m_xkblayout = null;
++    private string[] m_layouts = {};
++    private string[] m_variants = {};
++    private int m_fallback_lock_id = -1;
++    private bool m_changed_xkb_option = false;
++    private GLib.Timer m_changed_layout_timer;
+     private const string ACCELERATOR_SWITCH_IME_FOREWARD = "<Control>space";
+     private const string ACCELERATOR_SWITCH_IME_BACKWARD = "<Control><Shift>space";
+ 
+@@ -82,6 +89,14 @@ class Panel : IBus.PanelService {
+         var keybinding_manager = KeybindingManager.get_instance();
+         keybinding_manager.unbind(ACCELERATOR_SWITCH_IME_FOREWARD);
+         keybinding_manager.unbind(ACCELERATOR_SWITCH_IME_BACKWARD);
++
++        if (HAVE_IBUS_GKBD && m_gkbdlayout != null) {
++            m_gkbdlayout.changed.disconnect(gkbdlayout_changed_cb);
++            m_gkbdlayout.stop_listen();
++            m_gkbdlayout = null;
++        }
 +
-+    return g_strjoinv (",", (gchar **) default_layouts);
-+}
++        m_xkblayout = null;
+     }
+ 
+     public void set_config(IBus.Config config) {
+@@ -93,6 +108,7 @@ class Panel : IBus.PanelService {
+         m_config = config;
+         if (m_config != null) {
+             m_config.value_changed.connect(config_value_changed_cb);
++            init_engines_order();
+             update_engines(m_config.get_value("general", "preload_engines"),
+                            m_config.get_value("general", "engines_order"));
+         } else {
+@@ -100,6 +116,191 @@ class Panel : IBus.PanelService {
+         }
+     }
+ 
++    private void gkbdlayout_changed_cb() {
++        /* The callback is called four times after set_layout is called
++         * so check the elapsed and take the first signal only. */
++        double elapsed = m_changed_layout_timer.elapsed();
++        if (elapsed < 1.0 && elapsed > 0.0) {
++            return;
++        }
 +
-+gchar *
-+ibus_xkb_get_current_model (void)
-+{
-+    if (default_models == NULL) {
-+        return NULL;
++        if (m_fallback_lock_id != -1) {
++            /* Call lock_group only when set_layout is called. */
++            m_gkbdlayout.lock_group(m_fallback_lock_id);
++            m_fallback_lock_id = -1;
++        } else {
++            /* Reset default layout when gnome-control-center is called. */
++            m_xkblayout.reset_layout();
++        }
++
++        update_xkb_engines();
++        m_changed_layout_timer.reset();
 +    }
 +
-+    return g_strjoinv (",", (gchar **) default_models);
-+}
++    private void init_gkbd() {
++        m_gkbdlayout = new GkbdLayout();
++        m_gkbdlayout.changed.connect(gkbdlayout_changed_cb);
 +
-+gchar *
-+ibus_xkb_get_current_option (void)
-+{
-+    if (default_options == NULL) {
-+        return NULL;
++        /* Probably we cannot support both keyboard and ibus indicators
++         * How can I get the engine from keymap of group_id?
++         * e.g. 'en' could be owned by xkb:en and pinyin engines. */
++        //m_gkbdlayout.group_changed.connect((object) => {});
++
++        m_changed_layout_timer = new GLib.Timer();
++        m_changed_layout_timer.start();
++        m_gkbdlayout.start_listen();
 +    }
 +
-+    return g_strjoinv (",", (gchar **) default_options);
-+}
++    private void init_engines_order() {
++        if (m_config == null) {
++            return;
++        }
 +
-+gboolean
-+ibus_xkb_set_layout  (const char *layouts,
-+                      const char *variants,
-+                      const char *options)
-+{
-+    Display *xdisplay;
-+    gboolean retval;
-+    gchar *layouts_line;
++        m_xkblayout = new XKBLayout(m_config);
 +
-+    if (default_layouts == NULL) {
-+        g_warning ("Your system seems not to support XKB.");
-+        return FALSE;
-+    }
++        if (HAVE_IBUS_GKBD) {
++            init_gkbd();
++        }
 +
-+    if (layouts == NULL || g_strcmp0 (layouts, "default") == 0) {
-+        layouts_line = g_strjoinv (",", (gchar **) default_layouts);
-+    } else {
-+        layouts_line = g_strdup (layouts);
++        update_xkb_engines();
 +    }
 +
-+    xdisplay = get_xdisplay (NULL);
-+    retval = set_xkb_rules (xdisplay,
-+                            "evdev", "evdev",
-+                            layouts_line, variants, options);
-+    update_xkb_properties (xdisplay,
-+                           "evdev", "evdev",
-+                           layouts_line, variants, options);
-+    g_free (layouts_line);
++    private void update_xkb_engines() {
++        string var_layout = m_xkblayout.get_layout();
++        string var_variant = m_xkblayout.get_variant();
++        if (var_layout == "") {
++            return;
++        }
 +
-+    return retval;
-+}
++        m_layouts = var_layout.split(",");
++        m_variants = var_variant.split(",");
++
++        IBus.XKBConfigRegistry registry = new IBus.XKBConfigRegistry();
++        string[] var_xkb_engine_names = {};
++        for (int i = 0; i < m_layouts.length; i++) {
++            string name = m_layouts[i];
++            unowned GLib.List<string> langs = null;
++            string lang = null;
++
++            if (i < m_variants.length && m_variants[i] != "") {
++                name = "%s:%s".printf(name, m_variants[i]);
++                string layout = "%s(%s)".printf(name, m_variants[i]);
++                langs = registry.layout_lang_get_langs(layout);
++                if (langs.length() != 0) {
++                    lang = langs.data;
++                }
++            } else {
++                name = "%s:".printf(name);
++            }
 +
-+int
-+ibus_xkb_get_current_group (void)
-+{
-+    Display *xdisplay = get_xdisplay (NULL);
-+    XkbStateRec state;
++            if (lang == null) {
++                langs = registry.layout_lang_get_langs(m_layouts[i]);
++                if (langs.length() != 0) {
++                    lang = langs.data;
++                }
++            }
 +
-+    if (default_layouts == NULL) {
-+        g_warning ("Your system seems not to support XKB.");
-+        return 0;
-+    }
++            var_xkb_engine_names += "%s:%s:%s".printf("xkb", name, lang);
++        }
 +
-+    if (xdisplay == NULL) {
-+        g_warning ("ibus-xkb is not initialized.");
-+        return 0;
-+    }
++        GLib.Variant var_engines = 
++           m_config.get_value("general", "preload_engines");
++        string[] engine_names = {};
++        bool updated_engine_names = false;
 +
-+    if (XkbGetState (xdisplay, XkbUseCoreKbd, &state) != Success) {
-+        g_warning ("Could not get state");
-+        return 0;
++        if (var_engines != null) {
++            engine_names = var_engines.dup_strv();
++        }
++
++        foreach (string name in var_xkb_engine_names) {
++            if (name in engine_names)
++                continue;
++            updated_engine_names = true;
++            engine_names += name;
++        }
++
++        if (updated_engine_names) {
++            m_config.set_value("general",
++                               "preload_engines",
++                               new GLib.Variant.strv(engine_names));
++        }
++
++        GLib.Variant var_order =
++            m_config.get_value("general", "engines_order");
++        string[] order_names = {};
++        bool updated_order_names = false;
++
++        if (var_order != null) {
++            order_names = var_order.dup_strv();
++        }
++
++        foreach (var name in var_xkb_engine_names) {
++            if (name in order_names)
++                continue;
++            order_names += name;
++            updated_order_names = true;
++        }
++
++        if (updated_order_names) {
++            m_config.set_value("general",
++                               "engines_order",
++                               new GLib.Variant.strv(order_names));
++        }
 +    }
 +
-+    return state.group;
-+}
-diff --git a/xkb/xkblib.h b/xkb/xkblib.h
-new file mode 100644
-index 0000000..15e5d18
---- /dev/null
-+++ b/xkb/xkblib.h
-@@ -0,0 +1,41 @@
-+/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
-+/* vim:set et sts=4: */
-+/* bus - The Input Bus
-+ * Copyright (C) 2011 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2011 Peng Huang <shawn.p.huang@gmail.com>
-+ * Copyright (C) 2011 Red Hat, Inc.
-+ *
-+ * This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2 of the License, or (at your option) any later version.
-+ *
-+ * This library is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General Public
-+ * License along with this library; if not, write to the
-+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-+ * Boston, MA 02111-1307, USA.
-+ */
-+#ifndef __XKBLIB_H_
-+#define __XKBLIB_H_
++    private void set_xkb_group_layout(string layout) {
++        int[] retval = m_xkblayout.set_layout(layout);
++        if (retval[0] >= 0) {
++            /* If an XKB keymap is added into the XKB group,
++             * this._gkbdlayout.lock_group will be called after
++             * 'group-changed' signal is received. */
++            m_fallback_lock_id = retval[0];
++            m_changed_xkb_option = (retval[1] != 0) ? true : false;
++        }
++    }
 +
-+#include <X11/Xlib.h>
++    private bool set_gkbd_layout(string layout) {
++        /* If a previous ibus engine changed XKB options, need to set the
++         * default XKB option. */
++        if (m_changed_xkb_option == true) {
++            m_changed_xkb_option = false;
++            return false;
++        }
 +
-+G_BEGIN_DECLS
++        int gkbd_len = m_gkbdlayout.get_group_names().length;
++        for (int i = 0; i < m_layouts.length && i < gkbd_len; i++) {
++            string sys_layout = m_layouts[i];
++            if (i < m_variants.length && m_variants[i] != "") {
++                sys_layout = "%s(%s)".printf(sys_layout, m_variants[i]);
++            }
++            if (sys_layout == layout) {
++                m_gkbdlayout.lock_group(i);
++                return true;
++            }
++        }
++        return false;
++    }
 +
-+void             ibus_xkb_init                   (Display *xdisplay);
-+void             ibus_xkb_finit                  (void);
-+gchar           *ibus_xkb_get_current_layout     (void);
-+gchar           *ibus_xkb_get_current_model      (void);
-+gchar           *ibus_xkb_get_current_option     (void);
-+gboolean         ibus_xkb_set_layout             (const char *layouts,
-+                                                  const char *variants,
-+                                                  const char *options);
-+int              ibus_xkb_get_current_group      (void);
++    private void set_layout(string layout) {
++        if (layout == "default" || layout == null) {
++            return;
++        }
 +
-+G_END_DECLS
-+#endif
-diff --git a/xkb/xkbxml.c b/xkb/xkbxml.c
++        if (m_xkblayout == null) {
++            init_engines_order();
++        }
++
++        if (HAVE_IBUS_GKBD) {
++            if (set_gkbd_layout(layout)) {
++                return;
++            }
++            set_xkb_group_layout(layout);
++            return;
++        }
++
++        m_xkblayout.set_layout(layout);
++    }
++
+     private void switch_engine(int i, bool force = false) {
+         GLib.assert(i >= 0 && i < m_engines.length);
+ 
+@@ -119,15 +320,7 @@ class Panel : IBus.PanelService {
+             return;
+         }
+         // set xkb layout
+-        string cmdline = "setxkbmap %s".printf(engine.get_layout());
+-        try {
+-            if (!GLib.Process.spawn_command_line_sync(cmdline)) {
+-                warning("Switch xkb layout to %s failed.",
+-                    engine.get_layout());
+-            }
+-        } catch (GLib.SpawnError e) {
+-            warning("execute setxkblayout failed");
+-        }
++        set_layout(engine.get_layout());
+ 
+         string[] names = {};
+         foreach(var desc in m_engines) {
+diff --git a/ui/gtk3/xkblayout.vala b/ui/gtk3/xkblayout.vala
 new file mode 100644
-index 0000000..d59a929
+index 0000000..8b75387
 --- /dev/null
-+++ b/xkb/xkbxml.c
-@@ -0,0 +1,345 @@
-+/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
-+/* vim:set et sts=4: */
-+/* bus - The Input Bus
-+ * Copyright (C) 2011 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2011 Peng Huang <shawn.p.huang@gmail.com>
-+ * Copyright (C) 2011 Red Hat, Inc.
++++ b/ui/gtk3/xkblayout.vala
+@@ -0,0 +1,466 @@
++/* vim:set et sts=4 sw=4:
++ *
++ * ibus - The Input Bus
++ *
++ * Copyright 2012 Red Hat, Inc.
++ * Copyright(c) 2012 Peng Huang <shawn.p.huang@gmail.com>
++ * Copyright(c) 2012 Takao Fujiwara <tfujiwar@redhat.com>
 + *
 + * This library is free software; you can redistribute it and/or
 + * modify it under the terms of the GNU Lesser General Public
 + * License as published by the Free Software Foundation; either
-+ * version 2 of the License, or (at your option) any later version.
++ * version 2 of the License, or(at your option) any later version.
 + *
 + * This library is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
-+ * Lesser General Public License for more details.
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU Lesser General Public License for more details.
 + *
 + * You should have received a copy of the GNU Lesser General Public
-+ * License along with this library; if not, write to the
-+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-+ * Boston, MA 02111-1307, USA.
++ * License along with this program; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
++ * Boston, MA  02111-1307  USA
 + */
-+#ifdef HAVE_CONFIG_H
-+#include <config.h>
-+#endif
-+
-+#include <glib.h>
-+
-+#include "xkbxml.h"
-+#include "ibus.h"
-+
-+#define IBUS_XKB_LAYOUT_CONFIG_GET_PRIVATE(o)  \
-+   (G_TYPE_INSTANCE_GET_PRIVATE ((o), IBUS_TYPE_XKB_LAYOUT_CONFIG, IBusXKBLayoutConfigPrivate))
-+
-+typedef struct _IBusXKBLayoutConfigPrivate IBusXKBLayoutConfigPrivate;
-+
-+enum {
-+    PROP_0,
-+    PROP_SYSTEM_CONFIG_FILE,
-+};
-+
-+struct _IBusXKBLayoutConfigPrivate {
-+    gchar *system_config_file;
-+    GList *preload_layouts;
-+};
 +
-+/* functions prototype */
-+static void         ibus_xkb_layout_config_destroy
-+                                           (IBusXKBLayoutConfig *xkb_layout_config);
++using IBus;
++
++public extern const bool HAVE_IBUS_GKBD;
++public extern const bool HAVE_IBUS_XKB;
++public extern const int XKB_LAYOUTS_MAX_LENGTH;
++public extern const string IBUS_XKB_COMMAND;
++
++class XKBLayout
++{
++    string m_xkb_command = IBUS_XKB_COMMAND;
++    IBus.Config m_config = null;
++    string[] m_xkb_latin_layouts = {};
++    GLib.Pid m_xkb_pid = -1;
++    GLib.Pid m_xmodmap_pid = -1;
++    string m_xmodmap_command = "xmodmap";
++    bool m_use_xmodmap = true;
++    string[] m_xmodmap_known_files = {".xmodmap", ".xmodmaprc",
++                                      ".Xmodmap", ".Xmodmaprc"};
++    string m_default_layout = "";
++    string m_default_variant = "";
++    string m_default_option = "";
++
++    public XKBLayout(IBus.Config? config) {
++        if (!HAVE_IBUS_XKB) {
++            m_xkb_command = "setxkbmap";
++        }
 +
-+G_DEFINE_TYPE (IBusXKBLayoutConfig, ibus_xkb_layout_config, IBUS_TYPE_OBJECT)
++        m_config = config;
 +
-+static void
-+free_lang_list (GList *list)
-+{
-+    GList *l = list;
-+    while (l) {
-+        g_free (l->data);
-+        l->data = NULL;
-+        l = l->next;
++        if (config != null) {
++            var value  = config.get_value("general", "xkb_latin_layouts");
++            for (int i = 0; value != null && i < value.n_children(); i++) {
++                m_xkb_latin_layouts +=
++                        value.get_child_value(i).dup_string();
++            }
++            if (m_use_xmodmap) {
++                m_use_xmodmap = config.get_value("general", "use_xmodmap").get_boolean();
++            }
++        }
 +    }
-+    g_list_free (list);
-+}
-+
-+static GList *
-+parse_xkblayoutconfig_file (gchar *path)
-+{
-+    XMLNode *node = NULL;
-+    XMLNode *sub_node;
-+    XMLNode *sub_sub_node;
-+    GList *p;
-+    GList *retval = NULL;
-+    gchar **array;
-+    int i;
 +
-+    node = ibus_xml_parse_file (path);
-+    if (node == NULL) {
-+        return NULL;
-+    }
-+    if (g_strcmp0 (node->name, "xkblayout") != 0) {
-+        ibus_xml_free (node);
-+        return NULL;
-+    }
-+    for (p = node->sub_nodes; p != NULL; p = p->next) {
-+        sub_node = (XMLNode *) p->data;
-+        if (g_strcmp0 (sub_node->name, "config") == 0) {
-+            GList *pp;
-+            for (pp = sub_node->sub_nodes; pp != NULL; pp = pp->next) {
-+                sub_sub_node = (XMLNode *) pp->data;
-+                if  (g_strcmp0 (sub_sub_node->name, "preload_layouts") == 0) {
-+                    if (sub_sub_node->text != NULL) {
-+                        array = g_strsplit ((gchar *) sub_sub_node->text,
-+                                            ",", -1);
-+                        for (i = 0; array[i]; i++) {
-+                            retval = g_list_append (retval, g_strdup (array[i]));
-+                        }
-+                        g_strfreev (array);
-+                        break;
-+                    }
-+                }
-+            }
++    private string get_output_from_cmdline(string arg, string element) {
++        string[] exec_command = {};
++        exec_command += m_xkb_command;
++        exec_command += arg;
++        string standard_output = null;
++        string standard_error = null;
++        int exit_status = 0;
++        string retval = "";
++        try {
++            GLib.Process.spawn_sync(null,
++                                    exec_command,
++                                    null,
++                                    GLib.SpawnFlags.SEARCH_PATH,
++                                    null,
++                                    out standard_output,
++                                    out standard_error,
++                                    out exit_status);
++        } catch (GLib.SpawnError err) {
++            stderr.printf("IBUS_ERROR: %s\n", err.message);
 +        }
-+        if (retval != NULL) {
-+            break;
++        if (exit_status != 0) {
++            stderr.printf("IBUS_ERROR: %s\n", standard_error ?? "");
++        }
++        if (standard_output == null) {
++            return "";
 +        }
++        foreach (string line in standard_output.split("\n")) {
++            if (element.length <= line.length &&
++                line[0:element.length] == element) {
++                retval = line[element.length:line.length];
++            }
++        }
++        return retval;
 +    }
 +
-+    ibus_xml_free (node);
-+    return retval;
-+}
-+
-+static void
-+parse_xkb_layout_config (IBusXKBLayoutConfigPrivate *priv)
-+{
-+    gchar *basename;
-+    gchar *user_config;
-+    GList *list = NULL;
++    private void set_layout_cb(GLib.Pid pid, int status) {
++        if (m_xkb_pid != pid) {
++            stderr.printf("IBUS_ERROR: set_layout_cb has another pid\n");
++            return;
++        }
++        GLib.Process.close_pid(m_xkb_pid);
++        m_xkb_pid = -1;
++        set_xmodmap();
++    }
 +
-+    g_return_if_fail (priv->system_config_file != NULL);
-+
-+    basename = g_path_get_basename (priv->system_config_file);
-+    user_config = g_build_filename (g_get_user_config_dir (),
-+                                    "ibus", "xkb",
-+                                    basename, NULL);
-+    g_free (basename);
-+    list = parse_xkblayoutconfig_file (user_config);
-+    g_free (user_config);
-+    if (list) {
-+        priv->preload_layouts = list;
-+        return;
++    private void set_xmodmap_cb(GLib.Pid pid, int status) {
++        if (m_xmodmap_pid != pid) {
++            stderr.printf("IBUS_ERROR: set_xmodmap_cb has another pid\n");
++            return;
++        }
++        GLib.Process.close_pid(m_xmodmap_pid);
++        m_xmodmap_pid = -1;
 +    }
-+    list = parse_xkblayoutconfig_file (priv->system_config_file);
-+    priv->preload_layouts = list;
-+}
 +
-+static void
-+ibus_xkb_layout_config_init (IBusXKBLayoutConfig *xkb_layout_config)
-+{
-+    IBusXKBLayoutConfigPrivate *priv;
++    private string get_fullpath(string command) {
++        string envpath = GLib.Environment.get_variable("PATH");
++        foreach (string dir in envpath.split(":")) {
++            string filepath = GLib.Path.build_filename(dir, command);
++            if (GLib.FileUtils.test(filepath, GLib.FileTest.EXISTS)) {
++                return filepath;
++            }
++        }
++        return "";
++    }
++
++    private string[] get_xkb_group_layout (string layout,
++                                           string variant,
++                                           int layouts_max_length) {
++        int group_id = 0;
++        int i = 0;
++        string[] layouts = m_default_layout.split(",");
++        string[] variants = m_default_variant.split(",");
++        string group_layouts = "";
++        string group_variants = "";
++        bool has_variant = false;
++        bool include_keymap = false;
++
++        for (i = 0; i < layouts.length; i++) {
++            if (i >= layouts_max_length - 1) {
++                break;
++            }
 +
-+    priv = IBUS_XKB_LAYOUT_CONFIG_GET_PRIVATE (xkb_layout_config);
-+    priv->system_config_file = NULL;
-+    priv->preload_layouts = NULL;
-+}
++            if (i == 0) {
++                group_layouts = layouts[i];
++            } else {
++                group_layouts = "%s,%s".printf(group_layouts, layouts[i]);
++            }
 +
-+static GObject *
-+ibus_xkb_layout_config_constructor (GType type,
-+                                    guint n_construct_params,
-+                                    GObjectConstructParam *construct_params)
-+{
-+    GObject *obj;
-+    IBusXKBLayoutConfig *xkb_layout_config;
-+    IBusXKBLayoutConfigPrivate *priv;
++            if (i >= variants.length) {
++                if (i == 0) {
++                    group_variants = "";
++                } else {
++                    group_variants += ",";
++                }
++                if (layout == layouts[i] && variant == "") {
++                    include_keymap = true;
++                    group_id = i;
++                }
++                continue;
++            }
++            if (layout == layouts[i] && variant == variants[i]) {
++                include_keymap = true;
++                group_id = i;
++            }
 +
-+    obj = G_OBJECT_CLASS (ibus_xkb_layout_config_parent_class)->constructor (type, n_construct_params, construct_params);
-+    xkb_layout_config = IBUS_XKB_LAYOUT_CONFIG (obj);
-+    priv = IBUS_XKB_LAYOUT_CONFIG_GET_PRIVATE (xkb_layout_config);
-+    parse_xkb_layout_config (priv);
++            if (variants[i] != "") {
++                has_variant = true;
++            }
 +
-+    return obj;
-+}
++            if (i == 0) {
++                group_variants = variants[i];
++            } else {
++                group_variants = "%s,%s".printf(group_variants, variants[i]);
++            }
++        }
 +
-+static void
-+ibus_xkb_layout_config_destroy (IBusXKBLayoutConfig *xkb_layout_config)
-+{
-+    IBusXKBLayoutConfigPrivate *priv;
++        if (variant != "") {
++            has_variant = true;
++        }
 +
-+    g_return_if_fail (xkb_layout_config != NULL);
++        if (!include_keymap) {
++            group_layouts = "%s,%s".printf(group_layouts, layout);
++            group_variants = "%s,%s".printf(group_variants, variant);
++            group_id = i;
++        }
 +
-+    priv = IBUS_XKB_LAYOUT_CONFIG_GET_PRIVATE (xkb_layout_config);
++        if (!has_variant) {
++            group_variants = null;
++        }
 +
-+    g_free (priv->system_config_file);
-+    priv->system_config_file = NULL;
-+    free_lang_list (priv->preload_layouts);
-+    priv->preload_layouts = NULL;
-+}
++        return {group_layouts, group_variants, group_id.to_string()};
++    }
 +
-+static void
-+ibus_xkb_layout_config_set_property (IBusXKBLayoutConfig *xkb_layout_config,
-+                                     guint                prop_id,
-+                                     const GValue        *value,
-+                                     GParamSpec          *pspec)
-+{
-+    IBusXKBLayoutConfigPrivate *priv;
-+
-+    g_return_if_fail (xkb_layout_config != NULL);
-+    priv = IBUS_XKB_LAYOUT_CONFIG_GET_PRIVATE (xkb_layout_config);
-+
-+    switch (prop_id) {
-+    case PROP_SYSTEM_CONFIG_FILE:
-+        g_assert (priv->system_config_file == NULL);
-+        priv->system_config_file = g_strdup (g_value_get_string (value));
-+        break;
-+    default:
-+        G_OBJECT_WARN_INVALID_PROPERTY_ID (xkb_layout_config, prop_id, pspec);
++    public string[] get_variant_from_layout(string layout) {
++        int left_bracket = layout.index_of("(");
++        int right_bracket = layout.index_of(")");
++        if (left_bracket >= 0 && right_bracket > left_bracket) {
++            return {layout[0:left_bracket] +
++                    layout[right_bracket + 1:layout.length],
++                    layout[left_bracket + 1:right_bracket]};
++        }
++        return {layout, "default"};
 +    }
-+}
 +
-+static void
-+ibus_xkb_layout_config_get_property (IBusXKBLayoutConfig *xkb_layout_config,
-+                                     guint                prop_id,
-+                                     GValue              *value,
-+                                     GParamSpec          *pspec)
-+{
-+    IBusXKBLayoutConfigPrivate *priv;
++    public string[] get_option_from_layout(string layout) {
++        int left_bracket = layout.index_of("[");
++        int right_bracket = layout.index_of("]");
++        if (left_bracket >= 0 && right_bracket > left_bracket) {
++            return {layout[0:left_bracket] +
++                    layout[right_bracket + 1:layout.length],
++                    layout[left_bracket + 1:right_bracket]};
++        }
++        return {layout, "default"};
++    }
 +
-+    g_return_if_fail (xkb_layout_config != NULL);
-+    priv = IBUS_XKB_LAYOUT_CONFIG_GET_PRIVATE (xkb_layout_config);
++    public string get_layout() {
++        if (HAVE_IBUS_XKB) {
++            return get_output_from_cmdline("--get", "layout: ");
++        } else {
++            return get_output_from_cmdline("-query", "layout: ");
++        }
++    }
 +
-+    switch (prop_id) {
-+    case PROP_SYSTEM_CONFIG_FILE:
-+        g_value_set_string (value, priv->system_config_file);
-+        break;
-+    default:
-+        G_OBJECT_WARN_INVALID_PROPERTY_ID (xkb_layout_config, prop_id, pspec);
++    public string get_variant() {
++        if (HAVE_IBUS_XKB) {
++            return get_output_from_cmdline("--get", "variant: ");
++        } else {
++            return get_output_from_cmdline("-query", "variant: ");
++        }
++    }
 +
++    public string get_option() {
++        if (HAVE_IBUS_XKB) {
++            return get_output_from_cmdline("--get", "option: ");
++        } else {
++            return get_output_from_cmdline("-query", "options: ");
++        }
 +    }
-+}
 +
-+static void
-+ibus_xkb_layout_config_class_init (IBusXKBLayoutConfigClass *klass)
-+{
-+    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-+    IBusObjectClass *ibus_object_class = IBUS_OBJECT_CLASS (klass);
++    /*
++    public string get_group() {
++        return get_output_from_cmdline("--get-group", "group: ");
++    }
++    */
 +
-+    g_type_class_add_private (klass, sizeof (IBusXKBLayoutConfigPrivate));
-+
-+    gobject_class->constructor = ibus_xkb_layout_config_constructor;
-+    gobject_class->set_property = (GObjectSetPropertyFunc) ibus_xkb_layout_config_set_property;
-+    gobject_class->get_property = (GObjectGetPropertyFunc) ibus_xkb_layout_config_get_property;
-+    ibus_object_class->destroy = (IBusObjectDestroyFunc) ibus_xkb_layout_config_destroy;
-+
-+    /**
-+     * IBusProxy:interface:
-+     *
-+     * The interface of the proxy object.
-+     */
-+    g_object_class_install_property (gobject_class,
-+                    PROP_SYSTEM_CONFIG_FILE,
-+                    g_param_spec_string ("system_config_file",
-+                        "system_config_file",
-+                        "The system file of xkblayoutconfig",
-+                        NULL,
-+                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
-+}
++    public int[] set_layout(string _layout="default",
++                            string _variant="default",
++                            string _option="default") {
++        assert (_layout != null);
 +
-+IBusComponent *
-+ibus_xkb_component_new (void)
-+{
-+    IBusComponent *component;
-+
-+    component = ibus_component_new ("org.freedesktop.IBus.XKB",
-+                                    "XKB Component",
-+                                    VERSION,
-+                                    "LGPL2.1",
-+                                    "Takao Fujiwara <takao.fujiwara1@gmail.com>",
-+                                    "http://code.google.com/p/ibus/",
-+                                    LIBEXECDIR "/ibus-engine-xkb --ibus",
-+                                    GETTEXT_PACKAGE);
-+
-+    return component;
-+}
++        int xkb_group_id = 0;
++        int changed_option = 0;
 +
-+IBusEngineDesc *
-+ibus_xkb_engine_desc_new (const gchar *lang,
-+                          const gchar *layout,
-+                          const gchar *layout_desc,
-+                          const gchar *variant,
-+                          const gchar *variant_desc,
-+                          const gchar *alt_name)
-+{
-+    IBusEngineDesc *engine;
-+    gchar *name = NULL;
-+    gchar *longname = NULL;
-+    gchar *desc = NULL;
-+    gchar *engine_layout = NULL;
-+    const gchar *name_prefix = "xkb:layout:";
-+
-+    g_return_val_if_fail (lang != NULL && layout != NULL, NULL);
-+
-+    if (variant_desc) {
-+        longname = g_strdup (variant_desc);
-+    } else if (layout && variant) {
-+        longname = g_strdup_printf ("%s - %s", layout, variant);
-+    } else if (layout_desc) {
-+        longname = g_strdup (layout_desc);
-+    } else {
-+        longname = g_strdup (layout);
-+    }
-+    if (variant) {
-+        if (alt_name) {
-+            name = g_strdup (alt_name);
-+        } else {
-+            name = g_strdup_printf ("%s%s:%s", name_prefix, layout, variant);
++        if (m_xkb_pid != -1) {
++            return {-1, 0};
 +        }
-+        desc = g_strdup_printf ("XKB %s(%s) keyboard layout", layout, variant);
-+        engine_layout = g_strdup_printf ("%s(%s)", layout, variant);
-+    } else {
-+        if (alt_name) {
-+            name = g_strdup (alt_name);
-+        } else {
-+            name = g_strdup_printf ("%s%s", name_prefix, layout);
++
++        if (_layout == "default" && _variant == "default" &&
++            _option == "default") {
++            return {-1, 0};
++        }
++        // const gchar to gchar
++        string layout = _layout;
++        string variant = _variant;
++        string option = _option;
++
++        if (variant == "default") {
++            string[] array = get_variant_from_layout(layout);
++            layout = array[0];
++            variant = array[1];
 +        }
-+        desc = g_strdup_printf ("XKB %s keyboard layout", layout);
-+        engine_layout = g_strdup (layout);
-+    }
 +
-+    engine = ibus_engine_desc_new (name,
-+                                   longname,
-+                                   desc,
-+                                   lang,
-+                                   "LGPL2.1",
-+                                   "Takao Fujiwara <takao.fujiwara1@gmail.com>",
-+                                   "ibus-engine",
-+                                   engine_layout);
-+
-+    g_free (name);
-+    g_free (longname);
-+    g_free (desc);
-+    g_free (engine_layout);
-+
-+    return engine;
-+}
++        if (option == "default") {
++            string[] array = get_option_from_layout(layout);
++            layout = array[0];
++            option = array[1];
++        }
 +
-+IBusXKBLayoutConfig *
-+ibus_xkb_layout_config_new (const gchar *system_config_file)
-+{
-+    IBusXKBLayoutConfig *xkb_layout_config;
++        bool need_us_layout = false;
++        foreach (string latin_layout in m_xkb_latin_layouts) {
++            if (layout == latin_layout && variant != "eng") {
++                need_us_layout = true;
++                break;
++            }
++            if (variant != null &&
++                "%s(%s)".printf(layout, variant) == latin_layout) {
++                need_us_layout = true;
++                break;
++            }
++        }
 +
-+    xkb_layout_config = IBUS_XKB_LAYOUT_CONFIG (g_object_new (IBUS_TYPE_XKB_LAYOUT_CONFIG,
-+                                                              "system_config_file",
-+                                                              system_config_file,
-+                                                              NULL));
-+    return xkb_layout_config;
-+}
++        int layouts_max_length =  XKB_LAYOUTS_MAX_LENGTH;
++        if (need_us_layout) {
++            layouts_max_length--;
++        }
 +
-+const GList *
-+ibus_xkb_layout_config_get_preload_layouts (IBusXKBLayoutConfig *xkb_layout_config)
-+{
-+    IBusXKBLayoutConfigPrivate *priv;
++        if (m_default_layout == "") {
++            m_default_layout = get_layout();
++        }
++        if (m_default_variant  == "") {
++            m_default_variant  = get_variant();
++        }
++        if (m_default_option == "") {
++            m_default_option = get_option();
++        }
 +
-+    g_return_val_if_fail (xkb_layout_config != NULL, NULL);
-+    priv = IBUS_XKB_LAYOUT_CONFIG_GET_PRIVATE (xkb_layout_config);
-+    return (const GList *) priv->preload_layouts;
-+}
-diff --git a/xkb/xkbxml.h b/xkb/xkbxml.h
-new file mode 100644
-index 0000000..6c00f1d
---- /dev/null
-+++ b/xkb/xkbxml.h
-@@ -0,0 +1,113 @@
-+/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
-+/* vim:set et sts=4: */
-+/* bus - The Input Bus
-+ * Copyright (C) 2011 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2011 Peng Huang <shawn.p.huang@gmail.com>
-+ * Copyright (C) 2011 Red Hat, Inc.
-+ *
-+ * This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2 of the License, or (at your option) any later version.
-+ *
-+ * This library is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General Public
-+ * License along with this library; if not, write to the
-+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-+ * Boston, MA 02111-1307, USA.
-+ */
-+#ifndef __XKBXML_H_
-+#define __XKBXML_H_
++        if (layout == "default") {
++            layout = m_default_layout;
++            variant = m_default_variant;
++        } else {
++            if (HAVE_IBUS_GKBD) {
++                if (variant == "default") {
++                    variant = "";
++                }
++                string[] retval = get_xkb_group_layout (layout, variant,
++                                                        layouts_max_length);
++                layout = retval[0];
++                variant = retval[1];
++                xkb_group_id = int.parse(retval[2]);
++            }
++        }
 +
-+#include "ibus.h"
++        if (layout == "") {
++            warning("Could not get the correct layout");
++            return {-1, 0};
++        }
 +
-+/*
-+ * Type macros.
-+ */
-+/* define IBusXKBLayoutConfig macros */
-+#define IBUS_TYPE_XKB_LAYOUT_CONFIG                     \
-+    (ibus_xkb_layout_config_get_type ())
-+#define IBUS_XKB_LAYOUT_CONFIG(obj)                     \
-+    (G_TYPE_CHECK_INSTANCE_CAST ((obj), IBUS_TYPE_XKB_LAYOUT_CONFIG, IBusXKBLayoutConfig))
-+#define IBUS_XKB_LAYOUT_CONFIG_CLASS(klass)             \
-+    (G_TYPE_CHECK_CLASS_CAST ((klass), IBUS_TYPE_XKB_LAYOUT_CONFIG, IBusXKBLayoutConfigClass))
-+#define IBUS_IS_XKB_LAYOUT_CONFIG(obj)                  \
-+    (G_TYPE_CHECK_INSTANCE_TYPE ((obj), IBUS_TYPE_XKB_LAYOUT_CONFIG))
-+#define IBUS_IS_XKB_LAYOUT_CONFIG_CLASS(klass)          \
-+    (G_TYPE_CHECK_CLASS_TYPE ((klass), IBUS_TYPE_XKB_LAYOUT_CONFIG))
-+#define IBUS_XKB_LAYOUT_CONFIG_GET_CLASS(obj)           \
-+    (G_TYPE_INSTANCE_GET_CLASS ((obj), IBUS_TYPE_XKB_LAYOUT_CONFIG, IBusXKBLayoutConfigClass))
++        if (variant == "default" || variant == "") {
++            variant = null;
++        }
 +
-+G_BEGIN_DECLS
++        if (option == "default" || option == "") {
++            option = m_default_option;
++        } else {
++            if (!(option in m_default_option.split(","))) {
++                option = "%s,%s".printf(m_default_option, option);
++                changed_option = 1;
++            } else {
++                option = m_default_option;
++            }
++        }
 +
-+typedef struct _IBusXKBLayoutConfig IBusXKBLayoutConfig;
-+typedef struct _IBusXKBLayoutConfigClass IBusXKBLayoutConfigClass;
++        if (option == "") {
++            option = null;
++        }
 +
-+struct _IBusXKBLayoutConfig {
-+    IBusObject parent;
-+};
++        if (need_us_layout) {
++            layout += ",us";
++            if (variant != null) {
++                variant += ",";
++            }
++        }
 +
-+struct _IBusXKBLayoutConfigClass {
-+    IBusObjectClass parent;
-+    /* signals */
-+    /*< private >*/
-+    /* padding */
-+    gpointer pdummy[8];
-+};
++        string[] args = {};
++        args += m_xkb_command;
++        if (HAVE_IBUS_XKB) {
++            args += "--layout";
++            args += layout;
++            if (variant != null) {
++                args += "--variant";
++                args += variant;
++            }
++            if (option != null) {
++                args += "--option";
++                args += option;
++            }
++        } else {
++            args += layout;
++            if (variant != null) {
++                args += variant;
++            }
++            if (option != null) {
++                args += option;
++            }
++        }
 +
++        GLib.Pid child_pid;
++        try {
++            GLib.Process.spawn_async(null,
++                                     args,
++                                     null,
++                                     GLib.SpawnFlags.DO_NOT_REAP_CHILD |
++                                         GLib.SpawnFlags.SEARCH_PATH,
++                                     null,
++                                     out child_pid);
++        } catch (GLib.SpawnError err) {
++            stderr.printf("IBUS_ERROR: %s\n", err.message);
++            return {-1, 0};
++        }
++        m_xkb_pid = child_pid;
++        GLib.ChildWatch.add(m_xkb_pid, set_layout_cb);
 +
-+/**
-+ * ibus_xkb_component_new:
-+ * @returns: A newly allocated IBusComponent.
-+ *
-+ * New an IBusComponent.
-+ */
-+IBusComponent   *ibus_xkb_component_new          (void);
++        return {xkb_group_id, changed_option};
++    }
 +
-+/**
-+ * ibus_xkb_engine_desc_new:
-+ * @lang: Language (e.g. zh, jp) supported by this input method engine.
-+ * @layout: Keyboard layout
-+ * @layout_desc: Keyboard layout description for engine description
-+ * @variant: Keyboard variant
-+ * @variant_desc: Keyboard variant description for engine description
-+ * @name_prefix: Name prefix for engine description, If NULL,
-+ *               the default is "xkb:layout:".
-+ * @returns: A newly allocated IBusEngineDesc.
-+ *
-+ * New a IBusEngineDesc.
-+ */
-+IBusEngineDesc  *ibus_xkb_engine_desc_new        (const gchar *lang,
-+                                                  const gchar *layout,
-+                                                  const gchar *layout_desc,
-+                                                  const gchar *variant,
-+                                                  const gchar *variant_desc,
-+                                                  const gchar *name_prefix);
++    public void set_xmodmap() {
++        if (!m_use_xmodmap) {
++            return;
++        }
 +
-+GType            ibus_xkb_layout_config_get_type (void);
++        if (m_xmodmap_pid != -1) {
++            return;
++        }
 +
-+/**
-+ * ibus_xkb_layout_config_new:
-+ * @returns: A newly allocated IBusXKBLayoutConfig
-+ *
-+ * New an IBusXKBLayoutConfig
-+ */
-+IBusXKBLayoutConfig *
-+                 ibus_xkb_layout_config_new      (const gchar *system_config_file);
++        string xmodmap_cmdpath = get_fullpath(m_xmodmap_command);
++        if (xmodmap_cmdpath == "") {
++            xmodmap_cmdpath = m_xmodmap_command;
++        }
++        string homedir = GLib.Environment.get_home_dir();
++        foreach (string xmodmap_file in m_xmodmap_known_files) {
++            string xmodmap_filepath = GLib.Path.build_filename(homedir, xmodmap_file);
++            if (!GLib.FileUtils.test(xmodmap_filepath, GLib.FileTest.EXISTS)) {
++                continue;
++            }
++            string[] args = {xmodmap_cmdpath, xmodmap_filepath};
++
++            GLib.Pid child_pid;
++            try {
++                GLib.Process.spawn_async(null,
++                                         args,
++                                         null,
++                                         GLib.SpawnFlags.DO_NOT_REAP_CHILD |
++                                             GLib.SpawnFlags.SEARCH_PATH,
++                                         null,
++                                         out child_pid);
++            } catch (GLib.SpawnError err) {
++                stderr.printf("IBUS_ERROR: %s\n", err.message);
++                return;
++            }
++            m_xmodmap_pid = child_pid;
++            GLib.ChildWatch.add(m_xmodmap_pid, set_xmodmap_cb);
 +
-+/**
-+ * ibus_xkb_layout_config_get_preload_layouts:
-+ * @xkb_layout_config: An IBusXKBLayoutConfig.
-+ * @returns: A const GList
-+ *
-+ * a const GList
-+ */
-+const GList *    ibus_xkb_layout_config_get_preload_layouts
-+                                                 (IBusXKBLayoutConfig *xkb_layout_config);
++            break;
++        }
++    }
 +
-+G_END_DECLS
-+#endif
++    public void reset_layout() {
++        m_default_layout = get_layout();
++        m_default_variant = get_variant();
++        m_default_option = get_option();
++    }
++
++    /*
++    public static int main(string[] args) {
++        IBus.Bus bus = new IBus.Bus();
++        IBus.Config config = bus.get_config();
++        XKBLayout xkblayout = new XKBLayout(config);
++        stdout.printf ("layout: %s\n", xkblayout.get_layout());
++        stdout.printf ("variant: %s\n", xkblayout.get_variant());
++        stdout.printf ("option: %s\n", xkblayout.get_option());
++        xkblayout.set_layout("jp");
++        if (config != null) {
++            IBus.main();
++        } else {
++            Gtk.init (ref args);
++            Gtk.main();
++        }
++        return 0;
++    }
++    */
++}
 -- 
 1.7.7.4
 

diff --git a/ibus-HEAD.patch b/ibus-HEAD.patch
index 1264e34..64b9ea8 100644
--- a/ibus-HEAD.patch
+++ b/ibus-HEAD.patch
@@ -1,1990 +1,48 @@
-From cb519c852dfc7a652df1768c81974d750ef48f58 Mon Sep 17 00:00:00 2001
-From: Daiki Ueno <ueno@unixuser.org>
-Date: Thu, 29 Sep 2011 12:24:53 +0900
-Subject: [PATCH] Fix hiding button items in GTK panel.
-
-BUG=none
-TEST=manual
-
-Review URL: http://codereview.appspot.com/5148041
----
- ui/gtk/toolitem.py |   12 ++++--------
- 1 files changed, 4 insertions(+), 8 deletions(-)
-
-diff --git a/ui/gtk/toolitem.py b/ui/gtk/toolitem.py
-index 4bdffba..4f4f97d 100644
---- a/ui/gtk/toolitem.py
-+++ b/ui/gtk/toolitem.py
-@@ -73,11 +73,9 @@ class ToolButton(gtk.ToolButton, PropItem):
-         self.set_icon_name(self._prop.icon)
- 
-         if self._prop.visible:
--            self.set_no_show_all(False)
--            self.show_all()
-+            self.show()
-         else:
--            self.set_no_show_all(True)
--            self.hide_all()
-+            self.hide()
- 
-     def do_clicked(self):
-         self.emit("property-activate", self._prop.key, self._prop.state)
-@@ -128,11 +126,9 @@ class ToggleToolButton(gtk.ToggleToolButton, PropItem):
-         self.set_active(self._prop.state == ibus.PROP_STATE_CHECKED)
-         self.set_sensitive(self._prop.sensitive)
-         if self._prop.visible:
--            self.set_no_show_all(False)
--            self.show_all()
-+            self.show()
-         else:
--            self.set_no_show_all(True)
--            self.hide_all()
-+            self.hide()
- 
-     def do_toggled(self):
-         # Do not send property-activate to engine in case the event is
--- 
-1.7.6.4
-
-From d19018b8709847009d2e0836c942dd9f1385e7cb Mon Sep 17 00:00:00 2001
-From: Yusuke Sato <yusukes@chromium.org>
-Date: Sun, 9 Oct 2011 13:52:42 +0900
-Subject: [PATCH] Always consume a hotkey press
-
-BUG=1324
-
-Review URL: http://codereview.appspot.com/5242044
----
- bus/ibusimpl.c |    6 +++---
- 1 files changed, 3 insertions(+), 3 deletions(-)
-
-diff --git a/bus/ibusimpl.c b/bus/ibusimpl.c
-index 1942504..1494f5f 100644
---- a/bus/ibusimpl.c
-+++ b/bus/ibusimpl.c
-@@ -2066,21 +2066,21 @@ bus_ibus_impl_filter_keyboard_shortcuts (BusIBusImpl     *ibus,
-         else {
-             bus_input_context_enable (context);
-         }
--        return (enabled != bus_input_context_is_enabled (context));
-+        return TRUE;
-     }
-     if (event == enable_unconditional) {
-         gboolean enabled = bus_input_context_is_enabled (context);
-         if (!enabled) {
-             bus_input_context_enable (context);
-         }
--        return bus_input_context_is_enabled (context);
-+        return TRUE;
-     }
-     if (event == disable_unconditional) {
-         gboolean enabled = bus_input_context_is_enabled (context);
-         if (enabled) {
-             bus_input_context_disable (context);
-         }
--        return !bus_input_context_is_enabled (context);
-+        return TRUE;
-     }
-     if (event == next) {
-         if (bus_input_context_is_enabled (context)) {
--- 
-1.7.6.4
-
-From ee966e327cc3b1b4bba40379bc0fbb3d46c38239 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Tue, 25 Oct 2011 10:37:22 +0900
-Subject: [PATCH] Add ibusutil.h in ibus.h
-
-BUG=http://code.google.com/p/ibus/issues/detail?id=1338
-TEST=Linux desktop
-
-Review URL: http://codereview.appspot.com/5294054
----
- src/ibus.h |    1 +
- 1 files changed, 1 insertions(+), 0 deletions(-)
-
-diff --git a/src/ibus.h b/src/ibus.h
-index 0765799..addc531 100644
---- a/src/ibus.h
-+++ b/src/ibus.h
-@@ -52,6 +52,7 @@
- #include <ibusconfig.h>
- #include <ibusconfigservice.h>
- #include <ibuspanelservice.h>
-+#include <ibusutil.h>
- 
- #undef __IBUS_H_INSIDE__
- 
--- 
-1.7.6.4
-
-From 910f8a64098d89b04c50056f621ec1a49dd3e7ea Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Tue, 25 Oct 2011 10:50:34 +0900
-Subject: [PATCH] Fix previous_engine without global engine.
-
-BUG=http://code.google.com/p/ibus/issues/detail?id=1331
-TEST=Linux desktop
-
-Review URL: http://codereview.appspot.com/5297047
----
- bus/ibusimpl.c |   31 +++++++++++++++++++------------
- 1 files changed, 19 insertions(+), 12 deletions(-)
-
-diff --git a/bus/ibusimpl.c b/bus/ibusimpl.c
-index 1494f5f..0a4f3fb 100644
---- a/bus/ibusimpl.c
-+++ b/bus/ibusimpl.c
-@@ -1044,13 +1044,14 @@ bus_ibus_impl_get_engine_desc (BusIBusImpl *ibus,
- }
- 
- /**
-- * bus_ibus_impl_context_request_next_engine_in_menu:
-+ * bus_ibus_impl_context_request_rotate_engine_in_menu:
-  *
-- * Process the "next_engine_in_menu" hotkey.
-+ * Process the "next_engine_in_menu" or "previous_engine" hotkey.
-  */
- static void
--bus_ibus_impl_context_request_next_engine_in_menu (BusIBusImpl     *ibus,
--                                                   BusInputContext *context)
-+bus_ibus_impl_context_request_rotate_engine_in_menu (BusIBusImpl     *ibus,
-+                                                     BusInputContext *context,
-+                                                     gboolean         is_next)
- {
-     BusEngineProxy *engine;
-     IBusEngineDesc *desc;
-@@ -1071,12 +1072,20 @@ bus_ibus_impl_context_request_next_engine_in_menu (BusIBusImpl     *ibus,
- 
-     p = g_list_find (ibus->register_engine_list, desc);
-     if (p != NULL) {
--        p = p->next;
-+        if (is_next) {
-+            p = p->next;
-+        } else if (p->prev) {
-+            p = p->prev;
-+        }
-     }
-     if (p == NULL) {
-         p = g_list_find (ibus->engine_list, desc);
-         if (p != NULL) {
--            p = p->next;
-+            if (is_next) {
-+                p = p->next;
-+            } else if (p->prev) {
-+                p = p->prev;
-+            }
-         }
-     }
- 
-@@ -1126,12 +1135,9 @@ bus_ibus_impl_context_request_previous_engine (BusIBusImpl     *ibus,
-         }
-     }
- 
--    /*
--     * If the previous engine name is not found, switch to the next engine
--     * in the menu. This behavior is better than doing nothing.
--     */
-     if (!engine_name) {
--        bus_ibus_impl_context_request_next_engine_in_menu (ibus, context);
-+        bus_ibus_impl_context_request_rotate_engine_in_menu (ibus, context,
-+                                                             FALSE);
-         return;
-     }
- 
-@@ -2084,7 +2090,8 @@ bus_ibus_impl_filter_keyboard_shortcuts (BusIBusImpl     *ibus,
-     }
-     if (event == next) {
-         if (bus_input_context_is_enabled (context)) {
--            bus_ibus_impl_context_request_next_engine_in_menu (ibus, context);
-+            bus_ibus_impl_context_request_rotate_engine_in_menu (ibus, context,
-+                                                                 TRUE);
-         }
-         else {
-             bus_input_context_enable (context);
--- 
-1.7.6.4
-
-From cca4fd8993613a6993965c3120323e43c4647ef5 Mon Sep 17 00:00:00 2001
-From: Daiki Ueno <ueno@unixuser.org>
-Date: Fri, 28 Oct 2011 15:42:08 +0900
-Subject: [PATCH] Don't set focus on GTK password entry.
-
-For an old bug:
-https://bugzilla.redhat.com/show_bug.cgi?id=484643
-Input method should be disabled on password entry for security reason.
-
-BUG=none
-TEST=manually with gtk-demo "Entry Buffer" example
-
-Review URL: http://codereview.appspot.com/5319053
----
- client/gtk2/ibusimcontext.c |   13 +++++++++++++
- 1 files changed, 13 insertions(+), 0 deletions(-)
-
-diff --git a/client/gtk2/ibusimcontext.c b/client/gtk2/ibusimcontext.c
-index 327a5d9..b6ca12e 100644
---- a/client/gtk2/ibusimcontext.c
-+++ b/client/gtk2/ibusimcontext.c
-@@ -734,6 +734,19 @@ ibus_im_context_focus_in (GtkIMContext *context)
-     if (ibusimcontext->has_focus)
-         return;
- 
-+    /* don't set focus on password entry */
-+    if (ibusimcontext->client_window != NULL) {
-+        GtkWidget *widget;
-+
-+        gdk_window_get_user_data (ibusimcontext->client_window,
-+                                  (gpointer *)&widget);
-+
-+        if (GTK_IS_ENTRY (widget) &&
-+            !gtk_entry_get_visibility (GTK_ENTRY (widget))) {
-+            return;
-+        }
-+    }
-+
-     if (_focus_im_context != NULL) {
-         g_assert (_focus_im_context != context);
-         gtk_im_context_focus_out (_focus_im_context);
--- 
-1.7.6.4
-
-From 02893693fc0a8692a6242b0be6dc8f09e14c1c54 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Wed, 2 Nov 2011 14:17:50 +0900
-Subject: [PATCH] Rerotate next/previous engines without global engine.
-
-BUG=http://code.google.com/p/ibus/issues/detail?id=1331
-TEST=Linux desktop
-
-Review URL: http://codereview.appspot.com/5321067
----
- bus/ibusimpl.c |   31 ++++++++++++++++++++++++++++---
- 1 files changed, 28 insertions(+), 3 deletions(-)
-
-diff --git a/bus/ibusimpl.c b/bus/ibusimpl.c
-index 0a4f3fb..059d660 100644
---- a/bus/ibusimpl.c
-+++ b/bus/ibusimpl.c
-@@ -1056,7 +1056,7 @@ bus_ibus_impl_context_request_rotate_engine_in_menu (BusIBusImpl     *ibus,
-     BusEngineProxy *engine;
-     IBusEngineDesc *desc;
-     IBusEngineDesc *next_desc = NULL;
--    GList *p;
-+    GList *p = NULL;
- 
-     engine = bus_input_context_get_engine (context);
-     if (engine == NULL) {
-@@ -1074,21 +1074,46 @@ bus_ibus_impl_context_request_rotate_engine_in_menu (BusIBusImpl     *ibus,
-     if (p != NULL) {
-         if (is_next) {
-             p = p->next;
--        } else if (p->prev) {
-+        } else {
-             p = p->prev;
-         }
-     }
-+
-+    /* Rotate register_engine_list and engine_list. */
-+    if (p == NULL && g_list_find (ibus->register_engine_list, desc) != NULL) {
-+        if (is_next) {
-+            p = ibus->engine_list;
-+        } else {
-+            p = g_list_last (ibus->engine_list);
-+        }
-+    }
-+
-     if (p == NULL) {
-         p = g_list_find (ibus->engine_list, desc);
-         if (p != NULL) {
-             if (is_next) {
-                 p = p->next;
--            } else if (p->prev) {
-+            } else {
-                 p = p->prev;
-             }
-         }
-     }
- 
-+    /* Rerotate register_engine_list and engine_list. */
-+    if (p == NULL && g_list_find (ibus->engine_list, desc) != NULL) {
-+        if (is_next) {
-+            p = ibus->register_engine_list;
-+            if (p == NULL) {
-+                p = ibus->engine_list;
-+            }
-+        } else {
-+            p = g_list_last (ibus->register_engine_list);
-+            if (p == NULL) {
-+                p = g_list_last (ibus->engine_list);
-+            }
-+        }
-+    }
-+
-     if (p != NULL) {
-         next_desc = (IBusEngineDesc*) p->data;
-     }
--- 
-1.7.6.4
-
-From 613e01520f27a53c947fed476d99aeb8ae1ae39b Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Tue, 8 Nov 2011 10:48:42 +0900
-Subject: [PATCH] Fixed fallback icons.
-
-1. Set 'ibus-keyboard' icon for IME off in non-GNOME theme.
-People would think the application icon for non-GNONE classic desktop.
-The themed icon is applied for GNOME icon theme only.
-
-2. Set gtk-fallback-icon-theme as 'gnome'
-ibus gtk panel needs gtk stock icons but some desktop does not load GNOME
-icon theme. I assigned 'gnome' for gtk-fallback-icon-theme if it's none.
-
-3. Use 'gtk-dialog-info' if 'gtk-info' is not found.
-It seems the latest gtk2 does not have 'gtk-info' icon via pygtk2.
-
-BUG=RH#711632
-TEST=Linux desktop
-
-Review URL: http://codereview.appspot.com/5320066
----
- ibus/_config.py.in |    8 ++++++--
- ui/gtk/main.py     |    3 +++
- ui/gtk/panel.py    |    2 +-
- 3 files changed, 10 insertions(+), 3 deletions(-)
-
-diff --git a/ibus/_config.py.in b/ibus/_config.py.in
-index a830136..098d805 100644
---- a/ibus/_config.py.in
-+++ b/ibus/_config.py.in
-@@ -45,10 +45,14 @@ def get_license():
- 
- def get_ICON_KEYBOARD():
-     import gtk
--    theme = gtk.icon_theme_get_default()
-     icon = '@IBUS_ICON_KEYBOARD@'
-+    fallback_icon = 'ibus-keyboard'
-+    settings = gtk.settings_get_default()
-+    if settings.get_property('gtk-icon-theme-name') != 'gnome':
-+        return fallback_icon
-+    theme = gtk.icon_theme_get_default()
-     if not theme.lookup_icon(icon, 18, 0):
--        icon = 'ibus-keyboard'
-+        return fallback_icon
-     return icon
- 
- ISOCODES_PREFIX='@ISOCODES_PREFIX@'
-diff --git a/ui/gtk/main.py b/ui/gtk/main.py
-index 0412aea..cadcc96 100644
---- a/ui/gtk/main.py
-+++ b/ui/gtk/main.py
-@@ -86,6 +86,9 @@ class UIApplication:
-             pass
- 
- def launch_panel(replace):
-+    settings = gtk.settings_get_default()
-+    if settings.get_property('gtk-fallback-icon-theme') == None:
-+        settings.set_property('gtk-fallback-icon-theme', 'gnome')
-     # gtk.settings_get_default().props.gtk_theme_name = "/home/phuang/.themes/aud-Default/gtk-2.0/gtkrc"
-     # gtk.rc_parse("./themes/default/gtkrc")
-     UIApplication(replace).run()
-diff --git a/ui/gtk/panel.py b/ui/gtk/panel.py
-index 90be1d5..f71a36d 100644
---- a/ui/gtk/panel.py
-+++ b/ui/gtk/panel.py
-@@ -477,7 +477,7 @@ class Panel(ibus.PanelBase):
-             menu = gtk.Menu()
-             item = gtk.ImageMenuItem(_("No input window"))
-             size = gtk.icon_size_lookup(gtk.ICON_SIZE_MENU)
--            item.set_image(_icon.IconWidget("gtk-info", size[0]))
-+            item.set_image(_icon.IconWidget("gtk-dialog-info", size[0]))
-             menu.add(item)
-             menu.show_all()
-         else:
--- 
-1.7.6.4
-
-From c73b2d449e21ae0cb87845e34abadd2e54e1e423 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Mon, 21 Nov 2011 11:00:09 +0900
-Subject: [PATCH] Use ibus_input_context_process_key_event_async in
- ibus-x11
-
----
- client/x11/main.c |  113 ++++++++++++++++++++++++++++++++++++++++++++---------
- 1 files changed, 94 insertions(+), 19 deletions(-)
-
-diff --git a/client/x11/main.c b/client/x11/main.c
-index 0ba826c..58069fc 100644
---- a/client/x11/main.c
-+++ b/client/x11/main.c
-@@ -116,6 +116,8 @@ static gint     g_debug_level = 0;
- 
- static IBusBus *_bus = NULL;
- 
-+static gboolean _use_sync_mode = FALSE;
-+
- static void
- _xim_preedit_start (XIMS xims, const X11IC *x11ic)
- {
-@@ -443,6 +445,31 @@ xim_unset_ic_focus (XIMS xims, IMChangeFocusStruct *call_data)
- 
- }
- 
-+static void
-+_process_key_event_done (GObject      *object,
-+                         GAsyncResult *res,
-+                         gpointer      user_data)
-+{
-+    IBusInputContext *context = (IBusInputContext *)object;
-+    IMForwardEventStruct *pfe = (IMForwardEventStruct*) user_data;
-+
-+    GError *error = NULL;
-+    gboolean retval = ibus_input_context_process_key_event_async_finish (
-+            context,
-+            res,
-+            &error);
-+
-+    if (error != NULL) {
-+        g_warning ("Process Key Event failed: %s.", error->message);
-+        g_error_free (error);
-+    }
-+
-+    if (retval == FALSE) {
-+        IMForwardEvent (_xims, (XPointer) pfe);
-+    }
-+    g_slice_free (IMForwardEventStruct, pfe);
-+}
-+
- static int
- xim_forward_event (XIMS xims, IMForwardEventStruct *call_data)
- {
-@@ -469,30 +496,57 @@ xim_forward_event (XIMS xims, IMForwardEventStruct *call_data)
-     if (event.type == GDK_KEY_RELEASE) {
-         event.state |= IBUS_RELEASE_MASK;
-     }
--    retval = ibus_input_context_process_key_event (x11ic->context,
--                                                   event.keyval,
--                                                   event.hardware_keycode - 8,
--                                                   event.state);
--    if (retval) {
--        if (! x11ic->has_preedit_area) {
--            _xim_set_cursor_location (x11ic);
-+
-+    if (_use_sync_mode) {
-+        retval = ibus_input_context_process_key_event (
-+                                      x11ic->context,
-+                                      event.keyval,
-+                                      event.hardware_keycode - 8,
-+                                      event.state);
-+        if (retval) {
-+            if (! x11ic->has_preedit_area) {
-+                _xim_set_cursor_location (x11ic);
-+            }
-+            return 1;
-         }
--        return 1;
--    }
- 
--    IMForwardEventStruct fe;
--    memset (&fe, 0, sizeof (fe));
-+        IMForwardEventStruct fe;
-+        memset (&fe, 0, sizeof (fe));
- 
--    fe.major_code = XIM_FORWARD_EVENT;
--    fe.icid = x11ic->icid;
--    fe.connect_id = x11ic->connect_id;
--    fe.sync_bit = 0;
--    fe.serial_number = 0L;
--    fe.event = call_data->event;
-+        fe.major_code = XIM_FORWARD_EVENT;
-+        fe.icid = x11ic->icid;
-+        fe.connect_id = x11ic->connect_id;
-+        fe.sync_bit = 0;
-+        fe.serial_number = 0L;
-+        fe.event = call_data->event;
- 
--    IMForwardEvent (_xims, (XPointer) &fe);
-+        IMForwardEvent (_xims, (XPointer) &fe);
- 
--    return 1;
-+        retval = 1;
-+    }
-+    else {
-+        IMForwardEventStruct *pfe;
-+
-+        pfe = g_slice_new0 (IMForwardEventStruct);
-+        pfe->major_code = XIM_FORWARD_EVENT;
-+        pfe->icid = x11ic->icid;
-+        pfe->connect_id = x11ic->connect_id;
-+        pfe->sync_bit = 0;
-+        pfe->serial_number = 0L;
-+        pfe->event = call_data->event;
-+
-+        ibus_input_context_process_key_event_async (
-+                                      x11ic->context,
-+                                      event.keyval,
-+                                      event.hardware_keycode - 8,
-+                                      event.state,
-+                                      -1,
-+                                      NULL,
-+                                      _process_key_event_done,
-+                                      pfe);
-+        retval = 1;
-+    }
-+    return retval;
- }
- 
- 
-@@ -897,6 +951,25 @@ _context_disabled_cb (IBusInputContext *context,
-     _xim_preedit_end (_xims, x11ic);
- }
- 
-+static gboolean
-+_get_boolean_env(const gchar *name,
-+                 gboolean     defval)
-+{
-+    const gchar *value = g_getenv (name);
-+
-+    if (value == NULL)
-+      return defval;
-+
-+    if (g_strcmp0 (value, "") == 0 ||
-+        g_strcmp0 (value, "0") == 0 ||
-+        g_strcmp0 (value, "false") == 0 ||
-+        g_strcmp0 (value, "False") == 0 ||
-+        g_strcmp0 (value, "FALSE") == 0)
-+      return FALSE;
-+
-+    return TRUE;
-+}
-+
- static void
- _init_ibus (void)
- {
-@@ -909,6 +982,8 @@ _init_ibus (void)
- 
-     g_signal_connect (_bus, "disconnected",
-                         G_CALLBACK (_bus_disconnected_cb), NULL);
-+
-+    _use_sync_mode = _get_boolean_env ("IBUS_ENABLE_SYNC_MODE", FALSE);
- }
- 
- static void
--- 
-1.7.6.4
-
-From 5d2ac19e1524b1802f5298eedff1ba52423c847f Mon Sep 17 00:00:00 2001
-From: Daiki Ueno <ueno@unixuser.org>
-Date: Wed, 30 Nov 2011 09:40:15 +0900
-Subject: [PATCH] Disable surrounding-text when retrieve-surrounding
- signal is not handled in GTK.
-
-BUG=https://code.google.com/p/ibus/issues/detail?id=1358
-TEST=On Fedora with ibus-m17n tis820
-
-Review URL: http://codereview.appspot.com/5431086
----
- client/gtk2/ibusimcontext.c |    5 +++++
- 1 files changed, 5 insertions(+), 0 deletions(-)
-
-diff --git a/client/gtk2/ibusimcontext.c b/client/gtk2/ibusimcontext.c
-index b6ca12e..5ae5cfc 100644
---- a/client/gtk2/ibusimcontext.c
-+++ b/client/gtk2/ibusimcontext.c
-@@ -278,6 +278,11 @@ _request_surrounding_text (IBusIMContext *context)
-         IDEBUG ("requesting surrounding text");
-         g_signal_emit (context, _signal_retrieve_surrounding_id, 0,
-                        &return_value);
-+        if (!return_value) {
-+            context->caps &= ~IBUS_CAP_SURROUNDING_TEXT;
-+            ibus_input_context_set_capabilities (context->ibuscontext,
-+                                                 context->caps);
-+        }
-     }
- }
- 
--- 
-1.7.6.4
-
-From 5236e2159f2e6184c18df9a9ecbb05bfb09106d4 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Wed, 30 Nov 2011 12:28:22 +0900
-Subject: [PATCH] Add the engine preference button on ibus-setup
-
-The new preference button launches $libexecdir/ibus-setup- + engine.name
-by default. The engine is IBusEngineDesc.
-If engine.setup has a value, the button launches it instead.
-
-BUG=RH#618229
-TEST=Linux desktop
-
-Review URL: http://codereview.appspot.com/5437062
----
- ibus/enginedesc.py   |   11 +++++++++--
- setup/ibus-setup.in  |    2 ++
- setup/main.py        |   46 ++++++++++++++++++++++++++++++++++++++++++++++
- setup/setup.ui       |   16 ++++++++++++++++
- src/ibusenginedesc.c |   31 +++++++++++++++++++++++++++++++
- src/ibusenginedesc.h |   12 ++++++++++--
- 6 files changed, 114 insertions(+), 4 deletions(-)
-
-diff --git a/ibus/enginedesc.py b/ibus/enginedesc.py
-index 3ca7f24..055a3a0 100644
---- a/ibus/enginedesc.py
-+++ b/ibus/enginedesc.py
-@@ -31,7 +31,7 @@ from serializable import *
- class EngineDesc(Serializable):
-     __gtype_name__ = "PYIBusEngineDesc"
-     __NAME__ = "IBusEngineDesc"
--    def __init__(self, name="", longname="", description="", language="", license="", author="", icon="", layout="", hotkeys="", rank=0, symbol=""):
-+    def __init__(self, name="", longname="", description="", language="", license="", author="", icon="", layout="", hotkeys="", rank=0, symbol="", setup=""):
-         super(EngineDesc, self).__init__()
-         self.__name = name
-         self.__longname = longname
-@@ -44,6 +44,7 @@ class EngineDesc(Serializable):
-         self.__rank = rank
-         self.__hotkeys = hotkeys
-         self.__symbol = symbol
-+        self.__setup = setup
- 
-     def get_name(self):
-         return self.__name
-@@ -78,6 +79,9 @@ class EngineDesc(Serializable):
-     def get_symbol(self):
-         return self.__symbol
- 
-+    def get_setup(self):
-+        return self.__setup
-+
-     name        = property(get_name)
-     longname    = property(get_longname)
-     description = property(get_description)
-@@ -89,6 +93,7 @@ class EngineDesc(Serializable):
-     rank        = property(get_rank)
-     hotkeys     = property(get_hotkeys)
-     symbol      = property(get_symbol)
-+    setup       = property(get_setup)
- 
-     def serialize(self, struct):
-         super(EngineDesc, self).serialize(struct)
-@@ -103,6 +108,7 @@ class EngineDesc(Serializable):
-         struct.append(dbus.UInt32(self.__rank))
-         struct.append(dbus.String(self.__hotkeys))
-         struct.append(dbus.String(self.__symbol))
-+        struct.append(dbus.String(self.__setup))
- 
-     def deserialize(self, struct):
-         super(EngineDesc, self).deserialize(struct)
-@@ -117,9 +123,10 @@ class EngineDesc(Serializable):
-         self.__rank = struct.pop(0)
-         self.__hotkeys = struct.pop(0)
-         self.__symbol = struct.pop(0)
-+        self.__setup  = struct.pop(0)
- 
- def test():
--    engine = EngineDesc("Hello", "", "", "", "", "", "", "", "", 0, "")
-+    engine = EngineDesc("Hello", "", "", "", "", "", "", "", "", 0, "", "")
-     value = serialize_object(engine)
-     engine = deserialize_object(value)
- 
-diff --git a/setup/ibus-setup.in b/setup/ibus-setup.in
-index 72bc1a4..f3c3730 100644
---- a/setup/ibus-setup.in
-+++ b/setup/ibus-setup.in
-@@ -23,8 +23,10 @@
- prefix=@prefix@
- exec_prefix=@exec_prefix@
- datarootdir=@datarootdir@
-+libexecdir=@libexecdir@
- export IBUS_PREFIX=@prefix@
- export IBUS_DATAROOTDIR=@datarootdir@
- export IBUS_LOCALEDIR=@localedir@
-+export IBUS_LIBEXECDIR=${libexecdir}
- exec @PYTHON@ @prefix@/share/ibus/setup/main.py $@
- 
-diff --git a/setup/main.py b/setup/main.py
-index a22bb0c..6c0fb0e 100644
---- a/setup/main.py
-+++ b/setup/main.py
-@@ -238,6 +238,10 @@ class Setup(object):
-         button = self.__builder.get_object("button_engine_about")
-         button.connect("clicked", self.__button_engine_about_cb)
- 
-+        self.__engine_setup_exec_list = {}
-+        button = self.__builder.get_object("button_engine_preferences")
-+        button.connect("clicked", self.__button_engine_preferences_cb)
-+
-         self.__combobox.connect("notify::active-engine", self.__combobox_notify_active_engine_cb)
-         self.__treeview.connect("notify", self.__treeview_notify_cb)
- 
-@@ -246,6 +250,24 @@ class Setup(object):
-         button = self.__builder.get_object("button_engine_add")
-         button.set_sensitive(engine != None and engine not in self.__treeview.get_engines())
- 
-+    def __get_engine_setup_exec_args(self, engine):
-+        args = []
-+        if engine == None:
-+           return args
-+        setup = str(engine.setup)
-+        if len(setup) != 0:
-+            args = setup.split()
-+            args.insert(1, path.basename(args[0]))
-+            return args
-+        name = str(engine.name)
-+        libexecdir = os.environ['IBUS_LIBEXECDIR']
-+        setup_path = (libexecdir + '/' + 'ibus-setup-' if libexecdir != None \
-+            else 'ibus-setup-') + name.split(':')[0]
-+        if path.exists(setup_path):
-+            args.append(setup_path)
-+            args.append(path.basename(setup_path))
-+        return args
-+
-     def __treeview_notify_cb(self, treeview, property):
-         if property.name != "active-engine" and property.name != "engines":
-             return
-@@ -258,6 +280,12 @@ class Setup(object):
-         self.__builder.get_object("button_engine_up").set_sensitive(engine not in engines[:1])
-         self.__builder.get_object("button_engine_down").set_sensitive(engine not in engines[-1:])
- 
-+        obj = self.__builder.get_object("button_engine_preferences")
-+        if len(self.__get_engine_setup_exec_args(engine)) != 0:
-+            obj.set_sensitive(True)
-+        else:
-+            obj.set_sensitive(False)
-+
-         if property.name == "engines":
-             engine_names = map(lambda e: e.name, engines)
-             self.__config.set_list("general", "preload_engines", engine_names, "s")
-@@ -273,6 +301,24 @@ class Setup(object):
-             about.run()
-             about.destroy()
- 
-+    def __button_engine_preferences_cb(self, button):
-+        engine = self.__treeview.get_active_engine()
-+        args = self.__get_engine_setup_exec_args(engine)
-+        if len(args) == 0:
-+            return
-+        name = engine.name
-+        if name in self.__engine_setup_exec_list.keys():
-+            try:
-+                wpid, sts = os.waitpid(self.__engine_setup_exec_list[name],
-+                                       os.WNOHANG)
-+                # the setup is still running.
-+                if wpid == 0:
-+                    return
-+            except OSError:
-+                pass
-+            del self.__engine_setup_exec_list[name]
-+        self.__engine_setup_exec_list[name] = os.spawnl(os.P_NOWAIT, *args)
-+
-     def __init_bus(self):
-         try:
-             self.__bus = ibus.Bus()
-diff --git a/setup/setup.ui b/setup/setup.ui
-index 0a69df8..c7ff564 100644
---- a/setup/setup.ui
-+++ b/setup/setup.ui
-@@ -726,6 +726,22 @@
-                                     <property name="position">4</property>
-                                   </packing>
-                                 </child>
-+                                <child>
-+                                  <object class="GtkButton" id="button_engine_preferences">
-+                                    <property name="label">gtk-preferences</property>
-+                                    <property name="visible">True</property>
-+                                    <property name="sensitive">False</property>
-+                                    <property name="can_focus">True</property>
-+                                    <property name="receives_default">True</property>
-+                                    <property name="tooltip_text" translatable="yes">Show setup of the selected input method</property>
-+                                    <property name="use_stock">True</property>
-+                                  </object>
-+                                  <packing>
-+                                    <property name="expand">False</property>
-+                                    <property name="fill">False</property>
-+                                    <property name="position">5</property>
-+                                  </packing>
-+                                </child>
-                               </object>
-                             </child>
-                           </object>
-diff --git a/src/ibusenginedesc.c b/src/ibusenginedesc.c
-index fa3a768..48ecb07 100644
---- a/src/ibusenginedesc.c
-+++ b/src/ibusenginedesc.c
-@@ -40,6 +40,7 @@ enum {
-     PROP_RANK,
-     PROP_HOTKEYS,
-     PROP_SYMBOL,
-+    PROP_SETUP,
- };
- 
- 
-@@ -56,6 +57,7 @@ struct _IBusEngineDescPrivate {
-     guint       rank;
-     gchar      *hotkeys;
-     gchar      *symbol;
-+    gchar      *setup;
- };
- 
- #define IBUS_ENGINE_DESC_GET_PRIVATE(o)  \
-@@ -247,6 +249,19 @@ ibus_engine_desc_class_init (IBusEngineDescClass *class)
-                         "The icon symbol chars of engine description",
-                         "",
-                         G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
-+
-+    /**
-+     * IBusEngineDesc:setup:
-+     *
-+     * The exec lists of the engine setup command
-+     */
-+    g_object_class_install_property (gobject_class,
-+                    PROP_SETUP,
-+                    g_param_spec_string ("setup",
-+                        "setup args",
-+                        "The exec lists of the engine setup command",
-+                        "",
-+                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
- }
- 
- static void
-@@ -265,6 +280,7 @@ ibus_engine_desc_init (IBusEngineDesc *desc)
-     desc->priv->rank = 0;
-     desc->priv->hotkeys = NULL;
-     desc->priv->symbol = NULL;
-+    desc->priv->setup = NULL;
- }
- 
- static void
-@@ -280,6 +296,7 @@ ibus_engine_desc_destroy (IBusEngineDesc *desc)
-     g_free (desc->priv->layout);
-     g_free (desc->priv->hotkeys);
-     g_free (desc->priv->symbol);
-+    g_free (desc->priv->setup);
- 
-     IBUS_OBJECT_CLASS (ibus_engine_desc_parent_class)->destroy (IBUS_OBJECT (desc));
- }
-@@ -334,6 +351,10 @@ ibus_engine_desc_set_property (IBusEngineDesc *desc,
-         g_assert (desc->priv->symbol == NULL);
-         desc->priv->symbol = g_value_dup_string (value);
-         break;
-+    case PROP_SETUP:
-+        g_assert (desc->priv->setup == NULL);
-+        desc->priv->setup = g_value_dup_string (value);
-+        break;
-     default:
-         G_OBJECT_WARN_INVALID_PROPERTY_ID (desc, prop_id, pspec);
-     }
-@@ -379,6 +400,9 @@ ibus_engine_desc_get_property (IBusEngineDesc *desc,
-     case PROP_SYMBOL:
-         g_value_set_string (value, ibus_engine_desc_get_symbol (desc));
-         break;
-+    case PROP_SETUP:
-+        g_value_set_string (value, ibus_engine_desc_get_setup (desc));
-+        break;
-     default:
-         G_OBJECT_WARN_INVALID_PROPERTY_ID (desc, prop_id, pspec);
-     }
-@@ -410,6 +434,7 @@ ibus_engine_desc_serialize (IBusEngineDesc  *desc,
-     g_variant_builder_add (builder, "u", desc->priv->rank);
-     g_variant_builder_add (builder, "s", NOTNULL (desc->priv->hotkeys));
-     g_variant_builder_add (builder, "s", NOTNULL (desc->priv->symbol));
-+    g_variant_builder_add (builder, "s", NOTNULL (desc->priv->setup));
- #undef NOTNULL
- 
-     return TRUE;
-@@ -439,6 +464,7 @@ ibus_engine_desc_deserialize (IBusEngineDesc *desc,
-     g_variant_get_child (variant, retval++, "u", &desc->priv->rank);
-     g_variant_get_child (variant, retval++, "s", &desc->priv->hotkeys);
-     g_variant_get_child (variant, retval++, "s", &desc->priv->symbol);
-+    g_variant_get_child (variant, retval++, "s", &desc->priv->setup);
- 
-     return retval;
- }
-@@ -464,6 +490,7 @@ ibus_engine_desc_copy (IBusEngineDesc       *dest,
-     dest->priv->rank             = src->priv->rank;
-     dest->priv->hotkeys          = g_strdup (src->priv->hotkeys);
-     dest->priv->symbol           = g_strdup (src->priv->symbol);
-+    dest->priv->setup            = g_strdup (src->priv->setup);
-     return TRUE;
- }
- 
-@@ -502,6 +529,7 @@ ibus_engine_desc_output (IBusEngineDesc *desc,
-     OUTPUT_ENTRY_1(layout);
-     OUTPUT_ENTRY_1(hotkeys);
-     OUTPUT_ENTRY_1(symbol);
-+    OUTPUT_ENTRY_1(setup);
-     g_string_append_indent (output, indent + 1);
-     g_string_append_printf (output, "<rank>%u</rank>\n", desc->priv->rank);
- #undef OUTPUT_ENTRY
-@@ -536,6 +564,7 @@ ibus_engine_desc_parse_xml_node (IBusEngineDesc *desc,
-         PARSE_ENTRY_1(layout);
-         PARSE_ENTRY_1(hotkeys);
-         PARSE_ENTRY_1(symbol);
-+        PARSE_ENTRY_1(setup);
- #undef PARSE_ENTRY
- #undef PARSE_ENTRY_1
-         if (g_strcmp0 (sub_node->name , "rank") == 0) {
-@@ -565,6 +594,7 @@ IBUS_ENGINE_DESC_GET_PROPERTY (layout, const gchar *)
- IBUS_ENGINE_DESC_GET_PROPERTY (rank, guint)
- IBUS_ENGINE_DESC_GET_PROPERTY (hotkeys, const gchar *)
- IBUS_ENGINE_DESC_GET_PROPERTY (symbol, const gchar *)
-+IBUS_ENGINE_DESC_GET_PROPERTY (setup, const gchar *)
- #undef IBUS_ENGINE_DESC_GET_PROPERTY
- 
- IBusEngineDesc *
-@@ -613,6 +643,7 @@ ibus_engine_desc_new_varargs (const gchar *first_property_name, ...)
-     g_assert (desc->priv->layout);
-     g_assert (desc->priv->hotkeys);
-     g_assert (desc->priv->symbol);
-+    g_assert (desc->priv->setup);
- 
-     return desc;
- }
-diff --git a/src/ibusenginedesc.h b/src/ibusenginedesc.h
-index 76a7adc..928743e 100644
---- a/src/ibusenginedesc.h
-+++ b/src/ibusenginedesc.h
-@@ -255,8 +255,16 @@ const gchar     *ibus_engine_desc_get_hotkeys   (IBusEngineDesc *info);
-  *
-  * Return the symbol property in IBusEngineDesc. It should not be freed.
-  */
--const gchar     *ibus_engine_desc_get_symbol
--                                                (IBusEngineDesc *info);
-+const gchar     *ibus_engine_desc_get_symbol    (IBusEngineDesc *info);
-+
-+/**
-+ * ibus_engine_desc_get_setup:
-+ * @info: An IBusEngineDesc
-+ * @returns: setup property in IBusEngineDesc
-+ *
-+ * Return the setup property in IBusEngineDesc. It should not be freed.
-+ */
-+const gchar     *ibus_engine_desc_get_setup     (IBusEngineDesc *info);
- 
- /**
-  * ibus_engine_desc_output:
--- 
-1.7.6.4
-
-From fd07a5a761fe1c242ba8babaab1060d5679a3618 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Tue, 20 Dec 2011 13:46:45 +0900
-Subject: [PATCH] Fix a SEGV if ibusimcontext->ibuscontext is null.
-
-BUG=
-TEST=Linux desktop
-
-Review URL: http://codereview.appspot.com/5489086
----
- client/gtk2/ibusimcontext.c |    1 +
- 1 files changed, 1 insertions(+), 0 deletions(-)
-
-diff --git a/client/gtk2/ibusimcontext.c b/client/gtk2/ibusimcontext.c
-index 5ae5cfc..72db581 100644
---- a/client/gtk2/ibusimcontext.c
-+++ b/client/gtk2/ibusimcontext.c
-@@ -273,6 +273,7 @@ _request_surrounding_text (IBusIMContext *context)
- {
-     if (context && context->enable &&
-         (context->caps & IBUS_CAP_SURROUNDING_TEXT) != 0 &&
-+        context->ibuscontext != NULL &&
-         ibus_input_context_needs_surrounding_text (context->ibuscontext)) {
-         gboolean return_value;
-         IDEBUG ("requesting surrounding text");
--- 
-1.7.7
-
-From ee9c4fba4535e85bd1f02743cab8914dd84e6178 Mon Sep 17 00:00:00 2001
-From: Peng Huang <shawn.p.huang@gmail.com>
-Date: Thu, 22 Dec 2011 09:57:01 -0500
-Subject: [PATCH] Make all fields of IBusProperty as gobject property.
-
-BUG=http://code.google.com/p/ibus/issues/detail?id=1383
-TEST=Linux desktop
-
-Review URL: http://codereview.appspot.com/5500066
----
- src/ibusproperty.c |  471 +++++++++++++++++++++++++++++++++++++++------------
- src/ibusproperty.h |   41 ++---
- 2 files changed, 376 insertions(+), 136 deletions(-)
-
-diff --git a/src/ibusproperty.c b/src/ibusproperty.c
-index 5a2dd78..e5480fa 100644
---- a/src/ibusproperty.c
-+++ b/src/ibusproperty.c
-@@ -21,8 +21,52 @@
-  */
- #include "ibusproperty.h"
- #include "ibusproplist.h"
-+#include "ibusenumtypes.h"
-+
-+enum {
-+    LAST_SIGNAL,
-+};
-+
-+enum {
-+    PROP_0 = 0,
-+    PROP_KEY,
-+    PROP_ICON,
-+    PROP_LABEL,
-+    PROP_TOOLTIP,
-+    PROP_SENSITIVE,
-+    PROP_VISIBLE,
-+    PROP_PROP_TYPE,
-+    PROP_STATE,
-+    PROP_SUB_PROPS,
-+};
-+
-+/* _IBusPropertyPrivate */
-+struct _IBusPropertyPrivate {
-+    gchar    *key;
-+    gchar    *icon;
-+    IBusText *label;
-+    IBusText *tooltip;
-+
-+    gboolean sensitive;
-+    gboolean visible;
-+    IBusPropType type;
-+    IBusPropState state;
-+
-+    IBusPropList *sub_props;
-+};
-+
-+#define IBUS_PROPERTY_GET_PRIVATE(o)  \
-+   (G_TYPE_INSTANCE_GET_PRIVATE ((o), IBUS_TYPE_PROPERTY, IBusPropertyPrivate))
- 
- /* functions prototype */
-+static void         ibus_property_set_property  (IBusProperty       *prop,
-+                                                 guint               prop_id,
-+                                                 const GValue       *value,
-+                                                 GParamSpec         *pspec);
-+static void         ibus_property_get_property  (IBusProperty       *prop,
-+                                                 guint               prop_id,
-+                                                 GValue             *value,
-+                                                 GParamSpec         *pspec);
- static void         ibus_property_destroy       (IBusProperty       *prop);
- static gboolean     ibus_property_serialize     (IBusProperty       *prop,
-                                                  GVariantBuilder    *builder);
-@@ -36,53 +80,253 @@ G_DEFINE_TYPE (IBusProperty, ibus_property, IBUS_TYPE_SERIALIZABLE)
- static void
- ibus_property_class_init (IBusPropertyClass *class)
- {
-+    GObjectClass *gobject_class = G_OBJECT_CLASS (class);
-     IBusObjectClass *object_class = IBUS_OBJECT_CLASS (class);
-     IBusSerializableClass *serializable_class = IBUS_SERIALIZABLE_CLASS (class);
- 
-+    g_type_class_add_private (class, sizeof (IBusPropertyPrivate));
-+
-+    gobject_class->set_property = (GObjectSetPropertyFunc) ibus_property_set_property;
-+    gobject_class->get_property = (GObjectGetPropertyFunc) ibus_property_get_property;
-+
-     object_class->destroy = (IBusObjectDestroyFunc) ibus_property_destroy;
- 
-     serializable_class->serialize   = (IBusSerializableSerializeFunc) ibus_property_serialize;
-     serializable_class->deserialize = (IBusSerializableDeserializeFunc) ibus_property_deserialize;
-     serializable_class->copy        = (IBusSerializableCopyFunc) ibus_property_copy;
-+
-+    /* install properties */
-+    /**
-+     * IBusPropert:key:
-+     *
-+     * The key of property
-+     */
-+    g_object_class_install_property (gobject_class,
-+            PROP_KEY,
-+            g_param_spec_string ("key",
-+                    "key",
-+                    "The key of property",
-+                    "",
-+                    G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
-+
-+    /**
-+     * IBusPropert:icon:
-+     *
-+     * The icon of property
-+     */
-+    g_object_class_install_property (gobject_class,
-+            PROP_ICON,
-+            g_param_spec_string ("icon",
-+                    "icon",
-+                    "The icon of property",
-+                    "",
-+                    G_PARAM_READWRITE));
-+
-+    /**
-+     * IBusPropert:label:
-+     *
-+     * The label of property
-+     */
-+    g_object_class_install_property (gobject_class,
-+            PROP_LABEL,
-+            g_param_spec_object("label",
-+                    "label",
-+                    "The label of property",
-+                    IBUS_TYPE_TEXT,
-+                    G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
-+
-+    /**
-+     * IBusPropert:tooltip:
-+     *
-+     * The tooltip of property
-+     */
-+    g_object_class_install_property (gobject_class,
-+            PROP_TOOLTIP,
-+            g_param_spec_object("tooltip",
-+                    "tooltip",
-+                    "The tooltip of property",
-+                    IBUS_TYPE_TEXT,
-+                    G_PARAM_READWRITE));
-+
-+    /**
-+     * IBusPropert:sensitive:
-+     *
-+     * The sensitive of property
-+     */
-+    g_object_class_install_property (gobject_class,
-+            PROP_SENSITIVE,
-+            g_param_spec_boolean("sensitive",
-+                    "sensitive",
-+                    "The sensitive of property",
-+                    TRUE,
-+                    G_PARAM_READWRITE));
-+
-+    /**
-+     * IBusPropert:visible:
-+     *
-+     * The visible of property
-+     */
-+    g_object_class_install_property (gobject_class,
-+            PROP_VISIBLE,
-+            g_param_spec_boolean("visible",
-+                    "visible",
-+                    "The visible of property",
-+                    TRUE,
-+                    G_PARAM_READWRITE));
-+
-+    /**
-+     * IBusPropert:type:
-+     *
-+     * The type of property
-+     */
-+    g_object_class_install_property (gobject_class,
-+            PROP_PROP_TYPE,
-+            g_param_spec_enum("prop-type",
-+                    "prop-type",
-+                    "The type of property",
-+                    IBUS_TYPE_PROP_TYPE,
-+                    PROP_TYPE_NORMAL,
-+                    G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
-+    /**
-+     * IBusPropert:state:
-+     *
-+     * The state of property
-+     */
-+    g_object_class_install_property (gobject_class,
-+            PROP_STATE,
-+            g_param_spec_enum("state",
-+                    "state",
-+                    "The state of property",
-+                    IBUS_TYPE_PROP_STATE,
-+                    PROP_STATE_UNCHECKED,
-+                    G_PARAM_READWRITE));
-+
-+    /**
-+     * IBusPropert:sub-props:
-+     *
-+     * The sub properties of property
-+     */
-+    g_object_class_install_property (gobject_class,
-+            PROP_SUB_PROPS,
-+            g_param_spec_object("sub-props",
-+                    "sub properties",
-+                    "The sub properties of property",
-+                    IBUS_TYPE_PROP_LIST,
-+                    G_PARAM_READWRITE));
- }
- 
- static void
- ibus_property_init (IBusProperty *prop)
- {
--    prop->key = NULL;
--    prop->type = 0;
--    prop->label = NULL;
--    prop->icon = NULL;
--    prop->tooltip = NULL;
--    prop->sensitive = FALSE;
--    prop->visible = FALSE;
--    prop->state = 0;
--
--    prop->sub_props = NULL;
-+    prop->priv = IBUS_PROPERTY_GET_PRIVATE (prop);
-+
-+    ibus_property_set_label (prop, NULL);
-+    ibus_property_set_tooltip (prop, NULL);
-+    ibus_property_set_sub_props (prop, NULL);
-+
-+}
-+static void
-+ibus_property_set_property (IBusProperty *prop,
-+                            guint         prop_id,
-+                            const GValue *value,
-+                            GParamSpec   *pspec)
-+{
-+    switch (prop_id) {
-+    case PROP_KEY:
-+        g_assert (prop->priv->key == NULL);
-+        prop->priv->key = g_value_dup_string (value);
-+        break;
-+    case PROP_ICON:
-+        ibus_property_set_icon (prop, g_value_get_string (value));
-+        break;
-+    case PROP_LABEL:
-+        ibus_property_set_label (prop, g_value_get_object (value));
-+        break;
-+    case PROP_TOOLTIP:
-+        ibus_property_set_tooltip (prop, g_value_get_object (value));
-+        break;
-+    case PROP_SENSITIVE:
-+        ibus_property_set_sensitive (prop, g_value_get_boolean (value));
-+        break;
-+    case PROP_VISIBLE:
-+        ibus_property_set_visible (prop, g_value_get_boolean (value));
-+        break;
-+    case PROP_PROP_TYPE:
-+        prop->priv->type = g_value_get_enum (value);
-+        break;
-+    case PROP_STATE:
-+        ibus_property_set_state (prop, g_value_get_enum (value));
-+        break;
-+    case PROP_SUB_PROPS:
-+        ibus_property_set_sub_props (prop,
-+                (IBusPropList *)g_value_get_object (value));
-+        break;
-+    default:
-+        G_OBJECT_WARN_INVALID_PROPERTY_ID (prop, prop_id, pspec);
-+    }
-+}
-+
-+static void
-+ibus_property_get_property (IBusProperty *prop,
-+                            guint         prop_id,
-+                            GValue       *value,
-+                            GParamSpec   *pspec)
-+{
-+    switch (prop_id) {
-+    case PROP_KEY:
-+        g_value_set_string (value, ibus_property_get_key (prop));
-+        break;
-+    case PROP_ICON:
-+        g_value_set_string (value, ibus_property_get_icon (prop));
-+        break;
-+    case PROP_LABEL:
-+        g_value_set_object (value, ibus_property_get_label (prop));
-+        break;
-+    case PROP_TOOLTIP:
-+        g_value_set_object (value, ibus_property_get_tooltip (prop));
-+        break;
-+    case PROP_SENSITIVE:
-+        g_value_set_boolean (value, ibus_property_get_sensitive (prop));
-+        break;
-+    case PROP_VISIBLE:
-+        g_value_set_boolean (value, ibus_property_get_visible (prop));
-+        break;
-+    case PROP_PROP_TYPE:
-+        g_value_set_enum (value, ibus_property_get_prop_type (prop));
-+        break;
-+    case PROP_STATE:
-+        g_value_set_enum (value, ibus_property_get_state (prop));
-+        break;
-+    case PROP_SUB_PROPS:
-+        g_value_set_object (value, ibus_property_get_sub_props (prop));
-+        break;
-+    default:
-+        G_OBJECT_WARN_INVALID_PROPERTY_ID (prop, prop_id, pspec);
-+    }
- }
- 
- static void
- ibus_property_destroy (IBusProperty *prop)
- {
--    g_free (prop->key);
--    prop->key = NULL;
-+    g_free (prop->priv->key);
-+    prop->priv->key = NULL;
- 
--    g_free (prop->icon);
--    prop->icon = NULL;
-+    g_free (prop->priv->icon);
-+    prop->priv->icon = NULL;
- 
--    if (prop->label) {
--        g_object_unref (prop->label);
--        prop->label = NULL;
-+    if (prop->priv->label) {
-+        g_object_unref (prop->priv->label);
-+        prop->priv->label = NULL;
-     }
- 
--    if (prop->tooltip) {
--        g_object_unref (prop->tooltip);
--        prop->tooltip = NULL;
-+    if (prop->priv->tooltip) {
-+        g_object_unref (prop->priv->tooltip);
-+        prop->priv->tooltip = NULL;
-     }
- 
--    if (prop->sub_props) {
--        g_object_unref (prop->sub_props);
--        prop->sub_props = NULL;
-+    if (prop->priv->sub_props) {
-+        g_object_unref (prop->priv->sub_props);
-+        prop->priv->sub_props = NULL;
-     }
- 
-     IBUS_OBJECT_CLASS (ibus_property_parent_class)->destroy ((IBusObject *)prop);
-@@ -99,15 +343,18 @@ ibus_property_serialize (IBusProperty    *prop,
- 
-     g_return_val_if_fail (IBUS_IS_PROPERTY (prop), FALSE);
- 
--    g_variant_builder_add (builder, "s", prop->key);
--    g_variant_builder_add (builder, "u", prop->type);
--    g_variant_builder_add (builder, "v", ibus_serializable_serialize ((IBusSerializable *)prop->label));
--    g_variant_builder_add (builder, "s", prop->icon);
--    g_variant_builder_add (builder, "v", ibus_serializable_serialize ((IBusSerializable *)prop->tooltip));
--    g_variant_builder_add (builder, "b", prop->sensitive);
--    g_variant_builder_add (builder, "b", prop->visible);
--    g_variant_builder_add (builder, "u", prop->state);
--    g_variant_builder_add (builder, "v", ibus_serializable_serialize ((IBusSerializable *)prop->sub_props));
-+    g_variant_builder_add (builder, "s", prop->priv->key);
-+    g_variant_builder_add (builder, "u", prop->priv->type);
-+    g_variant_builder_add (builder, "v",
-+            ibus_serializable_serialize ((IBusSerializable *)prop->priv->label));
-+    g_variant_builder_add (builder, "s", prop->priv->icon);
-+    g_variant_builder_add (builder, "v",
-+            ibus_serializable_serialize ((IBusSerializable *)prop->priv->tooltip));
-+    g_variant_builder_add (builder, "b", prop->priv->sensitive);
-+    g_variant_builder_add (builder, "b", prop->priv->visible);
-+    g_variant_builder_add (builder, "u", prop->priv->state);
-+    g_variant_builder_add (builder, "v",
-+            ibus_serializable_serialize ((IBusSerializable *)prop->priv->sub_props));
- 
-     return TRUE;
- }
-@@ -121,28 +368,28 @@ ibus_property_deserialize (IBusProperty *prop,
-     retval = IBUS_SERIALIZABLE_CLASS (ibus_property_parent_class)->deserialize ((IBusSerializable *) prop, variant);
-     g_return_val_if_fail (retval, 0);
- 
--    g_variant_get_child (variant, retval++, "s", &prop->key);
--    g_variant_get_child (variant, retval++, "u", &prop->type);
-+    g_variant_get_child (variant, retval++, "s", &prop->priv->key);
-+    g_variant_get_child (variant, retval++, "u", &prop->priv->type);
- 
-     GVariant *subvar = g_variant_get_child_value (variant, retval++);
--    prop->label = IBUS_TEXT (ibus_serializable_deserialize (subvar));
--    g_object_ref_sink (prop->label);
-+    prop->priv->label = IBUS_TEXT (ibus_serializable_deserialize (subvar));
-+    g_object_ref_sink (prop->priv->label);
-     g_variant_unref (subvar);
- 
--    g_variant_get_child (variant, retval++, "s", &prop->icon);
-+    g_variant_get_child (variant, retval++, "s", &prop->priv->icon);
- 
-     subvar = g_variant_get_child_value (variant, retval++);
--    prop->tooltip = IBUS_TEXT (ibus_serializable_deserialize (subvar));
--    g_object_ref_sink (prop->tooltip);
-+    prop->priv->tooltip = IBUS_TEXT (ibus_serializable_deserialize (subvar));
-+    g_object_ref_sink (prop->priv->tooltip);
-     g_variant_unref (subvar);
- 
--    g_variant_get_child (variant, retval++, "b", &prop->sensitive);
--    g_variant_get_child (variant, retval++, "b", &prop->visible);
--    g_variant_get_child (variant, retval++, "u", &prop->state);
-+    g_variant_get_child (variant, retval++, "b", &prop->priv->sensitive);
-+    g_variant_get_child (variant, retval++, "b", &prop->priv->visible);
-+    g_variant_get_child (variant, retval++, "u", &prop->priv->state);
- 
-     subvar = g_variant_get_child_value (variant, retval++);
--    prop->sub_props = IBUS_PROP_LIST (ibus_serializable_deserialize (subvar));
--    g_object_ref_sink (prop->sub_props);
-+    prop->priv->sub_props = IBUS_PROP_LIST (ibus_serializable_deserialize (subvar));
-+    g_object_ref_sink (prop->priv->sub_props);
-     g_variant_unref (subvar);
- 
-     return retval;
-@@ -160,25 +407,25 @@ ibus_property_copy (IBusProperty       *dest,
-     g_return_val_if_fail (IBUS_IS_PROPERTY (dest), FALSE);
-     g_return_val_if_fail (IBUS_IS_PROPERTY (src), FALSE);
- 
--    dest->key = g_strdup (src->key);
--    dest->icon = g_strdup (src->icon);
--    if (src->label) {
--        dest->label = (IBusText *) ibus_serializable_copy ((IBusSerializable *) src->label);
-+    dest->priv->key = g_strdup (src->priv->key);
-+    dest->priv->icon = g_strdup (src->priv->icon);
-+    if (src->priv->label) {
-+        dest->priv->label = (IBusText *) ibus_serializable_copy ((IBusSerializable *) src->priv->label);
-     }
-     else
--        dest->label = ibus_text_new_from_static_string ("");
--    if (src->tooltip) {
--        dest->tooltip = (IBusText *) ibus_serializable_copy ((IBusSerializable *) src->tooltip);
-+        dest->priv->label = ibus_text_new_from_static_string ("");
-+    if (src->priv->tooltip) {
-+        dest->priv->tooltip = (IBusText *) ibus_serializable_copy ((IBusSerializable *) src->priv->tooltip);
-     }
-     else
--        dest->tooltip = ibus_text_new_from_static_string ("");
-+        dest->priv->tooltip = ibus_text_new_from_static_string ("");
- 
--    dest->sensitive = src->sensitive;
--    dest->visible = src->visible;
--    dest->type = src->type;
--    dest->state = src->state;
-+    dest->priv->sensitive = src->priv->sensitive;
-+    dest->priv->visible = src->priv->visible;
-+    dest->priv->type = src->priv->type;
-+    dest->priv->state = src->priv->state;
- 
--    dest->sub_props = (IBusPropList *) ibus_serializable_copy ((IBusSerializable *) src->sub_props);
-+    dest->priv->sub_props = (IBusPropList *) ibus_serializable_copy ((IBusSerializable *) src->priv->sub_props);
- 
-     return TRUE;
- }
-@@ -192,7 +439,7 @@ ibus_property_new (const gchar   *key,
-                    gboolean       sensitive,
-                    gboolean       visible,
-                    IBusPropState  state,
--                   IBusPropList  *prop_list)
-+                   IBusPropList  *props)
- {
-     g_return_val_if_fail (key != NULL, NULL);
-     g_return_val_if_fail (type >= PROP_TYPE_NORMAL &&
-@@ -201,19 +448,17 @@ ibus_property_new (const gchar   *key,
- 
-     IBusProperty *prop;
- 
--    prop = (IBusProperty *)g_object_new (IBUS_TYPE_PROPERTY, NULL);
--
--    prop->key = g_strdup (key);
--    prop->type = type;
--
--    ibus_property_set_label (prop, label);
--    ibus_property_set_icon (prop, icon);
--    ibus_property_set_tooltip (prop, tooltip);
--    ibus_property_set_sensitive (prop, sensitive);
--    ibus_property_set_visible (prop, visible);
--    ibus_property_set_state (prop, state);
--    ibus_property_set_sub_props (prop, prop_list);
--
-+    prop = (IBusProperty *)g_object_new (IBUS_TYPE_PROPERTY,
-+                                         "key", key,
-+                                         "prop-type", type,
-+                                         "label", label,
-+                                         "icon", icon,
-+                                         "tooltip", tooltip,
-+                                         "sensitive", sensitive,
-+                                         "visible", visible,
-+                                         "state", state,
-+                                         "sub-props", props,
-+                                         NULL);
-     return prop;
- }
- 
-@@ -221,24 +466,25 @@ ibus_property_new (const gchar   *key,
- return_type                                                             \
- ibus_property_get_ ## field (IBusProperty *prop)                        \
- {                                                                       \
--    return prop->field;                                                 \
-+    return prop->priv->field;                                           \
- }
- 
- IBUS_PROPERTY_GET_FIELD (key, const gchar *)
- IBUS_PROPERTY_GET_FIELD (icon, const gchar *)
--IBUS_PROPERTY_GET_FIELD (label, const IBusText *)
--IBUS_PROPERTY_GET_FIELD (tooltip, const IBusText *)
-+IBUS_PROPERTY_GET_FIELD (label, IBusText *)
-+IBUS_PROPERTY_GET_FIELD (tooltip, IBusText *)
- IBUS_PROPERTY_GET_FIELD (sensitive, gboolean)
- IBUS_PROPERTY_GET_FIELD (visible, gboolean)
- IBUS_PROPERTY_GET_FIELD (state, IBusPropState)
--IBUS_PROPERTY_GET_FIELD (sub_props, const IBusPropList *)
-+IBUS_PROPERTY_GET_FIELD (sub_props, IBusPropList *)
- #undef IBUS_PROPERTY_GET_FIELD
- 
- /* ibus_property_get_type() exists */
- IBusPropType
- ibus_property_get_prop_type (IBusProperty *prop)
- {
--    return prop->type;
-+    g_assert (IBUS_IS_PROPERTY (prop));
-+    return prop->priv->type;
- }
- 
- void
-@@ -248,15 +494,15 @@ ibus_property_set_label (IBusProperty *prop,
-     g_assert (IBUS_IS_PROPERTY (prop));
-     g_return_if_fail (label == NULL || IBUS_IS_TEXT (label));
- 
--    if (prop->label) {
--        g_object_unref (prop->label);
-+    if (prop->priv->label) {
-+        g_object_unref (prop->priv->label);
-     }
- 
-     if (label == NULL) {
--        prop->label = ibus_text_new_from_static_string ("");
-+        prop->priv->label = ibus_text_new_from_static_string ("");
-     }
-     else {
--        prop->label = g_object_ref_sink (label);
-+        prop->priv->label = g_object_ref_sink (label);
-     }
- }
- 
-@@ -266,8 +512,8 @@ ibus_property_set_icon (IBusProperty *prop,
- {
-     g_assert (IBUS_IS_PROPERTY (prop));
- 
--    g_free (prop->icon);
--    prop->icon = g_strdup (icon != NULL ? icon : "");
-+    g_free (prop->priv->icon);
-+    prop->priv->icon = g_strdup (icon != NULL ? icon : "");
- }
- 
- void
-@@ -277,17 +523,19 @@ ibus_property_set_tooltip (IBusProperty *prop,
-     g_assert (IBUS_IS_PROPERTY (prop));
-     g_assert (tooltip == NULL || IBUS_IS_TEXT (tooltip));
- 
--    if (prop->tooltip) {
--        g_object_unref (prop->tooltip);
-+    IBusPropertyPrivate *priv = prop->priv;
-+
-+    if (priv->tooltip) {
-+        g_object_unref (priv->tooltip);
-     }
- 
-     if (tooltip == NULL) {
--        prop->tooltip = ibus_text_new_from_static_string ("");
--        g_object_ref_sink (prop->tooltip);
-+        priv->tooltip = ibus_text_new_from_static_string ("");
-+        g_object_ref_sink (priv->tooltip);
-     }
-     else {
--        prop->tooltip = tooltip;
--        g_object_ref_sink (prop->tooltip);
-+        priv->tooltip = tooltip;
-+        g_object_ref_sink (priv->tooltip);
-     }
- }
- 
-@@ -296,7 +544,7 @@ ibus_property_set_sensitive (IBusProperty *prop,
-                              gboolean      sensitive)
- {
-     g_assert (IBUS_IS_PROPERTY (prop));
--    prop->sensitive = sensitive;
-+    prop->priv->sensitive = sensitive;
- }
- 
- void
-@@ -304,7 +552,7 @@ ibus_property_set_visible (IBusProperty *prop,
-                            gboolean      visible)
- {
-     g_assert (IBUS_IS_PROPERTY (prop));
--    prop->visible = visible;
-+    prop->priv->visible = visible;
- }
- 
- void
-@@ -316,7 +564,7 @@ ibus_property_set_state (IBusProperty  *prop,
-               state == PROP_STATE_CHECKED ||
-               state == PROP_STATE_INCONSISTENT);
- 
--    prop->state = state;
-+    prop->priv->state = state;
- }
- 
- void
-@@ -326,17 +574,19 @@ ibus_property_set_sub_props (IBusProperty *prop,
-     g_assert (IBUS_IS_PROPERTY (prop));
-     g_assert (IBUS_IS_PROP_LIST (prop_list) || prop_list == NULL);
- 
--    if (prop->sub_props) {
--        g_object_unref (prop->sub_props);
-+    IBusPropertyPrivate *priv = prop->priv;
-+
-+    if (priv->sub_props) {
-+        g_object_unref (priv->sub_props);
-     }
- 
-     if (prop_list) {
--        prop->sub_props = prop_list;
-+        priv->sub_props = prop_list;
-         g_object_ref_sink (prop_list);
-     }
-     else {
--        prop->sub_props = ibus_prop_list_new ();
--        g_object_ref_sink (prop->sub_props);
-+        priv->sub_props = ibus_prop_list_new ();
-+        g_object_ref_sink (priv->sub_props);
-     }
- }
- 
-@@ -347,25 +597,24 @@ ibus_property_update (IBusProperty *prop,
-     g_assert (IBUS_IS_PROPERTY (prop));
-     g_assert (IBUS_IS_PROPERTY (prop_update));
- 
--    if (g_strcmp0 (prop->key, prop_update->key) != 0) {
--        return ibus_prop_list_update_property (prop->sub_props, prop_update);
-+    IBusPropertyPrivate *priv = prop->priv;
-+    IBusPropertyPrivate *priv_update = prop_update->priv;
-+
-+    if (g_strcmp0 (priv->key, priv_update->key) != 0) {
-+        return ibus_prop_list_update_property (priv->sub_props, prop_update);
-     }
- 
--    g_free (prop->icon);
--    prop->icon = g_strdup (prop_update->icon);
-+    /* Do not support update prop type */
-+    g_assert (priv->type == priv_update->type);
- 
--    if (prop->label) {
--        g_object_unref (prop->label);
--    }
--    prop->label = (IBusText *) g_object_ref_sink (prop_update->label);
-+    ibus_property_set_icon (prop, ibus_property_get_icon (prop_update));
-+    ibus_property_set_label (prop, ibus_property_get_label (prop_update));
-+    ibus_property_set_tooltip (prop, ibus_property_get_tooltip (prop_update));
-+    ibus_property_set_visible (prop, ibus_property_get_visible (prop_update));
-+    ibus_property_set_state (prop, ibus_property_get_state (prop_update));
-+    ibus_property_set_sensitive (prop, ibus_property_get_sensitive (prop_update));
- 
--    if (prop->tooltip) {
--        g_object_unref (prop->tooltip);
--    }
--    prop->tooltip = (IBusText *) g_object_ref_sink (prop_update->tooltip);
--    prop->visible = prop_update->visible;
--    prop->state = prop_update->state;
--    prop->sensitive = prop_update->sensitive;
-+    /* Do not support update sub props */
- 
-     return TRUE;
- }
-diff --git a/src/ibusproperty.h b/src/ibusproperty.h
-index 5e76c8f..ddbadc8 100644
---- a/src/ibusproperty.h
-+++ b/src/ibusproperty.h
-@@ -114,6 +114,7 @@ typedef enum {
- 
- typedef struct _IBusProperty IBusProperty;
- typedef struct _IBusPropertyClass IBusPropertyClass;
-+typedef struct _IBusPropertyPrivate IBusPropertyPrivate;
- 
- #ifndef __PROPLIST_DEFINED
- #define __PROPLIST_DEFINED
-@@ -137,20 +138,11 @@ typedef struct _IBusPropListClass IBusPropListClass;
-  * UI component for input method engine property.
-  */
- struct _IBusProperty {
-+    /*< private >*/
-     IBusSerializable parent;
-+    IBusPropertyPrivate *priv;
- 
--    /*< public >*/
--    gchar    *key;
--    gchar    *icon;
--    IBusText *label;
--    IBusText *tooltip;
--
--    gboolean sensitive;
--    gboolean visible;
--    guint type;
--    guint state;
--
--    IBusPropList *sub_props;
-+    gpointer pdummy[7];
- };
- 
- struct _IBusPropertyClass {
-@@ -194,22 +186,13 @@ IBusProperty    *ibus_property_new          (const gchar    *key,
- const gchar *    ibus_property_get_key      (IBusProperty   *prop);
- 
- /**
-- * ibus_property_get_prop_type:
-- * @prop: An IBusProperty.
-- * @returns: the type of IBusProperty.
-- *
-- * Get the type of IBusProperty.
-- */
--IBusPropType     ibus_property_get_prop_type(IBusProperty   *prop);
--
--/**
-  * ibus_property_get_label:
-  * @prop: An IBusProperty.
-  * @returns: the label of IBusProperty. Should not be freed.
-  *
-  * Get the label of IBusProperty.
-  */
--const IBusText * ibus_property_get_label    (IBusProperty   *prop);
-+IBusText *      ibus_property_get_label    (IBusProperty   *prop);
- 
- /**
-  * ibus_property_set_label:
-@@ -247,7 +230,7 @@ void             ibus_property_set_icon     (IBusProperty   *prop,
-  *
-  * Get the tooltip of IBusProperty.
-  */
--const IBusText * ibus_property_get_tooltip  (IBusProperty   *prop);
-+IBusText *      ibus_property_get_tooltip  (IBusProperty   *prop);
- 
- /**
-  * ibus_property_set_tooltip:
-@@ -298,6 +281,15 @@ void             ibus_property_set_visible  (IBusProperty   *prop,
-                                              gboolean        visible);
- 
- /**
-+ * ibus_property_get_property_type:
-+ * @prop: An IBusProperty.
-+ * @returns: the type of IBusProperty.
-+ *
-+ * Get the type of IBusProperty.
-+ */
-+IBusPropType     ibus_property_get_prop_type(IBusProperty   *prop);
-+
-+/**
-  * ibus_property_get_state:
-  * @prop: An IBusProperty.
-  * @returns: the state of IBusProperty.
-@@ -323,8 +315,7 @@ void             ibus_property_set_state    (IBusProperty   *prop,
-  *
-  * Get the IBusPropList of IBusProperty.
-  */
--const IBusPropList *
--                 ibus_property_get_sub_props(IBusProperty   *prop);
-+IBusPropList *   ibus_property_get_sub_props(IBusProperty   *prop);
- 
- /**
-  * ibus_property_set_sub_props:
--- 
-1.7.7.4
-
-From df10a24f905c8eea420a5fd33eff78417312410c Mon Sep 17 00:00:00 2001
-From: Peng Huang <shawn.p.huang@gmail.com>
-Date: Thu, 22 Dec 2011 09:57:23 -0500
-Subject: [PATCH] Add ibus_text_set_attributes for scipt language
- bindings.
-
-BUG=None
-TEST=Linux desktop
-
-Review URL: http://codereview.appspot.com/5500067
----
- src/ibustext.c |   12 +++++++++++-
- src/ibustext.h |   13 +++++++++++--
- 2 files changed, 22 insertions(+), 3 deletions(-)
-
-diff --git a/src/ibustext.c b/src/ibustext.c
-index f4085e9..e5218d0 100644
---- a/src/ibustext.c
-+++ b/src/ibustext.c
-@@ -272,8 +272,18 @@ ibus_text_get_text (IBusText *text)
-     return text->text;
- }
- 
--const IBusAttrList *
-+IBusAttrList *
- ibus_text_get_attributes (IBusText *text)
- {
-     return text->attrs;
- }
-+
-+void
-+ibus_text_set_attributes (IBusText     *text,
-+                          IBusAttrList *attrs)
-+{
-+    if (text->attrs)
-+        g_object_unref (text->attrs);
-+    text->attrs = attrs;
-+    g_object_ref_sink (text->attrs);
-+}
-diff --git a/src/ibustext.h b/src/ibustext.h
-index 1dca466..f6e25a7 100644
---- a/src/ibustext.h
-+++ b/src/ibustext.h
-@@ -194,8 +194,17 @@ const gchar *    ibus_text_get_text                 (IBusText       *text);
-  *
-  * Return the attributes in an IBusText. Should not be freed.
-  */
--const IBusAttrList *
--                 ibus_text_get_attributes           (IBusText       *text);
-+IBusAttrList *   ibus_text_get_attributes           (IBusText       *text);
-+
-+/**
-+ * ibus_text_set_attributes:
-+ * @text: An IBusText.
-+ * @attrs: An IBusAttrList
-+ */
-+void             ibus_text_set_attributes           (IBusText       *text,
-+                                                     IBusAttrList   *attrs);
-+
-+
- G_END_DECLS
- #endif
- 
--- 
-1.7.7.4
-
-From 4d1f38314b3a9c3dc1683053cda10cfa36fd9019 Mon Sep 17 00:00:00 2001
-From: Peng Huang <shawn.p.huang@gmail.com>
-Date: Thu, 22 Dec 2011 09:59:05 -0500
-Subject: [PATCH] Fix a typo in docs/references/ibus/Makefile
-
-BUG=None
-TEST=make
-
-Review URL: http://codereview.appspot.com/5496079
----
- docs/reference/ibus/Makefile.am |    2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
-diff --git a/docs/reference/ibus/Makefile.am b/docs/reference/ibus/Makefile.am
-index 4fa77a1..75e3815 100644
---- a/docs/reference/ibus/Makefile.am
-+++ b/docs/reference/ibus/Makefile.am
-@@ -117,7 +117,7 @@ trim-build.stamp: scan-build.stamp
- 	$(AM_V_GEN) \
- 	    $(SED) -f $(srcdir)/trim.sed -i.bak \
- 			$(builddir)/$(DOC_MODULE)-sections.txt && \
--	    $(RM) $(buildir)/$(DOC_MODULE)-sections.txt.bak && \
-+	    $(RM) $(builddir)/$(DOC_MODULE)-sections.txt.bak && \
- 	    touch trim-build.stamp
- 
- tmpl-build.stamp: trim-build.stamp  $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-overrides.txt
--- 
-1.7.7.4
-
-From 377cf484ea64fc2f30706d298cf1f33debdd9c30 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Fri, 30 Dec 2011 13:53:50 +0900
-Subject: [PATCH] Fix ibus-x11 SEGV in _process_key_event_done.
-
-IMForwardEvent() calls _Xi18nFindClient() and it could return NULL.
-Maybe the connect_id would be disconnected during the async
-process_key_event.
-This fix checks XIM_DISCONNECT in ims_protocol_handler() to cancel
-IMForwardEvent() in _process_key_event_done().
----
- client/x11/main.c |   17 +++++++++++++++++
- 1 files changed, 17 insertions(+), 0 deletions(-)
-
-diff --git a/client/x11/main.c b/client/x11/main.c
-index 58069fc..3cb03f0 100644
---- a/client/x11/main.c
-+++ b/client/x11/main.c
-@@ -77,6 +77,8 @@ struct _X11IC {
-     gint             onspot_preedit_length;
- };
- 
-+static gint disconnected_id = 0;
-+
- static void     _xim_set_cursor_location    (X11IC              *x11ic);
- static void     _context_commit_text_cb     (IBusInputContext   *context,
-                                              IBusText           *text,
-@@ -464,6 +466,12 @@ _process_key_event_done (GObject      *object,
-         g_error_free (error);
-     }
- 
-+    if (pfe->connect_id == disconnected_id) {
-+        g_slice_free (IMForwardEventStruct, pfe);
-+        disconnected_id = 0;
-+        return;
-+    }
-+
-     if (retval == FALSE) {
-         IMForwardEvent (_xims, (XPointer) pfe);
-     }
-@@ -734,6 +742,13 @@ xim_reset_ic (XIMS xims, IMResetICStruct *call_data)
-     return 1;
- }
- 
-+static int
-+xim_disconnect_ic (XIMS xims, IMDisConnectStruct *call_data)
-+{
-+    disconnected_id = call_data->connect_id;
-+    return 0;
-+}
-+
- int
- ims_protocol_handler (XIMS xims, IMProtocol *call_data)
- {
-@@ -773,6 +788,8 @@ ims_protocol_handler (XIMS xims, IMProtocol *call_data)
-     case XIM_SYNC_REPLY:
-         LOG (1, "XIM_SYNC_REPLY");
-         return 0;
-+    case XIM_DISCONNECT:
-+        return xim_disconnect_ic (xims, (IMDisConnectStruct *)call_data);
-     default:
-         LOG (1, "Unkown (%d)", call_data->major_code);
-         return 0;
--- 
-1.7.7.4
-
-From b90c7ed47b1f84e0b0a03233e817c97dd854a5d6 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Sat, 31 Dec 2011 00:09:11 +0900
-Subject: [PATCH] Fix g-ir-scanner errors in ibusproperty.h and ibustext.h.
-
----
- src/ibusproperty.h |    7 ++++---
- src/ibustext.h     |    2 +-
- 2 files changed, 5 insertions(+), 4 deletions(-)
-
-diff --git a/src/ibusproperty.h b/src/ibusproperty.h
-index ddbadc8..96b1a13 100644
---- a/src/ibusproperty.h
-+++ b/src/ibusproperty.h
-@@ -188,7 +188,7 @@ const gchar *    ibus_property_get_key      (IBusProperty   *prop);
- /**
-  * ibus_property_get_label:
-  * @prop: An IBusProperty.
-- * @returns: the label of IBusProperty. Should not be freed.
-+ * @returns: (transfer none): the label of IBusProperty. Should not be freed.
-  *
-  * Get the label of IBusProperty.
-  */
-@@ -226,7 +226,7 @@ void             ibus_property_set_icon     (IBusProperty   *prop,
- /**
-  * ibus_property_get_tooltip:
-  * @prop: An IBusProperty.
-- * @returns: the tooltip of IBusProperty. Should not be freed.
-+ * @returns: (transfer none): the tooltip of IBusProperty. Should not be freed.
-  *
-  * Get the tooltip of IBusProperty.
-  */
-@@ -311,7 +311,8 @@ void             ibus_property_set_state    (IBusProperty   *prop,
- /**
-  * ibus_property_get_sub_props:
-  * @prop: An IBusProperty.
-- * @returns: the IBusPropList of IBusProperty. Should not be freed.
-+ * @returns: (transfer none): the IBusPropList of IBusProperty.
-+ *     Should not be freed.
-  *
-  * Get the IBusPropList of IBusProperty.
-  */
-diff --git a/src/ibustext.h b/src/ibustext.h
-index f6e25a7..23ae920 100644
---- a/src/ibustext.h
-+++ b/src/ibustext.h
-@@ -190,7 +190,7 @@ const gchar *    ibus_text_get_text                 (IBusText       *text);
- /**
-  * ibus_text_get_attributes:
-  * @text: An IBusText.
-- * @returns: the attrs in @text.
-+ * @returns: (transfer none): the attrs in @text.
-  *
-  * Return the attributes in an IBusText. Should not be freed.
-  */
--- 
-1.7.7.4
-
+--- ibus/ui/gtk3/candidatepanel.vala.orig	2012-02-04 09:11:06.233979510 +0900
++++ ibus/ui/gtk3/candidatepanel.vala	2012-02-04 09:16:18.813558453 +0900
+@@ -20,6 +20,7 @@
+  * Boston, MA  02111-1307  USA
+  */
+ 
++using Cairo;
+ using Gtk;
+ using Pango;
+ 
+@@ -33,7 +34,7 @@ public class CandidatePanel : Gtk.HBox{
+     private CandidateArea m_candidate_area;
+     private HSeparator m_hseparator;
+ 
+-    private Gdk.Rectangle m_cursor_location;
++    private Cairo.RectangleInt m_cursor_location;
+ 
+     public signal void cursor_up();
+     public signal void cursor_down();
+@@ -80,7 +81,7 @@ public class CandidatePanel : Gtk.HBox{
+     }
+ 
+     public void set_cursor_location(int x, int y, int width, int height) {
+-        Gdk.Rectangle location = { x, y, width, height };
++        Cairo.RectangleInt location = { x, y, width, height };
+         if (m_cursor_location == location)
+             return;
+         m_cursor_location = location;
+--- ibus/ui/gtk3/handle.vala.orig	2012-02-04 08:36:38.812523442 +0900
++++ ibus/ui/gtk3/handle.vala	2012-02-04 09:10:36.858017677 +0900
+@@ -26,7 +26,7 @@ using Gtk;
+ 
+ class Handle : Gtk.EventBox {
+     private bool m_move_begined;
+-    private Gdk.Rectangle m_workarea;
++    private Cairo.RectangleInt m_workarea;
+     private Gdk.Point m_press_pos;
+ 
+     public signal void move_begin();
+@@ -153,7 +153,7 @@ class Handle : Gtk.EventBox {
+             Gtk.StyleContext context = get_style_context();
+             Gtk.Allocation allocation;
+             get_allocation(out allocation);
+-            Gtk.render_handle(context, cr,
++            context.render_handle(cr,
+                 allocation.x, allocation.y + (allocation.height - 40) / 2, allocation.width, 40.0);
+         }
+         return false;

diff --git a/ibus-gjs-xx-gnome-shell-3.1.4-build-failure.patch b/ibus-gjs-xx-gnome-shell-3.1.4-build-failure.patch
index b6f1ca7..cbd67f5 100644
--- a/ibus-gjs-xx-gnome-shell-3.1.4-build-failure.patch
+++ b/ibus-gjs-xx-gnome-shell-3.1.4-build-failure.patch
@@ -1,13 +1,13 @@
---- ibus-gjs-3.1.4.20110823/configure.ac.orig	2011-09-01 16:03:26.074219971 +0900
-+++ ibus-gjs-3.1.4.20110823/configure.ac	2011-09-01 16:05:31.107012718 +0900
-@@ -174,8 +174,8 @@ try {
+--- ibus-gjs/configure.ac.orig	2012-02-03 20:24:22.331320102 +0900
++++ ibus-gjs/configure.ac	2012-02-03 20:31:03.628265181 +0900
+@@ -164,8 +164,8 @@ try {
          $GREP -v "DEBUG:"
  }
  
 -GNOME_SHELL_VERSION=`GET_JS_VERSION 'Config.PACKAGE_VERSION'`
 -GJS_VERSION=`GET_JS_VERSION 'Config.GJS_VERSION'`
-+GNOME_SHELL_VERSION=3.2
-+GJS_VERSION=1.30
++GNOME_SHELL_VERSION='3.3.4", "3.3.3", "3.2'
++GJS_VERSION='1.31.6", "1.31.11", "1.30'
  AC_SUBST(GNOME_SHELL_VERSION)
  AC_SUBST(GJS_VERSION)
  

diff --git a/ibus-xx-setup-frequent-lang.patch b/ibus-xx-setup-frequent-lang.patch
index 67d7e0b..c904faf 100644
--- a/ibus-xx-setup-frequent-lang.patch
+++ b/ibus-xx-setup-frequent-lang.patch
@@ -1,40 +1,40 @@
-From 6937ff7453a352dc63a6487c7726acdb8942f8c9 Mon Sep 17 00:00:00 2001
+From 6e9cdc7d5b10cb043e8709670ea5ad487ab3d937 Mon Sep 17 00:00:00 2001
 From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Fri, 5 Aug 2011 20:23:07 +0900
-Subject: [PATCH] Enable ibus-setup to show the frequently used languages
- only in IME list.
+Date: Fri, 3 Feb 2012 19:20:27 +0900
+Subject: [PATCH] Enable ibus-setup to show the frequently used languages only
+ in IME list.
 
 ---
- data/ibus.schemas.in.in |  168 +++++++++++++++++++++++++++++++++++++++++++++++
- setup/enginecombobox.py |  153 ++++++++++++++++++++++++++++++++++++------
+ data/ibus.schemas.in    |  168 +++++++++++++++++++++++++++++++++++++++++++++++
+ setup/enginecombobox.py |  156 ++++++++++++++++++++++++++++++++++++-------
  setup/main.py           |    1 +
- 3 files changed, 300 insertions(+), 22 deletions(-)
+ 3 files changed, 300 insertions(+), 25 deletions(-)
 
-diff --git a/data/ibus.schemas.in.in b/data/ibus.schemas.in.in
-index 2df4f19..692664b 100644
---- a/data/ibus.schemas.in.in
-+++ b/data/ibus.schemas.in.in
-@@ -240,6 +240,174 @@
+diff --git a/data/ibus.schemas.in b/data/ibus.schemas.in
+index 34de9b4..bf50645 100644
+--- a/data/ibus.schemas.in
++++ b/data/ibus.schemas.in
+@@ -260,6 +260,174 @@ se,si,sk,sy,sy(ku),th,tj,tr,ua,uz,vn
        </locale>
      </schema>
      <schema>
-+      <key>/schemas/desktop/ibus/general/xkblayoutconfig/system/group_list</key>
-+      <applyto>/desktop/ibus/general/xkblayoutconfig/system/group_list</applyto>
++      <key>/schemas/desktop/ibus/general/xkblayoutconfig/group_list</key>
++      <applyto>/desktop/ibus/general/xkblayoutconfig/group_list</applyto>
 +      <owner>ibus</owner>
 +      <type>list</type>
 +      <list_type>string</list_type>
 +      <default>[west_europe,south_europe,east_europe,north_europe,west_asia,center_asia,east_asia,india,australia]</default>
 +      <locale name="C">
 +        <short>List of system keyboard layout groups on ibus-setup</short>
-+	    <long>The group list is used not to show all the system
++           <long>The group list is used not to show all the system
 +                  keyboard layouts by default. The list item will be
 +                  appended at the end of gconf key. e.g.
-+                  .../xkblayoutconfig/system/item1</long>
++                  .../xkblayoutconfig/item1</long>
 +      </locale>
 +    </schema>
 +    <schema>
-+      <key>/schemas/desktop/ibus/general/xkblayoutconfig/system/west_europe</key>
-+      <applyto>/desktop/ibus/general/xkblayoutconfig/system/west_europe</applyto>
++      <key>/schemas/desktop/ibus/general/xkblayoutconfig/west_europe</key>
++      <applyto>/desktop/ibus/general/xkblayoutconfig/west_europe</applyto>
 +      <owner>ibus</owner>
 +      <type>list</type>
 +      <list_type>string</list_type>
@@ -44,14 +44,14 @@ index 2df4f19..692664b 100644
 +      <default>[ca,cs,de,en,es,fr,gd,hu,it,nl,pt,sk,sl]</default>
 +      <locale name="C">
 +        <short>List of European languages on ibus-setup</short>
-+	    <long>ibus-setup shows the languages only in input method list
++           <long>ibus-setup shows the languages only in input method list
 +                  when you run ibus-setup on one of the languages.
 +                  Other languages are hidden under an extended button.</long>
 +      </locale>
 +    </schema>
 +    <schema>
-+      <key>/schemas/desktop/ibus/general/xkblayoutconfig/system/south_europe</key>
-+      <applyto>/desktop/ibus/general/xkblayoutconfig/system/south_europe</applyto>
++      <key>/schemas/desktop/ibus/general/xkblayoutconfig/south_europe</key>
++      <applyto>/desktop/ibus/general/xkblayoutconfig/south_europe</applyto>
 +      <owner>ibus</owner>
 +      <type>list</type>
 +      <list_type>string</list_type>
@@ -61,14 +61,14 @@ index 2df4f19..692664b 100644
 +      <default>[bg,bs,el,mk,mt,ro,sq,sr]</default>
 +      <locale name="C">
 +        <short>List of European languages on ibus-setup</short>
-+	    <long>ibus-setup shows the languages only in input method list
++           <long>ibus-setup shows the languages only in input method list
 +                  when you run ibus-setup on one of the languages.
 +                  Other languages are hidden under an extended button.</long>
 +      </locale>
 +    </schema>
 +    <schema>
-+      <key>/schemas/desktop/ibus/general/xkblayoutconfig/system/east_europe</key>
-+      <applyto>/desktop/ibus/general/xkblayoutconfig/system/east_europe</applyto>
++      <key>/schemas/desktop/ibus/general/xkblayoutconfig/east_europe</key>
++      <applyto>/desktop/ibus/general/xkblayoutconfig/east_europe</applyto>
 +      <owner>ibus</owner>
 +      <type>list</type>
 +      <list_type>string</list_type>
@@ -78,14 +78,14 @@ index 2df4f19..692664b 100644
 +      <default>[be,csb,cv,et,ka,kk,ky,lt,lv,pl,ru,tt,uk,uz]</default>
 +      <locale name="C">
 +        <short>List of European languages on ibus-setup</short>
-+	    <long>ibus-setup shows the languages only in input method list
++           <long>ibus-setup shows the languages only in input method list
 +                  when you run ibus-setup on one of the languages.
 +                  Other languages are hidden under an extended button.</long>
 +      </locale>
 +    </schema>
 +    <schema>
-+      <key>/schemas/desktop/ibus/general/xkblayoutconfig/system/north_europe</key>
-+      <applyto>/desktop/ibus/general/xkblayoutconfig/system/north_europe</applyto>
++      <key>/schemas/desktop/ibus/general/xkblayoutconfig/north_europe</key>
++      <applyto>/desktop/ibus/general/xkblayoutconfig/north_europe</applyto>
 +      <owner>ibus</owner>
 +      <type>list</type>
 +      <list_type>string</list_type>
@@ -95,14 +95,14 @@ index 2df4f19..692664b 100644
 +      <default>[da,fi,fo,is,no,se,sv]</default>
 +      <locale name="C">
 +        <short>List of European languages on ibus-setup</short>
-+	    <long>ibus-setup shows the languages only in input method list
++           <long>ibus-setup shows the languages only in input method list
 +                  when you run ibus-setup on one of the languages.
 +                  Other languages are hidden under an extended button.</long>
 +      </locale>
 +    </schema>
 +    <schema>
-+      <key>/schemas/desktop/ibus/general/xkblayoutconfig/system/west_asia</key>
-+      <applyto>/desktop/ibus/general/xkblayoutconfig/system/west_asia</applyto>
++      <key>/schemas/desktop/ibus/general/xkblayoutconfig/west_asia</key>
++      <applyto>/desktop/ibus/general/xkblayoutconfig/west_asia</applyto>
 +      <owner>ibus</owner>
 +      <type>list</type>
 +      <list_type>string</list_type>
@@ -112,14 +112,14 @@ index 2df4f19..692664b 100644
 +      <default>[am,ar,az,ber,fa,ha,he,hy,ig,ku,tg,tr,yo]</default>
 +      <locale name="C">
 +        <short>List of Asian languages on ibus-setup</short>
-+	    <long>ibus-setup shows the languages only in input method list
++           <long>ibus-setup shows the languages only in input method list
 +                  when you run ibus-setup on one of the languages.
 +                  Other languages are hidden under an extended button.</long>
 +      </locale>
 +    </schema>
 +    <schema>
-+      <key>/schemas/desktop/ibus/general/xkblayoutconfig/system/center_asia</key>
-+      <applyto>/desktop/ibus/general/xkblayoutconfig/system/center_asia</applyto>
++      <key>/schemas/desktop/ibus/general/xkblayoutconfig/center_asia</key>
++      <applyto>/desktop/ibus/general/xkblayoutconfig/center_asia</applyto>
 +      <owner>ibus</owner>
 +      <type>list</type>
 +      <list_type>string</list_type>
@@ -129,14 +129,14 @@ index 2df4f19..692664b 100644
 +      <default>[bo,zh]</default>
 +      <locale name="C">
 +        <short>List of Asian languages on ibus-setup</short>
-+	    <long>ibus-setup shows the languages only in input method list
++           <long>ibus-setup shows the languages only in input method list
 +                  when you run ibus-setup on one of the languages.
 +                  Other languages are hidden under an extended button.</long>
 +      </locale>
 +    </schema>
 +    <schema>
-+      <key>/schemas/desktop/ibus/general/xkblayoutconfig/system/east_asia</key>
-+      <applyto>/desktop/ibus/general/xkblayoutconfig/system/east_asia</applyto>
++      <key>/schemas/desktop/ibus/general/xkblayoutconfig/east_asia</key>
++      <applyto>/desktop/ibus/general/xkblayoutconfig/east_asia</applyto>
 +      <owner>ibus</owner>
 +      <type>list</type>
 +      <list_type>string</list_type>
@@ -146,14 +146,14 @@ index 2df4f19..692664b 100644
 +      <default>[dz,km,lo,my,th,vi]</default>
 +      <locale name="C">
 +        <short>List of Asian languages on ibus-setup</short>
-+	    <long>ibus-setup shows the languages only in input method list
++           <long>ibus-setup shows the languages only in input method list
 +                  when you run ibus-setup on one of the languages.
 +                  Other languages are hidden under an extended button.</long>
 +      </locale>
 +    </schema>
 +    <schema>
-+      <key>/schemas/desktop/ibus/general/xkblayoutconfig/system/india</key>
-+      <applyto>/desktop/ibus/general/xkblayoutconfig/system/india</applyto>
++      <key>/schemas/desktop/ibus/general/xkblayoutconfig/india</key>
++      <applyto>/desktop/ibus/general/xkblayoutconfig/india</applyto>
 +      <owner>ibus</owner>
 +      <type>list</type>
 +      <list_type>string</list_type>
@@ -163,14 +163,14 @@ index 2df4f19..692664b 100644
 +      <default>[bn,dv,gu,hi,kn,ml,ne,or,pa,si,ta,te,ur]</default>
 +      <locale name="C">
 +        <short>List of Asian languages on ibus-setup</short>
-+	    <long>ibus-setup shows the languages only in input method list
++           <long>ibus-setup shows the languages only in input method list
 +                  when you run ibus-setup on one of the languages.
 +                  Other languages are hidden under an extended button.</long>
 +      </locale>
 +    </schema>
 +    <schema>
-+      <key>/schemas/desktop/ibus/general/xkblayoutconfig/system/australia</key>
-+      <applyto>/desktop/ibus/general/xkblayoutconfig/system/australia</applyto>
++      <key>/schemas/desktop/ibus/general/xkblayoutconfig/australia</key>
++      <applyto>/desktop/ibus/general/xkblayoutconfig/australia</applyto>
 +      <owner>ibus</owner>
 +      <type>list</type>
 +      <list_type>string</list_type>
@@ -180,63 +180,62 @@ index 2df4f19..692664b 100644
 +      <default>[mi]</default>
 +      <locale name="C">
 +        <short>List of Asian languages on ibus-setup</short>
-+	    <long>ibus-setup shows the languages only in input method list
++           <long>ibus-setup shows the languages only in input method list
 +                  when you run ibus-setup on one of the languages.
 +                  Other languages are hidden under an extended button.</long>
 +      </locale>
 +    </schema>
 +    <schema>
-       <key>/schemas/desktop/ibus/panel/use_custom_font</key>
-       <applyto>/desktop/ibus/panel/use_custom_font</applyto>
+       <key>/schemas/desktop/ibus/panel/custom_font</key>
+       <applyto>/desktop/ibus/panel/custom_font</applyto>
        <owner>ibus</owner>
 diff --git a/setup/enginecombobox.py b/setup/enginecombobox.py
-index 7383177..bff2407 100644
+index 8d1424b..9fbe476 100644
 --- a/setup/enginecombobox.py
 +++ b/setup/enginecombobox.py
-@@ -43,7 +43,10 @@ class EngineComboBox(gtk.ComboBox):
+@@ -45,6 +45,9 @@ class EngineComboBox(Gtk.ComboBox):
          self.connect("notify::active", self.__notify_active_cb)
  
          self.__model = None
 +        self.__all_model = None
 +        self.__config = None
-         self.__title = _("Select an input method")
 +        self.__show_sub_lang = False
  
-         renderer = gtk.CellRendererPixbuf()
+         renderer = Gtk.CellRendererPixbuf()
          renderer.set_property("xalign", 0)
-@@ -57,21 +60,51 @@ class EngineComboBox(gtk.ComboBox):
+@@ -58,21 +61,51 @@ class EngineComboBox(Gtk.ComboBox):
          self.pack_start(renderer, True)
-         self.set_cell_data_func(renderer, self.__name_cell_data_cb)
+         self.set_cell_data_func(renderer, self.__name_cell_data_cb, None)
  
 -    def set_engines(self, engines):
--        self.__model = gtk.TreeStore(gobject.TYPE_PYOBJECT)
+-        self.__model = Gtk.TreeStore(object)
 +    def __gconf_get_lang_list_from_locale(self):
 +        common_list = ['en', 'Other']
 +        if  self.__config == None:
 +            return None
 +        loc = None
 +        try:
-+            loc = locale.setlocale (locale.LC_ALL)
++           loc = locale.setlocale (locale.LC_ALL)
 +        except:
 +            pass
 +        if loc == None:
 +            return common_list
-+        current_lang = ibus.get_language_name(loc)
++        current_lang = IBus.get_language_name(loc)
 +        if current_lang == None:
 +            return common_list
-+        group_list = self.__config.get_value("general/xkblayoutconfig/system",
-+                                             "group_list", None)
++        group_list = self.__config.get_value("general/xkblayoutconfig",
++                                             "group_list")
 +        if group_list == None:
 +            return [loc] + common_list
 +        group_list = list(group_list)
 +        lang_list = None
 +        for group in group_list:
 +            group = str(group)
-+            langs = self.__config.get_value("general/xkblayoutconfig/system",
-+                                            group, [])
++            langs = list(self.__config.get_value("general/xkblayoutconfig",
++                                                  group))
 +            for lang in langs:
 +                lang = str(lang)
-+                if current_lang == ibus.get_language_name(lang):
++                if current_lang == IBus.get_language_name(lang):
 +                    lang_list = langs
 +                    break
 +            if lang_list != None:
@@ -247,49 +246,49 @@ index 7383177..bff2407 100644
  
 -        iter1 = self.__model.append(None)
 -        self.__model.set(iter1, 0, 0)
--        lang = {}
+-        langs = {}
 -        for e in engines:
--            if ibus.use_bridge_hotkey() and \
--               e.name.startswith(ibus.DEFAULT_BRIDGE_ENGINE_NAME):
--                continue
--            l = ibus.get_language_name(e.language)
--            if l not in lang:
--                lang[l] = []
--            lang[l].append(e)
+-            print e.get_language()
+-            l = IBus.get_language_name(e.get_language())
+-            if l == None:
+-                l = ""
+-            if l not in langs:
+-                langs[l] = []
+-            langs[l].append(e)
 +    def __has_engine_in_lang_list(self, engine, lang_list):
 +        retval = False
 +        for lang in lang_list:
-+            if ibus.get_language_name(lang) == \
-+                ibus.get_language_name(engine.language):
++            if IBus.get_language_name(lang) == \
++                IBus.get_language_name(engine.props.language):
 +                retval = True
 +                break
 +        return retval
  
-+    def __model_append_langs(self, model, lang, visible):
-         keys = lang.keys()
++    def __model_append_langs(self, model, langs, visible):
+         keys = langs.keys()
          keys.sort(locale.strcoll)
-         #add "Others" to the end of the combo box
-@@ -76,29 +112,89 @@ class EngineComboBox(gtk.ComboBox):
-             keys.remove(ibus.get_language_name("Other"))
-             keys += [ibus.get_language_name("Other")]
+         current_lang = IBus.get_language_name(locale.getlocale()[0])
+@@ -86,29 +119,86 @@ class EngineComboBox(Gtk.ComboBox):
+             keys.remove(IBus.get_language_name("Other"))
+             keys += [IBus.get_language_name("Other")]
          for l in keys:
 -            iter1 = self.__model.append(None)
 -            self.__model.set(iter1, 0, l)
 +            iter1 = model.append(None)
 +            model.set(iter1, 0, l)
              def cmp_engine(a, b):
-                 if a.rank == b.rank:
-                     return locale.strcoll(a.longname, b.longname)
-                 return int(b.rank - a.rank)
-             lang[l].sort(cmp_engine)
-             for e in lang[l]:
+                 if a.get_rank() == b.get_rank():
+                     return locale.strcoll(a.get_longname(), b.get_longname())
+                 return int(b.get_rank() - a.get_rank())
+             langs[l].sort(cmp_engine)
+             for e in langs[l]:
 -                iter2 = self.__model.append(iter1)
 -                self.__model.set(iter2, 0, e)
 +                iter2 = model.append(iter1)
 +                model.set(iter2, 0, e)
 +
 +    def set_engines(self, engines):
-+        self.__model = gtk.TreeStore(gobject.TYPE_PYOBJECT)
++        self.__model = Gtk.TreeStore(object)
 +
 +        iter1 = self.__model.append(None)
 +        self.__model.set(iter1, 0, 0)
@@ -297,10 +296,7 @@ index 7383177..bff2407 100644
 +        lang = {}
 +        sub_lang = {}
 +        for e in engines:
-+            if ibus.use_bridge_hotkey() and \
-+               e.name.startswith(ibus.DEFAULT_BRIDGE_ENGINE_NAME):
-+                continue
-+            l = ibus.get_language_name(e.language)
++            l = IBus.get_language_name(e.props.language)
 +            if lang_list == None or \
 +                self.__has_engine_in_lang_list(e, lang_list):
 +                if l not in lang:
@@ -314,8 +310,9 @@ index 7383177..bff2407 100644
 +        self.__model_append_langs(self.__model, lang, True)
 +        iter1 = self.__model.append(None)
 +        self.__model.set(iter1, 0, -1)
-+
-+        self.__all_model = gtk.TreeStore(gobject.TYPE_PYOBJECT)
+ 
+-        self.set_model(self.__model)
++        self.__all_model = Gtk.TreeStore(object)
 +        iter1 = self.__all_model.append(None)
 +        self.__all_model.set(iter1, 0, 0)
 +        self.__model_append_langs(self.__all_model, lang, False)
@@ -324,8 +321,7 @@ index 7383177..bff2407 100644
 +        self.__model_append_langs(self.__all_model, sub_lang, False)
 +
 +        self.__toggle_sub_lang()
- 
--        self.set_model(self.__model)
++
 +    def __toggle_sub_lang(self):
 +        self.set_model(None)
 +        if self.__show_sub_lang:
@@ -334,7 +330,7 @@ index 7383177..bff2407 100644
 +            self.set_model(self.__model)
          self.set_active(0)
  
-     def __icon_cell_data_cb(self, celllayout, renderer, model, iter):
+     def __icon_cell_data_cb(self, celllayout, renderer, model, iter, data):
 -        engine = self.__model.get_value(iter, 0)
 +        model = self.get_model()
 +        engine = model.get_value(iter, 0)
@@ -351,12 +347,12 @@ index 7383177..bff2407 100644
 +                renderer.set_property("pixbuf", None)
 +            elif engine < 0:
 +                if not self.__show_sub_lang:
-+                    pixbuf = load_icon("list-add", gtk.ICON_SIZE_LARGE_TOOLBAR)
++                    pixbuf = load_icon("list-add", Gtk.IconSize.LARGE_TOOLBAR)
 +                else:
-+                    pixbuf = load_icon("list-remove", gtk.ICON_SIZE_LARGE_TOOLBAR)
++                    pixbuf = load_icon("list-remove", Gtk.IconSize.LARGE_TOOLBAR)
 +                if pixbuf == None:
-+                    pixbuf = load_icon("gtk-missing-image",
-+                                       gtk.ICON_SIZE_LARGE_TOOLBAR)
++                    pixbuf = load_icon(Gtk.STOCK_MISSING_IMAGE,
++                                       Gtk.IconSize.LARGE_TOOLBAR)
 +                if pixbuf == None:
 +                    renderer.set_property("visible", False)
 +                    renderer.set_property("sensitive", False)
@@ -367,35 +363,35 @@ index 7383177..bff2407 100644
          else:
              renderer.set_property("visible", True)
              renderer.set_property("sensitive", True)
-@@ -110,7 +203,8 @@ class EngineComboBox(gtk.ComboBox):
+@@ -121,7 +211,8 @@ class EngineComboBox(Gtk.ComboBox):
              renderer.set_property("pixbuf", pixbuf)
  
-     def __name_cell_data_cb(self, celllayout, renderer, model, iter):
+     def __name_cell_data_cb(self, celllayout, renderer, model, iter, data):
 -        engine = self.__model.get_value(iter, 0)
 +        model = self.get_model()
 +        engine = model.get_value(iter, 0)
  
          if isinstance (engine, str) or isinstance (engine, unicode):
              renderer.set_property("sensitive", False)
-@@ -118,8 +212,15 @@ class EngineComboBox(gtk.ComboBox):
-             renderer.set_property("weight", pango.WEIGHT_NORMAL)
+@@ -129,8 +220,15 @@ class EngineComboBox(Gtk.ComboBox):
+             renderer.set_property("weight", Pango.Weight.NORMAL)
          elif isinstance(engine, int):
              renderer.set_property("sensitive", True)
--            renderer.set_property("text", self.__title)
--            renderer.set_property("weight", pango.WEIGHT_NORMAL)
+-            renderer.set_property("text", _("Select an input method"))
+-            renderer.set_property("weight", Pango.Weight.NORMAL)
 +            if engine == 0:
-+                renderer.set_property("text", self.__title)
-+                renderer.set_property("weight", pango.WEIGHT_NORMAL)
++                renderer.set_property("text", _("Select an input method"))
++                renderer.set_property("weight", Pango.Weight.NORMAL)
 +            elif engine < 0:
 +                if not self.__show_sub_lang:
 +                    renderer.set_property("text", _("Show all input methods"))
 +                else:
 +                    renderer.set_property("text", _("Show only input methods for your region"))
-+                renderer.set_property("weight", pango.WEIGHT_BOLD)
++                renderer.set_property("weight", Pango.Weight.BOLD)
          else:
              renderer.set_property("sensitive", True)
-             renderer.set_property("text", engine.longname)
-@@ -134,13 +235,21 @@ class EngineComboBox(gtk.ComboBox):
+             renderer.set_property("text", engine.get_longname())
+@@ -146,10 +244,18 @@ class EngineComboBox(Gtk.ComboBox):
              if i == 0 or i == -1:
                  return None
              iter = self.get_active_iter()
@@ -409,27 +405,24 @@ index 7383177..bff2407 100644
          else:
              raise AttributeError, 'unknown property %s' % property.name
  
-     def get_active_engine(self):
-         return self.get_property("active-engine")
- 
 +    def set_config(self, config):
 +        self.__config = config
 +
-     def get_title(self):
-         return self.__title
+     def get_active_engine(self):
+         return self.get_property("active-engine")
  
 diff --git a/setup/main.py b/setup/main.py
-index 192fb88..5a0170d 100644
+index 47a34e3..16bfeea 100644
 --- a/setup/main.py
 +++ b/setup/main.py
-@@ -227,6 +227,7 @@ class Setup(object):
-         button.connect("toggled", self.__checkbutton_preload_engine_mode_toggled_cb)
-         self.__engines = self.__bus.list_engines()
+@@ -197,6 +197,7 @@ class Setup(object):
+                     self.__engines.append(engine)
+ 
          self.__combobox = self.__builder.get_object("combobox_engines")
 +        self.__combobox.set_config(self.__config)
          self.__combobox.set_engines(self.__engines)
  
-         engines = self.__bus.list_active_engines()
+         tmp_dict = {}
 -- 
-1.7.5.4
+1.7.7.4
 

diff --git a/ibus.spec b/ibus.spec
index 9511d5a..659cf40 100644
--- a/ibus.spec
+++ b/ibus.spec
@@ -4,24 +4,14 @@
 
 %define have_libxkbfile 1
 %define have_gjsfile 1
+%define have_dconf 1
 
 %if 0%{?fedora} > 16
-%define have_bridge_hotkey 1
-%define ibus_gjs_version 3.2.1.20111230
+%define ibus_gjs_version 3.3.3.20120203
 %define ibus_gjs_build_failure 1
-%define have_dconf 1
 %else
-%if 0%{?fedora} > 15
-%define have_bridge_hotkey 1
 %define ibus_gjs_version 3.2.1.20111230
 %define ibus_gjs_build_failure 0
-%define have_dconf 1
-%else
-%define have_bridge_hotkey 0
-%define ibus_gjs_version 3.0.2.20111118
-%define ibus_gjs_build_failure 0
-%define have_dconf 0
-%endif
 %endif
 
 %define ibus_api_version 1.0
@@ -32,22 +22,25 @@
 %define gnome_icon_theme_legacy_version 2.91.6
 
 Name:       ibus
-Version:    1.4.0
-Release:    17%{?dist}
+Version:    1.4.99.20120203
+Release:    1%{?dist}
 Summary:    Intelligent Input Bus for Linux OS
 License:    LGPLv2+
 Group:      System Environment/Libraries
 URL:        http://code.google.com/p/ibus/
-Source0:    http://ibus.googlecode.com/files/%{name}-%{version}.tar.gz
+# Source0:    http://ibus.googlecode.com/files/%{name}-%{version}.tar.gz
+Source0:    http://fujiwara.fedorapeople.org/ibus/gnome-shell/%{name}-%{version}.tar.gz
 Source1:    xinput-ibus
 %if %have_gjsfile
 Source2:    http://fujiwara.fedorapeople.org/ibus/gnome-shell/ibus-gjs-%{ibus_gjs_version}.tar.gz
+# Workaround for glib2 bug:
+# https://bugzilla.gnome.org/show_bug.cgi?id=669253
+Source3:    ibus-gsettings-db
 %endif
 Patch0:     ibus-HEAD.patch
-Patch1:     ibus-530711-preload-sys.patch
-Patch2:     ibus-541492-xkb.patch
-Patch3:     ibus-xx-bridge-hotkey.patch
-Patch4:     ibus-xx-setup-frequent-lang.patch
+Patch1:     ibus-541492-xkb.patch
+Patch2:     ibus-xx-setup-frequent-lang.patch
+# Patch3:     ibus-530711-preload-sys.patch
 
 # Workaround gnome-shell build failure
 # http://koji.fedoraproject.org/koji/getfile?taskID=3317917&name=root.log
@@ -74,6 +67,8 @@ BuildRequires:  gtk-doc
 %if %have_dconf
 BuildRequires:  dconf-devel
 BuildRequires:  dbus-x11
+BuildRequires:  vala
+BuildRequires:  vala-tools
 %endif
 # for AM_GCONF_SOURCE_2 in configure.ac
 BuildRequires:  GConf2-devel
@@ -82,6 +77,7 @@ BuildRequires:  intltool
 BuildRequires:  iso-codes-devel
 %if %have_libxkbfile
 BuildRequires:  libxkbfile-devel
+BuildRequires:  libgnomekbd-devel
 %endif
 # for ibus-gjs-xx.tar.gz
 BuildRequires:  gjs
@@ -107,6 +103,7 @@ Requires:   dconf
 Requires:   GConf2
 %endif
 Requires:   notify-python
+Requires:   libgnomekbd
 Requires:   librsvg2
 Requires:   gnome-icon-theme-legacy >= %{gnome_icon_theme_legacy_version}
 Requires:   gnome-icon-theme-symbolic
@@ -206,14 +203,12 @@ cd ..
 %endif
 %patch0 -p1
 %patch92 -p1 -b .g-s-preedit
-cp client/gtk2/ibusimcontext.c client/gtk3/ibusimcontext.c
-%patch1 -p1 -b .preload-sys
+cp client/gtk2/ibusimcontext.c client/gtk3/ibusimcontext.c ||
 %if %have_libxkbfile
-%patch2 -p1 -b .xkb
+%patch1 -p1 -b .xkb
 %endif
-mv data/ibus.schemas.in data/ibus.schemas.in.in
-%patch3 -p1 -b .bridge-key
-%patch4 -p1 -b .setup-frequent-lang
+%patch2 -p1 -b .setup-frequent-lang
+# %patch3 -p1 -b .preload-sys
 
 %if 0%{?fedora} <= 16
 %patch93 -p1 -b .compat
@@ -227,7 +222,7 @@ XKB_PRELOAD_LAYOUTS=\
 "gb,ge,ge(dsb),ge(ru),ge(os),gh,gh(akan),gh(ewe),gh(fula),gh(ga),gh(hausa),"\
 "gn,gr,hu,hr,ie,ie(CloGaelach),il,"\
 "in,"\
-"in(tel),in(bolnagri),iq,iq(ku),ir,ir(ku),is,it,"\
+"in(tel),in(bolnagri),iq,iq(ku),ir,ir(ku),is,it,jp,"\
 "kg,kh,kz,la,latam,lk,lk(tam_unicode),lt,lv,ma,ma(tifinagh),mal,mao,"\
 "me,mk,mm,mt,mv,ng,ng(hausa),ng,ng(igbo),ng(yoruba),nl,no,no(smi),np,"\
 "pk,pl,pl(csb),pt,ro,rs,ru,ru(cv),ru(kom),ru(sah),ru(tt),ru(xal),"\
@@ -242,24 +237,32 @@ automake -a -c -f
     --enable-gtk2 \
     --enable-gtk3 \
     --enable-xim \
-    --disable-gtk-doc \
+    --enable-gtk-doc \
     --with-no-snooper-apps='gnome-do,Do.*,firefox.*,.*chrome.*,.*chromium.*' \
     --enable-surrounding-text \
 %if %have_libxkbfile
     --with-xkb-preload-layouts=$XKB_PRELOAD_LAYOUTS \
-%endif
-%if %have_bridge_hotkey
-    --enable-bridge-hotkey \
+    --enable-xkb \
+    --enable-libgnomekbd \
 %endif
 %if %have_dconf
     --enable-dconf \
     --disable-gconf \
 %endif
+    --enable-python-library \
     --enable-introspection
 
-# make -C po update-gmo
-make %{?_smp_mflags}
+# Workaround for glib2 bug:
+# https://bugzilla.gnome.org/show_bug.cgi?id=669253
+cd data/dconf
+make org.freedesktop.ibus.gschema.valid
+mkdir db
+cp %SOURCE3 db/ibus
+cd ../..
 
+# make -C po update-gmo
+make %{?_smp_mflags} \
+  PKG_CONFIG_PATH=..:/usr/lib64/pkgconfig:/usr/lib/pkgconfig
 
 %if %have_gjsfile
 d=`basename %SOURCE2 .tar.gz`
@@ -357,6 +360,18 @@ if [ "$1" = "0" ]; then
   # if alternative was set to manual, reset to auto
   [ -L %{_sysconfdir}/alternatives/xinputrc -a "`readlink %{_sysconfdir}/alternatives/xinputrc`" = "%{_xinputconf}" ] && %{_sbindir}/alternatives --auto xinputrc || :
 fi
+%if %have_dconf
+if [ $1 -eq 0 ]; then
+  glib-compile-schemas %{_datadir}/glib-2.0/schemas
+fi
+%endif
+
+%posttrans
+%if %have_dconf
+if [ $1 -eq 0 ]; then
+  glib-compile-schemas %{_datadir}/glib-2.0/schemas
+fi
+%endif
 
 %post libs -p /sbin/ldconfig
 
@@ -381,6 +396,7 @@ fi
 %dir %{python_sitelib}/ibus
 %{python_sitelib}/ibus/*
 %dir %{_datadir}/ibus/
+%{_bindir}/ibus
 %{_bindir}/ibus-daemon
 %{_bindir}/ibus-setup
 %{_datadir}/ibus/*
@@ -389,13 +405,15 @@ fi
 %if %have_dconf
 %{_datadir}/GConf/gsettings/*
 %{_datadir}/glib-2.0/schemas/*.xml
+%{_libexecdir}/ibus-engine-simple
 %{_libexecdir}/ibus-dconf
 %else
 %{_libexecdir}/ibus-gconf
 %endif
-%{_libexecdir}/ibus-ui-gtk
+%{_libexecdir}/ibus-ui-gtk3
 %{_libexecdir}/ibus-x11
 # %{_sysconfdir}/xdg/autostart/ibus.desktop
+%{_sysconfdir}/bash_completion.d/ibus.bash
 %if %have_dconf
 %{_sysconfdir}/dconf/db/ibus
 %{_sysconfdir}/dconf/profile/ibus
@@ -404,7 +422,6 @@ fi
 %endif
 %config %{_xinputconf}
 %if %have_libxkbfile
-%{_libexecdir}/ibus-engine-xkb
 %{_libexecdir}/ibus-xkb
 %endif
 
@@ -440,6 +457,12 @@ fi
 %{_datadir}/gtk-doc/html/*
 
 %changelog
+* Fri Feb 03 2021 Takao Fujiwara <tfujiwar@redhat.com> - 1.4.99.20120203-1
+- Updated to 1.4.99.20120203
+- Removed ibus-xx-bridge-hotkey.patch
+- Updated ibus-541492-xkb.patch to use libgnomekbd.
+- Updated ibus-xx-setup-frequent-lang.patch for 1.4.99.20120203
+
 * Wed Jan 04 2012 Takao Fujiwara <tfujiwar@redhat.com> - 1.4.0-17
 - Added ibus-771115-property-compatible.patch for f16
   Fixed Bug 771115 - IBusProperty back compatibility.

diff --git a/sources b/sources
index c2020d5..609f6e5 100644
--- a/sources
+++ b/sources
@@ -1,3 +1,4 @@
-b4f063794e89c71eb1f8cb543210da30  ibus-1.4.0.tar.gz
-4257048de65ea404389bb941a51db667  ibus-gjs-3.0.2.20111118.tar.gz
+675136bba0b04c922cca44eecd0bc421  ibus-1.4.99.20120203.tar.gz
+8c713e47d403482cdd8b851dda3d0713  ibus-gjs-3.3.3.20120203.tar.gz
 2d2ad58e3e41429dbd883ba7e501c9b2  ibus-gjs-3.2.1.20111230.tar.gz
+dbdf603f6897df8b894960249cf21909  ibus-gsettings-db

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2026-05-31  2:05 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-05-31  2:05 [rpms/ibus] autotool: Updated to 1.4.99.20120203 Takao Fujiwara

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox