public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
* [rpms/ibus] autotool: Delete upstreamed ibus-HEAD.patch
@ 2026-05-31  2:08 Takao Fujiwara
  0 siblings, 0 replies; 8+ messages in thread
From: Takao Fujiwara @ 2026-05-31  2:08 UTC (permalink / raw)
  To: git-commits

A new commit has been pushed.

Repo   : rpms/ibus
Branch : autotool
Commit : 76361ab0aa64c0871423a9d35ff4affcc79d331f
Author : Takao Fujiwara <tfujiwar@redhat.com>
Date   : 2023-08-08T23:19:38+09:00
Stats  : +0/-343 in 1 file(s)
URL    : https://src.fedoraproject.org/rpms/ibus/c/76361ab0aa64c0871423a9d35ff4affcc79d331f?branch=autotool

Log:
Delete upstreamed ibus-HEAD.patch

---
diff --git a/ibus-HEAD.patch b/ibus-HEAD.patch
deleted file mode 100644
index a5b8cdd..0000000
--- a/ibus-HEAD.patch
+++ /dev/null
@@ -1,343 +0,0 @@
-From d47dc5520145110acc5567e98cd3b0694aa13dde Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Tue, 1 Aug 2023 23:21:33 +0900
-Subject: [PATCH 1/3] src/tests: Fix some tests
-
-- Delete ua(rstu) in org.freedesktop.ibus.gschema.xml
-ua(rstu) has been available in xkeyboard-config 2.38 but deleted
-in 2.39.
-
-- Use command -v rather than which in runtest
-
-Fixes: https://gitlab.freedesktop.org/xkeyboard-config/xkeyboard-config/-/commit/a9f7e47
-
-BUG=https://github.com/ibus/ibus/issues/2542
-BUG=https://github.com/ibus/ibus/issues/2544
----
- data/dconf/org.freedesktop.ibus.gschema.xml | 4 ++--
- src/tests/runtest                           | 3 +--
- 2 files changed, 3 insertions(+), 4 deletions(-)
-
-diff --git a/data/dconf/org.freedesktop.ibus.gschema.xml b/data/dconf/org.freedesktop.ibus.gschema.xml
-index 5c96ce39..d115a436 100644
---- a/data/dconf/org.freedesktop.ibus.gschema.xml
-+++ b/data/dconf/org.freedesktop.ibus.gschema.xml
-@@ -74,8 +74,8 @@
-         'ru(xal)', 'se(rus)', 'se(rus_nodeadkeys)', 'se(swl)', 'sy',
-         'sy(syc)', 'sy(syc_phonetic)', 'th', 'th(pat)', 'th(tis)',
-         'tj', 'tj(legacy)', 'tz', 'ua', 'ua(homophonic)',
--        'ua(legacy)', 'ua(phonetic)', 'ua(rstu)', 'ua(rstu_ru)',
--        'ua(typewriter)', 'ua(winkeys)', 'us(chr)', 'us(rus)', 'uz' ]
-+        'ua(legacy)', 'ua(phonetic)', 'ua(typewriter)', 'ua(winkeys)',
-+        'us(chr)', 'us(rus)', 'uz' ]
-       </default>
-       <summary>Latin layouts which have no ASCII</summary>
-       <description>US layout is appended to the Latin layouts. variant can be omitted.</description>
-diff --git a/src/tests/runtest b/src/tests/runtest
-index 036dc771..e8487896 100755
---- a/src/tests/runtest
-+++ b/src/tests/runtest
-@@ -44,8 +44,7 @@ MACHINE=`uname -m`
- if test x"$MACHINE" = xx86_64 ; then
-     GTK_QUERY_MODULE=gtk-query-immodules-3.0-64
- fi
--which $GTK_QUERY_MODULE
--if [ $? -ne 0 ] ; then
-+if ! command -v $GTK_QUERY_MODULE &> /dev/null ; then
-     GTK_QUERY_MODULE=gtk-query-immodules-3.0
- fi
- 
--- 
-2.41.0
-
-From 4e644e8dff68c4f7d52c0fe5da8b3f3a89c74328 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Tue, 1 Aug 2023 23:25:35 +0900
-Subject: [PATCH 2/3] ui/gtk3: Fix configure --disable-appindicator
-
-Seems `automake` runs `valac` for all VALA files as the concept while
-I could not find such a documentation and I added "#if INDICATOR" in
-indicator.vala at the moment.
-
-BUG=https://github.com/ibus/ibus/issues/2543
----
- ui/gtk3/Makefile.am    | 56 ++++++++++++++++++++++--------------------
- ui/gtk3/indicator.vala |  3 +++
- ui/gtk3/panel.vala     | 26 ++++++++++++++++++--
- 3 files changed, 56 insertions(+), 29 deletions(-)
-
-diff --git a/ui/gtk3/Makefile.am b/ui/gtk3/Makefile.am
-index 2cc72037..6f732271 100644
---- a/ui/gtk3/Makefile.am
-+++ b/ui/gtk3/Makefile.am
-@@ -90,6 +90,32 @@ AM_VALAFLAGS = \
- 	--target-glib="$(VALA_TARGET_GLIB_VERSION)" \
- 	$(NULL)
- 
-+libexec_PROGRAMS = ibus-ui-gtk3
-+
-+ibus_ui_gtk3_SOURCES = \
-+    application.vala \
-+    bindingcommon.vala \
-+    candidatearea.vala \
-+    candidatepanel.vala \
-+    emojier.vala \
-+    handle.vala \
-+    iconwidget.vala \
-+    keybindingmanager.vala \
-+    panel.vala \
-+    pango.vala \
-+    property.vala \
-+    propertypanel.vala \
-+    separator.vala \
-+    switcher.vala \
-+    xkblayout.vala \
-+    gen-notification-item.xml.c \
-+    gen-notification-watcher.xml.c \
-+    $(NULL)
-+
-+ibus_ui_gtk3_LDADD = \
-+	$(AM_LDADD) \
-+	$(NULL)
-+
- if ENABLE_LIBNOTIFY
- AM_CFLAGS += \
-        @LIBNOTIFY_CFLAGS@ \
-@@ -119,35 +145,11 @@ AM_LDADD += \
-     @DBUSMENU_GLIB_LIBS@ \
-     @DBUSMENU_GTK3_LIBS@ \
-     $(NULL)
-+ibus_ui_gtk3_SOURCES += \
-+    indicator.vala \
-+    $(NULL)
- endif
- 
--libexec_PROGRAMS = ibus-ui-gtk3
--
--ibus_ui_gtk3_SOURCES = \
--	application.vala \
--	bindingcommon.vala \
--	candidatearea.vala \
--	candidatepanel.vala \
--	emojier.vala \
--	handle.vala \
--	iconwidget.vala \
--	indicator.vala \
--	keybindingmanager.vala \
--	panel.vala \
--	pango.vala \
--	property.vala \
--	propertypanel.vala \
--	separator.vala \
--	switcher.vala \
--	xkblayout.vala \
--	gen-notification-item.xml.c \
--	gen-notification-watcher.xml.c \
--	$(NULL)
--
--ibus_ui_gtk3_LDADD = \
--	$(AM_LDADD) \
--	$(NULL)
--
- gen-%.xml.c: %.xml
- 	echo "Building $@ from $<"
- 	echo "const char * _$(subst -,_,$(subst .,_,$(basename $(notdir $<)))) = " > $@
-diff --git a/ui/gtk3/indicator.vala b/ui/gtk3/indicator.vala
-index cae6ce5e..b53fd753 100644
---- a/ui/gtk3/indicator.vala
-+++ b/ui/gtk3/indicator.vala
-@@ -26,6 +26,8 @@
-  * for left click on the indicator.
-  */
- 
-+// I have no idea to exempt this file to make ibus_ui_gtk3_vala.stamp
-+#if INDICATOR
- public extern string _notification_item;
- public extern string _notification_watcher;
- 
-@@ -644,3 +646,4 @@ class Indicator : IBus.Service
-     public signal void secondary_activate();
-     public signal void registered_status_notifier_item();
- }
-+#endif
-diff --git a/ui/gtk3/panel.vala b/ui/gtk3/panel.vala
-index 7113460d..f1bbd720 100644
---- a/ui/gtk3/panel.vala
-+++ b/ui/gtk3/panel.vala
-@@ -33,7 +33,9 @@ class Panel : IBus.PanelService {
-     private GLib.Settings m_settings_hotkey = null;
-     private GLib.Settings m_settings_panel = null;
-     private IconType m_icon_type = IconType.STATUS_ICON;
-+#if INDICATOR
-     private Indicator m_indicator;
-+#endif
-     private Gtk.StatusIcon m_status_icon;
-     private Gtk.Menu m_ime_menu;
-     private Gtk.Menu m_sys_menu;
-@@ -685,7 +687,9 @@ class Panel : IBus.PanelService {
- 
-             m_status_icon.set_visible(
-                     m_settings_panel.get_boolean("show-icon-on-systray"));
--        } else if (m_icon_type == IconType.INDICATOR) {
-+        }
-+#if INDICATOR
-+        else if (m_icon_type == IconType.INDICATOR) {
-             if (m_indicator == null)
-                 return;
- 
-@@ -694,6 +698,7 @@ class Panel : IBus.PanelService {
-             else
-                 m_indicator.set_status(Indicator.Status.PASSIVE);
-         }
-+#endif
-     }
- 
-     private void set_lookup_table_orientation() {
-@@ -748,7 +753,9 @@ class Panel : IBus.PanelService {
-                 if (m_status_icon != null && m_switcher != null)
-                     state_changed();
-             }
--        } else if (m_icon_type == IconType.INDICATOR) {
-+        }
-+#if INDICATOR
-+        else if (m_icon_type == IconType.INDICATOR) {
-             if (m_xkb_icon_image.size() > 0) {
-                 m_xkb_icon_image.remove_all();
- 
-@@ -756,6 +763,7 @@ class Panel : IBus.PanelService {
-                     state_changed();
-             }
-         }
-+#endif
-     }
- 
-     private void set_property_icon_delay_time() {
-@@ -1550,11 +1558,13 @@ class Panel : IBus.PanelService {
-                 Gdk.Pixbuf pixbuf = create_icon_pixbuf_with_string(symbol);
-                 m_status_icon.set_from_pixbuf(pixbuf);
-             }
-+#if INDICATOR
-             else if (m_icon_type == IconType.INDICATOR) {
-                 Cairo.ImageSurface image =
-                         create_cairo_image_surface_with_string(symbol, true);
-                 m_indicator.set_cairo_image_surface_full(image, "");
-             }
-+#endif
- 
-             return false;
-         });
-@@ -1684,6 +1694,7 @@ class Panel : IBus.PanelService {
-         m_property_panel.set_properties(props);
-         set_properties(props);
- 
-+#if INDICATOR
-         if (m_icon_type != IconType.INDICATOR)
-             return;
-         if (m_is_context_menu)
-@@ -1699,6 +1710,7 @@ class Panel : IBus.PanelService {
-                             m_indicator.set_menu(create_activate_menu ());
-                             return false;
-                         });
-+#endif
-     }
- 
-     public override void update_property(IBus.Property prop) {
-@@ -1752,11 +1764,13 @@ class Panel : IBus.PanelService {
-         if (m_switcher.is_running())
-             return;
- 
-+#if INDICATOR
-         if (m_icon_type == IconType.INDICATOR) {
-             // Wait for the callback of the session bus.
-             if (m_indicator == null)
-                 return;
-         }
-+#endif
- 
-         var icon_name = "ibus-keyboard";
- 
-@@ -1771,8 +1785,10 @@ class Panel : IBus.PanelService {
-         if (icon_name[0] == '/') {
-             if (m_icon_type == IconType.STATUS_ICON)
-                 m_status_icon.set_from_file(icon_name);
-+#if INDICATOR
-             else if (m_icon_type == IconType.INDICATOR)
-                 m_indicator.set_icon_full(icon_name, "");
-+#endif
-         } else {
-             string language = null;
- 
-@@ -1788,24 +1804,30 @@ class Panel : IBus.PanelService {
-                             create_icon_pixbuf_with_string(language);
-                     m_status_icon.set_from_pixbuf(pixbuf);
-                 }
-+#if INDICATOR
-                 else if (m_icon_type == IconType.INDICATOR) {
-                     Cairo.ImageSurface image =
-                             create_cairo_image_surface_with_string(language,
-                                                                    true);
-                     m_indicator.set_cairo_image_surface_full(image, "");
-                 }
-+#endif
-             } else {
-                 var theme = Gtk.IconTheme.get_default();
-                 if (theme.lookup_icon(icon_name, 48, 0) != null) {
-                     if (m_icon_type == IconType.STATUS_ICON)
-                         m_status_icon.set_from_icon_name(icon_name);
-+#if INDICATOR
-                     else if (m_icon_type == IconType.INDICATOR)
-                         m_indicator.set_icon_full(icon_name, "");
-+#endif
-                 } else {
-                     if (m_icon_type == IconType.STATUS_ICON)
-                         m_status_icon.set_from_icon_name("ibus-engine");
-+#if INDICATOR
-                     else if (m_icon_type == IconType.INDICATOR)
-                         m_indicator.set_icon_full("ibus-engine", "");
-+#endif
-                 }
-             }
-         }
--- 
-2.41.0
-
-From 98c6ee7297a72b30e49431061b653ffba1bdbdf7 Mon Sep 17 00:00:00 2001
-From: Gunnar Hjalmarsson <gunnarhj@ubuntu.com>
-Date: Wed, 2 Aug 2023 16:56:59 +0200
-Subject: [PATCH 3/3] Fix typo in src/ibusservice.h
-
-"class" seems to be a reserved name in C++, so to make it possible to
-build plasma-desktop, the name "class" in
-ibus_service_class_free_interfaces() is replaced with "klass" in the
-same way as in ibus_service_class_add_interfaces().
-
-BUG=https://github.com/ibus/ibus/issues/2550
----
- src/ibusservice.h | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/src/ibusservice.h b/src/ibusservice.h
-index 37fca0ee..72263cb2 100644
---- a/src/ibusservice.h
-+++ b/src/ibusservice.h
-@@ -254,7 +254,7 @@ gboolean         ibus_service_class_add_interfaces
- 
- /**
-  * ibus_service_class_free_interfaces:
-- * @class: An IBusServiceClass.
-+ * @klass: An IBusServiceClass.
-  * @depth: The number of D-Bus introspection interfaces.
-  *
-  * Free the first @depth interfaces if @depth is positive. Free the last
-@@ -266,7 +266,7 @@ gboolean         ibus_service_class_add_interfaces
-  * returned but any interfaces are not freed.
-  */
- int              ibus_service_class_free_interfaces
--                                                (IBusServiceClass   *class,
-+                                                (IBusServiceClass   *klass,
-                                                  int                 depth);
- 
- G_END_DECLS
--- 
-2.41.0
-

^ permalink raw reply related	[flat|nested] 8+ messages in thread
* [rpms/ibus] autotool: Delete upstreamed ibus-HEAD.patch
@ 2026-05-31  2:09 Takao Fujiwara
  0 siblings, 0 replies; 8+ messages in thread
From: Takao Fujiwara @ 2026-05-31  2:09 UTC (permalink / raw)
  To: git-commits

A new commit has been pushed.

Repo   : rpms/ibus
Branch : autotool
Commit : 2aaca7a3c6c1f3e1a397564bdcadcbbd9034d9d6
Author : Takao Fujiwara <tfujiwar@redhat.com>
Date   : 2025-10-05T16:00:05+09:00
Stats  : +0/-81 in 1 file(s)
URL    : https://src.fedoraproject.org/rpms/ibus/c/2aaca7a3c6c1f3e1a397564bdcadcbbd9034d9d6?branch=autotool

Log:
Delete upstreamed ibus-HEAD.patch

---
diff --git a/ibus-HEAD.patch b/ibus-HEAD.patch
deleted file mode 100644
index 7f9a6bd..0000000
--- a/ibus-HEAD.patch
+++ /dev/null
@@ -1,81 +0,0 @@
-From abe7ed1bbe59fc89cf9a4cac5f0f4c3c6dee8cf7 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Thu, 25 Sep 2025 19:33:35 +0900
-Subject: [PATCH] src/ibuscomposetable: Fix leak with %L in compose file
-
-When IBus compose cache file is generated and the compose file
-includes "%L", a leak happens.
-Also fixes leaks in unicode-parser.
----
- src/ibuscomposetable.c |  3 ++-
- src/unicode-parser.c   | 12 +++++++++++-
- 2 files changed, 13 insertions(+), 2 deletions(-)
-
-diff --git a/src/ibuscomposetable.c b/src/ibuscomposetable.c
-index 8a4b17a0..e60ad091 100644
---- a/src/ibuscomposetable.c
-+++ b/src/ibuscomposetable.c
-@@ -284,6 +284,7 @@ expand_include_path (const char *include_path) {
-                 break;
-             }
-             case 'L': /* locale compose file */
-+                g_free (out);
-                 out = g_strdup ("%L");
-                 head = i + 2;
-                 while (*head || *head == ' ' || *head == '\t') head++;
-@@ -315,7 +316,7 @@ expand_include_path (const char *include_path) {
-                            "has been ignored", include_path, *(i+1));
-                 goto fail;
-             }
--            ++i;
-+            break;
-         }
-     }
-     o = out;
-diff --git a/src/unicode-parser.c b/src/unicode-parser.c
-index 8fece362..f86c1c81 100644
---- a/src/unicode-parser.c
-+++ b/src/unicode-parser.c
-@@ -141,7 +141,13 @@ ucd_names_list_parse_alias (const gchar *line,
- 
-     if (*line == '\0')
-         return FALSE;
--    data->alias = g_strdup (line);
-+    if (data->alias) {
-+        gchar *new_alias = g_strdup_printf ("%s;%s", data->alias, line);
-+        g_free (data->alias);
-+        data->alias = new_alias;
-+    } else {
-+        data->alias = g_strdup (line);
-+    }
-     return TRUE;
- }
- 
-@@ -197,6 +203,7 @@ ucd_names_list_parse_line (const gchar *line,
-         }
-         data->code = code;
-         data->name = name;
-+        g_strfreev (elements);
-     }
-     return TRUE;
- }
-@@ -521,6 +528,7 @@ main (int argc, char *argv[])
-     if (output_names_list && names_list)
-         ibus_unicode_data_save (output_names_list, names_list);
-     g_free (output_names_list);
-+    g_slist_free_full (names_list, g_object_unref);
- 
-     if (input_blocks) {
-         ucd_parse_file (input_blocks, &blocks_list, UCD_BLOCKS);
-@@ -531,6 +539,8 @@ main (int argc, char *argv[])
-     if (output_blocks_trans && blocks_list)
-         ucd_block_translatable_save (output_blocks_trans, blocks_list);
-     g_free (output_blocks);
-+    g_free (output_blocks_trans);
-+    g_slist_free_full (blocks_list, g_object_unref);
- 
-     g_free (unicode_version);
-     return 0;
--- 
-2.50.1
-

^ permalink raw reply related	[flat|nested] 8+ messages in thread
* [rpms/ibus] autotool: Delete upstreamed ibus-HEAD.patch
@ 2026-05-31  2:09 Takao Fujiwara
  0 siblings, 0 replies; 8+ messages in thread
From: Takao Fujiwara @ 2026-05-31  2:09 UTC (permalink / raw)
  To: git-commits

A new commit has been pushed.

Repo   : rpms/ibus
Branch : autotool
Commit : 83714326f2ac3aef36a6e29d409a4166dd58e767
Author : Takao Fujiwara <tfujiwar@redhat.com>
Date   : 2025-09-19T16:36:42+09:00
Stats  : +0/-31 in 1 file(s)
URL    : https://src.fedoraproject.org/rpms/ibus/c/83714326f2ac3aef36a6e29d409a4166dd58e767?branch=autotool

Log:
Delete upstreamed ibus-HEAD.patch

---
diff --git a/ibus-HEAD.patch b/ibus-HEAD.patch
deleted file mode 100644
index 3dbaf44..0000000
--- a/ibus-HEAD.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From 0991768f5f836c2b3f660040892fa1e60c2c1f22 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Sun, 7 Sep 2025 09:38:09 +0900
-Subject: [PATCH] util/IMdkit/i18nOffsetCache.c: Fix to realloc Xi18nAtomOffsetPair
-
-Fixes: https://github.com/ibus/ibus/commit/d039b95
-BUG=rhbz#2365138
----
- util/IMdkit/i18nOffsetCache.c | 5 +++--
- 1 file changed, 3 insertions(+), 2 deletions(-)
-
-diff --git a/util/IMdkit/i18nOffsetCache.c b/util/IMdkit/i18nOffsetCache.c
-index cab974c7..ac4b8bb1 100644
---- a/util/IMdkit/i18nOffsetCache.c
-+++ b/util/IMdkit/i18nOffsetCache.c
-@@ -83,9 +83,10 @@ void _Xi18nSetPropertyOffset (Xi18nOffsetCache *offset_cache, Atom key,
-     }
- 
-     if (++offset_cache->size > offset_cache->capacity) {
--        Xi18nAtomOffsetPair *pair = (Xi18nAtomOffsetPair *) realloc (data,
--                offset_cache->capacity * sizeof (Xi18nAtomOffsetPair));
-+        Xi18nAtomOffsetPair *pair;
-         offset_cache->capacity *= OFFSET_CACHE_GROWTH_FACTOR;
-+        pair = (Xi18nAtomOffsetPair *) realloc (data,
-+                offset_cache->capacity * sizeof (Xi18nAtomOffsetPair));
-         if (pair) {
-             offset_cache->data = pair;
-         } else {
--- 
-2.50.1
-

^ permalink raw reply related	[flat|nested] 8+ messages in thread
* [rpms/ibus] autotool: Delete upstreamed ibus-HEAD.patch
@ 2026-05-31  2:08 Takao Fujiwara
  0 siblings, 0 replies; 8+ messages in thread
From: Takao Fujiwara @ 2026-05-31  2:08 UTC (permalink / raw)
  To: git-commits

A new commit has been pushed.

Repo   : rpms/ibus
Branch : autotool
Commit : 8e894714961b83c1b7128d3e38bb412683422532
Author : Takao Fujiwara <tfujiwar@redhat.com>
Date   : 2024-08-25T09:09:54+09:00
Stats  : +0/-4011 in 1 file(s)
URL    : https://src.fedoraproject.org/rpms/ibus/c/8e894714961b83c1b7128d3e38bb412683422532?branch=autotool

Log:
Delete upstreamed ibus-HEAD.patch

---
diff --git a/ibus-HEAD.patch b/ibus-HEAD.patch
deleted file mode 100644
index 6e624de..0000000
--- a/ibus-HEAD.patch
+++ /dev/null
@@ -1,4011 +0,0 @@
-From a1a2fe5d13ad76956a94c0695af15d76e3edfdca Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Thu, 18 Jul 2024 01:25:41 +0900
-Subject: [PATCH] Fix memory leaks in error handlings
-
-- bus/ibusimpl: Free keys not in case of TYPE_IME_SWITCHER
-- src/ibuscomposetable: Correct handling G_MAXSIZE * G_MAXSIZE
-- src/ibuscomposetable: Fee ibus_compose_seqs in error handlings
----
- bus/ibusimpl.c         | 3 ++-
- src/ibuscomposetable.c | 6 +++++-
- 2 files changed, 7 insertions(+), 2 deletions(-)
-
-diff --git a/bus/ibusimpl.c b/bus/ibusimpl.c
-index 31a095f3..445c062b 100644
---- a/bus/ibusimpl.c
-+++ b/bus/ibusimpl.c
-@@ -1986,7 +1986,8 @@ _ibus_set_global_shortcut_keys (BusIBusImpl     *ibus,
-         }
-         ibus->ime_switcher_keys = keys;
-         break;
--    default:;
-+    default:
-+        g_slice_free1 (sizeof (IBusProcessKeyEventData) * (size + 1), keys);
-     }
-     return TRUE;
- }
-diff --git a/src/ibuscomposetable.c b/src/ibuscomposetable.c
-index 7531a4b2..a8e41a33 100644
---- a/src/ibuscomposetable.c
-+++ b/src/ibuscomposetable.c
-@@ -849,7 +849,7 @@ compose_data_to_variant (gconstpointer compose_data,
-     g_assert (compose_data);
-     if (error)
-         *error = NULL;
--    if ((index_stride * n_seqs) > G_MAXUINT64) {
-+    if (n_seqs == 0 || index_stride > (G_MAXSIZE / n_seqs)) {
-         if (error) {
-             g_set_error (error, IBUS_ERROR, IBUS_ERROR_FAILED,
-                          "Length %u x %lu is too long",
-@@ -1404,6 +1404,7 @@ ibus_compose_table_new_with_list (GList   *compose_list,
-                         (G_MAXSIZE / sizeof (guint16)))) {
-             g_warning ("Too long allocation %lu x %u",
-                        s_size_total - s_size_16bit, n_index_stride);
-+            g_free (ibus_compose_seqs);
-             return NULL;
-         }
-         rawdata = (gpointer)g_new (
-@@ -1416,6 +1417,8 @@ ibus_compose_table_new_with_list (GList   *compose_list,
-                        s_size_total - s_size_16bit,
-                        n_index_stride,
-                        v_size_32bit);
-+            g_free (ibus_compose_seqs);
-+            g_free (rawdata);
-             return NULL;
-         }
-         if (G_LIKELY (rawdata)) {
-@@ -1432,6 +1435,7 @@ ibus_compose_table_new_with_list (GList   *compose_list,
-         }
-         if (!ibus_compose_seqs_32bit_first || !ibus_compose_seqs_32bit_second) {
-             g_warning ("Failed g_new");
-+            g_free (ibus_compose_seqs);
-             g_free (rawdata);
-             return NULL;
-         }
--- 
-2.45.0
-
-From a52861385bb5d15598f6c3c3d86c7a9ee19f140a Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Sat, 27 Jul 2024 19:00:53 +0900
-Subject: [PATCH 1/6] src/tests: Enable CI in GNOME Wayland
-
-- Implement headless desktop to test Wayland sessions
-- Implement ibus-desktop-testing-autostart to be executed in XDG
-  autostart in GNOME Wayland
-- Move shared codes to ibus-desktop-testing-module between
-  ibus-desktop-testing-runner and ibus-desktop-testing-autostart
-- Add --no-systemd option to enable the previous testing frame with running
-  gnome-session directly
-- Rename --desktop option to --session
-- Move save_screen() from runner to module
-- Copy gnome-shell service file to user home for headless & virtual-monitor
-- Add --delete-tests option to clean up tests
-- Add AutostartCondition=if-exists in XDG autostart desktop file
-- Add 60 secs in ibus-compose-locales for systemd desktop sessions
-- Quote file names as much as possible.
-- Check file existant and not to use "rm -f" as much as possible
-- Do not set GTK_IM_MODULE=ibus for Wayland
-
-BUG=https://github.com/ibus/ibus/pull/2657
----
- src/tests/Makefile.am                       |  23 +-
- src/tests/ibus-compose-locales.in           |  16 +-
- src/tests/ibus-desktop-testing-autostart    |  57 --
- src/tests/ibus-desktop-testing-autostart.in |  83 ++
- src/tests/ibus-desktop-testing-module       | 876 ++++++++++++++++++++
- src/tests/ibus-desktop-testing-runner.in    | 495 +----------
- src/tests/ibus-desktop-testing.desktop.in   |   2 +-
- 7 files changed, 1034 insertions(+), 518 deletions(-)
- delete mode 100755 src/tests/ibus-desktop-testing-autostart
- create mode 100755 src/tests/ibus-desktop-testing-autostart.in
- create mode 100755 src/tests/ibus-desktop-testing-module
-
-diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am
-index b30a39fb..6c4c86cf 100644
---- a/src/tests/Makefile.am
-+++ b/src/tests/Makefile.am
-@@ -106,6 +106,7 @@ test_sourcesdir = $(datadir)/installed-tests/ibus
- 
- CLEANFILES += \
-     $(test_metas) \
-+    ibus-desktop-testing-autostart \
-     ibus-desktop-testing-runner \
-     org.freedesktop.IBus.Desktop.Testing.desktop \
-     $(NULL)
-@@ -119,7 +120,10 @@ CLEANFILES += \
-     $(NULL)
- endif
- test_execsdir = $(libexecdir)/installed-tests/ibus
--libexec_SCRIPTS = ibus-desktop-testing-autostart
-+libexec_SCRIPTS = \
-+  ibus-desktop-testing-autostart \
-+  ibus-desktop-testing-module \
-+  $(NULL)
- 
- test_frame_DATA = org.freedesktop.IBus.Desktop.Testing.desktop
- test_framedir = $(pkgdatadir)/tests
-@@ -142,9 +146,21 @@ ibus-compose-locales: ibus-compose-locales.in
- 	mv $@.tmp $@; \
- 	$(NULL)
- 
-+ibus-desktop-testing-autostart: ibus-desktop-testing-autostart.in
-+	INSTALLEDDIR=$(datadir)/installed-tests; \
-+	sed -e "s|@DATADIR[@]|$(datadir)|g" \
-+	    -e "s|@INSTALLEDDIR[@]|$$INSTALLEDDIR|g" \
-+	    -e "s|@LIBEXECDIR[@]|$(libexecdir)|g" \
-+	    $< > $@.tmp; \
-+	mv $@.tmp $@; \
-+	$(NULL)
-+
- ibus-desktop-testing-runner: ibus-desktop-testing-runner.in
- 	INSTALLEDDIR=$(datadir)/installed-tests; \
--	sed -e "s|@INSTALLEDDIR[@]|$$INSTALLEDDIR|g" $< > $@.tmp; \
-+	sed -e "s|@DATADIR[@]|$(datadir)|g" \
-+	    -e "s|@INSTALLEDDIR[@]|$$INSTALLEDDIR|g" \
-+	    -e "s|@LIBEXECDIR[@]|$(libexecdir)|g" \
-+	    $< > $@.tmp; \
- 	mv $@.tmp $@; \
- 	$(NULL)
- 
-@@ -157,7 +173,8 @@ EXTRA_DIST = \
-     ibus-compose.env \
-     ibus-compose-locales.in \
-     ibus-desktop-testing.desktop.in \
--    ibus-desktop-testing-autostart \
-+    ibus-desktop-testing-autostart.in \
-+    ibus-desktop-testing-module \
-     ibus-desktop-testing-runner.in \
-     $(NULL)
- 
-diff --git a/src/tests/ibus-compose-locales.in b/src/tests/ibus-compose-locales.in
-index b36165fe..7a133ce0 100755
---- a/src/tests/ibus-compose-locales.in
-+++ b/src/tests/ibus-compose-locales.in
-@@ -6,7 +6,8 @@ BUILDDIR=`dirname $0`
- 
- export IBUS_COMPOSE_CACHE_DIR=$PWD
- 
--retval=0
-+RETVAL=0
-+INITED=0
- # Deleted for var in `cat *.env` because IFS=$'\n' is not supported in POSIX sh
- while read var
- do
-@@ -14,19 +15,26 @@ do
-     if [ "x$IS_COMMENT" != x ] ; then
-         continue
-     fi
-+    while [ x"$IBUS_DAEMON_WITH_SYSTEMD" != x ] && [ $INITED -lt 6 ] ; do
-+        echo "Waiting for ${INITED}0 secs till 60 secs"
-+        sleep 10
-+        INITED=`expr $INITED + 1`
-+    done
-     # Use $* instead of $@ not to mix strings and integers
-     echo "# Starting $var $BUILDDIR/ibus-compose $SRCDIR $*"
-     # Need to enclose $@ with double quotes not to split the array.
-     env $var $BUILDDIR/ibus-compose $SRCDIR "$@"
--    retval=`expr $retval + $?`
--    echo "# Finished $var $BUILDDIR/ibus-compose $SRCDIR $* with $retval"
-+    RETVAL=`expr $RETVAL + $?`
-+    echo "# Finished $var $BUILDDIR/ibus-compose $SRCDIR $* with $RETVAL"
- 
-     CACHE_FILES=`ls *.cache`
-     if [ x"$CACHE_FILES" != x ] ; then
-         echo "Clean $CACHE_FILES"
-         rm $CACHE_FILES
-     fi
-+    # Need to wait for 1 sec not to be freezed with gnome-shell in Wayland
-+    sleep 1
- done << EOF_ENVS
- `cat $SRCDIR/ibus-compose.env`
- EOF_ENVS
--exit $retval
-+exit $RETVAL
-diff --git a/src/tests/ibus-desktop-testing-autostart b/src/tests/ibus-desktop-testing-autostart
-deleted file mode 100755
-index 1e1eb180..00000000
---- a/src/tests/ibus-desktop-testing-autostart
-+++ /dev/null
-@@ -1,57 +0,0 @@
--#!/bin/sh
--# -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*-
--# vim:set noet ts=4:
--#
--# ibus - The Input Bus
--#
--# Copyright (c) 2021 Takao Fujiwara <takao.fujiwara1@gmail.com>
--# Copyright (c) 2021 Red Hat, Inc.
--#
--# This program is free software; you can redistribute it and/or modify
--# it under the terms of the GNU General Public License as published by
--# the Free Software Foundation; either version 2 of the License, or
--# (at your option) any later version.
--#
--# This program 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 General Public License for more details.
--#
--# You should have received a copy of the GNU General Public License along
--# with this program; if not, write to the Free Software Foundation, Inc.,
--# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
--
--TEST_LOG=
--COMMANDS='
--id
--echo $DISPLAY
--pwd
--pstree -asp $$
--gsettings list-recursively org.gnome.shell
--rpm -q gnome-shell-extension-no-overview gnome-shell gnome-session
--ps -ef | grep ibus | grep -v grep
--ibus address
--'
--
--if [ $# -gt 0 ] ; then
--    TEST_LOG=$1
--fi
--
--run_test()
--{
--while read cmd ; do
--    if [ x"$cmd" = x ] ; then
--        continue
--    fi
--    echo "# $cmd"
--    eval "$cmd"
--done << EOF_COMMANDS
--`echo "$COMMANDS"`
--EOF_COMMANDS
--}
--
--if [ x"$TEST_LOG" = x ] ; then
--    run_test
--else
--    run_test 2>>$TEST_LOG 1>>$TEST_LOG
--fi
-diff --git a/src/tests/ibus-desktop-testing-autostart.in b/src/tests/ibus-desktop-testing-autostart.in
-new file mode 100755
-index 00000000..d50354df
---- /dev/null
-+++ b/src/tests/ibus-desktop-testing-autostart.in
-@@ -0,0 +1,83 @@
-+#!/bin/sh
-+# -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*-
-+# vim:set noet ts=4:
-+#
-+# ibus - The Input Bus
-+#
-+# Copyright (c) 2021-2024 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+# Copyright (c) 2021 Red Hat, Inc.
-+#
-+# This program is free software; you can redistribute it and/or modify
-+# it under the terms of the GNU General Public License as published by
-+# the Free Software Foundation; either version 2 of the License, or
-+# (at your option) any later version.
-+#
-+# This program 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 General Public License for more details.
-+#
-+# You should have received a copy of the GNU General Public License along
-+# with this program; if not, write to the Free Software Foundation, Inc.,
-+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-+
-+
-+PROGNAME=`basename $0`
-+TEST_CASE_DIR="@INSTALLEDDIR@"
-+MODULE_SH='ibus-desktop-testing-module'
-+MODULE_SH_PATH="@LIBEXECDIR@/$MODULE_SH"
-+TEST_LOG="test-autostart.log"
-+TESTING_RUNNER=""
-+
-+
-+if test -f $MODULE_SH_PATH ; then
-+  . $MODULE_SH_PATH
-+elif test -f $(dirname $0)/$MODULE_SH ; then
-+  . $(dirname $0)/$MODULE_SH
-+else
-+  echo "Not found $MODULE_SH"
-+  exit 1
-+fi
-+
-+
-+usage()
-+{
-+    $ECHO -e \
-+"This test suite is called from /etc/xdg/autostart for systemd sessions\n"     \
-+"$PROGNAME [OPTIONS…]\n"                                                       \
-+"\n"                                                                           \
-+"OPTIONS:\n"                                                                   \
-+"-h, --help                       This help\n"                                 \
-+"-v, --version                    Show version\n"                              \
-+"-b, --builddir=BUILDDIR          Set the BUILDDIR\n"                          \
-+"-s, --srcdir=SOURCEDIR           Set the SOURCEDIR\n"                         \
-+"-V, --verbose                    Verbose log for ibus-daemon\n"               \
-+"-t, --tests=\"TESTS...\"           Run TESTS programs which is separated by space\n" \
-+"-r, --runner=RUNNER              Run TESTS programs with a test RUNNER.\n"    \
-+"                                 RUNNDER = 'gnome', 'default' or ''.\n"       \
-+"                                 'default' is an embedded runner.\n"          \
-+"                                 '' is no tests.\n"                           \
-+"-T, --timeout=TIMEOUT            Set timeout (default TIMEOUT is 300 sec).\n" \
-+"-o, --output=OUTPUT_FILE         Output the log to OUTPUT_FILE\n"             \
-+"                                 default is $TEST_LOG\n"                      \
-+"-O, --result=RESULT_FILE         Output the result to RESULT_FILE\n"          \
-+"                                 default is stdout\n"                         \
-+"-S, --screendump=DUMP_FILE       Output the screen to DUMP_FILE ('STDOUT' can be stdout)\n" \
-+"-e, --envcheck                   Retrieve environment variables\n"            \
-+""
-+}
-+
-+
-+main()
-+{
-+    parse_args "$@"
-+    init_session
-+    check_env
-+    save_screen
-+    run_test_suite
-+    finit
-+}
-+
-+
-+# Need to enclose $@ with double quotes not to split the array.
-+main "$@"
-diff --git a/src/tests/ibus-desktop-testing-module b/src/tests/ibus-desktop-testing-module
-new file mode 100755
-index 00000000..2d686813
---- /dev/null
-+++ b/src/tests/ibus-desktop-testing-module
-@@ -0,0 +1,876 @@
-+#!/bin/sh
-+# -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*-
-+# vim:set noet ts=4:
-+#
-+# ibus - The Input Bus
-+#
-+# Copyright (c) 2018-2024 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+# Copyright (c) 2018 Red Hat, Inc.
-+#
-+# This program is free software; you can redistribute it and/or modify
-+# it under the terms of the GNU General Public License as published by
-+# the Free Software Foundation; either version 2 of the License, or
-+# (at your option) any later version.
-+#
-+# This program 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 General Public License for more details.
-+#
-+# You should have received a copy of the GNU General Public License along
-+# with this program; if not, write to the Free Software Foundation, Inc.,
-+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-+
-+
-+# POSIX sh has no 'echo -e'
-+: ${ECHO:='/usr/bin/echo'}
-+# POSIX sh has $UID
-+# DASH saves the graves in '``' as characters not to be extracted
-+: ${UID:=`id -u`}
-+: ${TEST_CASE_DIR='/usr/share/installed-tests'}
-+: ${AUTOSTART_DESKTOP_DIR='/usr/share/ibus/tests'}
-+
-+
-+VERSION=0.4
-+BUILDDIR="."
-+SRCDIR="."
-+TEST_LOG_STDOUT=0
-+RESULT_LOG=""
-+SCREEN_LOG=""
-+HAVE_GRAPHICS=1
-+VERBOSE=0
-+SESSION_COMMAND="dbus-launch --exit-with-session gnome-session"
-+SESSION_LANG=
-+SESSION_IS_GNOME=1
-+GNOME_SHELL_WAYLAND_COMMAND="gnome-shell --wayland --headless --virtual-monitor 1024x768"
-+SYSTEMD_SYSTEM_DIR="/usr/lib/systemd/user"
-+PID_XORG=0
-+PID_GNOME_SESSION=0
-+ENABLED_SYSTEMD=1
-+TEST_USER=itestuser
-+TEST_USER_HOME=/export/home/$TEST_USER
-+GDM_CONF=/run/gdm/custom.conf
-+AUTOSTART_DESKTOP_FILE="org.freedesktop.IBus.Desktop.Testing.desktop"
-+TESTS=""
-+TIMEOUT=300
-+GREEN='\033[0;32m'
-+RED='\033[0;31m'
-+NC='\033[0m'
-+ENV_CHECK=0
-+ENV_COMMANDS='
-+id
-+pwd
-+pstree -asp $$
-+gsettings list-recursively org.gnome.shell
-+rpm -q gnome-shell-extension-no-overview gnome-shell gnome-session
-+ps -ef | grep ibus | grep -v grep
-+ibus address
-+env
-+#dbus-send --session --print-reply --dest=org.gnome.Shell.Introspect /org/gnome/Shell/Introspect org.gnome.Shell.Introspect.GetWindows
-+'
-+
-+
-+print_log()
-+{
-+    if [ x"$RESULT_LOG" != x ] ; then
-+        # avoid 'echo -e' before call 'sed'.
-+        if [ x"$1" = x'-e' ] ; then
-+            shift
-+        fi
-+        NO_ESCAPE=`echo "$@" | sed -e 's/\\\033\\[0;3.m//g' -e 's/\\\033\\[0m//g'`
-+        $ECHO $NO_ESCAPE >> $RESULT_LOG
-+    else
-+        $ECHO "$@"
-+    fi
-+}
-+
-+
-+parse_args()
-+{
-+    # This is GNU getopt. "sudo port getopt" in BSD?
-+    ARGS=`getopt -o hvb:s:cVd:t:r:iT:o:O:S:el:D --long \
-+help,version,builddir:,srcdir:,no-graphics,verbose,desktop:,session:,tests:,\
-+runner:,no-systemd,timeout:,output:,result:,screendump:,envcheck,lang:,\
-+delete-tests\
-+        -- "$@"`;
-+    eval set -- "$ARGS"
-+    while [ 1 ] ; do
-+        case "$1" in
-+        -h | --help )        usage; exit 0;;
-+        -v | --version )     $ECHO -e "$VERSION"; exit 0;;
-+        -b | --builddir )    BUILDDIR="$2"; shift 2;;
-+        -s | --srcdir )      SRCDIR="$2"; shift 2;;
-+        -c | --no-graphics ) HAVE_GRAPHICS=0; shift;;
-+        -V | --verbose )     VERBOSE=1; shift;;
-+        --desktop )          SESSION_COMMAND="$2"
-+                             print_log -e "--desktop is deprecated. Use --session instead"
-+                             shift 2;;
-+        -d | --session )     SESSION_COMMAND="$2"; shift 2;;
-+        -t | --tests )       TESTS="$2"; shift 2;;
-+        -r | --runner )      TESTING_RUNNER="$2"; shift 2;;
-+        -i | --no-systemd )  ENABLED_SYSTEMD=0; shift;;
-+        -T | --timeout )     TIMEOUT="$2"; shift 2;;
-+        -o | --output )      TEST_LOG="$2"; shift 2;;
-+        -O | --result )      RESULT_LOG="$2"; shift 2;;
-+        -S | --screendump )  SCREEN_LOG="$2"; shift 2;;
-+        -e | --envcheck )    ENV_CHECK=1; shift;;
-+        -l | --lang )        SESSION_LANG="$2"; shift 2;;
-+        -D | --delete-tests ) delete_test_user; exit 0;;
-+        -- )                 shift; break;;
-+        * )                  usage; exit 1;;
-+        esac
-+    done
-+    DL='$'
-+    if echo "$SESSION_COMMAND" | grep -q -E ".*-with-dbus$DL" ; then
-+        SESSION_COMMAND=`echo "$SESSION_COMMAND" | sed -e 's/-with-dbus$//'`
-+        SESSION_COMMAND="dbus-launch --exit-with-session $SESSION_COMMAND"
-+    fi
-+}
-+
-+
-+check_tty()
-+{
-+    TTY=`tty`
-+    if echo $PROGNAME | grep -q runner ; then
-+        if [ $ENABLED_SYSTEMD -eq 1 ] && [  $SESSION_IS_GNOME -eq 1 ] ; then
-+            if echo "$TTY" | grep -E 'tty|console' ; then
-+               print_log -e "${RED}FAIL${NC}: ${RED}ERROR${NC}: Changing runlevel does not support console. Please log into the host with ssh."
-+               exit 1
-+            fi
-+        fi
-+        if [ $ENABLED_SYSTEMD -eq 0 ] ; then
-+            if echo "$TTY" | grep -E 'pts' ; then
-+               print_log -e "Running session with ssh. It might be good to use console instead."
-+            fi
-+        fi
-+        SESSION=`ps -ef | grep session | grep -v grep`
-+        if [ x"$SESSION" != x ] ; then
-+               print_log -e "${RED}FAIL${NC}: ${RED}ERROR${NC}: Session is running: $SESSION"
-+               exit 1
-+        fi
-+    fi
-+}
-+
-+
-+check_env()
-+{
-+    if test $ENV_CHECK -eq 0 ; then
-+        return
-+    fi
-+    while read cmd ; do
-+        if test x"$cmd" = x ; then
-+            continue
-+        fi
-+        if echo "$cmd" | grep -q "^#"; then
-+            continue
-+        fi
-+        echo "# $cmd" 2>>$TEST_LOG 1>>$TEST_LOG
-+        eval "$cmd" 2>>$TEST_LOG 1>>$TEST_LOG
-+    done << EOF_ENV_COMMANDS
-+`echo "$ENV_COMMANDS"`
-+EOF_ENV_COMMANDS
-+}
-+
-+
-+save_screen_real()
-+{
-+    SCREEN_PNG="`date '+%Y%m%d%H%M%S'`.png"
-+    gnome-screenshot --file=$SCREEN_PNG
-+    if test x"$SCREEN_LOG" = xSTDOUT ; then
-+        base64 $SCREEN_PNG
-+        touch /var/tmp/STDOUT.log
-+    else
-+        base64 $SCREEN_PNG > $SCREEN_LOG
-+    fi
-+}
-+
-+
-+save_screen()
-+{
-+    if test x"$SCREEN_LOG" = x ; then
-+        return
-+    fi
-+    if test x"$SCREEN_LOG" = xSTDOUT ; then
-+        if test -f /var/tmp/STDOUT.log ; then
-+            rm /var/tmp/STDOUT.log
-+        fi
-+    else
-+        if test -f "$SCREEN_LOG" ; then
-+            rm "$SCREEN_LOG"
-+        fi
-+    fi
-+    save_screen_real &
-+    while test 1 ; do
-+        if test x"$SCREEN_LOG" = xSTDOUT ; then
-+            if test -f /var/tmp/STDOUT.log ; then
-+                break
-+            fi
-+        else
-+            if test -f "$SCREEN_LOG" ; then
-+                break
-+            fi
-+        fi
-+        sleep 1
-+    done
-+}
-+
-+
-+create_test_user()
-+{
-+    if grep -q $TEST_USER /etc/passwd; then
-+        return;
-+    fi
-+    useradd -d $TEST_USER_HOME -m -s /bin/bash $TEST_USER
-+    pwconv
-+    passwd -d $TEST_USER
-+}
-+
-+
-+create_autologin_gdm()
-+{
-+    if test -f $GDM_CONF && grep -q $TEST_USER $GDM_CONF; then
-+        return;
-+    fi
-+    cat > $GDM_CONF << _EOF_GDM_CONF
-+[daemon]
-+AutomaticLoginEnable=true
-+AutomaticLogin=$TEST_USER
-+_EOF_GDM_CONF
-+}
-+
-+
-+create_xdg_autostart()
-+{
-+    if test -f "$TEST_USER_HOME/.config/autostart/$AUTOSTART_DESKTOP_FILE" ; then
-+        return
-+    fi
-+    if test ! -d "$TEST_USER_HOME" ; then
-+        print_log -e "${RED}FAIL${NC}: ${RED}ERROR${NC}: No $TEST_USER_HOME"
-+        exit 1
-+    fi
-+    desktop_file="$AUTOSTART_DESKTOP_DIR/$AUTOSTART_DESKTOP_FILE"
-+    if test ! -f $desktop_file ; then
-+        print_log -e "${RED}FAIL${NC}: ${RED}ERROR${NC}: No $desktop_file"
-+        exit 1
-+    fi
-+    mkdir -p "$TEST_USER_HOME/.config/autostart"
-+    cp "$desktop_file" "$TEST_USER_HOME/.config/autostart"
-+    LINE="AutostartCondition=if-exists $TEST_USER_HOME/.config/autostart/$AUTOSTART_DESKTOP_FILE"
-+    echo "$LINE" >> "$TEST_USER_HOME/.config/autostart/$AUTOSTART_DESKTOP_FILE"
-+    chown -R "$TEST_USER" "$TEST_USER_HOME/.config"
-+}
-+
-+
-+delete_test_user()
-+{
-+    print_log "Deleting $TEST_USER"
-+    pkill -u $TEST_USER
-+    if grep -q $TEST_USER /etc/passwd; then
-+        userdel -r $TEST_USER
-+    fi
-+    if test -f $GDM_CONF && grep -q $TEST_USER $GDM_CONF; then
-+        rm $GDM_CONF
-+    fi
-+
-+    if echo "$SESSION_COMMAND" | grep -q gnome-session ; then
-+        SESSION_IS_GNOME=1
-+    else
-+        SESSION_IS_GNOME=0
-+    fi
-+
-+    LOGIN_USER=$USER
-+    LOGIN_HOME=$HOME
-+    if [ $ENABLED_SYSTEMD -eq 1 ] && [  $SESSION_IS_GNOME -eq 1 ] ; then
-+        LOGIN_USER=$TEST_USER
-+        LOGIN_HOME=$TEST_USER_HOME
-+    fi
-+
-+    print_log "Deleting $LOGIN_USER environments"
-+    if test -f "$LOGIN_HOME/.config/gnome-initial-setup-done" ; then
-+        rm "$LOGIN_HOME/.config/gnome-initial-setup-done"
-+    fi
-+    if test -f "$LOGIN_HOME/.config/user-dirs.locale" ; then
-+        rm "$LOGIN_HOME/.config/user-dirs.locale"
-+    fi
-+    if test -f /var/lib/AccountsService/users/$LOGIN_USER ; then
-+        rm /var/lib/AccountsService/users/$LOGIN_USER
-+    fi
-+    sync
-+}
-+
-+
-+init_session()
-+{
-+    if [ "$RESULT_LOG" != "" ] ; then
-+        if [ -f $RESULT_LOG ] ; then
-+            rm $RESULT_LOG
-+        fi
-+    fi
-+    echo "$TEST_LOG" | grep ':stdout' > /dev/null
-+    HAS_STDOUT=$?
-+    if [ $HAS_STDOUT -eq 0 ] ; then
-+        TEST_LOG=`echo "$TEST_LOG" | sed -e 's|:stdout||'`
-+        TEST_LOG_STDOUT=1
-+    fi
-+    if [ "$TEST_LOG" = "" ] ; then
-+        print_log -e "${RED}FAIL${NC}: ${RED}ERROR${NC}: a log file is required to get return value with 'read' command"
-+        exit 1
-+    elif [ -f $TEST_LOG ] ; then
-+        rm $TEST_LOG
-+    fi
-+
-+    if echo "$SESSION_COMMAND" | grep -q gnome-session ; then
-+        SESSION_IS_GNOME=1
-+    else
-+        SESSION_IS_GNOME=0
-+    fi
-+
-+    LOGIN_USER=$USER
-+    LOGIN_HOME=$HOME
-+    check_tty
-+    if [ $ENABLED_SYSTEMD -eq 1 ] && [  $SESSION_IS_GNOME -eq 1 ] ; then
-+        SESSION_FILE1="/usr/lib/systemd/system/gnome-headless-session@.service"
-+        SESSION_FILE2="/usr/lib/systemd/system/graphical.target"
-+        if [ $HAVE_GRAPHICS -eq 0 ] && [ ! -f "$SESSION_FILE1" ] ; then
-+            print_log -e "${RED}FAIL${NC}: ${RED}ERROR${NC}: No $SESSION_FILE1: You need to install 'gdm' and 'systemd' package"
-+            exit 1
-+        fi
-+        if [ $HAVE_GRAPHICS -eq 1 ] ; then
-+            if [ ! -f "$SESSION_FILE2" ] ; then
-+                print_log -e "${RED}FAIL${NC}: ${RED}ERROR${NC}: No $SESSION_FILE2: You need to install 'systemd' package"
-+                exit 1
-+            fi
-+            if [ ! -f /usr/sbin/gdm ] ; then
-+                print_log -e "${RED}FAIL${NC}: ${RED}ERROR${NC}: No /usr/sbin/gdm: Currently only gdm is supported for auto login."
-+                exit 1
-+            fi
-+        fi
-+        create_test_user
-+        create_autologin_gdm
-+        create_xdg_autostart
-+        LOGIN_USER=$TEST_USER
-+        LOGIN_HOME=$TEST_USER_HOME
-+    else
-+        rm -f $TEST_USER_HOME/.config/autostart/$AUTOSTART_DESKTOP_FILE
-+    fi
-+
-+    if [ ! -f $LOGIN_HOME/.config/gnome-initial-setup-done ] ; then
-+        mkdir -p $LOGIN_HOME/.config
-+        touch $LOGIN_HOME/.config/gnome-initial-setup-done
-+        chown -R $LOGIN_USER $LOGIN_HOME/.config
-+    fi
-+    IS_SYSTEM_ACCOUNT=false
-+    if [ "$LOGIN_USER" = "root" ] ; then
-+            IS_SYSTEM_ACCOUNT=true
-+    fi
-+    if test x"$SESSION_LANG" = x ; then
-+        SESSION_LANG=$LANG
-+    fi
-+    if test -f /var/lib/AccountsService/users/$LOGIN_USER; then
-+        sed -i -e "s/\(Language=\).*/\1$SESSION_LANG/" \
-+                /var/lib/AccountsService/users/$LOGIN_USER
-+    else
-+        mkdir -p /var/lib/AccountsService/users
-+        cat > /var/lib/AccountsService/users/$LOGIN_USER << _EOF_AS_CONF
-+[User]
-+Language=$SESSION_LANG
-+XSession=gnome
-+SystemAccount=$IS_SYSTEM_ACCOUNT
-+_EOF_AS_CONF
-+    fi
-+
-+    # Prevent from launching a XDG dialog
-+    XDG_LOCALE_FILE="$LOGIN_HOME/.config/user-dirs.locale"
-+    if [ -f $XDG_LOCALE_FILE ] ; then
-+        XDG_LANG_ORIG=`cat $XDG_LOCALE_FILE`
-+        XDG_LANG_NEW=`echo $SESSION_LANG | sed -e 's/\(.*\)\..*/\1/'`
-+        if [ "$XDG_LANG_ORIG" != "$XDG_LANG_NEW" ] ; then
-+            echo "# Overriding XDG locale $XDG_LANG_ORIG with $XDG_LANG_NEW"
-+            echo "$XDG_LANG_NEW" > $XDG_LOCALE_FILE
-+        fi
-+    fi
-+
-+    if [ $ENABLED_SYSTEMD -eq 1 ] && [  $SESSION_IS_GNOME -eq 1 ] ; then
-+        return
-+    fi
-+    # `su` command does not run loginctl
-+    export XDG_SESSION_TYPE='x11'
-+    export XDG_SESSION_CLASS=user
-+    # `su` command does not get focus in events without this variable.
-+    # Need to restart sshd after set "PermitRootLogin yes" in sshd_config
-+    if [ "x$XDG_RUNTIME_DIR" = x ] ; then
-+        export XDG_RUNTIME_DIR="/run/user/$UID"
-+        is_root_login=`grep "^PermitRootLogin" /etc/ssh/sshd_config | grep yes`
-+        if [ "x$ANSIBLE" != x ] && [ "x$is_root_login" = x ] ; then
-+            print_log -e "${RED}FAIL${NC}: No permission to get focus-in events in GtkWindow with ansible"
-+            echo "su command does not configure necessary login info "         \
-+                 "with systemd and GtkWindow cannot receive focus-events "     \
-+                 "when ibus-desktop-testing-runner is executed by "            \
-+                 "ansible-playbook." >> $TEST_LOG
-+            echo "Enabling root login via sshd, restarting sshd, set "         \
-+                 "XDG_RUNTIME_DIR can resolve the problem under "              \
-+                 "ansible-playbook." >> $TEST_LOG
-+            exit 1
-+        fi
-+    fi
-+    #  Do we need XDG_SESSION_ID and XDG_SEAT?
-+    #export XDG_CONFIG_DIRS=/etc/xdg
-+    #export XDG_SESSION_ID=10
-+    #export XDG_SESSION_DESKTOP=gnome
-+    #export XDG_SEAT=seat0
-+}
-+
-+
-+run_dbus_daemon()
-+{
-+    if [ $ENABLED_SYSTEMD -eq 1 ] && [  $SESSION_IS_GNOME -eq 1 ] ; then
-+        return
-+    fi
-+    # Use dbus-launch --exit-with-session later instead of --sh-syntax
-+    # GNOME uses a unix:abstract address and it effects gsettings set values
-+    # in each test case.
-+    # TODO: Should we comment out this line?
-+    export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$UID/bus"
-+}
-+
-+
-+init_gnome()
-+{
-+    if test $SESSION_IS_GNOME -ne 1 ; then
-+        print_log -e "${RED}FAIL${NC}: ${RED}ERROR${NC}: Should not be called"
-+        exit 1
-+    fi
-+    LOGIN_USER=$USER
-+    if test $ENABLED_SYSTEMD -eq 1 ; then
-+        LOGIN_USER=$TEST_USER
-+    fi
-+    # gsettings set command needs dconf-service with the same $DISPLAY
-+    pkill dconf-service
-+    # G_MESSAGES_DEBUG=all or G_MESSAGES_DEBUG=GLib-GIO-DEBUG would append
-+    # debug messages to gsettings output and could not get the result correctly.
-+    backup_G_MESSAGES_DEBUG="$G_MESSAGES_DEBUG"
-+    unset G_MESSAGES_DEBUG
-+    # Disable Tour dialog to get focus
-+    GET_WELCOME_DIALOG="gsettings get org.gnome.shell welcome-dialog-last-shown-version"
-+    if test $LOGIN_USER = $USER ; then
-+        V=`dbus-run-session $GET_WELCOME_DIALOG`
-+    else
-+        V=`sudo -u $LOGIN_USER dbus-run-session $GET_WELCOME_DIALOG`
-+    fi
-+    if [ x"$V" = x"''" ] ; then
-+        SET_WELCOME_DIALOG="gsettings set org.gnome.shell welcome-dialog-last-shown-version '100'"
-+        if test $LOGIN_USER = $USER ; then
-+            dbus-run-session $SET_WELCOME_DIALOG
-+        else
-+            sudo -u $LOGIN_USER dbus-run-session $SET_WELCOME_DIALOG
-+        fi
-+    fi
-+    # gnome-shell now starts overview mode by login.
-+    # https://extensions.gnome.org/extension/4099/no-overview/
-+    NO_SYS_DIR=/usr/share/gnome-shell/extensions/no-overview@fthx
-+    if test $LOGIN_USER = $USER ; then
-+        NO_USER_DIR=$HOME/.local/share/gnome-shell/extensions/no-overview@fthx
-+    else
-+        NO_USER_DIR=$TEST_USER_HOME/.local/share/gnome-shell/extensions/no-overview@fthx
-+    fi
-+    if [ ! -d $NO_SYS_DIR ] && [ ! -d $NO_USER_DIR ] ; then
-+        mkdir -p "`dirname $NO_USER_DIR`"
-+        cp -R "no-overview@fthx" "`dirname $NO_USER_DIR`"
-+        if test $LOGIN_USER = $USER ; then
-+            chown -R $LOGIN_USER $HOME/.local
-+        else
-+            chown -R $LOGIN_USER $TEST_USER_HOME/.local
-+        fi
-+    fi
-+    if [ $LOGIN_USER != $USER ] ; then
-+        SHELL_SERVICE_FILE="org.gnome.Shell@wayland.service"
-+        SYSTEMD_USER_DIR="$TEST_USER_HOME/.config/systemd/user"
-+        if test $HAVE_GRAPHICS -ne 1 ; then
-+            if test ! -f "$SYSTEMD_USER_DIR/$SHELL_SERVICE_FILE" ; then
-+                mkdir -p "$SYSTEMD_USER_DIR"
-+                pushd "$SYSTEMD_USER_DIR"
-+                sed -e "s|^ExecStart=.*|ExecStart=$GNOME_SHELL_WAYLAND_COMMAND|" \
-+                    $SYSTEMD_SYSTEM_DIR/$SHELL_SERVICE_FILE \
-+                    > $SHELL_SERVICE_FILE
-+                diff $SYSTEMD_SYSTEM_DIR/$SHELL_SERVICE_FILE $SHELL_SERVICE_FILE
-+                popd
-+                chown -R $LOGIN_USER "$TEST_USER_HOME/.config"
-+            fi
-+        else
-+            if test -f "$SYSTEMD_USER_DIR/$SHELL_SERVICE_FILE" ; then
-+                rm "$SYSTEMD_USER_DIR/$SHELL_SERVICE_FILE"
-+            fi
-+        fi
-+    fi
-+    GET_DISABLE_USER_EX="gsettings get org.gnome.shell disable-user-extensions"
-+    if test $LOGIN_USER = $USER ; then
-+        V=`dbus-run-session $GET_DISABLE_USER_EX`
-+    else
-+        V=`sudo -u $LOGIN_USER dbus-run-session $GET_DISABLE_USER_EX`
-+    fi
-+    if [ x"$V" = x"true" ] ; then
-+        SET_DISABLE_USER_EX="gsettings set org.gnome.shell disable-user-extensions false"
-+        if test $LOGIN_USER = $USER ; then
-+            dbus-run-session $SET_DISABLE_USER_EX
-+        else
-+            sudo -u $LOGIN_USER dbus-run-session $SET_DISABLE_USER_EX
-+        fi
-+    fi
-+    GET_ENABLED_EXS="gsettings get org.gnome.shell enabled-extensions"
-+    if test $LOGIN_USER = $USER ; then
-+        V=`dbus-run-session $GET_ENABLED_EXS`
-+    else
-+        V=`sudo -u $LOGIN_USER dbus-run-session $GET_ENABLED_EXS`
-+    fi
-+    echo "$V" | grep "no-overview" > /dev/null
-+    V2=$?
-+    if [ $V2 -ne 0 ] ; then
-+        V3=`echo "$V" | sed -e 's/@as //' -e 's/\[//' -e 's/\]//'`
-+        if [ x"$V3" = x"''" ] || [ x"$V3" = x"" ]; then
-+            V4="['no-overview@fthx']"
-+        else
-+            V4="[$V3,'no-overview@fthx']"
-+        fi
-+        SET_ENABLED_EXS="gsettings set org.gnome.shell enabled-extensions \"$V4\""
-+        if test $LOGIN_USER = $USER ; then
-+            eval dbus-run-session $SET_ENABLED_EXS
-+        else
-+            eval sudo -u $LOGIN_USER dbus-run-session $SET_ENABLED_EXS
-+        fi
-+    fi
-+    # Disable notify dialog when the disk usage is low.
-+    SET_NOTIFY_DISK="gsettings set org.gnome.settings-daemon.plugins.housekeeping free-size-gb-no-notify 0"
-+    if test $LOGIN_USER = $USER ; then
-+            eval dbus-run-session $SET_NOTIFY_DISK
-+    else
-+            eval sudo -u $LOGIN_USER dbus-run-session $SET_NOTIFY_DISK
-+    fi
-+    if [ x"$backup_G_MESSAGES_DEBUG" != x ] ; then
-+        export G_MESSAGES_DEBUG="$backup_G_MESSAGES_DEBUG"
-+    fi
-+}
-+
-+
-+operate_desktop_with_systemd()
-+{
-+    SESSION=gnome-headless-session
-+    COMMAND="$1"
-+
-+    #if test $HAVE_GRAPHICS -eq 1 ; then
-+        case "$COMMAND" in
-+        "start") systemctl isolate graphical.target
-+                 echo ""
-+                 ;;
-+        "stop")  init 3;;
-+        "")      print_log -e "${RED}FAIL${NC}: ${RED}ERROR${NC}: Wrong command $COMMAND"
-+                 exit 1;;
-+        esac
-+    #else
-+    #    setenforce 0
-+    #    systemctl $COMMAND ${SESSION}@${TEST_USER}
-+    #fi
-+    case "$COMMAND" in
-+    "start") sleep 30;;
-+    "") ;;
-+    esac
-+    #if test $HAVE_GRAPHICS -eq 1 ; then
-+        systemctl status --no-pager graphical.target
-+    #else
-+    #    systemctl status --no-pager ${SESSION}@${TEST_USER}
-+    #fi
-+    ps -ef | grep X
-+    ps -ef | grep session
-+    ps -ef | grep ibus
-+}
-+
-+
-+run_session()
-+{
-+    if [ $ENABLED_SYSTEMD -eq 1 ] && [  $SESSION_IS_GNOME -eq 1 ] ; then
-+        init_gnome
-+        operate_desktop_with_systemd "start"
-+        return
-+    fi
-+    export DISPLAY=:99.0
-+    if test $HAVE_GRAPHICS -eq 1 ; then
-+        /usr/libexec/Xorg.wrap -noreset +extension GLX +extension RANDR +extension RENDER -logfile ./xorg.log -config ./xorg.conf -configdir . $DISPLAY &
-+    else
-+        /usr/bin/Xvfb $DISPLAY -noreset +extension GLX +extension RANDR +extension RENDER -screen 0 1280x1024x24 &
-+    fi
-+    PID_XORG=$!
-+    sleep 1
-+    # init_gnome need to be called with $DISPLAY before gnome-session is called
-+    if [  $SESSION_IS_GNOME -eq 1 ] ; then
-+        init_gnome
-+    fi
-+    echo "Running $SESSION_COMMAND with $USER and LANG=$SESSION_LANG in `tty`"
-+    if test x"$SESSION_LANG" = x ; then
-+        $SESSION_COMMAND &
-+    else
-+        env LANG=$SESSION_LANG $SESSION_COMMAND &
-+    fi
-+    PID_GNOME_SESSION=$!
-+    sleep 30
-+
-+    IBUS_ARGS="--verbose --panel disable"
-+    # gnome-shell 42 checks if org.freedesktop.IBus.session.GNOME.service
-+    # systemd file is available with org.freedesktop.systemd1.Manager.GetUnit
-+    # D-Bus method, which is provided by IBus 1.5.26, and if the file
-+    # is available, gnome-shell no longer launch ibus-daemon
-+    # because gnome-shell assumes gnome-session would launch ibus-daemon
-+    # with org.freedesktop.systemd1.Manager.StartUnit D-Bus method.
-+    # But actually gnome-session failed to launch ibus-daemon
-+    # because the IBus systemd file depends on gnome-session.target
-+    # but this CI launches gnome-session directly.
-+    #
-+    # So ibus-dameon is now always called here after gnome-shell fails to
-+    # launch ibus-daemon.
-+    # It may be better this CI launches GDM autologin to run gnome-session
-+    # with gnome-session.target systemd file.
-+    # But `systemctl start gdm` terminates the parent script forcibly
-+    # and the script cannot get the CI result.
-+    if test $VERBOSE -eq 1 ; then
-+        ibus-daemon $IBUS_ARGS &
-+    else
-+        ibus-daemon $IBUS_ARGS --daemonize
-+    fi
-+    sleep 3
-+    ps -ef | grep ibus
-+}
-+
-+
-+count_case_result()
-+{
-+    retval=$1
-+    pass=$2
-+    fail=$3
-+
-+    if test $retval -eq  0 ; then
-+        pass=`expr $pass + 1`
-+    else
-+        fail=`expr $fail + 1`
-+    fi
-+    echo $pass $fail
-+}
-+
-+
-+echo_case_result()
-+{
-+    retval=$1
-+    tst=$2
-+    subtst=${3:-''}
-+
-+    if test $retval -eq  0 ; then
-+        echo "PASS: $tst $subtst" >>$TEST_LOG
-+    else
-+        echo "FAIL: $tst $subtst" >>$TEST_LOG
-+    fi
-+}
-+
-+
-+wait_for_systemd_autostart()
-+{
-+    PS_IBUS="ps -ef | grep ibus-desktop-testing | grep autostart | grep -v grep"
-+    i=0
-+    while test 1 ; do
-+        R=`eval "$PS_IBUS"`
-+        if test x"$R" != x ; then
-+            break;
-+        fi
-+        if test $i -ge 12 ; then
-+            print_log -e "${RED}FAIL${NC}: Timeout to run ibus-desktop-testing-autostart"
-+            return
-+        fi
-+        i=`expr $i + 1`
-+        sleep 5
-+    done
-+    print_log -e "Start ibus-desktop-testing-autostart"
-+    i=0
-+    while test 1 ; do
-+        R=`eval "$PS_IBUS"`
-+        if test x"$R" = x ; then
-+            break;
-+        fi
-+        if test $i -ge $TIMEOUT ; then
-+            print_log -e "${RED}FAIL${NC}: Timeout to exit ibus-desktop-testing-autostart"
-+            return
-+        fi
-+        i=`expr $i + 1`
-+        sleep 5
-+    done
-+    print_log -e "Exit ibus-desktop-testing-autostart"
-+}
-+
-+run_direct_test_cases()
-+{
-+    pass=0
-+    fail=0
-+    for tst in $TESTS; do
-+        ENVS=
-+        if test -f $SRCDIR/${tst}.env ; then
-+            ENVS="`cat $SRCDIR/${tst}.env`"
-+        fi
-+        if test x"$ENVS" = x ; then
-+            $BUILDDIR/$tst $SRCDIR 2>>$TEST_LOG 1>>$TEST_LOG
-+            retval=$?
-+            read pass fail << EOF_COUNT
-+            `count_case_result $retval $pass $fail`
-+EOF_COUNT
-+            echo_case_result $retval $tst
-+            CACHE_FILES=`ls *.cache`
-+            if [ x"$CACHE_FILES" != x ] ; then
-+                echo "# Clean $CACHE_FILES" >>$TEST_LOG
-+                rm $CACHE_FILES
-+            fi
-+        else
-+            i=1
-+            # Deleted for var in "$ENVS" because IFS=$'\n' is not supported
-+            # in POSIX sh
-+            while read e ; do
-+                first=`echo "$e" | grep '^#'`
-+                if test x"$first" = x"#" ; then
-+                    continue
-+                fi
-+                echo "# Starting $e $BUILDDIR/$tst $SRCDIR" >>$TEST_LOG
-+                env $e $BUILDDIR/$tst $SRCDIR 2>>$TEST_LOG 1>>$TEST_LOG
-+                retval=$?
-+                echo "# Finished $e $BUILDDIR/$tst $SRCDIR with $retval" >>$TEST_LOG
-+                read pass fail << EOF_COUNT
-+                `count_case_result $retval $pass $fail`
-+EOF_COUNT
-+                echo_case_result $retval $tst $e
-+                CACHE_FILES=`ls *.cache`
-+                if [ x"$CACHE_FILES" != x ] ; then
-+                    echo "# Clean $CACHE_FILES" >>$TEST_LOG
-+                    rm $CACHE_FILES
-+                fi
-+                i=`expr $i + 1`
-+            done << EOF_ENVS
-+            `echo "$ENVS"`
-+EOF_ENVS
-+        fi
-+    done
-+    echo $pass $fail
-+}
-+
-+
-+run_gnome_desktop_testing_runner()
-+{
-+    pass=0
-+    fail=0
-+    if [ x"$TESTS" = x ] ; then
-+        TESTS='ibus'
-+    fi
-+    if echo $PROGNAME | grep -q autostart ; then
-+        export IBUS_DAEMON_WITH_SYSTEMD=1
-+    fi
-+    for tst in $TESTS; do
-+        tst_dir="$TEST_CASE_DIR/$tst"
-+        if [ ! -d "$tst_dir" ] ; then
-+            print_log -e "${RED}FAIL${NC}: Not found %tst_dir"
-+            fail=1
-+            continue
-+        fi
-+        gnome-desktop-testing-runner --timeout=$TIMEOUT $tst \
-+                2>>$TEST_LOG 1>>$TEST_LOG
-+        retval=$?
-+        read pass fail << EOF
-+        `count_case_result $retval $pass $fail`
-+EOF
-+    done
-+    child_pass=`grep '^PASS:' $TEST_LOG | wc -l`
-+    child_fail=`grep '^FAIL:' $TEST_LOG | wc -l`
-+    if [ $child_pass -ne 0 ] || [ $child_fail -ne 0 ] ; then
-+        pass=$child_pass
-+        if [ $child_fail -ne 0 ] ; then
-+            fail=`expr $child_fail / 2`
-+        else
-+            fail=0
-+        fi
-+    fi
-+    echo $pass $fail
-+}
-+
-+
-+run_test_suite()
-+{
-+    print_log -e "Start test suite `date '+%F %H:%M:%S:%N'`"
-+    if echo $PROGNAME | grep -q runner ; then
-+        if [ $ENABLED_SYSTEMD -eq 1 ] && [  $SESSION_IS_GNOME -eq 1 ] ; then
-+            wait_for_systemd_autostart
-+            return
-+        fi
-+        if ps -ef | grep X | grep -q wayland ; then
-+            # Expect GTK_IM_MODULE=wayland by default
-+            :
-+        else
-+            export GTK_IM_MODULE=ibus
-+        fi
-+    else
-+        if test x"$XDG_SESSION_TYPE" = xwayland ; then
-+            :
-+        else
-+            export GTK_IM_MODULE=ibus
-+        fi
-+    fi
-+    pass=0
-+    fail=0
-+    export IBUS_COMPOSE_CACHE_DIR=$PWD
-+    if test x"$TESTING_RUNNER" = x ; then
-+        return
-+    fi
-+    case $TESTING_RUNNER in
-+    default)
-+        # Get only the last value with do-while.
-+        read pass fail << EOF_RUNNER
-+        `run_direct_test_cases`
-+EOF_RUNNER
-+        ;;
-+    gnome)
-+        read pass fail << EOF_RUNNER
-+        `run_gnome_desktop_testing_runner`
-+EOF_RUNNER
-+        ;;
-+    esac
-+    echo ""
-+    print_log -e "End test suite `date '+%F %H:%M:%S:%N'`"
-+    # Fedora CI assumes the test is failed even if $fail is 0.
-+    if [ $pass -ne 0 ] ; then
-+        print_log -e "${GREEN}PASS${NC}: $pass"
-+    fi
-+    if [ $fail -ne 0 ] ; then
-+        print_log -e "${RED}FAIL${NC}: $fail"
-+    fi
-+}
-+
-+
-+finit()
-+{
-+    if test $PID_XORG -ne 0 ; then
-+        echo "# Killing left gnome-session and Xorg"
-+        kill $PID_GNOME_SESSION $PID_XORG
-+        ibus exit
-+        SUSER=`echo "$USER" | cut -c 1-7`
-+        LEFT_CALENDAR=`ps -ef | grep gnome-shell-calendar-server | grep $SUSER | grep -v grep`
-+        if test x"$LEFT_CALENDAR" != x ; then
-+            echo "# Killing left gnome-shell-calendar-server"
-+            echo "$LEFT_CALENDAR"
-+            echo "$LEFT_CALENDAR" | awk '{print $2}' | xargs kill
-+        fi
-+    fi
-+    if echo $PROGNAME | grep -q runner ; then
-+        if [ $ENABLED_SYSTEMD -eq 1 ] && [  $SESSION_IS_GNOME -eq 1 ] ; then
-+            operate_desktop_with_systemd "stop"
-+        fi
-+    fi
-+
-+    echo ""
-+    if test -f $TEST_LOG ; then
-+        if [ $TEST_LOG_STDOUT -eq 1 ] ; then
-+            cat $TEST_LOG
-+        else
-+            echo "# See $TEST_LOG"
-+        fi
-+    fi
-+    echo "# Finished $PROGNAME testing"
-+}
-diff --git a/src/tests/ibus-desktop-testing-runner.in b/src/tests/ibus-desktop-testing-runner.in
-index 1ac2dfc8..1d82bc76 100755
---- a/src/tests/ibus-desktop-testing-runner.in
-+++ b/src/tests/ibus-desktop-testing-runner.in
-@@ -4,7 +4,7 @@
- #
- # ibus - The Input Bus
- #
--# Copyright (c) 2018-2021 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+# Copyright (c) 2018-2024 Takao Fujiwara <takao.fujiwara1@gmail.com>
- # Copyright (c) 2018 Red Hat, Inc.
- #
- # This program is free software; you can redistribute it and/or modify
-@@ -22,58 +22,39 @@
- # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- 
- # This test runs /usr/bin/ibus-daemon after install ibus
--#
--# # init 3
--# Login as root
--# # /root/ibus/tests/test-console.sh --tests ibus-compose \
--#   --builddir /root/ibus/src/tests --srcdir /root/ibus/src/tests
--
--# POSIX sh has no 'echo -e'
--: ${ECHO:='/usr/bin/echo'}
--# POSIX sh has $UID
--# DASH saves the graves in '``' as characters not to be extracted
--: ${UID:=`id -u`}
- 
- 
- PROGNAME=`basename $0`
--VERSION=0.3
--DISPLAY=:99.0
--BUILDDIR="."
--SRCDIR="."
-+TEST_CASE_DIR="@INSTALLEDDIR@"
-+MODULE_SH='ibus-desktop-testing-module'
-+MODULE_SH_PATH="@LIBEXECDIR@/$MODULE_SH"
-+AUTOSTART_DESKTOP_DIR="@DATADIR@/ibus/tests"
- TEST_LOG="test-suite.log"
--TEST_LOG_STDOUT=0
--RESULT_LOG=""
--SCREEN_LOG=""
--HAVE_GRAPHICS=1
--VERBOSE=0
--DESKTOP_COMMAND="dbus-launch --exit-with-session gnome-session"
--PID_XORG=0
--PID_GNOME_SESSION=0
- TESTING_RUNNER="default"
--TESTS=""
--TIMEOUT=300
--GREEN='\033[0;32m'
--RED='\033[0;31m'
--NC='\033[0m'
- 
- 
--print_log()
--{
--    if [ x"$RESULT_LOG" != x ] ; then
--        # avoid 'echo -e' before call 'sed'.
--        if [ x"$1" = x'-e' ] ; then
--            shift
--        fi
--        NO_ESCAPE=`echo "$@" | sed -e 's/\\\033\\[0;3.m//g' -e 's/\\\033\\[0m//g'`
--        $ECHO $NO_ESCAPE >> $RESULT_LOG
--    else
--        $ECHO "$@"
--    fi
--}
-+if test -f $MODULE_SH_PATH ; then
-+  . $MODULE_SH_PATH
-+elif test -f $(dirname $0)/$MODULE_SH ; then
-+  . $(dirname $0)/$MODULE_SH
-+else
-+  echo "Not found $MODULE_SH"
-+  exit 1
-+fi
- 
- 
- usage()
- {
-+    command=""
-+    for element in $SESSION_COMMAND; do
-+        if test x"$element" = x; then
-+            continue
-+        fi
-+        if echo "$element" | grep -q -E "^-" ; then
-+            continue
-+        fi
-+        command="$element"
-+    done
-     $ECHO -e \
- "This test runs /usr/bin/ibus-daemon after install ibus\n"                     \
- "$PROGNAME [OPTIONS…]\n"                                                       \
-@@ -83,429 +64,37 @@ usage()
- "-v, --version                    Show version\n"                              \
- "-b, --builddir=BUILDDIR          Set the BUILDDIR\n"                          \
- "-s, --srcdir=SOURCEDIR           Set the SOURCEDIR\n"                         \
--"-c, --no-graphics                Use Xvfb instead of Xorg\n"                  \
-+"-c, --no-graphics                Use Xvfb instead of Xorg or Wayland\n"       \
- "-V, --verbose                    Verbose log for ibus-daemon\n"               \
--"-d, --desktop=DESKTOP            Run DESTKTOP. The default is gnome-session.\n" \
--"                                 Suffix '-with-dbus' can run DESKTOP with dbus session." \
--"                                 E.g. --desktop=mutter-with-dbus"             \
-+"-d, --session=SESSION            Run SESSION. The default is ${command}.\n"   \
-+"                                 Suffix '-with-dbus' can run SESSION with dbus session.\n" \
-+"                                 E.g. --session=${command}-with-dbus\n"       \
-+"-l, --lang=LANG                  Run SESSION with LANG\n"                     \
- "-t, --tests=\"TESTS...\"           Run TESTS programs which is separated by space\n" \
- "-r, --runner=RUNNER              Run TESTS programs with a test RUNNER.\n"    \
--"                                 RUNNDER = gnome or default.\n"               \
--"                                 default is an embedded runner.\n"            \
-+"                                 RUNNDER = 'gnome' or 'default'.\n"           \
-+"                                 'default' is an embedded runner.\n"          \
-+"-i, --no-systemd                 Run gnome-seesion directly withoout systemd\n" \
-+"                                 and login manager for legacy GNOME and this\n" \
-+"                                 mode does not support Wayland.\n" \
- "-T, --timeout=TIMEOUT            Set timeout (default TIMEOUT is 300 sec).\n" \
--"-o, --output=OUTPUT_FILE         OUtput the log to OUTPUT_FILE\n"             \
--"-O, --result=RESULT_FILE         OUtput the result to RESULT_FILE\n"          \
--"-S, --screendump=DUMP_FILE       OUtput the screen to DUMP_FILE ('STDOUT' can be stdout)\n" \
-+"-o, --output=OUTPUT_FILE         Output the log to OUTPUT_FILE\n"             \
-+"                                 default is $TEST_LOG\n"                      \
-+"-O, --result=RESULT_FILE         Output the result to RESULT_FILE\n"          \
-+"                                 default is stdout\n"                         \
-+"-S, --screendump=DUMP_FILE       Output the screen to DUMP_FILE ('STDOUT' can be stdout)\n" \
-+"-D, --delete-tests               Delete test enviroments and user $TEST_USER\n" \
- ""
- }
- 
- 
--parse_args()
--{
--    # This is GNU getopt. "sudo port getopt" in BSD?
--    ARGS=`getopt -o hvb:s:cVd:t:r:T:o:O:S: --long \
--          help,version,builddir:,srcdir:,no-graphics,verbose,desktop:,tests:,runner:,timeout:,output:,result:,screendump:\
--        -- "$@"`;
--    eval set -- "$ARGS"
--    while [ 1 ] ; do
--        case "$1" in
--        -h | --help )        usage; exit 0;;
--        -v | --version )     $ECHO -e "$VERSION"; exit 0;;
--        -b | --builddir )    BUILDDIR="$2"; shift 2;;
--        -s | --srcdir )      SRCDIR="$2"; shift 2;;
--        -c | --no-graphics ) HAVE_GRAPHICS=0; shift;;
--        -V | --verbose )     VERBOSE=1; shift;;
--        -d | --desktop )     DESKTOP_COMMAND="$2"; shift 2;;
--        -t | --tests )       TESTS="$2"; shift 2;;
--        -r | --runner )      TESTING_RUNNER="$2"; shift 2;;
--        -T | --timeout )     TIMEOUT="$2"; shift 2;;
--        -o | --output )      TEST_LOG="$2"; shift 2;;
--        -O | --result )      RESULT_LOG="$2"; shift 2;;
--        -S | --screendump )  SCREEN_LOG="$2"; shift 2;;
--        -- )                 shift; break;;
--        * )                  usage; exit 1;;
--        esac
--    done
--    DL='$'
--    echo "$DESKTOP_COMMAND" | grep "\-with\-dbus$DL" > /dev/null
--    HAS_DBUS_SUFFIX=$?
--    if [ $HAS_DBUS_SUFFIX -eq 0 ] ; then
--        DESKTOP_COMMAND=`echo "$DESKTOP_COMMAND" | sed -e 's/-with-dbus$//'`
--        DESKTOP_COMMAND="dbus-launch --exit-with-session $DESKTOP_COMMAND"
--    fi
--}
--
--
--init_desktop()
--{
--    if [ "$RESULT_LOG" != "" ] ; then
--        if [ -f $RESULT_LOG ] ; then
--            rm $RESULT_LOG
--        fi
--    fi
--    echo "$TEST_LOG" | grep ':stdout' > /dev/null
--    HAS_STDOUT=$?
--    if [ $HAS_STDOUT -eq 0 ] ; then
--        TEST_LOG=`echo "$TEST_LOG" | sed -e 's|:stdout||'`
--        TEST_LOG_STDOUT=1
--    fi
--    if [ "$TEST_LOG" = "" ] ; then
--        print_log -e "${RED}FAIL${NC}: ${RED}ERROR${NC}: a log file is required to get return value with 'read' command"
--        exit 255
--    elif [ -f $TEST_LOG ] ; then
--        rm $TEST_LOG
--    fi
--    if [ x$FORCE_TEST != x ] ; then
--        RUN_ARGS="$RUN_ARGS --force"
--    fi
--
--    if [ ! -f $HOME/.config/gnome-initial-setup-done ] ; then
--        IS_SYSTEM_ACCOUNT=false
--        if [ "$USER" = "root" ] ; then
--            IS_SYSTEM_ACCOUNT=true
--        fi
--        if test ! -f /var/lib/AccountsService/users/$USER ; then
--            mkdir -p /var/lib/AccountsService/users
--            cat >> /var/lib/AccountsService/users/$USER << _EOF
--[User]
--Language=ja_JP.UTF-8
--XSession=gnome
--SystemAccount=$IS_SYSTEM_ACCOUNT
--_EOF
--        fi
--        mkdir -p $HOME/.config
--        touch $HOME/.config/gnome-initial-setup-done
--    fi
--
--    # Prevent from launching a XDG dialog
--    XDG_LOCALE_FILE="$HOME/.config/user-dirs.locale"
--    if [ -f $XDG_LOCALE_FILE ] ; then
--        XDG_LANG_ORIG=`cat $XDG_LOCALE_FILE`
--        XDG_LANG_NEW=`echo $LANG | sed -e 's/\(.*\)\..*/\1/'`
--        if [ "$XDG_LANG_ORIG" != "$XDG_LANG_NEW" ] ; then
--            echo "# Overriding XDG locale $XDG_LANG_ORIG with $XDG_LANG_NEW"
--            echo "$XDG_LANG_NEW" > $XDG_LOCALE_FILE
--        fi
--    fi
--    # `su` command does not run loginctl
--    export XDG_SESSION_TYPE='x11'
--    export XDG_SESSION_CLASS=user
--    # `su` command does not get focus in events without this variable.
--    # Need to restart sshd after set "PermitRootLogin yes" in sshd_config
--    if [ "x$XDG_RUNTIME_DIR" = x ] ; then
--        export XDG_RUNTIME_DIR="/run/user/$UID"
--        is_root_login=`grep "^PermitRootLogin" /etc/ssh/sshd_config | grep yes`
--        if [ "x$ANSIBLE" != x ] && [ "x$is_root_login" = x ] ; then
--            print_log -e "${RED}FAIL${NC}: No permission to get focus-in events in GtkWindow with ansible"
--            echo "su command does not configure necessary login info "         \
--                 "with systemd and GtkWindow cannot receive focus-events "     \
--                 "when ibus-desktop-testing-runner is executed by "            \
--                 "ansible-playbook." >> $TEST_LOG
--            echo "Enabling root login via sshd, restarting sshd, set "         \
--                 "XDG_RUNTIME_DIR can resolve the problem under "              \
--                 "ansible-playbook." >> $TEST_LOG
--            exit 255
--        fi
--    fi
--    #  Do we need XDG_SESSION_ID and XDG_SEAT?
--    #export XDG_CONFIG_DIRS=/etc/xdg
--    #export XDG_SESSION_ID=10
--    #export XDG_SESSION_DESKTOP=gnome
--    #export XDG_SEAT=seat0
--}
--
--
--run_dbus_daemon()
--{
--    # Use dbus-launch --exit-with-session later instead of --sh-syntax
--    # GNOME uses a unix:abstract address and it effects gsettings set values
--    # in each test case.
--    # TODO: Should we comment out this line?
--    export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$UID/bus"
--}
--
--
--init_gnome()
--{
--    # gsettings set command needs dconf-service with the same $DISPLAY
--    pkill dconf-service
--    # G_MESSAGES_DEBUG=all or G_MESSAGES_DEBUG=GLib-GIO-DEBUG would append
--    # debug messages to gsettings output and could not get the result correctly.
--    backup_G_MESSAGES_DEBUG="$G_MESSAGES_DEBUG"
--    unset G_MESSAGES_DEBUG
--    # Disable Tour dialog to get focus
--    V=`gsettings get org.gnome.shell welcome-dialog-last-shown-version`
--    if [ x"$V" = x"''" ] ; then
--        gsettings set org.gnome.shell welcome-dialog-last-shown-version '100'
--    fi
--    # gnome-shell now starts overview mode by login.
--    # https://extensions.gnome.org/extension/4099/no-overview/
--    NO_SYS_DIR=/usr/share/gnome-shell/extensions/no-overview@fthx
--    NO_USER_DIR=$HOME/.local/share/gnome-shell/extensions/no-overview@fthx
--    if [ ! -d $NO_SYS_DIR ] && [ ! -d $NO_USER_DIR ] ; then
--        mkdir -p "`dirname $NO_USER_DIR`"
--        cp -R "no-overview@fthx" "`dirname $NO_USER_DIR`"
--    fi
--    V=`gsettings get org.gnome.shell disable-user-extensions`
--    if [ x"$V" = x"true" ] ; then
--        gsettings set org.gnome.shell disable-user-extensions false
--    fi
--    V=`gsettings get org.gnome.shell enabled-extensions`
--    echo "$V" | grep "no-overview" > /dev/null
--    V2=$?
--    if [ $V2 -ne 0 ] ; then
--        V3=`echo "$V" | sed -e 's/@as //' -e 's/\[//' -e 's/\]//'`
--        if [ x"$V3" = x"''" ] || [ x"$V3" = x"" ]; then
--            V4="['no-overview@fthx']"
--        else
--            V4="[$V3, 'no-overview@fthx']"
--        fi
--        gsettings set org.gnome.shell enabled-extensions "$V4"
--    fi
--    if [ x"$backup_G_MESSAGES_DEBUG" != x ] ; then
--        export G_MESSAGES_DEBUG="$backup_G_MESSAGES_DEBUG"
--    fi
--}
--
--
--run_desktop()
--{
--    echo "$DESKTOP_COMMAND" | grep gnome-session > /dev/null
--    HAS_GNOME=$?
--    export DISPLAY=$DISPLAY
--    if test $HAVE_GRAPHICS -eq 1 ; then
--        /usr/libexec/Xorg.wrap -noreset +extension GLX +extension RANDR +extension RENDER -logfile ./xorg.log -config ./xorg.conf -configdir . $DISPLAY &
--    else
--        /usr/bin/Xvfb $DISPLAY -noreset +extension GLX +extension RANDR +extension RENDER -screen 0 1280x1024x24 &
--    fi
--    PID_XORG=$!
--    sleep 1
--    # init_gnome need to be called with $DISPLAY before gnome-session is called
--    if [  $HAS_GNOME -eq 0 ] ; then
--        init_gnome
--    fi
--    echo "Running $DESKTOP_COMMAND with $USER in `tty`"
--    $DESKTOP_COMMAND &
--    PID_GNOME_SESSION=$!
--    sleep 30
--
--    IBUS_ARGS="--verbose --panel disable"
--    # gnome-shell 42 checks if org.freedesktop.IBus.session.GNOME.service
--    # systemd file is available with org.freedesktop.systemd1.Manager.GetUnit
--    # D-Bus method, which is provided by IBus 1.5.26, and if the file
--    # is available, gnome-shell no longer launch ibus-daemon
--    # because gnome-shell assumes gnome-session would launch ibus-daemon
--    # with org.freedesktop.systemd1.Manager.StartUnit D-Bus method.
--    # But actually gnome-session failed to launch ibus-daemon
--    # because the IBus systemd file depends on gnome-session.target
--    # but this CI launches gnome-session directly.
--    #
--    # So ibus-dameon is now always called here after gnome-shell fails to
--    # launch ibus-daemon.
--    # It may be better this CI launches GDM autologin to run gnome-session
--    # with gnome-session.target systemd file.
--    # But `systemctl start gdm` terminates the parent script forcibly
--    # and the script cannot get the CI result.
--    if test $VERBOSE -eq 1 ; then
--        ibus-daemon $IBUS_ARGS &
--    else
--        ibus-daemon $IBUS_ARGS --daemonize
--    fi
--    sleep 3
--    if test $VERBOSE -eq 1 ; then
--        ps -ef | grep ibus
--    fi
--}
--
--
--count_case_result()
--{
--    retval=$1
--    pass=$2
--    fail=$3
--
--    if test $retval -eq  0 ; then
--        pass=`expr $pass + 1`
--    else
--        fail=`expr $fail + 1`
--    fi
--    echo $pass $fail
--}
--
--
--echo_case_result()
--{
--    retval=$1
--    tst=$2
--    subtst=${3:-''}
--
--    if test $retval -eq  0 ; then
--        echo "PASS: $tst $subtst" >>$TEST_LOG
--    else
--        echo "FAIL: $tst $subtst" >>$TEST_LOG
--    fi
--}
--
--
--run_direct_test_cases()
--{
--    pass=0
--    fail=0
--    for tst in $TESTS; do
--        ENVS=
--        if test -f $SRCDIR/${tst}.env ; then
--            ENVS="`cat $SRCDIR/${tst}.env`"
--        fi
--        if test x"$ENVS" = x ; then
--            $BUILDDIR/$tst $SRCDIR 2>>$TEST_LOG 1>>$TEST_LOG
--            retval=$?
--            read pass fail << EOF_COUNT
--            `count_case_result $retval $pass $fail`
--EOF_COUNT
--            echo_case_result $retval $tst
--            CACHE_FILES=`ls *.cache`
--            if [ x"$CACHE_FILES" != x ] ; then
--                echo "# Clean $CACHE_FILES" >>$TEST_LOG
--                rm $CACHE_FILES
--            fi
--        else
--            i=1
--            # Deleted for var in "$ENVS" because IFS=$'\n' is not supported
--            # in POSIX sh
--            while read e ; do
--                first=`echo "$e" | grep '^#'`
--                if test x"$first" = x"#" ; then
--                    continue
--                fi
--                echo "# Starting $e $BUILDDIR/$tst $SRCDIR" >>$TEST_LOG
--                env $e $BUILDDIR/$tst $SRCDIR 2>>$TEST_LOG 1>>$TEST_LOG
--                retval=$?
--                echo "# Finished $e $BUILDDIR/$tst $SRCDIR with $retval" >>$TEST_LOG
--                read pass fail << EOF_COUNT
--                `count_case_result $retval $pass $fail`
--EOF_COUNT
--                echo_case_result $retval $tst $e
--                CACHE_FILES=`ls *.cache`
--                if [ x"$CACHE_FILES" != x ] ; then
--                    echo "# Clean $CACHE_FILES" >>$TEST_LOG
--                    rm $CACHE_FILES
--                fi
--                i=`expr $i + 1`
--            done << EOF_ENVS
--            `echo "$ENVS"`
--EOF_ENVS
--        fi
--    done
--    echo $pass $fail
--}
--
--
--run_gnome_desktop_testing_runner()
--{
--    pass=0
--    fail=0
--    if [ x"$TESTS" = x ] ; then
--        TESTS='ibus'
--    fi
--    for tst in $TESTS; do
--        tst_dir="@INSTALLEDDIR@/$tst"
--        if [ ! -d "$tst_dir" ] ; then
--            print_log -e "${RED}FAIL${NC}: Not found %tst_dir"
--            fail=1
--            continue
--        fi
--        gnome-desktop-testing-runner --timeout=$TIMEOUT $tst \
--                2>>$TEST_LOG 1>>$TEST_LOG
--        retval=$?
--        read pass fail << EOF
--        `count_case_result $retval $pass $fail`
--EOF
--    done
--    child_pass=`grep '^PASS:' $TEST_LOG | wc -l`
--    child_fail=`grep '^FAIL:' $TEST_LOG | wc -l`
--    if [ $child_pass -ne 0 ] || [ $child_fail -ne 0 ] ; then
--        pass=$child_pass
--        if [ $child_fail -ne 0 ] ; then
--            fail=`expr $child_fail / 2`
--        else
--            fail=0
--        fi
--    fi
--    echo $pass $fail
--}
--
--
--run_test_suite()
--{
--    pass=0
--    fail=0
--    export GTK_IM_MODULE=ibus
--    export IBUS_COMPOSE_CACHE_DIR=$PWD
--    if [ x"$TESTING_RUNNER" = x ] ; then
--        TESTING_RUNNER="default"
--    fi
--    case $TESTING_RUNNER in
--    default)
--        # Get only the last value with do-while.
--        read pass fail << EOF_RUNNER
--        `run_direct_test_cases`
--EOF_RUNNER
--        ;;
--    gnome)
--        read pass fail << EOF_RUNNER
--        `run_gnome_desktop_testing_runner`
--EOF_RUNNER
--        ;;
--    esac
--    echo ""
--    # Fedora CI assumes the test is failed even if $fail is 0.
--    if [ $pass -ne 0 ] ; then
--        print_log -e "${GREEN}PASS${NC}: $pass"
--    fi
--    if [ $fail -ne 0 ] ; then
--        print_log -e "${RED}FAIL${NC}: $fail"
--    fi
--    echo ""
--    if [ $TEST_LOG_STDOUT -eq 1 ] ; then
--        cat $TEST_LOG
--    else
--        echo "# See $TEST_LOG"
--    fi
--}
--
--
--finit()
--{
--    echo "# Killing left gnome-session and Xorg"
--    kill $PID_GNOME_SESSION $PID_XORG
--    ibus exit
--    SUSER=`echo "$USER" | cut -c 1-7`
--    LEFT_CALENDAR=`ps -ef | grep gnome-shell-calendar-server | grep $SUSER | grep -v grep`
--    if [ x"$LEFT_CALENDAR" != x ] ; then
--        echo "# Killing left gnome-shell-calendar-server"
--        echo "$LEFT_CALENDAR"
--        echo "$LEFT_CALENDAR" | awk '{print $2}' | xargs kill
--    fi
--
--    echo "# Finished $PROGNAME testing"
--}
--
--
- main()
- {
-     parse_args "$@"
--    init_desktop
-+    init_session
-     run_dbus_daemon 2>>$TEST_LOG 1>>$TEST_LOG
--    run_desktop 2>>$TEST_LOG 1>>$TEST_LOG
--    if [ x"$SCREEN_LOG" != x ] ; then
--        SCREEN_PNG="`date '+%Y%m%d%H%M%S'`.png"
--        gnome-screenshot --file=$SCREEN_PNG
--        if [ x"$SCREEN_LOG" = xSTDOUT ] ; then
--            base64 $SCREEN_PNG
--        else
--            base64 $SCREEN_PNG > $SCREEN_LOG
--        fi
--    fi
-+    run_session 2>>$TEST_LOG 1>>$TEST_LOG
-+    save_screen
-     run_test_suite
-     finit
- }
-diff --git a/src/tests/ibus-desktop-testing.desktop.in b/src/tests/ibus-desktop-testing.desktop.in
-index 1b815345..e91900ed 100644
---- a/src/tests/ibus-desktop-testing.desktop.in
-+++ b/src/tests/ibus-desktop-testing.desktop.in
-@@ -2,7 +2,7 @@
- Name=IBus Desktop Testing Runner
- GenericName=Input Method Desktop Testing Runner
- Comment=Test plugin for IBus Desktop Testing
--Exec=@libexecdir@/ibus-desktop-testing-autostart /var/tmp/ibus-ci-autostart.log
-+Exec=sh -c 'exec @libexecdir@/ibus-desktop-testing-autostart --envcheck --output $HOME/test-autostart.log --result $HOME/test.log --runner gnome --screendump $HOME/screen.log --tests ibus'
- Terminal=false
- Type=Application
- Encoding=UTF-8
--- 
-2.45.0
-
-From 039fcb16f18d341a244362c3e797eeaa5c51010e Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Sat, 27 Jul 2024 19:02:09 +0900
-Subject: [PATCH 2/6] Fix tests cases to be run in Wayland
-
-- Fix ibus-bus since ibus_bus_exit_async() does not work ibus-daemon
-  with systemd and run `ibus restart` instead.
-- Fix ibus-compose-locales to wait for 1 sec between key event test cases
-  to reset gnome-shell/mutter.
-- Fix ibus-compose to wait for commit-text event since the gnome-shell/mutter
-  process is a bit slow and can reset the previous commit-text events
-  before the previous events are not committed.
-- Fix counts in ibus-engine-switch.
-- Unref IBusEngineDesc in ibus-engine-switch.
-- Fix ibusimpl not to change the engine of the context when global-engine
-  is enabled.
-- Check DISPLAY and setxkbmap in xkb-latin-layouts for Wayland
-
-BUG=https://github.com/ibus/ibus/pull/2657
----
- bus/ibusimpl.c                 |   8 ++
- bus/ibusimpl.h                 |   3 +-
- bus/inputcontext.c             |   9 +++
- src/ibusshare.c                |   2 +-
- src/tests/ibus-bus.c           |  92 +++++++++++++++++++---
- src/tests/ibus-compose.c       | 139 ++++++++++++++++++++++++---------
- src/tests/ibus-engine-switch.c |  45 ++++++++++-
- src/tests/xkb-latin-layouts    |   9 +++
- 8 files changed, 254 insertions(+), 53 deletions(-)
-
-diff --git a/bus/ibusimpl.c b/bus/ibusimpl.c
-index 445c062b..4bed9bc0 100644
---- a/bus/ibusimpl.c
-+++ b/bus/ibusimpl.c
-@@ -2463,6 +2463,14 @@ bus_ibus_impl_is_embed_preedit_text (BusIBusImpl *ibus)
-     return ibus->embed_preedit_text;
- }
- 
-+gboolean
-+bus_ibus_impl_is_use_global_engine (BusIBusImpl *ibus)
-+{
-+    g_assert (BUS_IS_IBUS_IMPL (ibus));
-+
-+    return ibus->use_global_engine;
-+}
-+
- BusInputContext *
- bus_ibus_impl_get_focused_input_context (BusIBusImpl *ibus)
- {
-diff --git a/bus/ibusimpl.h b/bus/ibusimpl.h
-index e3b43f87..428b773b 100644
---- a/bus/ibusimpl.h
-+++ b/bus/ibusimpl.h
-@@ -2,7 +2,7 @@
- /* vim:set et sts=4: */
- /* bus - The Input Bus
-  * Copyright (C) 2008-2013 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright (C) 2022-2023 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2022-2024 Takao Fujiwara <takao.fujiwara1@gmail.com>
-  * Copyright (C) 2008-2022 Red Hat, Inc.
-  *
-  * This library is free software; you can redistribute it and/or
-@@ -94,6 +94,7 @@ BusComponent    *bus_ibus_impl_lookup_component_by_name
- gboolean         bus_ibus_impl_is_use_sys_layout    (BusIBusImpl        *ibus);
- gboolean         bus_ibus_impl_is_embed_preedit_text
-                                                     (BusIBusImpl        *ibus);
-+gboolean         bus_ibus_impl_is_use_global_engine (BusIBusImpl        *ibus);
- BusInputContext *bus_ibus_impl_get_focused_input_context
-                                                     (BusIBusImpl        *ibus);
- GHashTable      *bus_ibus_impl_get_engine_focus_id_table
-diff --git a/bus/inputcontext.c b/bus/inputcontext.c
-index 1e795733..85358241 100644
---- a/bus/inputcontext.c
-+++ b/bus/inputcontext.c
-@@ -1289,6 +1289,15 @@ _ic_set_engine (BusInputContext       *context,
-                 GDBusMethodInvocation *invocation)
- {
-     gchar *engine_name = NULL;
-+    BusIBusImpl *ibus = bus_ibus_impl_get_default ();
-+
-+    if (bus_ibus_impl_is_use_global_engine (ibus)) {
-+        g_dbus_method_invocation_return_error (invocation,
-+                G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
-+                "Cannot set engines when use-global-engine is enabled.");
-+        return;
-+    }
-+
-     g_variant_get (parameters, "(&s)", &engine_name);
- 
-     if (!bus_input_context_has_focus (context)) {
-diff --git a/src/ibusshare.c b/src/ibusshare.c
-index 5ab6e889..57e3ef14 100644
---- a/src/ibusshare.c
-+++ b/src/ibusshare.c
-@@ -2,7 +2,7 @@
- /* vim:set et sts=4: */
- /* ibus - The Input Bus
-  * Copyright (C) 2008-2010 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright (C) 2015-2023 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2015-2024 Takao Fujiwara <takao.fujiwara1@gmail.com>
-  * Copyright (C) 2008-2018 Red Hat, Inc.
-  *
-  * This library is free software; you can redistribute it and/or
-diff --git a/src/tests/ibus-bus.c b/src/tests/ibus-bus.c
-index d6b105cf..76120354 100644
---- a/src/tests/ibus-bus.c
-+++ b/src/tests/ibus-bus.c
-@@ -802,20 +802,29 @@ start_set_preload_engines_async (void)
-             NULL); /* user_data */
- }
- 
-+typedef struct _ExitAsyncData {
-+    gboolean has_socket_path;
-+    gboolean exited;
-+    guint    timeout_id;
-+} ExitAsyncData;
-+
- static void
- _socket_changed_cb (GFileMonitor       *monitor,
-                     GFile              *file,
-                     GFile              *other_file,
-                     GFileMonitorEvent   event_type,
--                    IBusBus            *bus)
-+                    ExitAsyncData      *data)
- {
-     switch (event_type) {
-     case G_FILE_MONITOR_EVENT_CHANGED:
-         g_debug ("IBus socket file is changed");
-         call_next_async_function ();
-+        data->exited = TRUE;
-         g_signal_handlers_disconnect_by_func (monitor,
-                                               G_CALLBACK (_socket_changed_cb),
--                                              NULL);
-+                                              data);
-+        if (data->timeout_id)
-+            g_source_remove (data->timeout_id);
-         g_object_unref (monitor);
-         break;
-     case G_FILE_MONITOR_EVENT_CREATED:
-@@ -829,6 +838,33 @@ _socket_changed_cb (GFileMonitor       *monitor,
-     }
- }
- 
-+static gboolean
-+_exit_timeout (gpointer user_data)
-+{
-+    g_error ("start_exit_async() is timeout. You might run ibus-daemon " \
-+             "with systemd under GNOME and the exit API does not work. " \
-+             "You need to export IBUS_DAEMON_WITH_SYSTEMD=1 .\n");
-+    return G_SOURCE_REMOVE;
-+}
-+
-+static void
-+finish_ibus_restart_async (GPid      pid,
-+                           gint      status,
-+                           gpointer *user_data)
-+{
-+    ExitAsyncData *data = (ExitAsyncData *)user_data;
-+    g_spawn_close_pid (pid);
-+    if (data->has_socket_path == FALSE) {
-+        g_debug ("ibus_bus_exit_finish: OK socket file: none");
-+        g_usleep (G_USEC_PER_SEC);
-+        call_next_async_function ();
-+    } else {
-+        g_debug ("ibus_bus_exit_finish: OK socket file: monitored");
-+        if (!data->exited)
-+            data->timeout_id = g_timeout_add_seconds (10, _exit_timeout, NULL);
-+    }
-+}
-+
- static void
- finish_exit_async (GObject *source_object,
-                    GAsyncResult *res,
-@@ -838,25 +874,32 @@ finish_exit_async (GObject *source_object,
-     gboolean result = ibus_bus_exit_async_finish (bus,
-                                                   res,
-                                                   &error);
--    gboolean has_socket_path = GPOINTER_TO_INT (user_data);
-+    ExitAsyncData *data = (ExitAsyncData *)user_data;
-     if (error) {
-         g_warning ("Failed to ibus_bus_exit(): %s", error->message);
-         g_error_free (error);
-     }
-     g_assert (result);
--    if (has_socket_path == FALSE) {
-+    g_assert (data);
-+    if (data->has_socket_path == FALSE) {
-         g_debug ("ibus_bus_exit_finish: OK socket file: none");
-         g_usleep (G_USEC_PER_SEC);
-         call_next_async_function ();
-     } else {
-         g_debug ("ibus_bus_exit_finish: OK socket file: monitored");
-+        if (!data->exited)
-+            data->timeout_id = g_timeout_add_seconds (10, _exit_timeout, NULL);
-     }
- }
- 
- static void
- start_exit_async (void)
- {
--    gboolean has_socket_path = FALSE;
-+    static ExitAsyncData data = {
-+        .has_socket_path = FALSE,
-+        .exited          = FALSE,
-+        .timeout_id      = 0
-+    };
-     /* When `./runtest ibus-bus` runs, ibus-daemon sometimes failed to
-      * restart because closing a file descriptor was failed in
-      * bus/server.c:_restart_server() with a following error:
-@@ -879,7 +922,7 @@ start_exit_async (void)
-         g_assert (address_path);
-         file = g_file_new_for_path (address_path);
-         g_assert (file);
--        has_socket_path = TRUE;
-+        data.has_socket_path = TRUE;
-         monitor = g_file_monitor (file, G_FILE_MONITOR_NONE, NULL, &error);
-         if (error) {
-             g_warning ("Failed to monitor socket file: %s", error->message);
-@@ -887,15 +930,38 @@ start_exit_async (void)
-         }
-         g_assert (monitor);
-         g_signal_connect (monitor, "changed",
--                          G_CALLBACK (_socket_changed_cb), NULL);
-+                          G_CALLBACK (_socket_changed_cb),
-+                          &data);
-         g_object_unref (file);
-     }
--    ibus_bus_exit_async (bus,
--                         TRUE, /* restart */
--                         -1, /* timeout */
--                         NULL, /* cancellable */
--                         finish_exit_async,
--                         GINT_TO_POINTER (has_socket_path)); /* user_data */
-+    /* When ibus-daemon runs with systemd, restarting the daemon with
-+     * ibus_bus_exit_async() does not work so runs `ibus restart` command
-+     * with IBUS_DAEMON_WITH_SYSTEMD variable instead.
-+     */
-+    if (g_getenv ("IBUS_DAEMON_WITH_SYSTEMD")) {
-+        gchar *argv[] = { "ibus", "restart", NULL };
-+        GSpawnFlags flags = G_SPAWN_DO_NOT_REAP_CHILD \
-+                            | G_SPAWN_SEARCH_PATH \
-+                            | G_SPAWN_STDOUT_TO_DEV_NULL \
-+                            | G_SPAWN_STDERR_TO_DEV_NULL;
-+        GPid pid = 0;
-+        GError *error = NULL;
-+        g_spawn_async (NULL, argv, NULL, flags, NULL, NULL, &pid, &error);
-+        if (error) {
-+            g_warning ("Failed to call ibus restart: %s", error->message);
-+            g_error_free (error);
-+        }
-+        g_child_watch_add (pid,
-+                           (GChildWatchFunc)finish_ibus_restart_async,
-+                           &data);
-+    } else {
-+        ibus_bus_exit_async (bus,
-+                             TRUE, /* restart */
-+                             -1, /* timeout */
-+                             NULL, /* cancellable */
-+                             finish_exit_async,
-+                             &data); /* user_data */
-+    }
- }
- 
- static gboolean
-diff --git a/src/tests/ibus-compose.c b/src/tests/ibus-compose.c
-index 21de7a22..660aee7f 100644
---- a/src/tests/ibus-compose.c
-+++ b/src/tests/ibus-compose.c
-@@ -7,19 +7,28 @@
- #define RED   "\033[0;31m"
- #define NC    "\033[0m"
- 
--IBusBus *m_bus;
--gchar *m_compose_file;
--IBusComposeTableEx *m_compose_table;
--IBusEngine *m_engine;
--gchar *m_srcdir;
--
--guint ibus_compose_key_flag (guint key);
--
-+static IBusBus *m_bus;
-+static gchar *m_compose_file;
-+static IBusComposeTableEx *m_compose_table;
-+static IBusEngine *m_engine;
-+static gchar *m_srcdir;
-+static GMainLoop *m_loop;
-+
-+typedef enum {
-+    TEST_CREATE_ENGINE,
-+    TEST_COMMIT_TEXT
-+} TestIDleCategory;
-+
-+typedef struct _TestIdleData {
-+    TestIDleCategory category;
-+    guint            idle_id;
-+} TestIdleData;
-+
-+extern guint ibus_compose_key_flag (guint key);
- static gboolean window_focus_in_event_cb (GtkWidget     *entry,
-                                           GdkEventFocus *event,
-                                           gpointer       data);
- 
--
- static gchar *
- get_compose_path ()
- {
-@@ -51,17 +60,50 @@ get_compose_path ()
- }
- 
- 
-+gboolean
-+idle_cb (gpointer user_data)
-+{
-+    TestIdleData *data = (TestIdleData *)user_data;
-+    g_assert (data);
-+    switch (data->category) {
-+    case TEST_CREATE_ENGINE:
-+        g_test_fail_printf ("\"create-engine\" signal is timeout.");
-+        break;
-+    case TEST_COMMIT_TEXT:
-+        if (data->idle_id)
-+            g_test_fail_printf ("Commiting composed chars is timeout.");
-+        if (m_loop) {
-+            if (g_main_loop_is_running (m_loop))
-+                g_main_loop_quit (m_loop);
-+            g_clear_pointer (&m_loop, g_main_loop_unref);
-+            gtk_main_quit ();
-+        }
-+        data->idle_id = 0;
-+        break;
-+    default:
-+        g_test_fail_printf ("Idle func is called by wrong category:%d.",
-+                            data->category);
-+        break;
-+    }
-+    return G_SOURCE_REMOVE;
-+}
-+
-+
- static IBusEngine *
- create_engine_cb (IBusFactory *factory,
-                   const gchar *name,
--                  gpointer     data)
-+                  gpointer     user_data)
- {
-     static int i = 1;
-     gchar *engine_path =
-             g_strdup_printf ("/org/freedesktop/IBus/engine/simpletest/%d",
-                              i++);
-     gchar *compose_path;
-+    TestIdleData *data = (TestIdleData *)user_data;
- 
-+    g_assert (data);
-+    /* Don't reset idle_id to avoid duplicated register_ibus_engine(). */
-+    g_source_remove (data->idle_id);
-     m_engine = ibus_engine_new_with_type (IBUS_TYPE_ENGINE_SIMPLE,
-                                           name,
-                                           engine_path,
-@@ -75,28 +117,33 @@ create_engine_cb (IBusFactory *factory,
-         ibus_engine_simple_add_compose_file (IBUS_ENGINE_SIMPLE (m_engine),
-                                              compose_path);
-         m_compose_table = ibus_compose_table_load_cache (compose_path);
--        if (m_compose_table == NULL)
--            g_warning ("Your locale uses en_US compose table.");
-     }
-     g_free (compose_path);
-     return m_engine;
- }
- 
-+
- static gboolean
- register_ibus_engine ()
- {
-+    static TestIdleData data = { .category = TEST_CREATE_ENGINE, .idle_id = 0 };
-     IBusFactory *factory;
-     IBusComponent *component;
-     IBusEngineDesc *desc;
- 
-+    if (data.idle_id) {
-+        g_test_incomplete ("Test is called twice due to a timeout.");
-+        return TRUE;
-+    }
-     m_bus = ibus_bus_new ();
-     if (!ibus_bus_is_connected (m_bus)) {
--        g_critical ("ibus-daemon is not running.");
-+        g_test_fail_printf ("ibus-daemon is not running.");
-         return FALSE;
-     }
-     factory = ibus_factory_new (ibus_bus_get_connection (m_bus));
-+    data.idle_id = g_timeout_add_seconds (20, idle_cb, &data);
-     g_signal_connect (factory, "create-engine",
--                      G_CALLBACK (create_engine_cb), NULL);
-+                      G_CALLBACK (create_engine_cb), &data);
- 
-     component = ibus_component_new (
-             "org.freedesktop.IBus.SimpleTest",
-@@ -122,34 +169,29 @@ register_ibus_engine ()
-     return TRUE;
- }
- 
--static gboolean
--finit (gpointer data)
--{
--    g_test_incomplete ("time out");
--    gtk_main_quit ();
--    return FALSE;
--}
- 
- static void
--set_engine_cb (GObject *object, GAsyncResult *res, gpointer data)
-+set_engine_cb (GObject      *object,
-+               GAsyncResult *res,
-+               gpointer      user_data)
- {
-     IBusBus *bus = IBUS_BUS (object);
--    GtkWidget *entry = GTK_WIDGET (data);
-+    GtkWidget *entry = GTK_WIDGET (user_data);
-     GError *error = NULL;
-+    static TestIdleData data = { .category = TEST_COMMIT_TEXT, .idle_id = 0 };
-     int i, j;
-     int index_stride;
-     IBusComposeTablePrivate *priv;
- 
-     if (!ibus_bus_set_global_engine_async_finish (bus, res, &error)) {
--        gchar *msg = g_strdup_printf ("set engine failed: %s", error->message);
--        g_test_incomplete (msg);
--        g_free (msg);
-+        g_test_fail_printf ("set engine failed: %s", error->message);
-         g_error_free (error);
-         return;
-     }
- 
-     if (m_compose_table == NULL) {
--        gtk_main_quit ();
-+        g_test_skip ("Your locale uses en_US compose table.");
-+        idle_cb (&data);
-         return;
-     }
- 
-@@ -157,6 +199,7 @@ set_engine_cb (GObject *object, GAsyncResult *res, gpointer data)
-     for (i = 0;
-          i < (m_compose_table->n_seqs * index_stride);
-          i += index_stride) {
-+        data.idle_id = g_timeout_add_seconds (20, idle_cb, &data);
-         for (j = i; j < i + (index_stride - 2); j++) {
-             guint keyval = m_compose_table->data[j];
-             guint keycode = 0;
-@@ -172,12 +215,22 @@ set_engine_cb (GObject *object, GAsyncResult *res, gpointer data)
-             g_signal_emit_by_name (m_engine, "process-key-event",
-                                    keyval, keycode, modifiers, &retval);
-         }
-+        /* Need to wait for calling window_inserted_text_cb() with
-+         * g_main_loop_run() because the commit-text event could be cancelled
-+         * by the next commit-text event with gnome-shell in Wayland.
-+         */
-+        g_main_loop_run (m_loop);
-+        if (data.idle_id) {
-+            g_source_remove (data.idle_id);
-+            data.idle_id = 0;
-+        }
-     }
-     priv = m_compose_table->priv;
-     if (priv) {
-         for (i = 0;
-              i < (priv->first_n_seqs * index_stride);
-              i += index_stride) {
-+            data.idle_id = g_timeout_add_seconds (20, idle_cb, &data);
-             for (j = i; j < i + (index_stride - 2); j++) {
-                 guint keyval = priv->data_first[j];
-                 guint keycode = 0;
-@@ -193,13 +246,18 @@ set_engine_cb (GObject *object, GAsyncResult *res, gpointer data)
-                 g_signal_emit_by_name (m_engine, "process-key-event",
-                                        keyval, keycode, modifiers, &retval);
-             }
-+            g_main_loop_run (m_loop);
-+            if (data.idle_id) {
-+                g_source_remove (data.idle_id);
-+                data.idle_id = 0;
-+            }
-         }
-     }
- 
-     g_signal_handlers_disconnect_by_func (entry, 
-                                           G_CALLBACK (window_focus_in_event_cb),
-                                           NULL);
--    g_timeout_add_seconds (10, finit, NULL);
-+    data.idle_id = g_timeout_add_seconds (10, idle_cb, &data);
- }
- 
- static gboolean
-@@ -215,12 +273,13 @@ window_focus_in_event_cb (GtkWidget *entry, GdkEventFocus *event, gpointer data)
-     return FALSE;
- }
- 
-+
- static void
- window_inserted_text_cb (GtkEntryBuffer *buffer,
-                          guint           position,
-                          const gchar    *chars,
-                          guint           nchars,
--                         gpointer        data)
-+                         gpointer        user_data)
- {
- /* https://gitlab.gnome.org/GNOME/gtk/commit/9981f46e0b
-  * The latest GTK does not emit "inserted-text" when the text is "".
-@@ -234,8 +293,9 @@ window_inserted_text_cb (GtkEntryBuffer *buffer,
-     int seq;
-     gunichar code = g_utf8_get_char (chars);
-     const gchar *test;
--    GtkEntry *entry = GTK_ENTRY (data);
-+    GtkEntry *entry = GTK_ENTRY (user_data);
-     IBusComposeTablePrivate *priv;
-+    static TestIdleData data = { .category = TEST_COMMIT_TEXT, .idle_id = 0 };
- 
-     g_assert (m_compose_table != NULL);
- 
-@@ -302,21 +362,26 @@ window_inserted_text_cb (GtkEntryBuffer *buffer,
-             stride = 0;
-             seq = 0;
-         } else {
--            gtk_main_quit ();
-+            /* Finish tests */
-+            idle_cb (&data);
-             return;
-         }
-     }
-     if (enable_32bit && seq == priv->first_n_seqs) {
--        gtk_main_quit ();
-+        /* Finish tests */
-+        idle_cb (&data);
-         return;
-     }
- 
- #if !GTK_CHECK_VERSION (3, 22, 16)
-     n_loop++;
- #endif
-+
-     gtk_entry_set_text (entry, "");
-+    g_main_loop_quit (m_loop);
- }
- 
-+
- static void
- create_window ()
- {
-@@ -335,14 +400,13 @@ create_window ()
-     gtk_widget_show_all (window);
- }
- 
-+
- static void
- test_compose (void)
- {
-     GLogLevelFlags flags;
--    if (!register_ibus_engine ()) {
--        g_test_fail ();
-+    if (!register_ibus_engine ())
-         return;
--    }
- 
-     create_window ();
-     /* FIXME:
-@@ -357,6 +421,7 @@ test_compose (void)
-     g_log_set_always_fatal (flags);
- }
- 
-+
- int
- main (int argc, char *argv[])
- {
-@@ -380,10 +445,12 @@ main (int argc, char *argv[])
- #else
-     test_name = g_strdup (g_getenv ("LANG"));
- #endif
--    if (!test_name || !g_ascii_strncasecmp (test_name, "en_US", 5)) {
-+    if (m_compose_file &&
-+        (!test_name || !g_ascii_strncasecmp (test_name, "en_US", 5))) {
-         g_free (test_name);
-         test_name = g_path_get_basename (m_compose_file);
-     }
-+    m_loop = g_main_loop_new (NULL, TRUE);
-     test_path = g_build_filename ("/ibus-compose", test_name, NULL);
-     g_test_add_func (test_path, test_compose);
-     g_free (test_path);
-diff --git a/src/tests/ibus-engine-switch.c b/src/tests/ibus-engine-switch.c
-index a1eeba2a..b50bac59 100644
---- a/src/tests/ibus-engine-switch.c
-+++ b/src/tests/ibus-engine-switch.c
-@@ -1,6 +1,7 @@
- /* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
- 
- #include <string.h>
-+#include <unistd.h>
- #include "ibus.h"
- 
- static IBusBus *bus;
-@@ -47,6 +48,7 @@ change_context_engine (IBusInputContext *context)
-         g_assert_cmpstr (ibus_engine_desc_get_name (engine_desc),
-                          ==,
-                          engine_names[i]);
-+        g_object_unref (engine_desc);
-     }
- }
- 
-@@ -61,7 +63,7 @@ static void
- global_engine_changed_cb (IBusBus *bus, gchar *name, gpointer user_data)
- {
-     GlobalEngineChangedData *data = (GlobalEngineChangedData *) user_data;
--    if (data->count++ == 0)
-+    if (data->count++ == 1)
-         ibus_quit ();
- }
- 
-@@ -84,6 +86,35 @@ change_global_engine_cb (gpointer user_data)
-     return FALSE;
- }
- 
-+gboolean
-+_wait_for_key_release_cb (gpointer user_data)
-+{
-+    GMainLoop *loop = (GMainLoop *)user_data;
-+    /* If this program is invoked by manual with Enter key in GNOME
-+     * Wayland session, ibus_input_context_focus_in() can be called in
-+     * test_context_engine_set_by_global() before the key release of
-+     * the Enter key so ibus/bus/inputcontext.c:_ic_process_key_event()
-+     * could call another bus_input_context_focus_in() in that test case
-+     * and fail.
-+     */
-+    g_test_message ("Wait for 3 seconds for key release event");
-+    g_main_loop_quit (loop);
-+    return G_SOURCE_REMOVE;
-+}
-+
-+static void
-+test_init (void)
-+{
-+    char *tty_name = ttyname (STDIN_FILENO);
-+    GMainLoop *loop = g_main_loop_new (NULL, TRUE);
-+    g_test_message ("Test on %s", tty_name ? tty_name : "(null)");
-+    if (tty_name && g_strstr_len (tty_name, -1, "pts")) {
-+        g_timeout_add_seconds (3, _wait_for_key_release_cb, loop);
-+        g_main_loop_run (loop);
-+    }
-+    g_main_loop_unref (loop);
-+}
-+
- static void
- test_global_engine (void)
- {
-@@ -105,6 +136,10 @@ test_global_engine (void)
-     } else {
-         data.reverse = FALSE;
-     }
-+    g_test_message ("Initial engine name: %s",
-+                    desc ? ibus_engine_desc_get_name (desc) : "(null)");
-+    if (desc)
-+        g_object_unref (desc);
- 
-     data.count = 0;
- 
-@@ -112,7 +147,7 @@ test_global_engine (void)
-                                    "global-engine-changed",
-                                    G_CALLBACK (global_engine_changed_cb),
-                                    &data);
--    data.timeout_id = g_timeout_add_seconds (1, timeout_cb, &data);
-+    data.timeout_id = g_timeout_add_seconds (3, timeout_cb, &data);
-     data.idle_id = g_idle_add ((GSourceFunc) change_global_engine_cb, &data);
- 
-     ibus_main ();
-@@ -144,6 +179,7 @@ test_context_engine (void)
-     change_context_engine (context);
-     engine_desc = ibus_input_context_get_engine (context);
-     g_assert_cmpstr (ibus_engine_desc_get_name (engine_desc), ==, AFTER_ENGINE);
-+    g_object_unref (engine_desc);
- 
-     g_object_unref (context);
- }
-@@ -171,6 +207,7 @@ test_context_engine_set_by_global (void)
- 
-     engine_desc = ibus_input_context_get_engine (context);
-     g_assert_cmpstr (ibus_engine_desc_get_name (engine_desc), ==, AFTER_ENGINE);
-+    g_object_unref (engine_desc);
- 
-     g_object_unref (context);
- }
-@@ -199,9 +236,11 @@ test_context_engine_set_by_focus (void)
- 
-     engine_desc = ibus_input_context_get_engine (context);
-     g_assert_cmpstr (ibus_engine_desc_get_name (engine_desc), ==, "dummy");
-+    g_object_unref (engine_desc);
- 
-     engine_desc = ibus_input_context_get_engine (another_context);
-     g_assert_cmpstr (ibus_engine_desc_get_name (engine_desc), ==, AFTER_ENGINE);
-+    g_object_unref (engine_desc);
- 
-     g_object_unref (context);
-     g_object_unref (another_context);
-@@ -220,6 +259,8 @@ main (gint    argc,
- 
-     ibus_bus_set_watch_ibus_signal (bus, TRUE);
- 
-+    g_test_add_func ("/ibus/engine-switch/test-init",
-+                     test_init);
-     g_test_add_func ("/ibus/engine-switch/global-engine",
-                      test_global_engine);
-     g_test_add_func ("/ibus/engine-switch/context-engine",
-diff --git a/src/tests/xkb-latin-layouts b/src/tests/xkb-latin-layouts
-index 92464234..45c99358 100755
---- a/src/tests/xkb-latin-layouts
-+++ b/src/tests/xkb-latin-layouts
-@@ -120,6 +120,15 @@ EOF_READ_XKB
- 
- main()
- {
-+    if [ x"$DISPLAY" = x ] ; then
-+        echo "skip: No display. Maybe headless mode."
-+        exit 77
-+    fi
-+    if ! which setxkbmap > /dev/null ; then
-+        echo "skip: No setxkbmap"
-+        exit 77
-+    fi
-+
-     parse_args "$@"
- 
-     if [ x"$INSTALLED_SCHEMAS_DIR" != x ] ; then
--- 
-2.45.0
-
-From 44f9a5957e4c53b4a6e6b3f42b56f2d20d58a21c Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Sat, 27 Jul 2024 19:04:39 +0900
-Subject: [PATCH 3/6] src/tests: Enable GTK4
-
-Seems GTK3 does not work in GNOME Wayland headless session to get
-GdkMonitor in gtk_init() and trying to migrate the test cases to
-GTK4.
-Calling ibus_init() twice with g_static_resource_init() causes a
-memory error and fix it.
-
-BUG=https://github.com/ibus/ibus/pull/2657
----
- src/tests/Makefile.am     |   8 +--
- src/tests/ibus-compose.c  | 147 ++++++++++++++++++++++++++++++++------
- src/tests/ibus-keypress.c | 146 ++++++++++++++++++++++++++++++-------
- 3 files changed, 251 insertions(+), 50 deletions(-)
-
-diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am
-index 6c4c86cf..10acd0a7 100644
---- a/src/tests/Makefile.am
-+++ b/src/tests/Makefile.am
-@@ -182,8 +182,8 @@ ibus_bus_SOURCES = ibus-bus.c
- ibus_bus_LDADD = $(prog_ldadd)
- 
- ibus_compose_SOURCES = ibus-compose.c
--ibus_compose_CFLAGS = @GTK3_CFLAGS@
--ibus_compose_LDADD = $(prog_ldadd) @GTK3_LIBS@
-+ibus_compose_CFLAGS = @GTK4_CFLAGS@
-+ibus_compose_LDADD = $(prog_ldadd) @GTK4_LIBS@
- 
- ibus_config_SOURCES = ibus-config.c
- ibus_config_LDADD = $(prog_ldadd)
-@@ -207,8 +207,8 @@ ibus_keynames_SOURCES = ibus-keynames.c
- ibus_keynames_LDADD = $(prog_ldadd)
- 
- ibus_keypress_SOURCES = ibus-keypress.c
--ibus_keypress_CFLAGS = @GTK3_CFLAGS@ @XTEST_CFLAGS@
--ibus_keypress_LDADD = $(prog_ldadd) @GTK3_LIBS@ @XTEST_LIBS@
-+ibus_keypress_CFLAGS = @GTK4_CFLAGS@ @XTEST_CFLAGS@
-+ibus_keypress_LDADD = $(prog_ldadd) @GTK4_LIBS@ @XTEST_LIBS@
- 
- ibus_registry_SOURCES = ibus-registry.c
- ibus_registry_LDADD = $(prog_ldadd)
-diff --git a/src/tests/ibus-compose.c b/src/tests/ibus-compose.c
-index 660aee7f..57851b0a 100644
---- a/src/tests/ibus-compose.c
-+++ b/src/tests/ibus-compose.c
-@@ -13,6 +13,9 @@ static IBusComposeTableEx *m_compose_table;
- static IBusEngine *m_engine;
- static gchar *m_srcdir;
- static GMainLoop *m_loop;
-+#if GTK_CHECK_VERSION (4, 0, 0)
-+static gboolean m_list_toplevel;
-+#endif
- 
- typedef enum {
-     TEST_CREATE_ENGINE,
-@@ -25,9 +28,16 @@ typedef struct _TestIdleData {
- } TestIdleData;
- 
- extern guint ibus_compose_key_flag (guint key);
-+
-+#if GTK_CHECK_VERSION (4, 0, 0)
-+static void     event_controller_enter_cb (GtkEventController *controller,
-+                                           gpointer            user_data);
-+#else
- static gboolean window_focus_in_event_cb (GtkWidget     *entry,
-                                           GdkEventFocus *event,
-                                           gpointer       data);
-+#endif
-+
- 
- static gchar *
- get_compose_path ()
-@@ -76,7 +86,11 @@ idle_cb (gpointer user_data)
-             if (g_main_loop_is_running (m_loop))
-                 g_main_loop_quit (m_loop);
-             g_clear_pointer (&m_loop, g_main_loop_unref);
-+#if GTK_CHECK_VERSION (4, 0, 0)
-+            m_list_toplevel = FALSE;
-+#else
-             gtk_main_quit ();
-+#endif
-         }
-         data->idle_id = 0;
-         break;
-@@ -170,13 +184,28 @@ register_ibus_engine ()
- }
- 
- 
-+static void
-+window_destroy_cb (void)
-+{
-+#if GTK_CHECK_VERSION (4, 0, 0)
-+    m_list_toplevel = FALSE;
-+#else
-+    gtk_main_quit ();
-+#endif
-+}
-+
-+
- static void
- set_engine_cb (GObject      *object,
-                GAsyncResult *res,
-                gpointer      user_data)
- {
-     IBusBus *bus = IBUS_BUS (object);
-+#if GTK_CHECK_VERSION (4, 0, 0)
-+    GtkEventController *controller = GTK_EVENT_CONTROLLER (user_data);
-+#else
-     GtkWidget *entry = GTK_WIDGET (user_data);
-+#endif
-     GError *error = NULL;
-     static TestIdleData data = { .category = TEST_COMMIT_TEXT, .idle_id = 0 };
-     int i, j;
-@@ -254,24 +283,55 @@ set_engine_cb (GObject      *object,
-         }
-     }
- 
-+#if GTK_CHECK_VERSION (4, 0, 0)
-+    g_signal_handlers_disconnect_by_func (
-+            controller,
-+            G_CALLBACK (event_controller_enter_cb),
-+            NULL);
-+#else
-     g_signal_handlers_disconnect_by_func (entry, 
-                                           G_CALLBACK (window_focus_in_event_cb),
-                                           NULL);
-+#endif
-     data.idle_id = g_timeout_add_seconds (10, idle_cb, &data);
- }
- 
--static gboolean
--window_focus_in_event_cb (GtkWidget *entry, GdkEventFocus *event, gpointer data)
-+
-+static void
-+set_engine (gpointer user_data)
- {
-+    g_test_message ("set_engine() is calling");
-     g_assert (m_bus != NULL);
-     ibus_bus_set_global_engine_async (m_bus,
-                                       "xkbtest:us::eng",
-                                       -1,
-                                       NULL,
-                                       set_engine_cb,
--                                      entry);
-+                                      user_data);
-+}
-+
-+
-+#if GTK_CHECK_VERSION (4, 0, 0)
-+static void
-+event_controller_enter_cb (GtkEventController *controller,
-+                           gpointer            user_data)
-+{
-+    g_test_message ("EventController emits \"enter\" signal");
-+    set_engine (controller);
-+}
-+
-+#else
-+
-+static gboolean
-+window_focus_in_event_cb (GtkWidget     *entry,
-+                          GdkEventFocus *event,
-+                          gpointer       data)
-+{
-+    g_test_message ("Entry emits \"focus-in-event\" signal");
-+    set_engine (entry);
-     return FALSE;
- }
-+#endif
- 
- 
- static void
-@@ -293,7 +353,9 @@ window_inserted_text_cb (GtkEntryBuffer *buffer,
-     int seq;
-     gunichar code = g_utf8_get_char (chars);
-     const gchar *test;
-+#if ! GTK_CHECK_VERSION (4, 0, 0)
-     GtkEntry *entry = GTK_ENTRY (user_data);
-+#endif
-     IBusComposeTablePrivate *priv;
-     static TestIdleData data = { .category = TEST_COMMIT_TEXT, .idle_id = 0 };
- 
-@@ -306,6 +368,10 @@ window_inserted_text_cb (GtkEntryBuffer *buffer,
-         n_loop = 0;
-         return;
-     }
-+#endif
-+#if GTK_CHECK_VERSION (4, 0, 0)
-+    if (code == 0)
-+        return;
- #endif
-     i = stride + (m_compose_table->max_seq_len + 2) - 2;
-     seq = (i + 2) / (m_compose_table->max_seq_len + 2);
-@@ -318,12 +384,12 @@ window_inserted_text_cb (GtkEntryBuffer *buffer,
-             test = RED "FAIL" NC;
-             g_test_fail ();
-         }
--        g_print ("%05d/%05d %s expected: %04X typed: %04X\n",
--                 seq,
--                 m_compose_table->n_seqs,
--                 test,
--                 m_compose_table->data[i],
--                 code);
-+        g_test_message ("%05d/%05d %s expected: %04X typed: %04X",
-+                        seq,
-+                        m_compose_table->n_seqs,
-+                        test,
-+                        m_compose_table->data[i],
-+                        code);
-     } else {
-         const gchar *p = chars;
-         guint num = priv->data_first[i];
-@@ -344,14 +410,14 @@ window_inserted_text_cb (GtkEntryBuffer *buffer,
-             test = RED "FAIL" NC;
-             g_test_fail ();
-         }
--        g_print ("%05d/%05ld %s expected: %04X[%d] typed: %04X\n",
--                 seq,
--                 priv->first_n_seqs,
--                 test,
--                 valid_output ? priv->data_second[index]
--                         : priv->data_second[index + j],
--                 valid_output ? index + num : index + j,
--                 valid_output ? g_utf8_get_char (chars) : code);
-+        g_test_message ("%05d/%05ld %s expected: %04X[%d] typed: %04X",
-+                        seq,
-+                        priv->first_n_seqs,
-+                        test,
-+                        valid_output ? priv->data_second[index]
-+                                : priv->data_second[index + j],
-+                        valid_output ? index + num : index + j,
-+                        valid_output ? g_utf8_get_char (chars) : code);
-     }
- 
-     stride += m_compose_table->max_seq_len + 2;
-@@ -377,7 +443,11 @@ window_inserted_text_cb (GtkEntryBuffer *buffer,
-     n_loop++;
- #endif
- 
-+#if GTK_CHECK_VERSION (4, 0, 0)
-+    gtk_entry_buffer_set_text (buffer, "", 0);
-+#else
-     gtk_entry_set_text (entry, "");
-+#endif
-     g_main_loop_quit (m_loop);
- }
- 
-@@ -385,19 +455,43 @@ window_inserted_text_cb (GtkEntryBuffer *buffer,
- static void
- create_window ()
- {
--    GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
--    GtkWidget *entry = gtk_entry_new ();
-+    GtkWidget *window;
-+    GtkWidget *entry;
-     GtkEntryBuffer *buffer;
-+#if GTK_CHECK_VERSION (4, 0, 0)
-+    GtkEventController *controller;
-+    GtkEditable *text;
-+
-+    window = gtk_window_new ();
-+#else
-+    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-+#endif
-+    entry = gtk_entry_new ();
- 
-     g_signal_connect (window, "destroy",
--                      G_CALLBACK (gtk_main_quit), NULL);
-+                      G_CALLBACK (window_destroy_cb), NULL);
-+#if GTK_CHECK_VERSION (4, 0, 0)
-+    controller = gtk_event_controller_focus_new ();
-+    text = gtk_editable_get_delegate (GTK_EDITABLE (entry));
-+    g_signal_connect (controller, "enter",
-+                      G_CALLBACK (event_controller_enter_cb), NULL);
-+    gtk_widget_add_controller (GTK_WIDGET (text), controller);
-+#else
-     g_signal_connect (entry, "focus-in-event",
-                       G_CALLBACK (window_focus_in_event_cb), NULL);
-+#endif
-     buffer = gtk_entry_get_buffer (GTK_ENTRY (entry));
-     g_signal_connect (buffer, "inserted-text",
-                       G_CALLBACK (window_inserted_text_cb), entry);
-+
-+#if GTK_CHECK_VERSION (4, 0, 0)
-+    gtk_window_set_child (GTK_WINDOW (window), entry);
-+    gtk_window_set_focus (GTK_WINDOW (window), entry);
-+    gtk_window_present (GTK_WINDOW (window));
-+#else
-     gtk_container_add (GTK_CONTAINER (window), entry);
-     gtk_widget_show_all (window);
-+#endif
- }
- 
- 
-@@ -408,6 +502,9 @@ test_compose (void)
-     if (!register_ibus_engine ())
-         return;
- 
-+#if GTK_CHECK_VERSION (4, 0, 0)
-+    m_list_toplevel = TRUE;
-+#endif
-     create_window ();
-     /* FIXME:
-      * IBusIMContext opens GtkIMContextSimple as the slave and
-@@ -417,7 +514,13 @@ test_compose (void)
-      " "GTK+ supports to output one char only: "
-      */
-     flags = g_log_set_always_fatal (G_LOG_LEVEL_CRITICAL);
-+#if GTK_CHECK_VERSION (4, 0, 0)
-+    gtk_window_list_toplevels ();
-+    while (m_list_toplevel)
-+        g_main_context_iteration (NULL, TRUE);
-+#else
-     gtk_main ();
-+#endif
-     g_log_set_always_fatal (flags);
- }
- 
-@@ -435,7 +538,11 @@ main (int argc, char *argv[])
-     if (!g_setenv ("NO_AT_BRIDGE", "1", TRUE))
-         g_message ("Failed setenv NO_AT_BRIDGE\n");
-     g_test_init (&argc, &argv, NULL);
-+#if GTK_CHECK_VERSION (4, 0, 0)
-+    gtk_init ();
-+#else
-     gtk_init (&argc, &argv);
-+#endif
- 
-     m_srcdir = (argc > 1 && strlen (argv[1]) < FILENAME_MAX)
-             ? g_strdup (argv[1]) : g_strdup (".");
-diff --git a/src/tests/ibus-keypress.c b/src/tests/ibus-keypress.c
-index d44f39b2..a9288260 100644
---- a/src/tests/ibus-keypress.c
-+++ b/src/tests/ibus-keypress.c
-@@ -1,12 +1,16 @@
- #include <gtk/gtk.h>
-+#if GTK_CHECK_VERSION (4, 0, 0)
-+#include <gdk/x11/gdkx.h>
-+#else
- #include <gdk/gdkx.h>
-+#endif
- #include "ibus.h"
- #include <stdlib.h>
- #include <X11/Xlib.h>
- #include <X11/extensions/XTest.h>
- 
- #ifdef GDK_WINDOWING_WAYLAND
--#if GTK_CHECK_VERSION (3, 98, 4)
-+#if GTK_CHECK_VERSION (4, 0, 0)
- #include <gdk/wayland/gdkwayland.h>
- #else
- #include <gdk/gdkwayland.h>
-@@ -51,12 +55,18 @@ static const gunichar test_results[][60] = {
- };
- 
- 
--IBusBus *m_bus;
--IBusEngine *m_engine;
-+static IBusBus *m_bus;
-+static IBusEngine *m_engine;
-+#if GTK_CHECK_VERSION (4, 0, 0)
-+static gboolean m_list_toplevel;
- 
-+static gboolean event_controller_enter_cb (GtkEventController *controller,
-+                                           gpointer            user_data);
-+#else
- static gboolean window_focus_in_event_cb (GtkWidget     *entry,
-                                           GdkEventFocus *event,
-                                           gpointer       data);
-+#endif
- 
- static IBusEngine *
- create_engine_cb (IBusFactory *factory, const gchar *name, gpointer data)
-@@ -118,7 +128,11 @@ static gboolean
- finit (gpointer data)
- {
-     g_critical ("time out");
-+#if GTK_CHECK_VERSION (4, 0, 0)
-+    m_list_toplevel = FALSE;
-+#else
-     gtk_main_quit ();
-+#endif
-     return FALSE;
- }
- 
-@@ -173,27 +187,41 @@ send_key_event (Display *xdisplay,
-     }
- }
- 
-+static void
-+window_destroy_cb (void)
-+{
-+#if GTK_CHECK_VERSION (4, 0, 0)
-+    m_list_toplevel = FALSE;
-+#else
-+    gtk_main_quit ();
-+#endif
-+}
-+
- static void
- set_engine_cb (GObject      *object,
-                GAsyncResult *res,
--               gpointer      data)
-+               gpointer      user_data)
- {
-     IBusBus *bus = IBUS_BUS (object);
--    GtkWidget *entry = GTK_WIDGET (data);
-+#if ! GTK_CHECK_VERSION (4, 0, 0)
-+    GtkWidget *entry = GTK_WIDGET (user_data);
-+#endif
-     GdkDisplay *display;
-     Display *xdisplay = NULL;
-     GError *error = NULL;
-     int i, j;
- 
--    g_assert (GTK_IS_ENTRY (entry));
--
-     if (!ibus_bus_set_global_engine_async_finish (bus, res, &error)) {
-         g_critical ("set engine failed: %s", error->message);
-         g_error_free (error);
-         return;
-     }
- 
-+#if GTK_CHECK_VERSION (4, 0, 0)
-+    display = gdk_display_get_default ();
-+#else
-     display = gtk_widget_get_display (entry);
-+#endif
-     g_assert (GDK_IS_X11_DISPLAY (display));
-     xdisplay = gdk_x11_display_get_xdisplay (display);
-     g_return_if_fail (xdisplay);
-@@ -210,8 +238,8 @@ set_engine_cb (GObject      *object,
-     g_timeout_add_seconds (10, finit, NULL);
- }
- 
--static gboolean
--window_focus_in_event_cb (GtkWidget *entry, GdkEventFocus *event, gpointer data)
-+static void
-+set_engine (gpointer user_data)
- {
-     g_assert (m_bus != NULL);
-     ibus_bus_set_global_engine_async (m_bus,
-@@ -219,18 +247,40 @@ window_focus_in_event_cb (GtkWidget *entry, GdkEventFocus *event, gpointer data)
-                                       -1,
-                                       NULL,
-                                       set_engine_cb,
--                                      entry);
-+                                      user_data);
-+}
-+
-+#if GTK_CHECK_VERSION (4, 0, 0)
-+static gboolean
-+event_controller_enter_cb (GtkEventController *controller,
-+                           gpointer            user_data)
-+{
-+    set_engine (controller);
-+    return FALSE;
-+}
-+
-+#else
-+
-+static gboolean
-+window_focus_in_event_cb (GtkWidget     *entry,
-+                          GdkEventFocus *event,
-+                          gpointer       user_data)
-+{
-+    set_engine (entry);
-     return FALSE;
- }
-+#endif
- 
- static void
- window_inserted_text_cb (GtkEntryBuffer *buffer,
-                          guint           position,
-                          const gchar    *chars,
-                          guint           nchars,
--                         gpointer        data)
-+                         gpointer        user_data)
- {
--    GtkWidget *entry = data;
-+#if ! GTK_CHECK_VERSION (4, 0, 0)
-+    GtkWidget *entry = user_data;
-+#endif
-     static int i = 0;
-     static int j = 0;
- 
-@@ -242,10 +292,19 @@ window_inserted_text_cb (GtkEntryBuffer *buffer,
-         g_print ("\n");
-         i++;
-         j = 0;
--        if (test_results[i][0] == 0)
-+        if (test_results[i][0] == 0) {
-+#if GTK_CHECK_VERSION (4, 0, 0)
-+            m_list_toplevel = FALSE;
-+#else
-             gtk_main_quit ();
--        else
-+#endif
-+        } else {
-+#if GTK_CHECK_VERSION (4, 0, 0)
-+            gtk_entry_buffer_set_text (buffer, "", 1);
-+#else
-             gtk_entry_set_text (GTK_ENTRY (entry), "");
-+#endif
-+        }
-         return;
-     }
-     g_assert (g_utf8_get_char (chars) == test_results[i][j]);
-@@ -255,19 +314,39 @@ window_inserted_text_cb (GtkEntryBuffer *buffer,
- static void
- create_window ()
- {
--    GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-+    GtkWidget *window;
-     GtkWidget *entry = gtk_entry_new ();
-     GtkEntryBuffer *buffer;
-+#if GTK_CHECK_VERSION (4, 0, 0)
-+    GtkEventController *controller;
-+
-+    window = gtk_window_new ();
-+#else
-+    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-+#endif
- 
-     g_signal_connect (window, "destroy",
--                      G_CALLBACK (gtk_main_quit), NULL);
-+                      G_CALLBACK (window_destroy_cb), NULL);
-+#if GTK_CHECK_VERSION (4, 0, 0)
-+    controller = gtk_event_controller_focus_new ();
-+    g_signal_connect (controller, "enter",
-+                      G_CALLBACK (event_controller_enter_cb), NULL);
-+    gtk_widget_add_controller (window, controller);
-+#else
-     g_signal_connect (entry, "focus-in-event",
-                       G_CALLBACK (window_focus_in_event_cb), NULL);
-+#endif
-     buffer = gtk_entry_get_buffer (GTK_ENTRY (entry));
-     g_signal_connect (buffer, "inserted-text",
-                       G_CALLBACK (window_inserted_text_cb), entry);
-+#if GTK_CHECK_VERSION (4, 0, 0)
-+    gtk_window_set_child (GTK_WINDOW (window), entry);
-+    gtk_window_set_focus (GTK_WINDOW (window), entry);
-+    gtk_window_present (GTK_WINDOW (window));
-+#else
-     gtk_container_add (GTK_CONTAINER (window), entry);
-     gtk_widget_show_all (window);
-+#endif
- }
- 
- static void
-@@ -277,6 +356,16 @@ test_keypress (void)
-     int status = 0;
-     GError *error = NULL;
- 
-+#ifdef GDK_WINDOWING_WAYLAND
-+    {
-+        GdkDisplay *display = gdk_display_get_default ();
-+        if (GDK_IS_WAYLAND_DISPLAY (display)) {
-+            g_test_skip_printf ("setxkbmap and XTEST do not work in Wayland.");
-+            return;
-+        }
-+    }
-+#endif
-+
-     /* localectl does not change the session keymap. */
-     path = g_find_program_in_path ("setxkbmap");
-     if (path) {
-@@ -287,33 +376,38 @@ test_keypress (void)
-     g_free (path);
-     g_assert (register_ibus_engine ());
- 
-+#if GTK_CHECK_VERSION (4, 0, 0)
-+    m_list_toplevel = TRUE;
-+#endif
-     create_window ();
-+#if GTK_CHECK_VERSION (4, 0, 0)
-+    while (m_list_toplevel)
-+        g_main_context_iteration (NULL, TRUE);
-+#else
-     gtk_main ();
-+#endif
- }
- 
- int
- main (int argc, char *argv[])
- {
--    ibus_init ();
-+    /* ibus_init() should not be called here because
-+     * ibus_init() is called from IBus Gtk4 IM module even if
-+     * GTK_IM_MODULE=wayland is exported.
-+     */
-     /* Avoid a warning of "AT-SPI: Could not obtain desktop path or name"
-      * with gtk_main().
-      */
-     if (!g_setenv ("NO_AT_BRIDGE", "1", TRUE))
-         g_message ("Failed setenv NO_AT_BRIDGE\n");
-     g_test_init (&argc, &argv, NULL);
-+#if GTK_CHECK_VERSION (4, 0, 0)
-+    gtk_init ();
-+#else
-     gtk_init (&argc, &argv);
--#ifdef GDK_WINDOWING_WAYLAND
--    {
--        GdkDisplay *display = gdk_display_get_default ();
--        if (GDK_IS_WAYLAND_DISPLAY (display)) {
--            g_print ("setxkbmap and XTEST do not work in Wayland.\n");
--            return 0;
--        }
--    }
- #endif
- 
-     g_test_add_func ("/ibus/keyrepss", test_keypress);
- 
--
-     return g_test_run ();
- }
--- 
-2.45.0
-
-From a2689c4d66d1f5ae73d2ddbbb94374c98914a029 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Sat, 27 Jul 2024 19:07:58 +0900
-Subject: [PATCH 4/6] src/tests: Fix test cases in GNOME Xorg in ibus-compose
-
-"focus-in" signal is sent to IBus GtkIMModule with a delay in GNOME
-desktop session and the signal order is not fixed with GTK_PHASE_TARGET
-also "focus-in" signal is also sent with GtkText "realize"' signal.
-Now the test cases wait for GtkText 'realize' signal.
-This fixes the test cases in GNOME Xorg but there are still sone issues
-in GNOME Wayland.
-
-BUG=https://github.com/ibus/ibus/pull/2657
----
- src/tests/ibus-compose.c | 71 ++++++++++++++++++++++++++++++++++++++--
- 1 file changed, 68 insertions(+), 3 deletions(-)
-
-diff --git a/src/tests/ibus-compose.c b/src/tests/ibus-compose.c
-index 57851b0a..e9f102a1 100644
---- a/src/tests/ibus-compose.c
-+++ b/src/tests/ibus-compose.c
-@@ -39,6 +39,23 @@ static gboolean window_focus_in_event_cb (GtkWidget     *entry,
- #endif
- 
- 
-+gboolean
-+_wait_for_key_release_cb (gpointer user_data)
-+{
-+    GMainLoop *loop = (GMainLoop *)user_data;
-+    /* If this program is invoked by manual with Enter key in GNOME
-+     * Wayland session, ibus_input_context_focus_in() can be called in
-+     * test_context_engine_set_by_global() before the key release of
-+     * the Enter key so ibus/bus/inputcontext.c:_ic_process_key_event()
-+     * could call another bus_input_context_focus_in() in that test case
-+     * and fail.
-+     */
-+    g_test_message ("Wait for 3 seconds for key release event");
-+    g_main_loop_quit (loop);
-+    return G_SOURCE_REMOVE;
-+}
-+
-+
- static gchar *
- get_compose_path ()
- {
-@@ -312,12 +329,45 @@ set_engine (gpointer user_data)
- 
- 
- #if GTK_CHECK_VERSION (4, 0, 0)
-+static gboolean
-+event_controller_enter_delay (gpointer user_data)
-+{
-+    GtkEventController *controller = (GtkEventController *)user_data;
-+    GtkWidget *text = gtk_event_controller_get_widget (controller);
-+    static int i = 0;
-+
-+    /* Wait for gtk_text_realize() which calls gtk_text_im_set_focus_in()
-+     * while gtk_text_focus_changed() also calls gtk_text_im_set_focus_in()
-+     * in GNOME Xorg.
-+     */
-+    if (gtk_widget_get_realized (text)) {
-+        set_engine (user_data);
-+        return G_SOURCE_REMOVE;
-+    }
-+    if (i++ == 10) {
-+        g_test_fail_printf ("Window is not realized with %d times", i);
-+        return G_SOURCE_REMOVE;
-+    }
-+    g_test_message ("event_controller_enter_delay %d", i);
-+    return G_SOURCE_CONTINUE;
-+}
-+
-+
- static void
- event_controller_enter_cb (GtkEventController *controller,
-                            gpointer            user_data)
- {
-+    static guint id = 0;
-+
-     g_test_message ("EventController emits \"enter\" signal");
--    set_engine (controller);
-+    /* Call an idle function because gtk_widget_add_controller()
-+     * calls g_list_prepend() for event_controllers and this controller is
-+     * always called before "gtk-text-focus-controller"
-+     * is caleld and the IM context does not receive the focus-in yet.
-+     */
-+    if (id)
-+        return;
-+    id = g_idle_add (event_controller_enter_delay, controller);
- }
- 
- #else
-@@ -473,8 +523,9 @@ create_window ()
- #if GTK_CHECK_VERSION (4, 0, 0)
-     controller = gtk_event_controller_focus_new ();
-     text = gtk_editable_get_delegate (GTK_EDITABLE (entry));
--    g_signal_connect (controller, "enter",
--                      G_CALLBACK (event_controller_enter_cb), NULL);
-+    gtk_event_controller_set_propagation_phase (controller, GTK_PHASE_BUBBLE);
-+    g_signal_connect_after (controller, "enter",
-+                            G_CALLBACK (event_controller_enter_cb), NULL);
-     gtk_widget_add_controller (GTK_WIDGET (text), controller);
- #else
-     g_signal_connect (entry, "focus-in-event",
-@@ -495,6 +546,19 @@ create_window ()
- }
- 
- 
-+static void
-+test_init (void)
-+{
-+    char *tty_name = ttyname (STDIN_FILENO);
-+    GMainLoop *loop = g_main_loop_new (NULL, TRUE);
-+    g_test_message ("Test on %s", tty_name ? tty_name : "(null)");
-+    if (tty_name && g_strstr_len (tty_name, -1, "pts")) {
-+        g_timeout_add_seconds (3, _wait_for_key_release_cb, loop);
-+        g_main_loop_run (loop);
-+    }
-+    g_main_loop_unref (loop);
-+}
-+
- static void
- test_compose (void)
- {
-@@ -557,6 +621,7 @@ main (int argc, char *argv[])
-         g_free (test_name);
-         test_name = g_path_get_basename (m_compose_file);
-     }
-+    g_test_add_func ("/ibus-compose/test-init", test_init);
-     m_loop = g_main_loop_new (NULL, TRUE);
-     test_path = g_build_filename ("/ibus-compose", test_name, NULL);
-     g_test_add_func (test_path, test_compose);
--- 
-2.45.0
-
-From e65110a9bed03c981884e28ff44e2ac1f639df45 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Sat, 27 Jul 2024 19:09:10 +0900
-Subject: [PATCH 5/6] src/tests: Fix ibus-compose for GNOME Wayland
-
-mutter calls meta_wayland_text_input_set_focus() after meta_window_show()
-and the delayed focus-in/out events are sent to IBusEngine.
-Now sleep() is added in ibus-compose because MetaWaylandInputMethod
-cannot know the application status while GTK application is already
-realized.
-
-Also GTK4 compose table supports 16bit compose keys only and it
-causes a warning with pt-BR and fi-FI compose tables but the warning
-is treated as a failure with g_test_init().
-Set LANG=en_US.UTF-8 for thw workaround to test pt-BR and fi-FI IBus
-compose tables.
-
-BUG=https://github.com/ibus/ibus/pull/2657
----
- src/tests/ibus-compose.c | 223 ++++++++++++++++++++++++++++++++++-----
- 1 file changed, 195 insertions(+), 28 deletions(-)
-
-diff --git a/src/tests/ibus-compose.c b/src/tests/ibus-compose.c
-index e9f102a1..0679c259 100644
---- a/src/tests/ibus-compose.c
-+++ b/src/tests/ibus-compose.c
-@@ -7,19 +7,24 @@
- #define RED   "\033[0;31m"
- #define NC    "\033[0m"
- 
-+static gchar *m_test_name;
-+static gchar *m_session_name;
- static IBusBus *m_bus;
- static gchar *m_compose_file;
- static IBusComposeTableEx *m_compose_table;
- static IBusEngine *m_engine;
- static gchar *m_srcdir;
-+static gboolean m_is_gtk_32bit_compose_error;
- static GMainLoop *m_loop;
-+static char *m_engine_is_focused;
- #if GTK_CHECK_VERSION (4, 0, 0)
- static gboolean m_list_toplevel;
- #endif
- 
- typedef enum {
-+    TEST_COMMIT_TEXT,
-     TEST_CREATE_ENGINE,
--    TEST_COMMIT_TEXT
-+    TEST_DELAYED_FOCUS_IN
- } TestIDleCategory;
- 
- typedef struct _TestIdleData {
-@@ -39,6 +44,19 @@ static gboolean window_focus_in_event_cb (GtkWidget     *entry,
- #endif
- 
- 
-+gboolean
-+is_integrated_desktop ()
-+{
-+    if (!m_session_name)
-+        m_session_name = g_strdup (g_getenv ("XDG_SESSION_DESKTOP"));
-+    if (!m_session_name)
-+        return FALSE;
-+    if (!g_ascii_strncasecmp (m_session_name, "gnome", strlen ("gnome")))
-+       return TRUE;
-+    return FALSE;
-+}
-+
-+
- gboolean
- _wait_for_key_release_cb (gpointer user_data)
- {
-@@ -63,11 +81,15 @@ get_compose_path ()
-     const gchar * const *l;
-     gchar *compose_path = NULL;
- 
-+    if (m_is_gtk_32bit_compose_error)
-+        g_assert (g_setenv ("LANG", m_test_name, TRUE));
- #if GLIB_CHECK_VERSION (2, 58, 0)
-     langs = g_get_language_names_with_category ("LC_CTYPE");
- #else
-     langs = g_get_language_names ();
- #endif
-+    if (m_is_gtk_32bit_compose_error)
-+        g_assert (g_setenv ("LANG", "en_US.UTF-8", TRUE));
-     for (l = langs; *l; l++) {
-         if (g_str_has_prefix (*l, "en_US"))
-             break;
-@@ -91,6 +113,9 @@ gboolean
- idle_cb (gpointer user_data)
- {
-     TestIdleData *data = (TestIdleData *)user_data;
-+    static int n = 0;
-+    gboolean terminate_program = FALSE;
-+
-     g_assert (data);
-     switch (data->category) {
-     case TEST_CREATE_ENGINE:
-@@ -103,23 +128,75 @@ idle_cb (gpointer user_data)
-             if (g_main_loop_is_running (m_loop))
-                 g_main_loop_quit (m_loop);
-             g_clear_pointer (&m_loop, g_main_loop_unref);
--#if GTK_CHECK_VERSION (4, 0, 0)
--            m_list_toplevel = FALSE;
--#else
--            gtk_main_quit ();
--#endif
-+            terminate_program = TRUE;
-         }
-         data->idle_id = 0;
-         break;
-+    case TEST_DELAYED_FOCUS_IN:
-+        if (m_engine_is_focused) {
-+            data->idle_id = 0;
-+            n = 0;
-+            g_main_loop_quit (m_loop);
-+            return G_SOURCE_REMOVE;
-+        }
-+        if (n++ < 10) {
-+            g_test_message ("Waiting for \"focus-in\" signal %dth times", n);
-+            return G_SOURCE_CONTINUE;
-+        }
-+        g_test_fail_printf ("\"focus-in\" signal is timeout.");
-+        g_main_loop_quit (m_loop);
-+        terminate_program = TRUE;
-+        n = 0;
-+        break;
-     default:
-         g_test_fail_printf ("Idle func is called by wrong category:%d.",
-                             data->category);
-         break;
-     }
-+    if (terminate_program) {
-+#if GTK_CHECK_VERSION (4, 0, 0)
-+        m_list_toplevel = FALSE;
-+#else
-+        gtk_main_quit ();
-+#endif
-+    }
-     return G_SOURCE_REMOVE;
- }
- 
- 
-+static void
-+engine_focus_in_cb (IBusEngine *engine,
-+#ifdef IBUS_FOCUS_IN_ID
-+                    gchar      *object_path,
-+                    gchar      *client,
-+#endif
-+                    gpointer    user_data)
-+{
-+#ifdef IBUS_FOCUS_IN_ID
-+    g_test_message ("engine_focus_in_cb %s %s", object_path, client);
-+    m_engine_is_focused = g_strdup (client);
-+#else
-+    g_test_message ("engine_focus_in_cb");
-+    m_engine_is_focused = g_strdup ("No named");
-+#endif
-+}
-+
-+static void
-+engine_focus_out_cb (IBusEngine *engine,
-+#ifdef IBUS_FOCUS_IN_ID
-+                     gchar      *object_path,
-+#endif
-+                     gpointer    user_data)
-+{
-+#ifdef IBUS_FOCUS_IN_ID
-+    g_test_message ("engine_focus_out_cb %s", object_path);
-+#else
-+    g_test_message ("engine_focus_out_cb");
-+#endif
-+    g_clear_pointer (&m_engine_is_focused, g_free);
-+}
-+
-+
- static IBusEngine *
- create_engine_cb (IBusFactory *factory,
-                   const gchar *name,
-@@ -135,11 +212,30 @@ create_engine_cb (IBusFactory *factory,
-     g_assert (data);
-     /* Don't reset idle_id to avoid duplicated register_ibus_engine(). */
-     g_source_remove (data->idle_id);
--    m_engine = ibus_engine_new_with_type (IBUS_TYPE_ENGINE_SIMPLE,
--                                          name,
--                                          engine_path,
--                                          ibus_bus_get_connection (m_bus));
-+    m_engine = (IBusEngine *)g_object_new (
-+            IBUS_TYPE_ENGINE_SIMPLE,
-+            "engine-name",      name,
-+            "object-path",      engine_path,
-+            "connection",       ibus_bus_get_connection (m_bus),
-+#ifdef IBUS_FOCUS_IN_ID
-+            "has-focus-id",     TRUE,
-+#endif
-+            NULL);
-     g_free (engine_path);
-+
-+    m_engine_is_focused = NULL;
-+#ifdef IBUS_FOCUS_IN_ID
-+    g_signal_connect (m_engine, "focus-in-id",
-+#else
-+    g_signal_connect (m_engine, "focus-in",
-+#endif
-+                      G_CALLBACK (engine_focus_in_cb), NULL);
-+#ifdef IBUS_FOCUS_IN_ID
-+    g_signal_connect (m_engine, "focus-out-id",
-+#else
-+    g_signal_connect (m_engine, "focus-out",
-+#endif
-+                      G_CALLBACK (engine_focus_out_cb), NULL);
-     if (m_compose_file)
-         compose_path = g_build_filename (m_srcdir, m_compose_file, NULL);
-     else
-@@ -235,6 +331,13 @@ set_engine_cb (GObject      *object,
-         return;
-     }
- 
-+    /* ibus_im_context_focus_in() is called after GlboalEngine is set. */
-+    if (is_integrated_desktop () && !m_engine_is_focused) {
-+        data.category = TEST_DELAYED_FOCUS_IN;
-+        data.idle_id = g_timeout_add_seconds (1, idle_cb, &data);
-+        g_main_loop_run (m_loop);
-+        if (data.idle_id != 0)
-+            return;
-     if (m_compose_table == NULL) {
-         g_test_skip ("Your locale uses en_US compose table.");
-         idle_cb (&data);
-@@ -319,6 +422,7 @@ set_engine (gpointer user_data)
- {
-     g_test_message ("set_engine() is calling");
-     g_assert (m_bus != NULL);
-+
-     ibus_bus_set_global_engine_async (m_bus,
-                                       "xkbtest:us::eng",
-                                       -1,
-@@ -346,6 +450,11 @@ event_controller_enter_delay (gpointer user_data)
-     }
-     if (i++ == 10) {
-         g_test_fail_printf ("Window is not realized with %d times", i);
-+#if GTK_CHECK_VERSION (4, 0, 0)
-+        m_list_toplevel = FALSE;
-+#else
-+        gtk_main_quit ();
-+#endif
-         return G_SOURCE_REMOVE;
-     }
-     g_test_message ("event_controller_enter_delay %d", i);
-@@ -360,16 +469,43 @@ event_controller_enter_cb (GtkEventController *controller,
-     static guint id = 0;
- 
-     g_test_message ("EventController emits \"enter\" signal");
--    /* Call an idle function because gtk_widget_add_controller()
--     * calls g_list_prepend() for event_controllers and this controller is
--     * always called before "gtk-text-focus-controller"
--     * is caleld and the IM context does not receive the focus-in yet.
--     */
-     if (id)
-         return;
--    id = g_idle_add (event_controller_enter_delay, controller);
-+    if (is_integrated_desktop ()) {
-+        /* Wait for 3 seconds in GNOME Wayland because there is a long time lag
-+         * between the "enter" signal on the event controller in GtkText
-+         * and the "FocusIn" D-Bus signal in BusInputContext of ibus-daemon
-+         * because mutter/core/window.c:meta_window_show() calls
-+         * mutter/core/window.c:meta_window_focus() ->
-+         * mutter/wayland/meta-wayland-text-input.c:
-+         *   meta_wayland_text_input_set_focus() ->
-+         * mutter/clutter/clutter/clutter-input-method.c:
-+         *   clutter_input_method_focus_out()
-+         * I.e. "FocusOut" and "FocusIn" D-Bus methods are always delayed
-+         * against the window present in GNOME Wayland.
-+         * If "FocusOut" and "FocusIn" D-Bus signals would be called after
-+         * "SetGlobalEngine" D-BUs signal was called in ibus-daemon,
-+         * the following functions could be called:
-+         *   engine_focus_out_cb() for the "gnome-shell" context
-+         *   engine_focus_in_cb() for the "fake" context
-+         *   engine_focus_out_cb() for the "fake" context
-+         *   engine_focus_in_cb() for the "gnome-shell" context
-+         * and ibus_engine_commit_text() would not work.
-+         * This assume the focus-in/out signals are called within the timeout
-+         * seconds.
-+         */
-+        id = g_timeout_add_seconds (3,
-+                                    event_controller_enter_delay,
-+                                    controller);
-+    } else {
-+        /* Call an idle function in Xorg because gtk_widget_add_controller()
-+         * calls g_list_prepend() for event_controllers and this controller is
-+         * always called before "gtk-text-focus-controller"
-+         * is caleld and the IM context does not receive the focus-in yet.
-+         */
-+        id = g_idle_add (event_controller_enter_delay, controller);
-+    }
- }
--
- #else
- 
- static gboolean
-@@ -550,10 +686,18 @@ static void
- test_init (void)
- {
-     char *tty_name = ttyname (STDIN_FILENO);
--    GMainLoop *loop = g_main_loop_new (NULL, TRUE);
-+    GMainLoop *loop;
-+    static guint idle_id = 0;
-+
-+    if (idle_id) {
-+        g_test_incomplete ("Test is called twice due to a timeout.");
-+        return;
-+    }
-+
-+    loop = g_main_loop_new (NULL, TRUE);
-     g_test_message ("Test on %s", tty_name ? tty_name : "(null)");
-     if (tty_name && g_strstr_len (tty_name, -1, "pts")) {
--        g_timeout_add_seconds (3, _wait_for_key_release_cb, loop);
-+        idle_id = g_timeout_add_seconds (3, _wait_for_key_release_cb, loop);
-         g_main_loop_run (loop);
-     }
-     g_main_loop_unref (loop);
-@@ -586,14 +730,16 @@ test_compose (void)
-     gtk_main ();
- #endif
-     g_log_set_always_fatal (flags);
-+    g_clear_pointer (&m_engine_is_focused, g_free);
-+    g_clear_pointer (&m_session_name, g_free);
- }
- 
- 
- int
- main (int argc, char *argv[])
- {
--    gchar *test_name;
-     gchar *test_path;
-+    int retval;
- 
-     ibus_init ();
-     /* Avoid a warning of "AT-SPI: Could not obtain desktop path or name"
-@@ -612,21 +758,42 @@ main (int argc, char *argv[])
-             ? g_strdup (argv[1]) : g_strdup (".");
-     m_compose_file = g_strdup (g_getenv ("COMPOSE_FILE"));
- #if GLIB_CHECK_VERSION (2, 58, 0)
--    test_name = g_strdup (g_get_language_names_with_category ("LC_CTYPE")[0]);
-+    m_test_name = g_strdup (g_get_language_names_with_category ("LC_CTYPE")[0]);
- #else
--    test_name = g_strdup (g_getenv ("LANG"));
-+    m_test_name = g_strdup (g_getenv ("LANG"));
- #endif
-     if (m_compose_file &&
--        (!test_name || !g_ascii_strncasecmp (test_name, "en_US", 5))) {
--        g_free (test_name);
--        test_name = g_path_get_basename (m_compose_file);
-+        (!m_test_name || !g_ascii_strncasecmp (m_test_name, "en_US", 5))) {
-+        g_free (m_test_name);
-+        m_test_name = g_path_get_basename (m_compose_file);
-+    }
-+    /* The parent of GtkIMContextWayland is GtkIMContextSimple and
-+     * it outputs a warning of "Can't handle >16bit keyvals" in
-+     * gtk/gtkcomposetable.c:parse_compose_sequence() in pt-BR locales
-+     * and any warnings are treated as errors with g_test_run()
-+     * So export LANG=en_US.UTF-8 for GNOME Wayland as a workaround.
-+     */
-+    if (m_test_name && (!g_ascii_strncasecmp (m_test_name, "pt_BR", 5) ||
-+                        !g_ascii_strncasecmp (m_test_name, "fi_FI", 5)
-+                       )) {
-+        m_is_gtk_32bit_compose_error = TRUE;
-+    }
-+    if (m_is_gtk_32bit_compose_error) {
-+#if 1
-+        g_assert (g_setenv ("LANG", "en_US.UTF-8", TRUE));
-+#else
-+        /* FIXME: Use expected_messages in g_log_structured() */
-+        g_test_expect_message ("Gtk", G_LOG_LEVEL_WARNING,
-+                               "Can't handle >16bit keyvals");
-+#endif
-     }
-     g_test_add_func ("/ibus-compose/test-init", test_init);
-     m_loop = g_main_loop_new (NULL, TRUE);
--    test_path = g_build_filename ("/ibus-compose", test_name, NULL);
-+    test_path = g_build_filename ("/ibus-compose", m_test_name, NULL);
-     g_test_add_func (test_path, test_compose);
-     g_free (test_path);
--    g_free (test_name);
- 
--    return g_test_run ();
-+    retval = g_test_run ();
-+    g_free (m_test_name);
-+    return retval;
- }
--- 
-2.45.0
-
-From 23785e6c8150aceda7f9665a3335f1e4baecd1cc Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Thu, 1 Aug 2024 08:23:09 +0900
-Subject: [PATCH 6/6] src/tests: Fix some CI issues with busy TMT virtual session
-
-- Increase waiting time in ibus-compose-locales.
-- Wait for 3 secs after set-engine in ibus-compose to wait for the delayed
-  focus-in/out events.
-- delete screendump option in ibus-desktop-testing.desktop not to
-  support no display.
-- setlocale in ibus-engine-switch to get UTF-8 warnings.
-- Quote file names as shell syntax as much as possible.
-- Check file existent and do not use "rm -f" as much as possible.
-- Do not set GTK_IM_MODULE=ibus for Wayland.
-- Exclude sshd-session to check existent sessions.
-
-BUG=https://github.com/ibus/ibus/pull/2657
----
- src/tests/ibus-compose-locales.in           |  4 +-
- src/tests/ibus-compose.c                    | 23 ++++--
- src/tests/ibus-desktop-testing-autostart.in |  1 +
- src/tests/ibus-desktop-testing-module       | 79 ++++++++++++++++-----
- src/tests/ibus-desktop-testing.desktop.in   |  2 +-
- src/tests/ibus-engine-switch.c              |  3 +
- 6 files changed, 85 insertions(+), 27 deletions(-)
-
-diff --git a/src/tests/ibus-compose-locales.in b/src/tests/ibus-compose-locales.in
-index 7a133ce0..485204c0 100755
---- a/src/tests/ibus-compose-locales.in
-+++ b/src/tests/ibus-compose-locales.in
-@@ -15,8 +15,8 @@ do
-     if [ "x$IS_COMMENT" != x ] ; then
-         continue
-     fi
--    while [ x"$IBUS_DAEMON_WITH_SYSTEMD" != x ] && [ $INITED -lt 6 ] ; do
--        echo "Waiting for ${INITED}0 secs till 60 secs"
-+    while [ x"$IBUS_DAEMON_WITH_SYSTEMD" != x ] && [ $INITED -lt 12 ] ; do
-+        echo "Waiting for ${INITED}0 secs till 120 secs"
-         sleep 10
-         INITED=`expr $INITED + 1`
-     done
-diff --git a/src/tests/ibus-compose.c b/src/tests/ibus-compose.c
-index 0679c259..326d3b90 100644
---- a/src/tests/ibus-compose.c
-+++ b/src/tests/ibus-compose.c
-@@ -331,13 +331,22 @@ set_engine_cb (GObject      *object,
-         return;
-     }
- 
--    /* ibus_im_context_focus_in() is called after GlboalEngine is set. */
--    if (is_integrated_desktop () && !m_engine_is_focused) {
--        data.category = TEST_DELAYED_FOCUS_IN;
--        data.idle_id = g_timeout_add_seconds (1, idle_cb, &data);
--        g_main_loop_run (m_loop);
--        if (data.idle_id != 0)
--            return;
-+    /* ibus_im_context_focus_in() is called after GlboalEngine is set.
-+     * The focus-in/out events happen more slowly in a busy system
-+     * likes with a TMT tool.
-+     */
-+    if (is_integrated_desktop () && g_getenv ("IBUS_DAEMON_WITH_SYSTEMD")) {
-+        g_test_message ("Start tiny \"focus-in\" signal test");
-+        for (i = 0; i < 3; i++) {
-+            data.category = TEST_DELAYED_FOCUS_IN;
-+            data.idle_id = g_timeout_add_seconds (1, idle_cb, &data);
-+            g_main_loop_run (m_loop);
-+            if (data.idle_id != 0)
-+                return;
-+        }
-+        g_test_message ("End tiny \"focus-in\" signal test");
-+        data.category = TEST_COMMIT_TEXT;
-+    }
-     if (m_compose_table == NULL) {
-         g_test_skip ("Your locale uses en_US compose table.");
-         idle_cb (&data);
-diff --git a/src/tests/ibus-desktop-testing-autostart.in b/src/tests/ibus-desktop-testing-autostart.in
-index d50354df..9ecc8c27 100755
---- a/src/tests/ibus-desktop-testing-autostart.in
-+++ b/src/tests/ibus-desktop-testing-autostart.in
-@@ -73,6 +73,7 @@ main()
-     parse_args "$@"
-     init_session
-     check_env
-+    #run_monitor
-     save_screen
-     run_test_suite
-     finit
-diff --git a/src/tests/ibus-desktop-testing-module b/src/tests/ibus-desktop-testing-module
-index 2d686813..55eb248e 100755
---- a/src/tests/ibus-desktop-testing-module
-+++ b/src/tests/ibus-desktop-testing-module
-@@ -63,8 +63,9 @@ pwd
- pstree -asp $$
- gsettings list-recursively org.gnome.shell
- rpm -q gnome-shell-extension-no-overview gnome-shell gnome-session
--ps -ef | grep ibus | grep -v grep
-+ps -ef | grep ibus | grep -v TMT | grep -v grep
- ibus address
-+locale
- env
- #dbus-send --session --print-reply --dest=org.gnome.Shell.Introspect /org/gnome/Shell/Introspect org.gnome.Shell.Introspect.GetWindows
- '
-@@ -133,7 +134,8 @@ check_tty()
-     TTY=`tty`
-     if echo $PROGNAME | grep -q runner ; then
-         if [ $ENABLED_SYSTEMD -eq 1 ] && [  $SESSION_IS_GNOME -eq 1 ] ; then
--            if echo "$TTY" | grep -E 'tty|console' ; then
-+            # "not a tty" is correct with TMT tool
-+            if echo "$TTY" | grep -E 'tty|console' | grep -v "not a tty" ; then
-                print_log -e "${RED}FAIL${NC}: ${RED}ERROR${NC}: Changing runlevel does not support console. Please log into the host with ssh."
-                exit 1
-             fi
-@@ -143,7 +145,7 @@ check_tty()
-                print_log -e "Running session with ssh. It might be good to use console instead."
-             fi
-         fi
--        SESSION=`ps -ef | grep session | grep -v grep`
-+        SESSION=`ps -ef | grep session | grep -v TMT | grep -v sshd-session | grep -v grep`
-         if [ x"$SESSION" != x ] ; then
-                print_log -e "${RED}FAIL${NC}: ${RED}ERROR${NC}: Session is running: $SESSION"
-                exit 1
-@@ -254,7 +256,8 @@ create_xdg_autostart()
-         exit 1
-     fi
-     mkdir -p "$TEST_USER_HOME/.config/autostart"
--    cp "$desktop_file" "$TEST_USER_HOME/.config/autostart"
-+    sed -e "s/\(^Exec=.*\)tests ibus\(.*\)/\1tests $TESTS\2/" "$desktop_file" \
-+        > "$TEST_USER_HOME/.config/autostart/$AUTOSTART_DESKTOP_FILE"
-     LINE="AutostartCondition=if-exists $TEST_USER_HOME/.config/autostart/$AUTOSTART_DESKTOP_FILE"
-     echo "$LINE" >> "$TEST_USER_HOME/.config/autostart/$AUTOSTART_DESKTOP_FILE"
-     chown -R "$TEST_USER" "$TEST_USER_HOME/.config"
-@@ -327,6 +330,9 @@ init_session()
- 
-     LOGIN_USER=$USER
-     LOGIN_HOME=$HOME
-+    if [ x"$TESTS" = x ] ; then
-+        TESTS='ibus'
-+    fi
-     check_tty
-     if [ $ENABLED_SYSTEMD -eq 1 ] && [  $SESSION_IS_GNOME -eq 1 ] ; then
-         SESSION_FILE1="/usr/lib/systemd/system/gnome-headless-session@.service"
-@@ -482,9 +488,25 @@ init_gnome()
-             chown -R $LOGIN_USER $TEST_USER_HOME/.local
-         fi
-     fi
-+
-+    ## Use gnome-headless-session for the no-graphics option because currently
-+    ## GDM itself cannot run the login screen(greeter) without a display so
-+    ## the no-graphics option does not work with GDM and the TMT tool
-+    ## while GDM can invoke the headless GNOME Wayland sessions.
-+    ##
-+    ## Use GNOME_SHELL_WAYLAND_COMMAND for the no-graphics option to add a
-+    ## virtual monitor since gnome-headless-session provides a headless mode
-+    ## but no monitor and IBus focus-in/out events does not work without
-+    ## any monitors.
-+    ##
-+    ## Use the systemd locale configuration for the no-graphcis mode since
-+    ## gnome-headless-session does not pull LANG from AccountsService.
-+    ##
-     if [ $LOGIN_USER != $USER ] ; then
-         SHELL_SERVICE_FILE="org.gnome.Shell@wayland.service"
-         SYSTEMD_USER_DIR="$TEST_USER_HOME/.config/systemd/user"
-+        ENV_USER_DIR="$TEST_USER_HOME/.config/environment.d"
-+        LOCALE_CONF="$ENV_USER_DIR/ibus.conf"
-         if test $HAVE_GRAPHICS -ne 1 ; then
-             if test ! -f "$SYSTEMD_USER_DIR/$SHELL_SERVICE_FILE" ; then
-                 mkdir -p "$SYSTEMD_USER_DIR"
-@@ -494,12 +516,19 @@ init_gnome()
-                     > $SHELL_SERVICE_FILE
-                 diff $SYSTEMD_SYSTEM_DIR/$SHELL_SERVICE_FILE $SHELL_SERVICE_FILE
-                 popd
--                chown -R $LOGIN_USER "$TEST_USER_HOME/.config"
-             fi
-+            mkdir -p "$ENV_USER_DIR"
-+            cat > "$LOCALE_CONF" << _EOF_LOCALE_CONF
-+LANG=$SESSION_LANG
-+_EOF_LOCALE_CONF
-+            chown -R $LOGIN_USER "$TEST_USER_HOME/.config"
-         else
-             if test -f "$SYSTEMD_USER_DIR/$SHELL_SERVICE_FILE" ; then
-                 rm "$SYSTEMD_USER_DIR/$SHELL_SERVICE_FILE"
-             fi
-+            if test -f "$LOCALE_CONF" ; then
-+                rm "$LOCALE_CONF"
-+            fi
-         fi
-     fi
-     GET_DISABLE_USER_EX="gsettings get org.gnome.shell disable-user-extensions"
-@@ -556,7 +585,7 @@ operate_desktop_with_systemd()
-     SESSION=gnome-headless-session
-     COMMAND="$1"
- 
--    #if test $HAVE_GRAPHICS -eq 1 ; then
-+    if test $HAVE_GRAPHICS -eq 1 ; then
-         case "$COMMAND" in
-         "start") systemctl isolate graphical.target
-                  echo ""
-@@ -565,22 +594,24 @@ operate_desktop_with_systemd()
-         "")      print_log -e "${RED}FAIL${NC}: ${RED}ERROR${NC}: Wrong command $COMMAND"
-                  exit 1;;
-         esac
--    #else
--    #    setenforce 0
--    #    systemctl $COMMAND ${SESSION}@${TEST_USER}
--    #fi
-+    else
-+        setenforce 0
-+        systemctl $COMMAND ${SESSION}@${TEST_USER}
-+    fi
-     case "$COMMAND" in
-     "start") sleep 30;;
-     "") ;;
-     esac
--    #if test $HAVE_GRAPHICS -eq 1 ; then
-+    if test $HAVE_GRAPHICS -eq 1 ; then
-         systemctl status --no-pager graphical.target
--    #else
--    #    systemctl status --no-pager ${SESSION}@${TEST_USER}
--    #fi
-+    else
-+        systemctl status --no-pager ${SESSION}@${TEST_USER}
-+    fi
-     ps -ef | grep X
-     ps -ef | grep session
-     ps -ef | grep ibus
-+    SUSER=`echo "$LOGIN_USER" | cut -c 1-7`
-+    ps -ef | grep $SUSER
- }
- 
- 
-@@ -639,6 +670,23 @@ run_session()
- }
- 
- 
-+run_monitor()
-+{
-+    if ! which gnome-monitor-config > /dev/null ; then
-+        print_log -e "${RED}FAIL${NC}: No gnome-monitor-config"
-+        return
-+    fi
-+    if [ $ENABLED_SYSTEMD -ne 1 ] || [  $SESSION_IS_GNOME -ne 1 ] \
-+       || [ $HAVE_GRAPHICS -ne 1 ] ; then
-+        return
-+    fi
-+    /usr/libexec/gnome-screen-cast.py -v 1024 768 &
-+    sleep 3
-+    gnome-monitor-config list
-+    #gnome-monitor-config set -LpM Virtual-1 -t normal -m 1024x768@60.004
-+}
-+
-+
- count_case_result()
- {
-     retval=$1
-@@ -758,9 +806,6 @@ run_gnome_desktop_testing_runner()
- {
-     pass=0
-     fail=0
--    if [ x"$TESTS" = x ] ; then
--        TESTS='ibus'
--    fi
-     if echo $PROGNAME | grep -q autostart ; then
-         export IBUS_DAEMON_WITH_SYSTEMD=1
-     fi
-diff --git a/src/tests/ibus-desktop-testing.desktop.in b/src/tests/ibus-desktop-testing.desktop.in
-index e91900ed..fe9356ad 100644
---- a/src/tests/ibus-desktop-testing.desktop.in
-+++ b/src/tests/ibus-desktop-testing.desktop.in
-@@ -2,7 +2,7 @@
- Name=IBus Desktop Testing Runner
- GenericName=Input Method Desktop Testing Runner
- Comment=Test plugin for IBus Desktop Testing
--Exec=sh -c 'exec @libexecdir@/ibus-desktop-testing-autostart --envcheck --output $HOME/test-autostart.log --result $HOME/test.log --runner gnome --screendump $HOME/screen.log --tests ibus'
-+Exec=sh -c 'exec @libexecdir@/ibus-desktop-testing-autostart --envcheck --output $HOME/test-autostart.log --result $HOME/test.log --runner gnome --tests ibus'
- Terminal=false
- Type=Application
- Encoding=UTF-8
-diff --git a/src/tests/ibus-engine-switch.c b/src/tests/ibus-engine-switch.c
-index b50bac59..7359e125 100644
---- a/src/tests/ibus-engine-switch.c
-+++ b/src/tests/ibus-engine-switch.c
-@@ -1,5 +1,6 @@
- /* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
- 
-+#include <locale.h>
- #include <string.h>
- #include <unistd.h>
- #include "ibus.h"
-@@ -251,6 +252,8 @@ main (gint    argc,
-       gchar **argv)
- {
-     gint result;
-+    /* To get UTF-8 error messages with glib2 */
-+    setlocale (LC_ALL, "");
-     ibus_init ();
-     g_test_init (&argc, &argv, NULL);
-     bus = ibus_bus_new ();
--- 
-2.45.0
-
-From 803b71fbcc2de6faaaf3b20e2bc08fea2e1abbe8 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Wed, 14 Aug 2024 09:12:58 +0900
-Subject: [PATCH] util/IMdkit: Revert to fix typing freeze with barcode reader
-
-The original barcode reader issue is fixed with libX11 1.8.10 and
-it's now available in Fedora.
-The typing freezing issue is no longer reproducible with the latest
-libX11 in Fedora 40.
-
-Now the previous change(b49f3a4736540f3cf2f7e7b3ac7f965970393c74) is
-reverted and I continue to trace the issue.
-
-Fixes: https://github.com/ibus/ibus/commit/b49f3a4
-BUG=https://gitlab.freedesktop.org/xorg/lib/libx11/-/issues/198
-BUG=https://github.com/ibus/ibus/issues/2560
----
- util/IMdkit/i18nPtHdr.c | 1 -
- 1 file changed, 1 deletion(-)
-
-diff --git a/util/IMdkit/i18nPtHdr.c b/util/IMdkit/i18nPtHdr.c
-index 07aecbb1..ec20e322 100644
---- a/util/IMdkit/i18nPtHdr.c
-+++ b/util/IMdkit/i18nPtHdr.c
-@@ -1757,7 +1757,6 @@ static void ProcessQueue (XIMS ims, CARD16 connect_id)
-         switch (hdr->major_opcode)
-         {
-         case XIM_FORWARD_EVENT:
--            sync();
-             ForwardEventMessageProc(ims, &call_data, p1);
-             break;
-         }
--- 
-2.45.2
-

^ permalink raw reply related	[flat|nested] 8+ messages in thread
* [rpms/ibus] autotool: Delete upstreamed ibus-HEAD.patch
@ 2026-05-31  2:08 Takao Fujiwara
  0 siblings, 0 replies; 8+ messages in thread
From: Takao Fujiwara @ 2026-05-31  2:08 UTC (permalink / raw)
  To: git-commits

A new commit has been pushed.

Repo   : rpms/ibus
Branch : autotool
Commit : b8d456542f2c8be7f89a9d7d363e4b650c0a0fd7
Author : Takao Fujiwara <tfujiwar@redhat.com>
Date   : 2023-07-29T00:29:51+09:00
Stats  : +0/-4823 in 1 file(s)
URL    : https://src.fedoraproject.org/rpms/ibus/c/b8d456542f2c8be7f89a9d7d363e4b650c0a0fd7?branch=autotool

Log:
Delete upstreamed ibus-HEAD.patch

---
diff --git a/ibus-HEAD.patch b/ibus-HEAD.patch
deleted file mode 100644
index 8953954..0000000
--- a/ibus-HEAD.patch
+++ /dev/null
@@ -1,4823 +0,0 @@
-From a140924e437346ebb7cd30c6e4d316ab5d447871 Mon Sep 17 00:00:00 2001
-From: Simon Deziel <simon@sdeziel.info>
-Date: Wed, 22 Feb 2023 19:05:17 +0900
-Subject: [PATCH] src/services: use a shell exec in systemd service files
-
-exec sub-command avoids keeping the parent shell around. Refer sh(1)
-Fedora sh is bash.
-
-BUG=https://github.com/ibus/ibus/pull/2453
----
- bus/services/org.freedesktop.IBus.session.GNOME.service.in   | 2 +-
- bus/services/org.freedesktop.IBus.session.generic.service.in | 3 +--
- 2 files changed, 2 insertions(+), 3 deletions(-)
-
-diff --git a/bus/services/org.freedesktop.IBus.session.GNOME.service.in b/bus/services/org.freedesktop.IBus.session.GNOME.service.in
-index 7f718e3c..858cf10d 100644
---- a/bus/services/org.freedesktop.IBus.session.GNOME.service.in
-+++ b/bus/services/org.freedesktop.IBus.session.GNOME.service.in
-@@ -18,7 +18,7 @@ Conflicts=gnome-session@gnome-login.target
- [Service]
- Type=dbus
- # Only pull --xim in X11 session, it is done via Xwayland-session.d on Wayland
--ExecStart=sh -c '@bindir@/ibus-daemon --panel disable $([ "$XDG_SESSION_TYPE" = "x11" ] && echo "--xim")'
-+ExecStart=sh -c 'exec @bindir@/ibus-daemon --panel disable $([ "$XDG_SESSION_TYPE" = "x11" ] && echo "--xim")'
- Restart=on-abnormal
- BusName=org.freedesktop.IBus
- TimeoutStopSec=5
-diff --git a/bus/services/org.freedesktop.IBus.session.generic.service.in b/bus/services/org.freedesktop.IBus.session.generic.service.in
-index 9d493159..e7b7ce4f 100644
---- a/bus/services/org.freedesktop.IBus.session.generic.service.in
-+++ b/bus/services/org.freedesktop.IBus.session.generic.service.in
-@@ -7,8 +7,7 @@ Conflicts=gnome-session-initialized.target
- 
- [Service]
- Type=dbus
--# Only pull --xim in X11 session, it is done via Xwayland-session.d on Wayland
--ExecStart=sh -c '@bindir@/ibus-daemon $IBUS_DAEMON_ARGS'
-+ExecStart=sh -c 'exec @bindir@/ibus-daemon $IBUS_DAEMON_ARGS'
- Restart=on-abnormal
- BusName=org.freedesktop.IBus
- TimeoutStopSec=5
--- 
-2.39.2
-
-From 7da18d08ce85405e41ba7bf363661292bc97ca39 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Wed, 22 Feb 2023 23:53:35 +0900
-Subject: [PATCH] src: Call IBUS_TYPE_EMOJI_DATA in ibus_init()
-
-Seems the evaluation of IBUS_EMOJI_DATA() depends on the compiler
-optimization.
-
-BUG=https://github.com/ibus/ibus/issues/2476
----
- src/ibusshare.c | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
-
-diff --git a/src/ibusshare.c b/src/ibusshare.c
-index 340168c8..bb59f3cb 100644
---- a/src/ibusshare.c
-+++ b/src/ibusshare.c
-@@ -308,12 +308,15 @@ ibus_init (void)
-     IBUS_TYPE_TEXT;
-     IBUS_TYPE_ATTRIBUTE;
-     IBUS_TYPE_ATTR_LIST;
--    IBUS_TYPE_LOOKUP_TABLE;
-     IBUS_TYPE_COMPONENT;
-+    IBUS_TYPE_EMOJI_DATA;
-     IBUS_TYPE_ENGINE_DESC;
-+    IBUS_TYPE_LOOKUP_TABLE;
-     IBUS_TYPE_OBSERVED_PATH;
-     IBUS_TYPE_REGISTRY;
-     IBUS_TYPE_X_EVENT;
-+    IBUS_TYPE_UNICODE_BLOCK;
-+    IBUS_TYPE_UNICODE_DATA;
-     _ibus_register_resource ();
- }
- 
--- 
-2.38.1
-
-From ce5e2bb43ea4c2f5780f4a3bfd7509f812b60afa Mon Sep 17 00:00:00 2001
-From: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp>
-Date: Tue, 28 Feb 2023 18:05:29 +0900
-Subject: [PATCH] src: Define X11_LOCALEDATADIR for BSD Compose data
-
-FreeBSD and NetBSD have X11 locale Compose data directories in
-${X11_PREFIX}/lib/X11/locale instead of ${X11_PREFIX}/share/X11/locale:
-https://github.com/freedesktop/xorg-lib-libX11/blob/20a3f99/configure.ac#L336-L340
-
-BUG=https://github.com/ibus/ibus/pull/2478
----
- configure.ac             | 8 ++++++++
- src/Makefile.am          | 2 +-
- src/gencomposetable.c    | 6 ++----
- src/ibuscomposetable.c   | 5 ++---
- src/ibusenginesimple.c   | 5 ++---
- src/tests/Makefile.am    | 2 +-
- src/tests/ibus-compose.c | 3 +--
- 7 files changed, 17 insertions(+), 14 deletions(-)
-
-diff --git a/configure.ac b/configure.ac
-index f446ae92..ece1d9ee 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -349,6 +349,14 @@ else
- fi
- AC_SUBST(X11_PREFIX)
- 
-+# Check locale dir for Compose files.
-+AC_CHECK_FILE($X11_PREFIX/share/X11/locale/locale.dir,
-+              X11_LOCALEDATADIR="$X11_PREFIX/share/X11/locale",
-+              [AC_CHECK_FILE($X11_PREFIX/lib/X11/locale/locale.dir,
-+                             X11_LOCALEDATADIR="$X11_PREFIX/lib/X11/locale",
-+                             X11_LOCALEDATADIR="$(datadir)/X11/locale")])
-+AC_SUBST(X11_LOCALEDATADIR)
-+
- if test x"$enable_wayland" = x"yes"; then
-     # Check for wayland
-     PKG_CHECK_MODULES(WAYLAND, [
-diff --git a/src/Makefile.am b/src/Makefile.am
-index 426376dd..c2e8daa6 100644
---- a/src/Makefile.am
-+++ b/src/Makefile.am
-@@ -54,7 +54,7 @@ AM_CPPFLAGS =                                           \
-     -DIBUS_DISABLE_DEPRECATION_WARNINGS                 \
-     -DIBUS_COMPILATION                                  \
-     -DISOCODES_PREFIX=\"$(ISOCODES_PREFIX)\"            \
--    -DX11_DATA_PREFIX=\"$(X11_PREFIX)\"                 \
-+    -DX11_LOCALEDATADIR=\"$(X11_LOCALEDATADIR)\"        \
-     $(NULL)
- 
- # ibus library
-diff --git a/src/gencomposetable.c b/src/gencomposetable.c
-index 3fe6ff86..6e52d6a6 100644
---- a/src/gencomposetable.c
-+++ b/src/gencomposetable.c
-@@ -28,8 +28,6 @@
- #include "ibuscomposetable.h"
- #include "ibusenginesimpleprivate.h"
- 
--#define X11_DATADIR X11_DATA_PREFIX "/share/X11/locale"
--
- 
- static void
- save_compose_table_endianness (IBusComposeTableEx *compose_table,
-@@ -84,7 +82,7 @@ main (int argc, char *argv[])
-     if (!path || !g_file_test (path, G_FILE_TEST_EXISTS)) {
-         g_clear_pointer (&path, g_free);
-         for (sys_lang = sys_langs; *sys_lang; sys_lang++) {
--            path = g_build_filename (X11_DATADIR, *sys_lang,
-+            path = g_build_filename (X11_LOCALEDATADIR, *sys_lang,
-                                      "Compose", NULL);
-             if (!path)
-                 continue;
-@@ -93,7 +91,7 @@ main (int argc, char *argv[])
-         }
-     }
-     if (!path) {
--        g_warning ("en_US compose file is not found in %s.", X11_DATADIR);
-+        g_warning ("en_US compose file is not found in %s.", X11_LOCALEDATADIR);
-         return 1;
-     } else {
-         g_debug ("Create a cache of %s", path);
-diff --git a/src/ibuscomposetable.c b/src/ibuscomposetable.c
-index 3e7b0f41..fc486692 100644
---- a/src/ibuscomposetable.c
-+++ b/src/ibuscomposetable.c
-@@ -39,7 +39,6 @@
- 
- #define IBUS_COMPOSE_TABLE_MAGIC "IBusComposeTable"
- #define IBUS_COMPOSE_TABLE_VERSION (4)
--#define X11_DATADIR X11_DATA_PREFIX "/share/X11/locale"
- #define IBUS_MAX_COMPOSE_ALGORITHM_LEN 9
- 
- typedef struct {
-@@ -285,7 +284,7 @@ expand_include_path (const char *include_path) {
-             case 'S': /* system compose dir */
-                 o = out;
-                 former = g_strndup (head, i - head);
--                out = g_strdup_printf ("%s%s%s", o, former, X11_DATADIR);
-+                out = g_strdup_printf ("%s%s%s", o, former, X11_LOCALEDATADIR);
-                 head = i + 2;
-                 g_free (o);
-                 g_free (former);
-@@ -397,7 +396,7 @@ get_en_compose_file (void)
-     char * const *sys_lang = NULL;
-     char *path = NULL;
-     for (sys_lang = sys_langs; *sys_lang; sys_lang++) {
--        path = g_build_filename (X11_DATADIR, *sys_lang, "Compose", NULL);
-+        path = g_build_filename (X11_LOCALEDATADIR, *sys_lang, "Compose", NULL);
-         if (g_file_test (path, G_FILE_TEST_EXISTS))
-             break;
-         g_clear_pointer (&path, g_free);
-diff --git a/src/ibusenginesimple.c b/src/ibusenginesimple.c
-index 409d5a56..585d7870 100644
---- a/src/ibusenginesimple.c
-+++ b/src/ibusenginesimple.c
-@@ -37,7 +37,6 @@
- #include <memory.h>
- #include <stdlib.h>
- 
--#define X11_DATADIR X11_DATA_PREFIX "/share/X11/locale"
- #define IBUS_ENGINE_SIMPLE_GET_PRIVATE(o)  \
-    ((IBusEngineSimplePrivate *)ibus_engine_simple_get_instance_private (o))
- 
-@@ -1440,7 +1439,7 @@ ibus_engine_simple_add_table_by_locale (IBusEngineSimple *simple,
-             for (sys_lang = sys_langs; *sys_lang; sys_lang++) {
-                 if (g_ascii_strncasecmp (*lang, *sys_lang,
-                                          strlen (*sys_lang)) == 0) {
--                    path = g_build_filename (X11_DATADIR,
-+                    path = g_build_filename (X11_LOCALEDATADIR,
-                                              *lang, "Compose", NULL);
-                     break;
-                 }
-@@ -1462,7 +1461,7 @@ ibus_engine_simple_add_table_by_locale (IBusEngineSimple *simple,
-             ibus_engine_simple_add_compose_file (simple, path);
-         g_clear_pointer(&path, g_free);
-     } else {
--        path = g_build_filename (X11_DATADIR, locale, "Compose", NULL);
-+        path = g_build_filename (X11_LOCALEDATADIR, locale, "Compose", NULL);
-         do {
-             if (g_file_test (path, G_FILE_TEST_EXISTS))
-                 break;
-diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am
-index ca5285bd..8d1d16e3 100644
---- a/src/tests/Makefile.am
-+++ b/src/tests/Makefile.am
-@@ -30,7 +30,7 @@ AM_CPPFLAGS = \
-     @GLIB2_CFLAGS@                          \
-     @GIO2_CFLAGS@                           \
-     -DIBUS_DISABLE_DEPRECATION_WARNINGS     \
--    -DX11_DATA_PREFIX=\"$(X11_PREFIX)\"     \
-+    -DX11_LOCALEDATADIR=\"$(X11_LOCALEDATADIR)\" \
-     -I$(top_srcdir)/src                     \
-     -I$(top_builddir)/src                   \
-     $(NULL)
-diff --git a/src/tests/ibus-compose.c b/src/tests/ibus-compose.c
-index 0be01d27..da1a1298 100644
---- a/src/tests/ibus-compose.c
-+++ b/src/tests/ibus-compose.c
-@@ -6,7 +6,6 @@
- #define GREEN "\033[0;32m"
- #define RED   "\033[0;31m"
- #define NC    "\033[0m"
--#define X11_DATADIR X11_DATA_PREFIX "/share/X11/locale"
- 
- IBusBus *m_bus;
- gchar *m_compose_file;
-@@ -36,7 +35,7 @@ get_compose_path ()
-             break;
-         if (g_strcmp0 (*l, "C") == 0)
-             break;
--        compose_path = g_build_filename (X11_DATADIR,
-+        compose_path = g_build_filename (X11_LOCALEDATADIR,
-                                          *l,
-                                          "Compose",
-                                          NULL);
--- 
-2.39.2
-
-From 9d9dca9e103e88b33e786c4a46f44123a6cf11c6 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Wed, 8 Mar 2023 19:44:16 +0900
-Subject: [PATCH] client/x11: Fix Key typing order
-
-ibus-x11 now also uses the hybrid process key events with
-IBUS_ENABLE_SYNC_MODE=2 and it waits for the async API
-with GSource and g_main_context_iteration() in xim_forward_event().
-
-But g_main_context_iteration() calls gdk_event_source_dispatch()
-and it can call another xim_forward_event() and the callbacks
-of ibus_input_context_process_key_event_async() can be nested.
-So if the forwarding API is called out of the callbacks of
-ibus_input_context_process_key_event_async(), the key events
-order is swapped due to the delayed return of
-g_main_context_iteration().
-
-To resolve this issue, the forwarding API should be called in
-the callbacks of ibus_input_context_process_key_event_async().
-
-BUG=https://github.com/ibus/ibus/issues/2480
----
- client/x11/main.c | 160 ++++++++++++++++++++++++----------------------
- 1 file changed, 83 insertions(+), 77 deletions(-)
-
-diff --git a/client/x11/main.c b/client/x11/main.c
-index 905fd251..83d95cb7 100644
---- a/client/x11/main.c
-+++ b/client/x11/main.c
-@@ -2,7 +2,7 @@
- /* vim:set et sts=4: */
- /* ibus
-  * Copyright (C) 2007-2015 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright (C) 2015-2022 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2015-2023 Takao Fujiwara <takao.fujiwara1@gmail.com>
-  * Copyright (C) 2007-2015 Red Hat, Inc.
-  *
-  * main.c:
-@@ -49,6 +49,8 @@
- #include <getopt.h>
- 
- #define ESC_SEQUENCE_ISO10646_1 "\033%G"
-+/* Wait for about 120 secs to return a key from async process-key-event. */
-+#define MAX_WAIT_KEY_TIME       120000
- 
- #define LOG(level, fmt_args...) \
-     if (g_debug_level >= (level)) { \
-@@ -461,11 +463,39 @@ xim_unset_ic_focus (XIMS xims, IMChangeFocusStruct *call_data)
- 
- }
- 
-+static void
-+_xim_forward_key_event_done (X11IC   *x11ic,
-+                             XEvent  *event,
-+                             gboolean processed)
-+{
-+    IMForwardEventStruct fe;
-+    if (processed) {
-+        if (!x11ic->has_preedit_area) {
-+            _xim_set_cursor_location (x11ic);
-+        }
-+        return;
-+    }
-+    g_assert (x11ic);
-+    g_assert (event);
-+
-+    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 = *event;
-+    IMForwardEvent (_xims, (XPointer) &fe);
-+}
-+
-+
- typedef struct {
--    IMForwardEventStruct *pfe;
-     int                   count;
-     guint                 count_cb_id;
-     gboolean              retval;
-+    X11IC                *x11ic;
-+    CARD16                connect_id;
-+    XEvent                event;
- } ProcessKeyEventReplyData;
- 
- static void
-@@ -474,7 +504,7 @@ _process_key_event_done (GObject      *object,
-                          gpointer      user_data)
- {
-     IBusInputContext *context = (IBusInputContext *)object;
--    IMForwardEventStruct *pfe = (IMForwardEventStruct*) user_data;
-+    ProcessKeyEventReplyData *data = (ProcessKeyEventReplyData *)user_data;
- 
-     GError *error = NULL;
-     gboolean retval = ibus_input_context_process_key_event_async_finish (
-@@ -488,16 +518,15 @@ _process_key_event_done (GObject      *object,
-     }
- 
-     if (g_hash_table_lookup (_connections,
--                             GINT_TO_POINTER ((gint) pfe->connect_id))
-+                             GINT_TO_POINTER ((gint)data->connect_id))
-         == NULL) {
--        g_slice_free (IMForwardEventStruct, pfe);
-+        g_slice_free (ProcessKeyEventReplyData, data);
-         return;
-     }
- 
--    if (retval == FALSE) {
--        IMForwardEvent (_xims, (XPointer) pfe);
--    }
--    g_slice_free (IMForwardEventStruct, pfe);
-+    if (retval == FALSE)
-+        _xim_forward_key_event_done (data->x11ic, &data->event, retval);
-+    g_slice_free (ProcessKeyEventReplyData, data);
- }
- 
- static void
-@@ -518,6 +547,21 @@ _process_key_event_reply_done (GObject      *object,
-     }
-     g_return_if_fail (data);
-     data->retval = retval;
-+    if (g_hash_table_lookup (_connections,
-+                             GINT_TO_POINTER ((gint)data->connect_id))
-+        == NULL) {
-+        return;
-+    }
-+    /* _xim_forward_key_event_done() should be called in
-+     * _process_key_event_reply_done() because g_main_context_iteration()
-+     * can call another xim_forward_event() and xim_forward_event() can be
-+     * nested and the first _process_key_event_reply_done() is returned
-+     * at last with g_main_context_iteration() so
-+     * if _xim_forward_key_event_done() is called out of
-+     * _process_key_event_reply_done(), the key events order
-+     * can be swapped.
-+     */
-+    _xim_forward_key_event_done (data->x11ic, &data->event, retval);
-     data->count = 0;
-     g_source_remove (data->count_cb_id);
- }
-@@ -529,9 +573,8 @@ _process_key_event_count_cb (gpointer user_data)
-     g_return_val_if_fail (data, G_SOURCE_REMOVE);
-     if (!data->count)
-         return G_SOURCE_REMOVE;
--    /* Wait for about 10 secs. */
--    if (data->count++ == 10000) {
--        data->count = 0;
-+    if (data->count++ == MAX_WAIT_KEY_TIME) {
-+        g_warning ("Key event is not returned for %usecs.", MAX_WAIT_KEY_TIME);
-         return G_SOURCE_REMOVE;
-     }
-     return G_SOURCE_CONTINUE;
-@@ -571,32 +614,13 @@ xim_forward_event (XIMS xims, IMForwardEventStruct *call_data)
-                                       event.keyval,
-                                       event.hardware_keycode - 8,
-                                       event.state);
--        if (retval) {
--            if (!x11ic->has_preedit_area) {
--                _xim_set_cursor_location (x11ic);
--            }
--            return 1;
--        }
--
--        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;
--
--        IMForwardEvent (_xims, (XPointer) &fe);
--
-+        _xim_forward_key_event_done (x11ic, &call_data->event, retval);
-         retval = 1;
-         break;
-     }
-     case 2: {
-         GSource *source = g_timeout_source_new (1);
-         ProcessKeyEventReplyData *data = NULL;
--        IMForwardEventStruct fe;
- 
-         if (source)
-             data = g_slice_new0 (ProcessKeyEventReplyData);
-@@ -610,11 +634,13 @@ xim_forward_event (XIMS xims, IMForwardEventStruct *call_data)
-             if (source)
-                 g_source_destroy (source);
-         } else {
--            CARD16 connect_id = x11ic->connect_id;
-             data->count = 1;
-             g_source_attach (source, NULL);
-             g_source_unref (source);
-             data->count_cb_id = g_source_get_id (source);
-+            data->connect_id = call_data->connect_id;
-+            data->x11ic = x11ic;
-+            data->event = *((XEvent*)xevent);
-             ibus_input_context_process_key_event_async (
-                     x11ic->context,
-                     event.keyval,
-@@ -626,7 +652,7 @@ xim_forward_event (XIMS xims, IMForwardEventStruct *call_data)
-                     data);
-             g_source_set_callback (source, _process_key_event_count_cb,
-                                    data, NULL);
--            while (data->count)
-+            while (data->count > 0 && data->count < MAX_WAIT_KEY_TIME)
-                 g_main_context_iteration (NULL, TRUE);
-             if (source->ref_count > 0) {
-                 /* g_source_get_id() could causes a SEGV */
-@@ -634,46 +660,33 @@ xim_forward_event (XIMS xims, IMForwardEventStruct *call_data)
-                         "issue in %p.", source);
-             }
-             retval = data->retval;
--            g_slice_free (ProcessKeyEventReplyData, data);
--
--            if (g_hash_table_lookup (_connections,
--                                     GINT_TO_POINTER ((gint)connect_id))
--                == NULL) {
-+            if (data->count == 0) {
-+                g_slice_free (ProcessKeyEventReplyData, data);
-                 return 1;
-             }
-         }
- 
--        if (retval) {
--            if (! x11ic->has_preedit_area) {
--                _xim_set_cursor_location (x11ic);
--            }
--            return 1;
-+        g_slice_free (ProcessKeyEventReplyData, data);
-+        if (g_hash_table_lookup (_connections,
-+                                 GINT_TO_POINTER ((gint)call_data->connect_id))
-+                == NULL) {
-+                return 1;
-         }
--
--        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;
--
--        IMForwardEvent (_xims, (XPointer) &fe);
--
-+        _xim_forward_key_event_done (x11ic, &call_data->event, retval);
-         retval = 1;
-         break;
-     }
-     default: {
--        IMForwardEventStruct *pfe;
-+        ProcessKeyEventReplyData *data;
- 
--        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;
-+        if (!(data = g_slice_new0 (ProcessKeyEventReplyData))) {
-+            g_warning ("Cannot allocate async data");
-+            _xim_forward_key_event_done (x11ic, &call_data->event, 0);
-+            return 1;
-+        }
-+        data->connect_id = call_data->connect_id;
-+        data->x11ic = x11ic;
-+        data->event = call_data->event;
- 
-         ibus_input_context_process_key_event_async (
-                                       x11ic->context,
-@@ -683,7 +696,7 @@ xim_forward_event (XIMS xims, IMForwardEventStruct *call_data)
-                                       -1,
-                                       NULL,
-                                       _process_key_event_done,
--                                      pfe);
-+                                      data);
-         retval = 1;
-     }
-     }
-@@ -962,11 +975,10 @@ _xim_forward_key_event (X11IC   *x11ic,
-                         guint    keycode,
-                         guint    state)
- {
--    g_return_if_fail (x11ic != NULL);
--
--    IMForwardEventStruct fe = {0};
-     XEvent xkp = {0};
- 
-+    g_return_if_fail (x11ic != NULL);
-+
-     xkp.xkey.type = (state & IBUS_RELEASE_MASK) ? KeyRelease : KeyPress;
-     xkp.xkey.serial = 0L;
-     xkp.xkey.send_event = False;
-@@ -975,20 +987,14 @@ _xim_forward_key_event (X11IC   *x11ic,
-     xkp.xkey.window =
-         x11ic->focus_window ? x11ic->focus_window : x11ic->client_window;
-     xkp.xkey.subwindow = None;
--    xkp.xkey.root = DefaultRootWindow (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
-+    xkp.xkey.root = DefaultRootWindow (
-+            GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
- 
-     xkp.xkey.time = 0;
-     xkp.xkey.state = state;
-     xkp.xkey.keycode = (keycode == 0) ? 0 : keycode + 8;
- 
--    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 = xkp;
--
--    IMForwardEvent (_xims, (XPointer) & fe);
-+    _xim_forward_key_event_done (x11ic, &xkp, FALSE);
- }
- 
- static void
--- 
-2.38.1
-
-From 5b5d0795f297e330fdc84b6be6beab1305b0cda9 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Wed, 15 Mar 2023 10:22:05 +0900
-Subject: [PATCH] util/IMdkit: Disable while loop before call
- ForwardEventMessageProc()
-
-Seems ProcessQueue() had a wrong XFree() with async process-key-event.
-Fixes: c0fec89ae76f9522319f58107ab234992b249ec6
-
-BUG=https://github.com/ibus/ibus/issues/2484
----
- util/IMdkit/i18nPtHdr.c | 9 +++------
- 1 file changed, 3 insertions(+), 6 deletions(-)
-
-diff --git a/util/IMdkit/i18nPtHdr.c b/util/IMdkit/i18nPtHdr.c
-index 8dc52714..ec20e322 100644
---- a/util/IMdkit/i18nPtHdr.c
-+++ b/util/IMdkit/i18nPtHdr.c
-@@ -1747,11 +1747,13 @@ static void ProcessQueue (XIMS ims, CARD16 connect_id)
-         XimProtoHdr *hdr = (XimProtoHdr *) client->pending->p;
-         unsigned char *p1 = (unsigned char *) (hdr + 1);
-         IMProtocol call_data;
-+        XIMPending *old = client->pending;
- 
-         call_data.major_code = hdr->major_opcode;
-         call_data.any.minor_code = hdr->minor_opcode;
-         call_data.any.connect_id = connect_id;
- 
-+        client->pending = old->next;
-         switch (hdr->major_opcode)
-         {
-         case XIM_FORWARD_EVENT:
-@@ -1760,12 +1762,7 @@ static void ProcessQueue (XIMS ims, CARD16 connect_id)
-         }
-         /*endswitch*/
-         XFree (hdr);
--        {
--            XIMPending *old = client->pending;
--
--            client->pending = old->next;
--            XFree (old);
--        }
-+        XFree (old);
-     }
-     /*endwhile*/
-     return;
--- 
-2.39.2
-
-From f82140b1368c5ec4c0b70e5caea2931ceed5589c Mon Sep 17 00:00:00 2001
-From: Sibo Dong <46512211+dongsibo@users.noreply.github.com>
-Date: Tue, 21 Feb 2023 16:38:03 -0500
-Subject: [PATCH] ui/gtk3: Update Emoji shortcut key in ibus-emoji(7)
-
-The default Emoji shortcut key was changed but not updated in the
-ibus-emoji.7 man page.
-
-Fixes: https://github.com/ibus/ibus/commit/1520c39
-
-BUG=https://github.com/ibus/ibus/pull/2475
----
- ui/gtk3/ibus-emoji.7.in | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/ui/gtk3/ibus-emoji.7.in b/ui/gtk3/ibus-emoji.7.in
-index b4d941ec..31074300 100644
---- a/ui/gtk3/ibus-emoji.7.in
-+++ b/ui/gtk3/ibus-emoji.7.in
-@@ -51,7 +51,7 @@ E.g. "Noto Color Emoji", "Android Emoji" font.
- 
- .SH "KEYBOARD OPERATIONS"
- .TP
--\fBControl-Period or Control-Semicolon\fR
-+\fBSuper-Period\fR
- Launch IBus Emojier. The shortcut key can be customized by
- .B ibus\-setup (1).
- .TP
--- 
-2.40.0
-
-From 9553dbf12ec42a58beb671a7039827fbd652e14d Mon Sep 17 00:00:00 2001
-From: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp>
-Date: Mon, 27 Mar 2023 19:45:37 +0900
-Subject: [PATCH] Portability fixes for preparation of NetBSD CI
-
-- Makefile: Ignore errors on $(RM) -r "`uname -i`"
-
-- autogen: Replace make with $MAKE
-
-- data/dconf: BSD does not support the --tmpdir long option
-              in mktemp. Also add the cleanup function.
-
-BUG=https://github.com/ibus/ibus/pull/2482
----
- Makefile.am                          |  2 +-
- autogen.sh                           |  7 ++++---
- data/dconf/make-dconf-override-db.sh | 11 ++++++++---
- 3 files changed, 13 insertions(+), 7 deletions(-)
-
-diff --git a/Makefile.am b/Makefile.am
-index 17e56b38..16548d25 100644
---- a/Makefile.am
-+++ b/Makefile.am
-@@ -139,7 +139,7 @@ srpm: dist @PACKAGE_NAME@.spec
- 			@PACKAGE_NAME@.spec
- 
- clean-rpm:
--	$(RM) -r "`uname -i`"
-+	-$(RM) -r "`uname -i`"
- 
- clean-local: clean-rpm
- 
-diff --git a/autogen.sh b/autogen.sh
-index 9b1d8342..4ea8d757 100755
---- a/autogen.sh
-+++ b/autogen.sh
-@@ -4,6 +4,7 @@
- : ${srcdir=$(dirname $0)}
- : ${srcdir:=.}
- : ${SAVE_DIST_FILES:=0}
-+: ${MAKE:=make}
- 
- olddir=$(pwd)
- # shellcheck disable=SC2016
-@@ -73,7 +74,7 @@ cd "$olddir"
-     (test "$1" = "--help" ) && {
-         exit 0
-     } || {
--        echo "Now type 'make' to compile $PKG_NAME" || exit 1
-+        echo "Now type '$MAKE' to compile $PKG_NAME" || exit 1
-     }
- } || {
-     echo "Skipping configure process."
-@@ -83,8 +84,8 @@ cd "$srcdir"
- (test "x$SAVE_DIST_FILES" = "x0" ) && {
-     # rm engine/simple.xml.in src/ibusemojigen.h src/ibusunicodegen.h
-     for d in engine src src/compose; do
--        echo "make -C $d maintainer-clean-generic"
--        make -C $d maintainer-clean-generic
-+        echo "$MAKE -C $d maintainer-clean-generic"
-+        $MAKE -C $d maintainer-clean-generic
-    done
- } || :
- cd "$olddir"
-diff --git a/data/dconf/make-dconf-override-db.sh b/data/dconf/make-dconf-override-db.sh
-index 601c1c3f..32cb1530 100755
---- a/data/dconf/make-dconf-override-db.sh
-+++ b/data/dconf/make-dconf-override-db.sh
-@@ -1,4 +1,4 @@
--#!/bin/bash
-+#!/bin/sh
- 
- set -e
- 
-@@ -6,7 +6,7 @@ set -e
- # breaks dbus-launch.  There's dbus-run-session which is
- # better, but not everyone has it yet.
- export DBUS_FATAL_WARNINGS=0
--export TMPDIR=$(mktemp -d --tmpdir="$PWD")
-+export TMPDIR=$(mktemp -d -p "$PWD")
- export XDG_CONFIG_HOME="$TMPDIR/config"
- export XDG_CACHE_HOME="$TMPDIR/cache"
- export GSETTINGS_SCHEMA_DIR="$TMPDIR/schemas"
-@@ -14,7 +14,12 @@ mkdir -p $XDG_CONFIG_HOME $XDG_CACHE_HOME $GSETTINGS_SCHEMA_DIR
- 
- eval `dbus-launch --sh-syntax`
- 
--trap 'rm -rf $TMPDIR; kill $DBUS_SESSION_BUS_PID' ERR
-+trap cleanup EXIT
-+
-+cleanup() {
-+  test $? -eq 0 && exit
-+  rm -rf $TMPDIR; kill $DBUS_SESSION_BUS_PID
-+}
- 
- # in case that schema is not installed on the system
- glib-compile-schemas --targetdir "$GSETTINGS_SCHEMA_DIR" "$PWD"
--- 
-2.39.2
-
-From 630f3f73f62a121abb1af5b215d193aec4e0053c Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Wed, 5 Apr 2023 14:28:49 +0900
-Subject: [PATCH] configure: Use AC_C_BIGENDIAN for BSD systems
-
-NetBSD does not define __BYTE_ORDER and use AC_C_BIGENDIAN instead.
-
-BUG=https://github.com/ibus/ibus/pull/2477
----
- configure.ac | 31 ++++---------------------------
- 1 file changed, 4 insertions(+), 27 deletions(-)
-
-diff --git a/configure.ac b/configure.ac
-index ece1d9ee..b3eacbcb 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -152,35 +152,12 @@ AC_CHECK_LIB(c, dlclose, LIBDL="", [AC_CHECK_LIB(dl, dlclose, LIBDL="-ldl")])
- AC_SUBST(LIBDL)
- 
- # Check endianness.
--AC_MSG_CHECKING([build system endianness])
--ENDIAN=unknown
--AC_RUN_IFELSE(
--    [AC_LANG_PROGRAM(
--        [[
--            #include <endian.h>
--            #if __BYTE_ORDER != __LITTLE_ENDIAN
--            #error
--            #endif
--        ]]
--    )],
--    [ENDIAN=little]
--)
--AC_RUN_IFELSE(
--    [AC_LANG_PROGRAM(
--        [[
--            #include <endian.h>
--            #if __BYTE_ORDER != __BIG_ENDIAN
--            #error
--            #endif
--        ]]
--    )],
--    [ENDIAN=big]
--)
-+AC_C_BIGENDIAN([ENDIAN=big], [ENDIAN=little], [ENDIAN=unknown], [ENDIAN=big])
- if test x"$ENDIAN" != xlittle  -a x"$ENDIAN" != xbig; then
--    AC_MSG_ERROR([Cannot deermine endianness without endian.h])
-+    AC_MSG_ERROR([Cannot determine endianness. Use ac_cv_c_bigendian to yes or no])
- fi
--AC_MSG_RESULT($ENDIAN)
- AC_SUBST(ENDIAN)
-+ENDIAN_MSG="$ENDIAN (ac_cv_c_bigendian=$ac_cv_c_bigendian)"
- 
- # Check packages.
- # Check glib2.
-@@ -902,7 +879,7 @@ Build options:
-   Install prefix                $prefix
-   Build shared libs             $enable_shared
-   Build static libs             $enable_static
--  Build endianness              $ENDIAN
-+  Build endianness              $ENDIAN_MSG
-   CFLAGS                        $CFLAGS
-   PYTHON                        $PYTHON
-   PYTHON2                       $PYTHON2
--- 
-2.39.2
-
-From 67a0f36de029fe3adc21c90c7fb8669d0d68cbe2 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Thu, 13 Apr 2023 12:22:50 +0900
-Subject: [PATCH] src: Generate ibusenumtypes.h for gen-internal-compose-table
-
-`make clean` deletes ibusenumtypes.h and ibus.h incudes ibusenumtypes.h
-and it's required by the gen-internal-compose-table build.
-
-BUG=https://github.com/ibus/ibus/issues/2501
----
- src/Makefile.am | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/src/Makefile.am b/src/Makefile.am
-index c2e8daa6..adc7f04a 100644
---- a/src/Makefile.am
-+++ b/src/Makefile.am
-@@ -194,6 +194,7 @@ gen_internal_compose_table_SOURCES = \
-     ibuserror.c         \
-     ibuskeynames.c      \
-     ibuskeyuni.c        \
-+    ibusenumtypes.h     \
-     $(NULL)
- gen_internal_compose_table_CFLAGS = $(AM_CFLAGS)
- gen_internal_compose_table_LDADD = \
--- 
-2.39.2
-
-From 310c442b62b569255ffc39bca557920d06881ade Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Tue, 2 May 2023 10:00:03 +0900
-Subject: [PATCH] ui/gtk3: Add workaround Emojier can be launched
-
-gnome-shell 44 prevents ibus from launching Emojier GUI.
-This workaround can launch the Emojier but still cannot output
-the selected emoji character to the focused application.
-
-So another workaround is needed with this patch.
-I.e. Type Ctrl-Shift-c keys to copy the seleted emoji instead of
-Enter key.
-
-BUG=https://github.com/ibus/ibus/issues/2509
-BUG=https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/6518
----
- ui/gtk3/emojier.vala | 7 +++----
- 1 file changed, 3 insertions(+), 4 deletions(-)
-
-diff --git a/ui/gtk3/emojier.vala b/ui/gtk3/emojier.vala
-index 69fb8abe..c9cf4469 100644
---- a/ui/gtk3/emojier.vala
-+++ b/ui/gtk3/emojier.vala
-@@ -2,7 +2,7 @@
-  *
-  * ibus - The Input Bus
-  *
-- * Copyright (c) 2017-2021 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (c) 2017-2023 Takao Fujiwara <takao.fujiwara1@gmail.com>
-  *
-  * This library is free software; you can redistribute it and/or
-  * modify it under the terms of the GNU Lesser General Public
-@@ -1799,12 +1799,12 @@ public class IBusEmojier : Gtk.ApplicationWindow {
- 
-         m_rebuilding_gui = true;
-         m_rebuilding_gui_timeout_id =
--                GLib.Timeout.add_seconds(10, () => {
-+                GLib.Timeout.add_seconds(5, () => {
-                     if (!m_rebuilding_gui) {
-                         m_rebuilding_gui_timeout_id = 0;
-                         return false;
-                     }
--                    warning("Rebuilding GUI is time out.");
-+                    debug("Rebuilding GUI is time out.");
-                     m_rebuilding_gui = false;
-                     m_rebuilding_gui_timeout_id = 0;
-                     return false;
-@@ -2459,7 +2459,6 @@ public class IBusEmojier : Gtk.ApplicationWindow {
- 
- 
-     public override bool focus_in_event(Gdk.EventFocus event) {
--        m_rebuilding_gui = false;
-         return base.focus_in_event(event);
-     }
- 
--- 
-2.40.0
-
-From 1a25975d9f55f18eab609e4d147dd32689e367f3 Mon Sep 17 00:00:00 2001
-From: Emil Velikov <emil.l.velikov@gmail.com>
-Date: Sun, 11 Jun 2023 16:16:35 +0900
-Subject: [PATCH 1/2] makefile: don't gzip the man pages
-
-Drop the gzip step from the manpages - distributions already do that as
-needed. In addition this resolves the final reproducibility issue with
-ibus.
-
-BUG=https://github.com/ibus/ibus/pull/2514
----
- bus/Makefile.am        | 6 +-----
- data/dconf/Makefile.am | 6 +-----
- setup/Makefile.am      | 6 +-----
- tools/Makefile.am      | 6 +-----
- ui/gtk3/Makefile.am    | 6 +-----
- 5 files changed, 5 insertions(+), 25 deletions(-)
-
-diff --git a/bus/Makefile.am b/bus/Makefile.am
-index e173ee25..d0445d02 100644
---- a/bus/Makefile.am
-+++ b/bus/Makefile.am
-@@ -169,7 +169,6 @@ EXTRA_DIST =                \
- 
- CLEANFILES = \
- 	$(man_one_DATA)            \
--	$(man_one_files)        \
- 	$(NULL)
- 
- $(libibus):
-@@ -181,14 +180,11 @@ test: ibus-daemon
- 		$(builddir)/ibus-daemon -v
- 
- man_one_in_files = ibus-daemon.1.in
--man_one_files = $(man_one_in_files:.1.in=.1)
--man_one_DATA =$(man_one_files:.1=.1.gz) 
-+man_one_DATA = $(man_one_in_files:.1.in=.1)
- man_onedir = $(mandir)/man1
- %.1: %.1.in
- 	$(AM_V_GEN) sed \
- 		-e 's|@VERSION[@]|$(VERSION)|g' $< > $@.tmp && \
- 		mv $@.tmp $@
--%.1.gz: %.1
--	$(AM_V_GEN) gzip -c $< > $@.tmp && mv $@.tmp $@
- 
- -include $(top_srcdir)/git.mk
-diff --git a/data/dconf/Makefile.am b/data/dconf/Makefile.am
-index 5360f033..2352f770 100644
---- a/data/dconf/Makefile.am
-+++ b/data/dconf/Makefile.am
-@@ -38,15 +38,12 @@ dconfdb_DATA = 00-upstream-settings
- 		{ rc=$$?; $(RM) -rf $@; exit $$rc; }
- 
- man_5_in_files = 00-upstream-settings.5.in ibus.5.in
--man_5_files = $(man_5_in_files:.5.in=.5)
--man_5_DATA =$(man_5_files:.5=.5.gz)
-+man_5_DATA = $(man_5_in_files:.5.in=.5)
- man_5dir = $(mandir)/man5
- %.5: %.5.in
- 	$(AM_V_GEN) sed \
- 	    -e 's|@VERSION[@]|$(VERSION)|g' $< > $@.tmp && \
- 	    mv $@.tmp $@
--%.5.gz: %.5
--	$(AM_V_GEN) gzip -c $< > $@.tmp && mv $@.tmp $@
- 
- install-data-hook:
- 	if test -z "$(DESTDIR)"; then \
-@@ -63,7 +60,6 @@ EXTRA_DIST = \
- 
- CLEANFILES = \
-     $(man_5_DATA) \
--    $(man_5_files) \
-     $(NULL)
- 
- MAINTAINERCLEANFILES = \
-diff --git a/setup/Makefile.am b/setup/Makefile.am
-index 34c8f136..b34aa8fc 100644
---- a/setup/Makefile.am
-+++ b/setup/Makefile.am
-@@ -56,20 +56,16 @@ org.freedesktop.IBus.Setup.desktop: ibus-setup.desktop
- 	$(AM_V_GEN) $(MSGFMT) --desktop --template $< -d $(top_srcdir)/po -o $@
- 
- man_one_in_files = ibus-setup.1.in
--man_one_files = $(man_one_in_files:.1.in=.1)
--man_one_DATA =$(man_one_files:.1=.1.gz) 
-+man_one_DATA = $(man_one_in_files:.1.in=.1)
- man_onedir = $(mandir)/man1
- %.1: %.1.in
- 	$(AM_V_GEN) sed \
- 		-e 's|@VERSION[@]|$(VERSION)|g' $< > $@.tmp && \
- 		mv $@.tmp $@
--%.1.gz: %.1
--	$(AM_V_GEN) gzip -c $< > $@.tmp && mv $@.tmp $@
- 
- CLEANFILES = \
-     $(desktop_DATA) \
-     $(man_one_DATA) \
--    $(man_one_files) \
-     *.pyc \
-     ibus-setup \
-     $(NULL)
-diff --git a/tools/Makefile.am b/tools/Makefile.am
-index e300f9f3..0d00abed 100644
---- a/tools/Makefile.am
-+++ b/tools/Makefile.am
-@@ -113,15 +113,12 @@ libibusimmodule_la_LDFLAGS = \
-     $(NULL)
- 
- man_one_in_files = ibus.1.in
--man_one_files = $(man_one_in_files:.1.in=.1)
--man_one_DATA =$(man_one_files:.1=.1.gz)
-+man_one_DATA = $(man_one_in_files:.1.in=.1)
- man_onedir = $(mandir)/man1
- %.1: %.1.in
- 	$(AM_V_GEN) sed \
- 		-e 's|@VERSION[@]|$(VERSION)|g' $< > $@.tmp && \
- 		mv $@.tmp $@
--%.1.gz: %.1
--	$(AM_V_GEN) gzip -c $< > $@.tmp && mv $@.tmp $@
- 
- EXTRA_DIST = \
-     $(ibus_immodule_vapi) \
-@@ -133,7 +130,6 @@ EXTRA_DIST = \
- 
- CLEANFILES = \
-     $(man_one_DATA) \
--    $(man_one_files) \
-     $(NULL)
- 
- if ENABLE_EMOJI_DICT
-diff --git a/ui/gtk3/Makefile.am b/ui/gtk3/Makefile.am
-index 2a9cabde..5e1a8510 100644
---- a/ui/gtk3/Makefile.am
-+++ b/ui/gtk3/Makefile.am
-@@ -257,15 +257,12 @@ panelbinding.o: $(srcdir)/panelbinding.c
- 
- MAINTAINERCLEANFILES += extension.c panelbinding.c
- 
--man_seven_files = $(man_seven_in_files:.7.in=.7)
--man_seven_DATA =$(man_seven_files:.7=.7.gz)
-+man_seven_DATA = $(man_seven_in_files:.7.in=.7)
- man_sevendir = $(mandir)/man7
- %.7: %.7.in
- 	$(AM_V_GEN) sed \
- 	    -e 's|@VERSION[@]|$(VERSION)|g' $< > $@.tmp && \
- 	    mv $@.tmp $@
--%.7.gz: %.7
--	$(AM_V_GEN) gzip -c $< > $@.tmp && mv $@.tmp $@
- 
- desktop_in_files = \
-     ibus-ui-emojier.desktop.in \
-@@ -293,7 +290,6 @@ CLEANFILES += \
-     $(desktop_DATA) \
-     $(desktop_notrans_files) \
-     $(man_seven_DATA) \
--    $(man_seven_files) \
-     $(NULL)
- 
- endif
--- 
-2.40.0
-
-From 03a486c1ec98647e7f8c7dbb70e6e4d3898c9322 Mon Sep 17 00:00:00 2001
-From: Emil Velikov <emil.l.velikov@gmail.com>
-Date: Sun, 11 Jun 2023 16:16:40 +0900
-Subject: [PATCH 2/2] makefile: manage the manpages via AC_CONFIG_FILES()
-
-The AC_CONFIG_FILES macro already known how to handle @VERSION@
-substitution, while also ensuring the input files are in the tarball
-(EXTRA_DIST) and substituted files are removed on make distclean
-(CONFIG_CLEAN_FILES).
-
-BUG=https://github.com/ibus/ibus/pull/2514
----
- bus/Makefile.am        | 12 +-----------
- configure.ac           |  6 ++++++
- data/dconf/Makefile.am | 12 +-----------
- setup/Makefile.am      |  9 +--------
- tools/Makefile.am      | 12 +-----------
- ui/gtk3/Makefile.am    | 10 +---------
- 6 files changed, 11 insertions(+), 50 deletions(-)
-
-diff --git a/bus/Makefile.am b/bus/Makefile.am
-index d0445d02..99715a15 100644
---- a/bus/Makefile.am
-+++ b/bus/Makefile.am
-@@ -163,14 +163,9 @@ test_stress_LDADD = \
- 	$(NULL)
- 
- EXTRA_DIST =                \
--	$(man_one_in_files)     \
- 	marshalers.list         \
- 	$(NULL)
- 
--CLEANFILES = \
--	$(man_one_DATA)            \
--	$(NULL)
--
- $(libibus):
- 	$(MAKE) -C $(top_builddir)/src
- 
-@@ -179,12 +174,7 @@ test: ibus-daemon
- 		G_DEBUG=fatal_warnings \
- 		$(builddir)/ibus-daemon -v
- 
--man_one_in_files = ibus-daemon.1.in
--man_one_DATA = $(man_one_in_files:.1.in=.1)
-+man_one_DATA = ibus-daemon.1
- man_onedir = $(mandir)/man1
--%.1: %.1.in
--	$(AM_V_GEN) sed \
--		-e 's|@VERSION[@]|$(VERSION)|g' $< > $@.tmp && \
--		mv $@.tmp $@
- 
- -include $(top_srcdir)/git.mk
-diff --git a/configure.ac b/configure.ac
-index b3eacbcb..73583bab 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -831,6 +831,7 @@ bindings/Makefile
- bindings/pygobject/Makefile
- bindings/vala/Makefile
- bus/Makefile
-+bus/ibus-daemon.1
- bus/services/Makefile
- client/Makefile
- client/gtk2/Makefile
-@@ -847,6 +848,8 @@ data/icons/Makefile
- data/its/Makefile
- data/keymaps/Makefile
- data/dconf/Makefile
-+data/dconf/00-upstream-settings.5
-+data/dconf/ibus.5
- docs/Makefile
- docs/reference/Makefile
- docs/reference/ibus/ibus-docs.sgml
-@@ -858,13 +861,16 @@ ibus/interface/Makefile
- m4/Makefile
- portal/Makefile
- setup/Makefile
-+setup/ibus-setup.1
- src/Makefile
- src/compose/Makefile
- src/ibusversion.h
- src/tests/Makefile
- tools/Makefile
-+tools/ibus.1
- ui/Makefile
- ui/gtk3/Makefile
-+ui/gtk3/ibus-emoji.7
- util/Makefile
- util/IMdkit/Makefile
- Makefile
-diff --git a/data/dconf/Makefile.am b/data/dconf/Makefile.am
-index 2352f770..b0601aa8 100644
---- a/data/dconf/Makefile.am
-+++ b/data/dconf/Makefile.am
-@@ -37,13 +37,8 @@ dconfdb_DATA = 00-upstream-settings
- 	$(AM_V_GEN) $(srcdir)/make-dconf-override-db.sh > $@ || \
- 		{ rc=$$?; $(RM) -rf $@; exit $$rc; }
- 
--man_5_in_files = 00-upstream-settings.5.in ibus.5.in
--man_5_DATA = $(man_5_in_files:.5.in=.5)
-+man_5_DATA = 00-upstream-settings.5 ibus.5
- man_5dir = $(mandir)/man5
--%.5: %.5.in
--	$(AM_V_GEN) sed \
--	    -e 's|@VERSION[@]|$(VERSION)|g' $< > $@.tmp && \
--	    mv $@.tmp $@
- 
- install-data-hook:
- 	if test -z "$(DESTDIR)"; then \
-@@ -52,16 +47,11 @@ install-data-hook:
- 
- EXTRA_DIST = \
-     $(gsettings_SCHEMAS) \
--    $(man_5_in_files) \
-     make-dconf-override-db.sh \
-     profile/ibus \
-     00-upstream-settings \
-     $(NULL)
- 
--CLEANFILES = \
--    $(man_5_DATA) \
--    $(NULL)
--
- MAINTAINERCLEANFILES = \
-     00-upstream-settings \
-     $(NULL)
-diff --git a/setup/Makefile.am b/setup/Makefile.am
-index b34aa8fc..831f883c 100644
---- a/setup/Makefile.am
-+++ b/setup/Makefile.am
-@@ -55,24 +55,17 @@ desktopdir = $(datadir)/applications
- org.freedesktop.IBus.Setup.desktop: ibus-setup.desktop
- 	$(AM_V_GEN) $(MSGFMT) --desktop --template $< -d $(top_srcdir)/po -o $@
- 
--man_one_in_files = ibus-setup.1.in
--man_one_DATA = $(man_one_in_files:.1.in=.1)
-+man_one_DATA = ibus-setup.1
- man_onedir = $(mandir)/man1
--%.1: %.1.in
--	$(AM_V_GEN) sed \
--		-e 's|@VERSION[@]|$(VERSION)|g' $< > $@.tmp && \
--		mv $@.tmp $@
- 
- CLEANFILES = \
-     $(desktop_DATA) \
--    $(man_one_DATA) \
-     *.pyc \
-     ibus-setup \
-     $(NULL)
- 
- EXTRA_DIST = \
-     $(desktop_notrans_files) \
--    $(man_one_in_files) \
-     ibus-setup.in \
-     setup.ui \
-     $(NULL)
-diff --git a/tools/Makefile.am b/tools/Makefile.am
-index 0d00abed..daf18f28 100644
---- a/tools/Makefile.am
-+++ b/tools/Makefile.am
-@@ -112,26 +112,16 @@ libibusimmodule_la_LDFLAGS = \
-     -export-symbols-regex "ibus_.*"                     \
-     $(NULL)
- 
--man_one_in_files = ibus.1.in
--man_one_DATA = $(man_one_in_files:.1.in=.1)
-+man_one_DATA = ibus.1
- man_onedir = $(mandir)/man1
--%.1: %.1.in
--	$(AM_V_GEN) sed \
--		-e 's|@VERSION[@]|$(VERSION)|g' $< > $@.tmp && \
--		mv $@.tmp $@
- 
- EXTRA_DIST = \
-     $(ibus_immodule_vapi) \
-     $(ibusimmodule_gir) \
--    $(man_one_in_files) \
-     ibus.bash \
-     IBusIMModule-1.0.metadata \
-     $(NULL)
- 
--CLEANFILES = \
--    $(man_one_DATA) \
--    $(NULL)
--
- if ENABLE_EMOJI_DICT
- if ENABLE_UI
- AM_VALAFLAGS += \
-diff --git a/ui/gtk3/Makefile.am b/ui/gtk3/Makefile.am
-index 5e1a8510..4a6506fe 100644
---- a/ui/gtk3/Makefile.am
-+++ b/ui/gtk3/Makefile.am
-@@ -147,8 +147,6 @@ emoji_headers =         \
-     ibusemojidialog.h   \
-     $(NULL)
- 
--man_seven_in_files = ibus-emoji.7.in
--
- # References:
- # libappindicator/src/notification-item.xml
- # libappindicator/src/notification-watcher.xml
-@@ -156,7 +154,6 @@ man_seven_in_files = ibus-emoji.7.in
- # kdelibs/kdeui/knotifications/src/org.kde.StatusNotifierWatcher.xml
- EXTRA_DIST =                            \
-     $(emoji_headers)                    \
--    $(man_seven_in_files)               \
-     emojierapp.vala                     \
-     extension.vala                      \
-     gtkextension.xml.in                 \
-@@ -257,12 +254,8 @@ panelbinding.o: $(srcdir)/panelbinding.c
- 
- MAINTAINERCLEANFILES += extension.c panelbinding.c
- 
--man_seven_DATA = $(man_seven_in_files:.7.in=.7)
-+man_seven_DATA = ibus-emoji.7
- man_sevendir = $(mandir)/man7
--%.7: %.7.in
--	$(AM_V_GEN) sed \
--	    -e 's|@VERSION[@]|$(VERSION)|g' $< > $@.tmp && \
--	    mv $@.tmp $@
- 
- desktop_in_files = \
-     ibus-ui-emojier.desktop.in \
-@@ -289,7 +282,6 @@ org.freedesktop.IBus.Panel.Extension.Gtk3.desktop: ibus-extension-gtk3.desktop
- CLEANFILES += \
-     $(desktop_DATA) \
-     $(desktop_notrans_files) \
--    $(man_seven_DATA) \
-     $(NULL)
- 
- endif
--- 
-2.40.0
-
-From 4831ed595b346f1ab9224b44e571532785ca86c7 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Sun, 11 Jun 2023 16:25:56 +0900
-Subject: [PATCH] setup: Unselect Add button in Select Input Method dialog
-
-After click "More" ListBoxRow cell in the "Select an input method"
-dialog, "Add" button is sensitive but clicking "Add" button causes
-a SEGV in enginedialog.py:get_selected_engine() because the more cell
-has no engine memmber.
-
-BUG=rhbz#2213145
----
- setup/enginedialog.py | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
-diff --git a/setup/enginedialog.py b/setup/enginedialog.py
-index 470f801c..ba6a4819 100644
---- a/setup/enginedialog.py
-+++ b/setup/enginedialog.py
-@@ -4,7 +4,7 @@
- # ibus - The Input Bus
- #
- # Copyright (c) 2015 Peng Huang <shawn.p.huang@gmail.com>
--# Copyright (c) 2015-2021 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+# Copyright (c) 2015-2023 Takao Fujiwara <takao.fujiwara1@gmail.com>
- # Copyright (c) 2013-2015 Red Hat, Inc.
- #
- # This program is free software; you can redistribute it and/or
-@@ -145,6 +145,8 @@ class EngineDialog(Gtk.Dialog):
- 
-     def __row_activated(self, box, row):
-         if row == self.__more_row:
-+            # Undo sensitive Gtk.ResponseType.APPLY button
-+            self.__list.unselect_row(row)
-             self.__show_more()
-             return
-         if row.back:
--- 
-2.40.0
-
-From 76f2f4a3aa25b399d65c947d76d61d5ae4723bc7 Mon Sep 17 00:00:00 2001
-From: Matt Turner <mattst88@gmail.com>
-Date: Sun, 11 Jun 2023 19:59:17 +0900
-Subject: [PATCH 1/2] configure: Run autoupdate
-
-Avoids these warnings when running autogen.sh:
-
-configure.ac:67: warning: The macro `AC_GNU_SOURCE' is obsolete.
-configure.ac:67: You should run autoupdate.
-./lib/autoconf/specific.m4:311: AC_GNU_SOURCE is expanded from...
-configure.ac:67: the top level
-configure.ac:129: warning: The macro `AC_PROG_CC_STDC' is obsolete.
-configure.ac:129: You should run autoupdate.
-./lib/autoconf/c.m4:1671: AC_PROG_CC_STDC is expanded from...
-configure.ac:129: the top level
-configure.ac:139: warning: The macro `AM_DISABLE_STATIC' is obsolete.
-configure.ac:139: You should run autoupdate.
-m4/ltoptions.m4:260: AM_DISABLE_STATIC is expanded from...
-configure.ac:139: the top level
-configure.ac:140: warning: The macro `AC_ISC_POSIX' is obsolete.
-configure.ac:140: You should run autoupdate.
-./lib/autoconf/specific.m4:549: AC_ISC_POSIX is expanded from...
-configure.ac:140: the top level
-configure.ac:141: warning: The macro `AC_HEADER_STDC' is obsolete.
-configure.ac:141: You should run autoupdate.
-./lib/autoconf/headers.m4:704: AC_HEADER_STDC is expanded from...
-configure.ac:141: the top level
-
-BUG=https://github.com/ibus/ibus/pull/2519
----
- configure.ac | 9 ++++-----
- 1 file changed, 4 insertions(+), 5 deletions(-)
-
-diff --git a/configure.ac b/configure.ac
-index 73583bab..cbdfbd05 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -64,7 +64,7 @@ AC_SUBST(VALA_TARGET_GLIB_VERSION)
- # Init automake.
- AM_INIT_AUTOMAKE([1.11.1 parallel-tests])
- AM_MAINTAINER_MODE([enable])
--AC_GNU_SOURCE
-+AC_USE_SYSTEM_EXTENSIONS
- 
- # Support silent build rules. Disable
- # by either passing --disable-silent-rules to configure or passing V=1
-@@ -126,7 +126,6 @@ AC_SUBST(DATE_DISPLAY)
- # Check for programs.
- AC_PROG_CC
- AM_PROG_CC_C_O
--AC_PROG_CC_STDC
- AM_PROG_VALAC([0.20])
- AC_PROG_INSTALL
- AC_PROG_MAKE_SET
-@@ -136,9 +135,9 @@ AM_GNU_GETTEXT_VERSION([0.19.8])
- AM_GNU_GETTEXT([external])
- 
- # Define PACKAGE_VERSION_* variables.
--AM_DISABLE_STATIC
--AC_ISC_POSIX
--AC_HEADER_STDC
-+AC_DISABLE_STATIC([])
-+AC_SEARCH_LIBS([strerror],[cposix])
-+
- LT_INIT
- 
- # Check header filess.
--- 
-2.40.0
-
-From b97e6669ea8127dd50ce49d061edd4ce579bbb42 Mon Sep 17 00:00:00 2001
-From: Matt Turner <mattst88@gmail.com>
-Date: Sun, 11 Jun 2023 19:59:18 +0900
-Subject: [PATCH 2/2] src/ibuscomposetable: Fix unaligned accesses
-
-Fixes: https://github.com/ibus/ibus/commit/19ca1065
-
-BUG=https://github.com/ibus/ibus/issues/2518
----
- src/ibuscomposetable.c | 23 +++++++++++++----------
- 1 file changed, 13 insertions(+), 10 deletions(-)
-
-diff --git a/src/ibuscomposetable.c b/src/ibuscomposetable.c
-index fc486692..c807c751 100644
---- a/src/ibuscomposetable.c
-+++ b/src/ibuscomposetable.c
-@@ -732,8 +732,8 @@ compose_data_to_variant (gconstpointer compose_data,
-                          gboolean reverse_endianness,
-                          GError **error)
- {
--    guint16 *compose_data16 = NULL;
--    guint32 *compose_data32 = NULL;
-+    guint16 data16;
-+    guint32 data32;
-     guint16 *target_data16 = NULL;
-     guint32 *target_data32 = NULL;
-     gsize i, length;
-@@ -759,18 +759,20 @@ compose_data_to_variant (gconstpointer compose_data,
-                              "Failed to malloc");
-                 return NULL;
-             }
--            compose_data32 = (guint32*)compose_data;
--            for (i = 0; i < length; i++)
--                target_data32[i] = GUINT32_SWAP_LE_BE (compose_data32[i]);
-+            for (i = 0; i < length; i++) {
-+                memcpy(&data32, (char *)compose_data + i * sizeof (data32), sizeof (data32));
-+                target_data32[i] = GUINT32_SWAP_LE_BE (data32);
-+            }
-         } else {
-             if (!(target_data16 = g_new0 (guint16, length))) {
-                 g_set_error (error, IBUS_ERROR, IBUS_ERROR_FAILED,
-                              "Failed to malloc");
-                 return NULL;
-             }
--            compose_data16 = (guint16*)compose_data;
--            for (i = 0; i < length; i++)
--                target_data16[i] = GUINT16_SWAP_LE_BE (compose_data16[i]);
-+            for (i = 0; i < length; i++) {
-+                memcpy(&data16, (char *)compose_data + i * sizeof (data16), sizeof (data16));
-+                target_data16[i] = GUINT16_SWAP_LE_BE (data16);
-+            }
-         }
-     } else {
-         if (is_32bit)
-@@ -1365,8 +1367,9 @@ ibus_compose_table_new_with_list (GList   *compose_list,
-         if (is_32bit) {
-             for (j = 0; compose_data->values[j]; j++) {
-                 g_assert (v_index_32bit + j <  v_size_32bit);
--                ibus_compose_seqs_32bit_second[v_index_32bit + j] =
--                        compose_data->values[j];
-+                memcpy(&ibus_compose_seqs_32bit_second[v_index_32bit + j],
-+                       &compose_data->values[j],
-+                       sizeof *ibus_compose_seqs_32bit_second);
-             }
-             g_assert (m + 1 < (s_size_total - s_size_16bit) * n_index_stride);
-             ibus_compose_seqs_32bit_first[m++] = j;
--- 
-2.40.0
-
-From f0492c86f7c42d35bedff1a1910075617243d1f0 Mon Sep 17 00:00:00 2001
-From: Matt Turner <mattst88@gmail.com>
-Date: Sun, 18 Jun 2023 10:59:35 +0900
-Subject: [PATCH] m4: Update m4 files
-
-- Revert .gitignore because m4 files cannot be added
-- Delete as-version.m4 which has been unused since 2010
-- Update the latest introspection.m4
-- Update the latest vapigen.m4
-
-Fixes: https://github.com/ibus/ibus/commit/d23bbdd
-Fixes: https://github.com/ibus/ibus/commit/3b3f56d
-
-BUG=https://github.com/ibus/ibus/pull/2527
----
- m4/Makefile.am      |  1 -
- m4/as-version.m4    | 71 ---------------------------------------------
- m4/introspection.m4 | 60 ++++++++++++++++++++++++++++++++++----
- m4/vapigen.m4       | 19 +++++++-----
- 5 files changed, 66 insertions(+), 86 deletions(-)
- delete mode 100644 m4/as-version.m4
-
-diff --git a/m4/Makefile.am b/m4/Makefile.am
-index dcf84ac3..49ecbb89 100644
---- a/m4/Makefile.am
-+++ b/m4/Makefile.am
-@@ -21,7 +21,6 @@
- # USA
- 
- EXTRA_DIST = \
--    as-version.m4 \
-     ibuslocale.m4 \
-     vapigen.m4 \
-     $(NULL)
-diff --git a/m4/as-version.m4 b/m4/as-version.m4
-deleted file mode 100644
-index a5b43990..00000000
---- a/m4/as-version.m4
-+++ /dev/null
-@@ -1,71 +0,0 @@
--dnl as-version.m4 0.2.0
--
--dnl autostars m4 macro for versioning
--
--dnl Thomas Vander Stichele <thomas at apestaart dot org>
--
--dnl $Id: as-version.m4,v 1.4 2004/06/01 09:40:05 thomasvs Exp $
--
--dnl AS_VERSION
--
--dnl example
--dnl AS_VERSION
--
--dnl this macro
--dnl - AC_SUBST's PACKAGE_VERSION_MAJOR, _MINOR, _MICRO
--dnl - AC_SUBST's PACKAGE_VERSION_RELEASE,
--dnl    which can be used for rpm release fields
--dnl - doesn't call AM_INIT_AUTOMAKE anymore because it prevents
--dnl   maintainer mode from running correctly
--dnl
--dnl don't forget to put #undef PACKAGE_VERSION_RELEASE in acconfig.h
--dnl if you use acconfig.h
--
--AC_DEFUN([AS_VERSION],
--[
--  PACKAGE_VERSION_MAJOR=$(echo AC_PACKAGE_VERSION | cut -d'.' -f1)
--  PACKAGE_VERSION_MINOR=$(echo AC_PACKAGE_VERSION | cut -d'.' -f2)
--  PACKAGE_VERSION_MICRO=$(echo AC_PACKAGE_VERSION | cut -d'.' -f3)
--
--  AC_SUBST(PACKAGE_VERSION_MAJOR)
--  AC_SUBST(PACKAGE_VERSION_MINOR)
--  AC_SUBST(PACKAGE_VERSION_MICRO)
--])
--
--dnl AS_NANO(ACTION-IF-NO-NANO, [ACTION-IF-NANO])
--
--dnl requires AC_INIT to be called before
--dnl For projects using a fourth or nano number in your versioning to indicate
--dnl development or prerelease snapshots, this macro allows the build to be
--dnl set up differently accordingly.
--
--dnl this macro:
--dnl - parses AC_PACKAGE_VERSION, set by AC_INIT, and extracts the nano number
--dnl - sets the variable PACKAGE_VERSION_NANO
--dnl - sets the variable PACKAGE_VERSION_RELEASE, which can be used
--dnl   for rpm release fields
--dnl - executes ACTION-IF-NO-NANO or ACTION-IF-NANO
--    
--dnl example:
--dnl AS_NANO(RELEASE="yes", RELEASE="no")
--
--AC_DEFUN([AS_NANO],
--[
--  AC_MSG_CHECKING(nano version)
--
--  NANO=$(echo AC_PACKAGE_VERSION | cut -d'.' -f4)
--
--  if test x"$NANO" = x || test "x$NANO" = "x0" ; then
--    AC_MSG_RESULT([0 (release)])
--    NANO=0
--    PACKAGE_VERSION_RELEASE=1
--    ifelse([$1], , :, [$1])
--  else
--    AC_MSG_RESULT($NANO)
--    PACKAGE_VERSION_RELEASE=0.`date +%Y%m%d.%H%M%S`
--    ifelse([$2], , :, [$2])
--  fi
--  PACKAGE_VERSION_NANO=$NANO
--  AC_SUBST(PACKAGE_VERSION_NANO)
--  AC_SUBST(PACKAGE_VERSION_RELEASE)
--])
-diff --git a/m4/introspection.m4 b/m4/introspection.m4
-index 589721c5..b0ccd689 100644
---- a/m4/introspection.m4
-+++ b/m4/introspection.m4
-@@ -8,6 +8,47 @@ dnl
- 
- # serial 1
- 
-+dnl This is a copy of AS_AC_EXPAND
-+dnl
-+dnl (C) 2003, 2004, 2005 Thomas Vander Stichele <thomas at apestaart dot org>
-+dnl Copying and distribution of this file, with or without modification,
-+dnl are permitted in any medium without royalty provided the copyright
-+dnl notice and this notice are preserved.
-+m4_define([_GOBJECT_INTROSPECTION_AS_AC_EXPAND],
-+[
-+  EXP_VAR=[$1]
-+  FROM_VAR=[$2]
-+
-+  dnl first expand prefix and exec_prefix if necessary
-+  prefix_save=$prefix
-+  exec_prefix_save=$exec_prefix
-+
-+  dnl if no prefix given, then use /usr/local, the default prefix
-+  if test "x$prefix" = "xNONE"; then
-+    prefix="$ac_default_prefix"
-+  fi
-+  dnl if no exec_prefix given, then use prefix
-+  if test "x$exec_prefix" = "xNONE"; then
-+    exec_prefix=$prefix
-+  fi
-+
-+  full_var="$FROM_VAR"
-+  dnl loop until it doesn't change anymore
-+  while true; do
-+    new_full_var="`eval echo $full_var`"
-+    if test "x$new_full_var" = "x$full_var"; then break; fi
-+    full_var=$new_full_var
-+  done
-+
-+  dnl clean up
-+  full_var=$new_full_var
-+  AC_SUBST([$1], "$full_var")
-+
-+  dnl restore prefix and exec_prefix
-+  prefix=$prefix_save
-+  exec_prefix=$exec_prefix_save
-+])
-+
- m4_define([_GOBJECT_INTROSPECTION_CHECK_INTERNAL],
- [
-     AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first
-@@ -41,6 +82,8 @@ m4_define([_GOBJECT_INTROSPECTION_CHECK_INTERNAL],
-     ],dnl
-     [auto],[dnl
-         PKG_CHECK_EXISTS([gobject-introspection-1.0 >= $1], found_introspection=yes, found_introspection=no)
-+	dnl Canonicalize enable_introspection
-+	enable_introspection=$found_introspection
-     ],dnl
-     [dnl	
-         AC_MSG_ERROR([invalid argument passed to --enable-introspection, should be one of @<:@no/auto/yes@:>@])
-@@ -48,20 +91,25 @@ m4_define([_GOBJECT_INTROSPECTION_CHECK_INTERNAL],
- 
-     AC_MSG_RESULT([$found_introspection])
- 
-+    dnl expand datadir/libdir so we can pass them to pkg-config
-+    dnl and get paths relative to our target directories
-+    _GOBJECT_INTROSPECTION_AS_AC_EXPAND(_GI_EXP_DATADIR, "$datadir")
-+    _GOBJECT_INTROSPECTION_AS_AC_EXPAND(_GI_EXP_LIBDIR, "$libdir")
-+
-     INTROSPECTION_SCANNER=
-     INTROSPECTION_COMPILER=
-     INTROSPECTION_GENERATE=
-     INTROSPECTION_GIRDIR=
-     INTROSPECTION_TYPELIBDIR=
-     if test "x$found_introspection" = "xyes"; then
--       INTROSPECTION_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0`
--       INTROSPECTION_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0`
--       INTROSPECTION_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0`
--       INTROSPECTION_GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0`
--       INTROSPECTION_TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)"
-+       INTROSPECTION_SCANNER=$PKG_CONFIG_SYSROOT_DIR`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0`
-+       INTROSPECTION_COMPILER=$PKG_CONFIG_SYSROOT_DIR`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0`
-+       INTROSPECTION_GENERATE=$PKG_CONFIG_SYSROOT_DIR`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0`
-+       INTROSPECTION_GIRDIR=`$PKG_CONFIG --define-variable=datadir="${_GI_EXP_DATADIR}" --variable=girdir gobject-introspection-1.0`
-+       INTROSPECTION_TYPELIBDIR="$($PKG_CONFIG --define-variable=libdir="${_GI_EXP_LIBDIR}" --variable=typelibdir gobject-introspection-1.0)"
-        INTROSPECTION_CFLAGS=`$PKG_CONFIG --cflags gobject-introspection-1.0`
-        INTROSPECTION_LIBS=`$PKG_CONFIG --libs gobject-introspection-1.0`
--       INTROSPECTION_MAKEFILE=`$PKG_CONFIG --variable=datadir gobject-introspection-1.0`/gobject-introspection-1.0/Makefile.introspection
-+       INTROSPECTION_MAKEFILE=$PKG_CONFIG_SYSROOT_DIR`$PKG_CONFIG --variable=datadir gobject-introspection-1.0`/gobject-introspection-1.0/Makefile.introspection
-     fi
-     AC_SUBST(INTROSPECTION_SCANNER)
-     AC_SUBST(INTROSPECTION_COMPILER)
-diff --git a/m4/vapigen.m4 b/m4/vapigen.m4
-index 051ccd2e..6228991a 100644
---- a/m4/vapigen.m4
-+++ b/m4/vapigen.m4
-@@ -16,15 +16,20 @@ dnl You should have received a copy of the GNU Lesser General Public
- dnl License along with this library; if not, write to the Free Software
- dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
- 
--# VAPIGEN_CHECK([VERSION], [API_VERSION], [FOUND-INTROSPECTION], [DEFAULT])
-+# VAPIGEN_CHECK([VERSION], [API_VERSION], [FOUND_INTROSPECTION], [DEFAULT])
- # --------------------------------------
- # Check vapigen existence and version
- #
- # See http://live.gnome.org/Vala/UpstreamGuide for detailed documentation
- AC_DEFUN([VAPIGEN_CHECK],
- [
--  AC_BEFORE([GOBJECT_INTROSPECTION_CHECK],[$0])
--  AC_BEFORE([GOBJECT_INTROSPECTION_REQUIRE],[$0])
-+  AS_IF([test "x$3" != "xyes"], [
-+      m4_provide_if([GOBJECT_INTROSPECTION_CHECK], [], [
-+          m4_provide_if([GOBJECT_INTROSPECTION_REQUIRE], [], [
-+              AC_MSG_ERROR([[You must call GOBJECT_INTROSPECTION_CHECK or GOBJECT_INTROSPECTION_REQUIRE before using VAPIGEN_CHECK unless using the FOUND_INTROSPECTION argument is "yes"]])
-+            ])
-+        ])
-+    ])
- 
-   AC_ARG_ENABLE([vala],
-     [AS_HELP_STRING([--enable-vala[=@<:@no/auto/yes@:>@]],[build Vala bindings @<:@default=]ifelse($4,,auto,$4)[@:>@])],,[
-@@ -77,12 +82,12 @@ AC_DEFUN([VAPIGEN_CHECK],
- 
-   AS_CASE([$enable_vala],
-     [yes], [
--      VAPIGEN=`$PKG_CONFIG --variable=vapigen $vapigen_pkg_name`
--      VAPIGEN_MAKEFILE=`$PKG_CONFIG --variable=datadir $vapigen_pkg_name`/vala/Makefile.vapigen
-+      VAPIGEN=$PKG_CONFIG_SYSROOT_DIR`$PKG_CONFIG --variable=vapigen $vapigen_pkg_name`
-+      VAPIGEN_MAKEFILE=$PKG_CONFIG_SYSROOT_DIR`$PKG_CONFIG --variable=datadir $vapigen_pkg_name`/vala/Makefile.vapigen
-       AS_IF([test "x$2" = "x"], [
--          VAPIGEN_VAPIDIR=`$PKG_CONFIG --variable=vapidir $vapigen_pkg_name`
-+          VAPIGEN_VAPIDIR=$PKG_CONFIG_SYSROOT_DIR`$PKG_CONFIG --variable=vapidir $vapigen_pkg_name`
-         ], [
--          VAPIGEN_VAPIDIR=`$PKG_CONFIG --variable=vapidir_versioned $vapigen_pkg_name`
-+          VAPIGEN_VAPIDIR=$PKG_CONFIG_SYSROOT_DIR`$PKG_CONFIG --variable=vapidir_versioned $vapigen_pkg_name`
-         ])
-     ])
- 
--- 
-2.41.0
-
-From 18f0d9f5f245f92dee086ce57a5bb94e63f1c222 Mon Sep 17 00:00:00 2001
-From: oreo639 <oreo6391@gmail.com>
-Date: Sun, 18 Jun 2023 11:08:59 +0900
-Subject: [PATCH] configure: Fix cross compiling
-
-Use AX_PROG_CC_FOR_BUILD to get build CC/CFLAGS/LDFLAGS/etc.
-Use PKG_PROG_PKG_CONFIG_FOR_BUILD to find build pkg-config binary.
-
-https://sourceware.org/autobook/autobook/autobook_143.html#Supporting-Cross-Compiler-in-Make
-
-BUG=https://github.com/ibus/ibus/issues/2479
----
- configure.ac               |  12 +++
- m4/Makefile.am             |   2 +
- m4/ax_prog_cc_for_build.m4 | 155 +++++++++++++++++++++++++++++++++++++
- m4/pkg_config_for_build.m4 |  20 +++++
- src/Makefile.am            |  67 ++++++++++++----
- 5 files changed, 240 insertions(+), 16 deletions(-)
- create mode 100644 m4/ax_prog_cc_for_build.m4
- create mode 100644 m4/pkg_config_for_build.m4
-
-diff --git a/configure.ac b/configure.ac
-index cbdfbd05..fb51367f 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -129,6 +129,7 @@ AM_PROG_CC_C_O
- AM_PROG_VALAC([0.20])
- AC_PROG_INSTALL
- AC_PROG_MAKE_SET
-+AX_PROG_CC_FOR_BUILD
- 
- # i18n stuff
- AM_GNU_GETTEXT_VERSION([0.19.8])
-@@ -150,6 +151,9 @@ AC_CHECK_FUNCS(daemon)
- AC_CHECK_LIB(c, dlclose, LIBDL="", [AC_CHECK_LIB(dl, dlclose, LIBDL="-ldl")])
- AC_SUBST(LIBDL)
- 
-+# Check if cross compiling.
-+AM_CONDITIONAL(CROSS_COMPILING, test "x$cross_compiling" = xyes)
-+
- # Check endianness.
- AC_C_BIGENDIAN([ENDIAN=big], [ENDIAN=little], [ENDIAN=unknown], [ENDIAN=big])
- if test x"$ENDIAN" != xlittle  -a x"$ENDIAN" != xbig; then
-@@ -183,6 +187,14 @@ AH_BOTTOM([
- #endif
- ])
- 
-+if test "x$cross_compiling" = "xyes"; then
-+PKG_PROG_PKG_CONFIG_FOR_BUILD
-+GLIB_CFLAGS_FOR_BUILD=`$PKG_CONFIG_FOR_BUILD --cflags glib-2.0 gobject-2.0 gio-2.0 gio-unix-2.0 gthread-2.0`
-+GLIB_LIBS_FOR_BUILD=`$PKG_CONFIG_FOR_BUILD --libs glib-2.0 gobject-2.0 gio-2.0 gio-unix-2.0 gthread-2.0`
-+AC_SUBST(GLIB_CFLAGS_FOR_BUILD)
-+AC_SUBST(GLIB_LIBS_FOR_BUILD)
-+fi
-+
- # --disable-tests option.
- AC_ARG_ENABLE(tests,
-     AS_HELP_STRING([--disable-tests],
-diff --git a/m4/Makefile.am b/m4/Makefile.am
-index 49ecbb89..8ea759e6 100644
---- a/m4/Makefile.am
-+++ b/m4/Makefile.am
-@@ -21,7 +21,9 @@
- # USA
- 
- EXTRA_DIST = \
-+    ax_prog_cc_for_build.m4 \
-     ibuslocale.m4 \
-+    pkg_config_for_build.m4 \
-     vapigen.m4 \
-     $(NULL)
- 
-diff --git a/m4/ax_prog_cc_for_build.m4 b/m4/ax_prog_cc_for_build.m4
-new file mode 100644
-index 00000000..1db8d73f
---- /dev/null
-+++ b/m4/ax_prog_cc_for_build.m4
-@@ -0,0 +1,155 @@
-+# ===========================================================================
-+#   https://www.gnu.org/software/autoconf-archive/ax_prog_cc_for_build.html
-+# ===========================================================================
-+#
-+# SYNOPSIS
-+#
-+#   AX_PROG_CC_FOR_BUILD
-+#
-+# DESCRIPTION
-+#
-+#   This macro searches for a C compiler that generates native executables,
-+#   that is a C compiler that surely is not a cross-compiler. This can be
-+#   useful if you have to generate source code at compile-time like for
-+#   example GCC does.
-+#
-+#   The macro sets the CC_FOR_BUILD and CPP_FOR_BUILD macros to anything
-+#   needed to compile or link (CC_FOR_BUILD) and preprocess (CPP_FOR_BUILD).
-+#   The value of these variables can be overridden by the user by specifying
-+#   a compiler with an environment variable (like you do for standard CC).
-+#
-+#   It also sets BUILD_EXEEXT and BUILD_OBJEXT to the executable and object
-+#   file extensions for the build platform, and GCC_FOR_BUILD to `yes' if
-+#   the compiler we found is GCC. All these variables but GCC_FOR_BUILD are
-+#   substituted in the Makefile.
-+#
-+# LICENSE
-+#
-+#   Copyright (c) 2008 Paolo Bonzini <bonzini@gnu.org>
-+#
-+#   Copying and distribution of this file, with or without modification, are
-+#   permitted in any medium without royalty provided the copyright notice
-+#   and this notice are preserved. This file is offered as-is, without any
-+#   warranty.
-+
-+#serial 21
-+
-+AU_ALIAS([AC_PROG_CC_FOR_BUILD], [AX_PROG_CC_FOR_BUILD])
-+AC_DEFUN([AX_PROG_CC_FOR_BUILD], [dnl
-+AC_REQUIRE([AC_PROG_CC])dnl
-+AC_REQUIRE([AC_PROG_CPP])dnl
-+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-+
-+dnl Use the standard macros, but make them use other variable names
-+dnl
-+pushdef([ac_cv_prog_CPP], ac_cv_build_prog_CPP)dnl
-+pushdef([ac_cv_prog_cc_c89], ac_cv_build_prog_cc_c89)dnl
-+pushdef([ac_cv_prog_cc_c99], ac_cv_build_prog_cc_c99)dnl
-+pushdef([ac_cv_prog_cc_c11], ac_cv_build_prog_cc_c11)dnl
-+pushdef([ac_cv_prog_gcc], ac_cv_build_prog_gcc)dnl
-+pushdef([ac_cv_prog_cc_works], ac_cv_build_prog_cc_works)dnl
-+pushdef([ac_cv_prog_cc_cross], ac_cv_build_prog_cc_cross)dnl
-+pushdef([ac_cv_prog_cc_g], ac_cv_build_prog_cc_g)dnl
-+pushdef([ac_cv_c_compiler_gnu], ac_cv_build_c_compiler_gnu)dnl
-+pushdef([ac_cv_exeext], ac_cv_build_exeext)dnl
-+pushdef([ac_cv_objext], ac_cv_build_objext)dnl
-+pushdef([ac_exeext], ac_build_exeext)dnl
-+pushdef([ac_objext], ac_build_objext)dnl
-+pushdef([CC], CC_FOR_BUILD)dnl
-+pushdef([CPP], CPP_FOR_BUILD)dnl
-+pushdef([GCC], GCC_FOR_BUILD)dnl
-+pushdef([CFLAGS], CFLAGS_FOR_BUILD)dnl
-+pushdef([CPPFLAGS], CPPFLAGS_FOR_BUILD)dnl
-+pushdef([EXEEXT], BUILD_EXEEXT)dnl
-+pushdef([LDFLAGS], LDFLAGS_FOR_BUILD)dnl
-+pushdef([OBJEXT], BUILD_OBJEXT)dnl
-+pushdef([host], build)dnl
-+pushdef([host_alias], build_alias)dnl
-+pushdef([host_cpu], build_cpu)dnl
-+pushdef([host_vendor], build_vendor)dnl
-+pushdef([host_os], build_os)dnl
-+pushdef([ac_cv_host], ac_cv_build)dnl
-+pushdef([ac_cv_host_alias], ac_cv_build_alias)dnl
-+pushdef([ac_cv_host_cpu], ac_cv_build_cpu)dnl
-+pushdef([ac_cv_host_vendor], ac_cv_build_vendor)dnl
-+pushdef([ac_cv_host_os], ac_cv_build_os)dnl
-+pushdef([ac_tool_prefix], ac_build_tool_prefix)dnl
-+pushdef([am_cv_CC_dependencies_compiler_type], am_cv_build_CC_dependencies_compiler_type)dnl
-+pushdef([am_cv_prog_cc_c_o], am_cv_build_prog_cc_c_o)dnl
-+pushdef([cross_compiling], cross_compiling_build)dnl
-+
-+cross_compiling_build=no
-+
-+ac_build_tool_prefix=
-+AS_IF([test -n "$build"],      [ac_build_tool_prefix="$build-"],
-+      [test -n "$build_alias"],[ac_build_tool_prefix="$build_alias-"])
-+
-+AC_LANG_PUSH([C])
-+
-+dnl The pushdef([ac_cv_c_compiler_gnu], ...) currently does not cover
-+dnl the use of this variable in _AC_LANG_COMPILER_GNU called by
-+dnl AC_PROG_CC. Unset this cache variable temporarily as a workaround.
-+was_set_c_compiler_gnu=${[ac_cv_c_compiler_gnu]+y}
-+AS_IF([test ${was_set_c_compiler_gnu}],
-+    [saved_c_compiler_gnu=$[ac_cv_c_compiler_gnu]
-+    AS_UNSET([[ac_cv_c_compiler_gnu]])])
-+
-+AC_PROG_CC
-+
-+dnl Restore ac_cv_c_compiler_gnu
-+AS_IF([test ${was_set_c_compiler_gnu}],
-+  [[ac_cv_c_compiler_gnu]=$[saved_c_compiler_gnu]])
-+
-+_AC_COMPILER_EXEEXT
-+_AC_COMPILER_OBJEXT
-+AC_PROG_CPP
-+
-+dnl Restore the old definitions
-+dnl
-+popdef([cross_compiling])dnl
-+popdef([am_cv_prog_cc_c_o])dnl
-+popdef([am_cv_CC_dependencies_compiler_type])dnl
-+popdef([ac_tool_prefix])dnl
-+popdef([ac_cv_host_os])dnl
-+popdef([ac_cv_host_vendor])dnl
-+popdef([ac_cv_host_cpu])dnl
-+popdef([ac_cv_host_alias])dnl
-+popdef([ac_cv_host])dnl
-+popdef([host_os])dnl
-+popdef([host_vendor])dnl
-+popdef([host_cpu])dnl
-+popdef([host_alias])dnl
-+popdef([host])dnl
-+popdef([OBJEXT])dnl
-+popdef([LDFLAGS])dnl
-+popdef([EXEEXT])dnl
-+popdef([CPPFLAGS])dnl
-+popdef([CFLAGS])dnl
-+popdef([GCC])dnl
-+popdef([CPP])dnl
-+popdef([CC])dnl
-+popdef([ac_objext])dnl
-+popdef([ac_exeext])dnl
-+popdef([ac_cv_objext])dnl
-+popdef([ac_cv_exeext])dnl
-+popdef([ac_cv_c_compiler_gnu])dnl
-+popdef([ac_cv_prog_cc_g])dnl
-+popdef([ac_cv_prog_cc_cross])dnl
-+popdef([ac_cv_prog_cc_works])dnl
-+popdef([ac_cv_prog_cc_c89])dnl
-+popdef([ac_cv_prog_gcc])dnl
-+popdef([ac_cv_prog_CPP])dnl
-+
-+dnl restore global variables ac_ext, ac_cpp, ac_compile,
-+dnl ac_link, ac_compiler_gnu (dependant on the current
-+dnl language after popping):
-+AC_LANG_POP([C])
-+
-+dnl Finally, set Makefile variables
-+dnl
-+AC_SUBST(BUILD_EXEEXT)dnl
-+AC_SUBST(BUILD_OBJEXT)dnl
-+AC_SUBST([CFLAGS_FOR_BUILD])dnl
-+AC_SUBST([CPPFLAGS_FOR_BUILD])dnl
-+AC_SUBST([LDFLAGS_FOR_BUILD])dnl
-+])
-diff --git a/m4/pkg_config_for_build.m4 b/m4/pkg_config_for_build.m4
-new file mode 100644
-index 00000000..0422f482
---- /dev/null
-+++ b/m4/pkg_config_for_build.m4
-@@ -0,0 +1,20 @@
-+# PKG_PROG_PKG_CONFIG_FOR_BUILD([MIN-VERSION])
-+# ----------------------------------
-+AC_DEFUN([PKG_PROG_PKG_CONFIG_FOR_BUILD],
-+[m4_pattern_allow([^PKG_CONFIG_FOR_BUILD$])
-+AC_ARG_VAR([PKG_CONFIG_FOR_BUILD], [path to build system's pkg-config utility])
-+
-+if test "x$ac_cv_env_PKG_CONFIG_FOR_BUILD_set" != "xset"; then
-+	AC_PATH_PROG([PKG_CONFIG_FOR_BUILD], [pkg-config])
-+fi
-+if test -n "$PKG_CONFIG_FOR_BUILD"; then
-+	_pkg_for_build_min_version=m4_default([$1], [0.9.0])
-+	AC_MSG_CHECKING([build system's pkg-config is at least version $_pkg_min_version])
-+	if $PKG_CONFIG_FOR_BUILD --atleast-pkgconfig-version $_pkg_min_version; then
-+		AC_MSG_RESULT([yes])
-+	else
-+		AC_MSG_RESULT([no])
-+		PKG_CONFIG_FOR_BUILD=""
-+	fi
-+fi[]dnl
-+])# PKG_PROG_PKG_CONFIG_FOR_BUILD
-diff --git a/src/Makefile.am b/src/Makefile.am
-index adc7f04a..68dde2f3 100644
---- a/src/Makefile.am
-+++ b/src/Makefile.am
-@@ -46,9 +46,6 @@ noinst_PROGRAMS = gen-internal-compose-table
- # C preprocessor flags
- AM_CPPFLAGS =                                           \
-     -DG_LOG_DOMAIN=\"IBUS\"                             \
--    @GLIB2_CFLAGS@                                      \
--    @GOBJECT2_CFLAGS@                                   \
--    @GIO2_CFLAGS@                                       \
-     -DIBUS_CACHE_DIR=\""$(localstatedir)/cache/ibus"\"  \
-     -DIBUS_DATA_DIR=\"$(pkgdatadir)\"                   \
-     -DIBUS_DISABLE_DEPRECATION_WARNINGS                 \
-@@ -65,6 +62,11 @@ libibus_1_0_la_LIBADD =     \
-     @GOBJECT2_LIBS@         \
-     @GIO2_LIBS@             \
-     $(NULL)
-+libibus_1_0_la_CFLAGS =     \
-+    @GLIB2_CFLAGS@          \
-+    @GOBJECT2_CFLAGS@       \
-+    @GIO2_CFLAGS@           \
-+    $(NULL)
- libibus_1_0_la_LDFLAGS =            \
-     -no-undefined                   \
-     -export-symbols-regex "ibus_.*" \
-@@ -107,7 +109,7 @@ ibus_sources =              \
-     ibusxevent.c            \
-     ibusxml.c               \
-     $(NULL)
--libibus_1_0_la_SOURCES =    \
-+libibus_sources =           \
-     ibuscomposetable.c      \
-     ibusenumtypes.c         \
-     ibusmarshalers.c        \
-@@ -166,6 +168,7 @@ ibus_headers =              \
-     ibusxevent.h            \
-     ibusxml.h               \
-     $(NULL)
-+libibus_1_0_la_SOURCES = $(libibus_sources)
- ibusincludedir = $(includedir)/ibus-@IBUS_API_VERSION@
- ibus_public_headers =       \
-     $(ibus_headers)         \
-@@ -188,6 +191,35 @@ noinst_HEADERS =            \
-     $(ibus_private_headers) \
-     $(NULL)
- 
-+if CROSS_COMPILING
-+# Avoid libtool when building native libraries
-+libnativeibus =
-+parser_extra_sources = $(libibus_sources)
-+
-+glib_cflags = @GLIB_CFLAGS_FOR_BUILD@
-+glib_libs = @GLIB_LIBS_FOR_BUILD@
-+
-+$(noinst_PROGRAMS): CC=$(CC_FOR_BUILD)
-+$(noinst_PROGRAMS): CCLD=$(CC_FOR_BUILD)
-+$(noinst_PROGRAMS): CFLAGS=$(CFLAGS_FOR_BUILD)
-+$(noinst_PROGRAMS): CPPFLAGS=$(CPPFLAGS_FOR_BUILD)
-+$(noinst_PROGRAMS): LDFLAGS=$(LDFLAGS_FOR_BUILD)
-+else
-+libnativeibus = $(libibus)
-+parser_extra_sources =
-+
-+glib_libs =             \
-+    @GLIB2_LIBS@        \
-+    @GOBJECT2_LIBS@     \
-+    @GIO2_LIBS@         \
-+    $(NULL)
-+glib_cflags =           \
-+    @GLIB2_CFLAGS@      \
-+    @GOBJECT2_CFLAGS@   \
-+    @GIO2_CFLAGS@       \
-+    $(NULL)
-+endif
-+
- gen_internal_compose_table_SOURCES = \
-     gencomposetable.c   \
-     ibuscomposetable.c  \
-@@ -196,11 +228,12 @@ gen_internal_compose_table_SOURCES = \
-     ibuskeyuni.c        \
-     ibusenumtypes.h     \
-     $(NULL)
--gen_internal_compose_table_CFLAGS = $(AM_CFLAGS)
-+gen_internal_compose_table_CFLAGS =  \
-+    $(AM_CFLAGS)        \
-+    $(glib_cflags)      \
-+    $(NULL)
- gen_internal_compose_table_LDADD = \
--    @GLIB2_LIBS@        \
--    @GOBJECT2_LIBS@     \
--    @GIO2_LIBS@         \
-+    $(glib_libs)        \
-     $(NULL)
- 
- BUILT_SOURCES =                 \
-@@ -363,15 +396,15 @@ install-data-hook:
- 
- emoji_parser_SOURCES =          \
-     emoji-parser.c              \
-+    $(parser_extra_sources)     \
-     $(NULL)
- emoji_parser_CFLAGS =           \
--    $(GLIB2_CFLAGS)             \
--    $(GOBJECT2_CFLAGS)          \
-+    $(AM_CFLAGS)                \
-+    $(glib_cflags)              \
-     $(NULL)
- emoji_parser_LDADD =            \
--    $(libibus)                  \
--    $(GLIB2_LIBS)               \
--    $(GOBJECT2_LIBS)            \
-+    $(libnativeibus)            \
-+    $(glib_libs)                \
-     $(NULL)
- endif
- 
-@@ -408,13 +441,15 @@ ibusunicodegen.h:
- 
- unicode_parser_SOURCES =        \
-     unicode-parser.c            \
-+    $(parser_extra_sources)     \
-     $(NULL)
- unicode_parser_CFLAGS =         \
--    $(GLIB2_CFLAGS)             \
-+    $(AM_CFLAGS)                \
-+    $(glib_cflags)              \
-     $(NULL)
- unicode_parser_LDADD =          \
--    $(GLIB2_LIBS)               \
--    $(libibus)                  \
-+    $(glib_libs)                \
-+    $(libnativeibus)            \
-     $(NULL)
- endif
- 
--- 
-2.41.0
-
-From 25a2dfc12410fff5f32a3caf793a958d7e41dc4c Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Tue, 4 Jul 2023 22:46:31 +0900
-Subject: [PATCH] bus: Avoid to hang the process with SIGUSR1 signal
-
-Seems multiple `Xephyr -query` to a remote GDM login session causes
-to leave the some processes of ibus-daemon even if the Xephyr sessions
-are terminated and the issue is caused by calling bus_server_quit()
-with SIGUSR1 signal.
-
-I cannot reproduce the issue but calling the unsafe code from a signal
-handler might lead to hangs and this is another signal connection
-not to hang ibus-daemon.
-
-BUG=https://github.com/ibus/ibus/pull/2499
----
- bus/main.c | 11 ++++++-----
- 1 file changed, 6 insertions(+), 5 deletions(-)
-
-diff --git a/bus/main.c b/bus/main.c
-index e80185b1..c4b8d651 100644
---- a/bus/main.c
-+++ b/bus/main.c
-@@ -2,8 +2,8 @@
- /* vim:set et sts=4: */
- /* ibus - The Input Bus
-  * Copyright (C) 2008-2013 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright (C) 2013-2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
-- * Copyright (C) 2008-2018 Red Hat, Inc.
-+ * Copyright (C) 2013-2023 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2008-2023 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
-@@ -166,11 +166,12 @@ daemon (gint nochdir, gint noclose)
- #endif
- 
- #ifdef HAVE_SYS_PRCTL_H
--static void
--_sig_usr1_handler (int sig)
-+static gboolean
-+_on_sigusr1 (void)
- {
-     g_warning ("The parent process died.");
-     bus_server_quit (FALSE);
-+    return G_SOURCE_REMOVE;
- }
- #endif
- 
-@@ -350,7 +351,7 @@ main (gint argc, gchar **argv)
-         if (prctl (PR_SET_PDEATHSIG, SIGUSR1))
-             g_printerr ("Cannot bind SIGUSR1 for parent death\n");
-         else
--            signal (SIGUSR1, _sig_usr1_handler);
-+            g_unix_signal_add (SIGUSR1, (GSourceFunc)_on_sigusr1, NULL);
- #endif
-     }
-     bus_server_run ();
--- 
-2.41.0
-
-From be1f1d0da86006b019aaf78781d8c0c9c68fd46d Mon Sep 17 00:00:00 2001
-From: Matt Turner <mattst88@gmail.com>
-Date: Wed, 5 Jul 2023 13:33:25 +0900
-Subject: [PATCH 1/2] src: Fix missing ibusenumtypes.h with parallel build
-
-When `./autogen.sh && make -C src ibusresources.c -j2` runs,
-it causes a build failure due to no ibusenumtypes.h file.
-
-The chained dependencies are:
-ibusresources.c -> compose/sequences-$(ENDIAN)-endian
--> gen-internal-compose-table -> gencomposetable.c
-
-gencomposetable.c includes ibus.h and it causes no ibusenumtypes.h with
-the parallel build with multi CPUs.
-
-ibusenumtypes.h is in BUILT_SOURCES so it is built (with other files in
-BUILT_SOURCES) before any other rules.
-But ibus.h is included by gencomposetable.c which is needed to generate
-ibusresources.c in BUILT_SOURCES.
-
-Since gencomposetable.c is an internal build source file and
-it doesn't have to include ibus.h but can include each ibus header
-files.
-Deleting ibus.h in gencomposetable.c can fix the build failure.
-
-BUG=https://github.com/ibus/ibus/pull/2523
----
- src/gencomposetable.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/gencomposetable.c b/src/gencomposetable.c
-index 6e52d6a6..35d6ce83 100644
---- a/src/gencomposetable.c
-+++ b/src/gencomposetable.c
-@@ -20,7 +20,7 @@
-  * USA
-  */
- 
--#include <ibus.h>
-+/* #2523 Should not include <ibus.h> but each IBus header file. */
- #include <glib.h>
- #include <glib/gstdio.h>
- #include <errno.h>
--- 
-2.41.0
-
-From f25c48a1989be221e98b863c947e52eaf80dc4a3 Mon Sep 17 00:00:00 2001
-From: Matt Turner <mattst88@gmail.com>
-Date: Wed, 5 Jul 2023 13:41:33 +0900
-Subject: [PATCH 2/2] src: Fix to build libibus-1.0.la twice
-
-The purpose of autotools is to automatically handle dependencies. By
-calling $(MAKE) manually and without specifying any dependencies below,
-we are going out of our way to prevent automake from doing its job.
-
-    ibusunicodegen.h:
-           $(MAKE) $(AM_MAKEFLAGS) dicts/unicode-blocks.dict
-
-This avoids a build error whereby libibus-1.0.la is built twice
-simultaneously, races with itself, and breaks the build.
-
-    dicts/unicode-blocks.dict ibusunicodegen.h: unicode-parser
-
-The two build targets let `make ibusunicodegen.h` try to make
-`dicts/unicode-blocks.dict` and `ibusunicodegen.h` with unicode-parser.
-
-Unlike `ibusunicodegen.h`, we cannot add `ibusemojigen.h` to the rule
-that produces it (as a side-effect) because the rule is specified with
-GNU Make syntax:
-
-    dicts/emoji-%.dict: emoji-parser
-
-and doing so yields an error:
-
-    config.status: error: Something went wrong bootstrapping makefile
-        fragments for automatic dependency tracking.  If GNU make was
-        not used, consider re-running the configure script with
-        MAKE="gmake" (or whatever is necessary).  You can also try
-        re-running configure with the '--disable-dependency-tracking'
-        option to at least be able to build the package (albeit without
-        support for automatic dependency tracking).
-
-So instead, add a prerequisite to the rule.
-
-Both emoji-parser and unicode-parser has $(libibus) in LDADD
-and $(libibus) is built before emoji-parser and unicode-parser are
-built.
-
-BUG=https://github.com/ibus/ibus/pull/2523
----
- src/Makefile.am | 11 +++++------
- 1 file changed, 5 insertions(+), 6 deletions(-)
-
-diff --git a/src/Makefile.am b/src/Makefile.am
-index 68dde2f3..fee0b3ee 100644
---- a/src/Makefile.am
-+++ b/src/Makefile.am
-@@ -372,8 +372,9 @@ dicts/emoji-%.dict: emoji-parser
- 	    echo "Skip $$plus_comment $@"; \
- 	fi;
- 
--ibusemojigen.h:
--	$(MAKE) $(AM_MAKEFLAGS) dicts/emoji-en.dict
-+# #2523 Should use autotool dependency
-+ibusemojigen.h: dicts/emoji-en.dict
-+	$(MAKE) $(AM_MAKEFLAGS) $^
- 
- # We put dicts/emoji-%.dict as the make target for the parallel build
- # and the make target has to be genarated even if the file size is zero.
-@@ -424,7 +425,8 @@ dicts/unicode-names.dict: unicode-parser
- 	    echo "Generated $@"; \
- 	fi;
- 
--dicts/unicode-blocks.dict: unicode-parser
-+# #2523 Should use autotool dependency
-+dicts/unicode-blocks.dict ibusunicodegen.h: unicode-parser
- 	$(AM_V_at)input_file="$(UCD_DIR)/Blocks.txt"; \
- 	if test ! -f "$$input_file" ; then \
- 	    echo "WARNING: Not found $$input_file" 1>&2; \
-@@ -436,9 +438,6 @@ dicts/unicode-blocks.dict: unicode-parser
- 	    echo "Generated $@"; \
- 	fi;
- 
--ibusunicodegen.h:
--	$(MAKE) $(AM_MAKEFLAGS) dicts/unicode-blocks.dict
--
- unicode_parser_SOURCES =        \
-     unicode-parser.c            \
-     $(parser_extra_sources)     \
--- 
-2.41.0
-
-From 139e0be07bfbc96d5ff95e5f5ebd760fbc7d94c0 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Wed, 12 Jul 2023 07:39:27 +0900
-Subject: [PATCH 1/3] bus: Apply code style to inputcontext.c
-
----
- bus/inputcontext.c | 528 +++++++++++++++++++++++++++------------------
- 1 file changed, 319 insertions(+), 209 deletions(-)
-
-diff --git a/bus/inputcontext.c b/bus/inputcontext.c
-index e76bbdfc..8aded5d8 100644
---- a/bus/inputcontext.c
-+++ b/bus/inputcontext.c
-@@ -38,7 +38,8 @@ struct _SetEngineByDescData {
-     GTask *task;
-     /* a object to cancel bus_engine_proxy_new call */
-     GCancellable *cancellable;
--    /* a object being passed to the bus_input_context_set_engine_by_desc function. if origin_cancellable is cancelled by someone,
-+    /* a object being passed to the bus_input_context_set_engine_by_desc
-+     * function. if origin_cancellable is cancelled by someone,
-      * we cancel the cancellable above as well. */
-     GCancellable *origin_cancellable;
-     gulong cancelled_handler_id;
-@@ -211,112 +212,115 @@ static IBusPropList    *props_empty = NULL;
-  * XML will be automatically rejected by the GDBus library (see
-  * src/ibusservice.c for details.) */
- static const gchar introspection_xml[] =
--    "<node>"
--    "  <interface name='org.freedesktop.IBus.InputContext'>"
-+    "<node>\n"
-+    "  <interface name='org.freedesktop.IBus.InputContext'>\n"
-     /* properties */
--    "    <property name='ContentType' type='(uu)' access='write' />"
-+    "    <property name='ContentType' type='(uu)' access='write' />\n"
-     "    <property name='ClientCommitPreedit' type='(b)' access='write' />\n"
-     /* methods */
--    "    <method name='ProcessKeyEvent'>"
--    "      <arg direction='in'  type='u' name='keyval' />"
--    "      <arg direction='in'  type='u' name='keycode' />"
--    "      <arg direction='in'  type='u' name='state' />"
--    "      <arg direction='out' type='b' name='handled' />"
--    "    </method>"
--    "    <method name='SetCursorLocation'>"
--    "      <arg direction='in' type='i' name='x' />"
--    "      <arg direction='in' type='i' name='y' />"
--    "      <arg direction='in' type='i' name='w' />"
--    "      <arg direction='in' type='i' name='h' />"
--    "    </method>"
--    "    <method name='SetCursorLocationRelative'>"
--    "      <arg direction='in' type='i' name='x' />"
--    "      <arg direction='in' type='i' name='y' />"
--    "      <arg direction='in' type='i' name='w' />"
--    "      <arg direction='in' type='i' name='h' />"
--    "    </method>"
--    "    <method name='ProcessHandWritingEvent'>"
--    "      <arg direction='in' type='ad' name='coordinates' />"
--    "    </method>"
--    "    <method name='CancelHandWriting'>"
--    "      <arg direction='in' type='u' name='n_strokes' />"
--    "    </method>"
--    "    <method name='FocusIn' />"
--    "    <method name='FocusOut' />"
--    "    <method name='Reset' />"
--    "    <method name='SetCapabilities'>"
--    "      <arg direction='in' type='u' name='caps' />"
--    "    </method>"
--    "    <method name='PropertyActivate'>"
--    "      <arg direction='in' type='s' name='name' />"
--    "      <arg direction='in' type='u' name='state' />"
--    "    </method>"
--    "    <method name='SetEngine'>"
--    "      <arg direction='in' type='s' name='name' />"
--    "    </method>"
--    "    <method name='GetEngine'>"
--    "      <arg direction='out' type='v' name='desc' />"
--    "    </method>"
--    "    <method name='SetSurroundingText'>"
--    "      <arg direction='in' type='v' name='text' />"
--    "      <arg direction='in' type='u' name='cursor_pos' />"
--    "      <arg direction='in' type='u' name='anchor_pos' />"
--    "    </method>"
-+    "    <method name='ProcessKeyEvent'>\n"
-+    "      <arg direction='in'  type='u' name='keyval' />\n"
-+    "      <arg direction='in'  type='u' name='keycode' />\n"
-+    "      <arg direction='in'  type='u' name='state' />\n"
-+    "      <arg direction='out' type='b' name='handled' />\n"
-+    "    </method>\n"
-+    "    <method name='SetCursorLocation'>\n"
-+    "      <arg direction='in' type='i' name='x' />\n"
-+    "      <arg direction='in' type='i' name='y' />\n"
-+    "      <arg direction='in' type='i' name='w' />\n"
-+    "      <arg direction='in' type='i' name='h' />\n"
-+    "    </method>\n"
-+    "    <method name='SetCursorLocationRelative'>\n"
-+    "      <arg direction='in' type='i' name='x' />\n"
-+    "      <arg direction='in' type='i' name='y' />\n"
-+    "      <arg direction='in' type='i' name='w' />\n"
-+    "      <arg direction='in' type='i' name='h' />\n"
-+    "    </method>\n"
-+    "    <method name='ProcessHandWritingEvent'>\n"
-+    "      <arg direction='in' type='ad' name='coordinates' />\n"
-+    "    </method>\n"
-+    "    <method name='CancelHandWriting'>\n"
-+    "      <arg direction='in' type='u' name='n_strokes' />\n"
-+    "    </method>\n"
-+    "    <method name='FocusIn' />\n"
-+    "    <method name='FocusOut' />\n"
-+    "    <method name='Reset' />\n"
-+    "    <method name='SetCapabilities'>\n"
-+    "      <arg direction='in' type='u' name='caps' />\n"
-+    "    </method>\n"
-+    "    <method name='PropertyActivate'>\n"
-+    "      <arg direction='in' type='s' name='name' />\n"
-+    "      <arg direction='in' type='u' name='state' />\n"
-+    "    </method>\n"
-+    "    <method name='SetEngine'>\n"
-+    "      <arg direction='in' type='s' name='name' />\n"
-+    "    </method>\n"
-+    "    <method name='GetEngine'>\n"
-+    "      <arg direction='out' type='v' name='desc' />\n"
-+    "    </method>\n"
-+    "    <method name='SetSurroundingText'>\n"
-+    "      <arg direction='in' type='v' name='text' />\n"
-+    "      <arg direction='in' type='u' name='cursor_pos' />\n"
-+    "      <arg direction='in' type='u' name='anchor_pos' />\n"
-+    "    </method>\n"
- 
-     /* signals */
--    "    <signal name='CommitText'>"
--    "      <arg type='v' name='text' />"
--    "    </signal>"
--    "    <signal name='ForwardKeyEvent'>"
--    "      <arg type='u' name='keyval' />"
--    "      <arg type='u' name='keycode' />"
--    "      <arg type='u' name='state' />"
--    "    </signal>"
--    "    <signal name='UpdatePreeditText'>"
--    "      <arg type='v' name='text' />"
--    "      <arg type='u' name='cursor_pos' />"
--    "      <arg type='b' name='visible' />"
--    "    </signal>"
--    "    <signal name='UpdatePreeditTextWithMode'>"
--    "      <arg type='v' name='text' />"
--    "      <arg type='u' name='cursor_pos' />"
--    "      <arg type='b' name='visible' />"
--    "      <arg type='u' name='mode' />"
--    "    </signal>"
--    "    <signal name='ShowPreeditText'/>"
--    "    <signal name='HidePreeditText'/>"
--    "    <signal name='UpdateAuxiliaryText'>"
--    "      <arg type='v' name='text' />"
--    "      <arg type='b' name='visible' />"
--    "    </signal>"
--    "    <signal name='ShowAuxiliaryText'/>"
--    "    <signal name='HideAuxiliaryText'/>"
--    "    <signal name='UpdateLookupTable'>"
--    "      <arg type='v' name='table' />"
--    "      <arg type='b' name='visible' />"
--    "    </signal>"
--    "    <signal name='ShowLookupTable'/>"
--    "    <signal name='HideLookupTable'/>"
--    "    <signal name='PageUpLookupTable'/>"
--    "    <signal name='PageDownLookupTable'/>"
--    "    <signal name='CursorUpLookupTable'/>"
--    "    <signal name='CursorDownLookupTable'/>"
--    "    <signal name='RegisterProperties'>"
--    "      <arg type='v' name='props' />"
--    "    </signal>"
--    "    <signal name='UpdateProperty'>"
--    "      <arg type='v' name='prop' />"
--    "    </signal>"
--    "  </interface>"
--    "</node>";
-+    "    <signal name='CommitText'>\n"
-+    "      <arg type='v' name='text' />\n"
-+    "    </signal>\n"
-+    "    <signal name='ForwardKeyEvent'>\n"
-+    "      <arg type='u' name='keyval' />\n"
-+    "      <arg type='u' name='keycode' />\n"
-+    "      <arg type='u' name='state' />\n"
-+    "    </signal>\n"
-+    "    <signal name='UpdatePreeditText'>\n"
-+    "      <arg type='v' name='text' />\n"
-+    "      <arg type='u' name='cursor_pos' />\n"
-+    "      <arg type='b' name='visible' />\n"
-+    "    </signal>\n"
-+    "    <signal name='UpdatePreeditTextWithMode'>\n"
-+    "      <arg type='v' name='text' />\n"
-+    "      <arg type='u' name='cursor_pos' />\n"
-+    "      <arg type='b' name='visible' />\n"
-+    "      <arg type='u' name='mode' />\n"
-+    "    </signal>\n"
-+    "    <signal name='ShowPreeditText'/>\n"
-+    "    <signal name='HidePreeditText'/>\n"
-+    "    <signal name='UpdateAuxiliaryText'>\n"
-+    "      <arg type='v' name='text' />\n"
-+    "      <arg type='b' name='visible' />\n"
-+    "    </signal>\n"
-+    "    <signal name='ShowAuxiliaryText'/>\n"
-+    "    <signal name='HideAuxiliaryText'/>\n"
-+    "    <signal name='UpdateLookupTable'>\n"
-+    "      <arg type='v' name='table' />\n"
-+    "      <arg type='b' name='visible' />\n"
-+    "    </signal>\n"
-+    "    <signal name='ShowLookupTable'/>\n"
-+    "    <signal name='HideLookupTable'/>\n"
-+    "    <signal name='PageUpLookupTable'/>\n"
-+    "    <signal name='PageDownLookupTable'/>\n"
-+    "    <signal name='CursorUpLookupTable'/>\n"
-+    "    <signal name='CursorDownLookupTable'/>\n"
-+    "    <signal name='RegisterProperties'>\n"
-+    "      <arg type='v' name='props' />\n"
-+    "    </signal>\n"
-+    "    <signal name='UpdateProperty'>\n"
-+    "      <arg type='v' name='prop' />\n"
-+    "    </signal>\n"
-+    "  </interface>\n"
-+    "</node>\n";
- 
- G_DEFINE_TYPE (BusInputContext, bus_input_context, IBUS_TYPE_SERVICE)
- 
--/* TRUE if we can send preedit text to client. FALSE if the panel has to handle it. Note that we check IBUS_CAP_FOCUS here since
-- * when the capability is not set, the client has to handle a preedit text regardless of the embed_preedit_text config. */
-+/* TRUE if we can send preedit text to client. FALSE if the panel has to handle
-+ * it. Note that we check IBUS_CAP_FOCUS here since
-+ * when the capability is not set, the client has to handle a preedit text
-+ * regardless of the embed_preedit_text config. */
- #define PREEDIT_CONDITION  \
-     ((context->capabilities & IBUS_CAP_PREEDIT_TEXT) && \
--     (bus_ibus_impl_is_embed_preedit_text (BUS_DEFAULT_IBUS) || (context->capabilities & IBUS_CAP_FOCUS) == 0))
-+     (bus_ibus_impl_is_embed_preedit_text (\
-+            BUS_DEFAULT_IBUS) || (context->capabilities & IBUS_CAP_FOCUS) == 0))
- 
- static void
- _connection_destroy_cb (BusConnection   *connection,
-@@ -343,17 +347,21 @@ bus_input_context_class_init (BusInputContextClass *class)
-                                                        "");
-     g_object_ref_sink (class->default_engine_desc);
- 
--    ibus_object_class->destroy = (IBusObjectDestroyFunc) bus_input_context_destroy;
-+    ibus_object_class->destroy =
-+            (IBusObjectDestroyFunc)bus_input_context_destroy;
- 
-     /* override the parent class's implementation. */
-     IBUS_SERVICE_CLASS (class)->service_method_call =
-         bus_input_context_service_method_call;
-     IBUS_SERVICE_CLASS (class)->service_set_property =
-         bus_input_context_service_set_property;
--    /* register the xml so that bus_ibus_impl_service_method_call will be called on a method call defined in the xml (e.g. 'FocusIn'.) */
-+    /* register the xml so that bus_ibus_impl_service_method_call will be
-+     * called on a method call defined in the xml (e.g. 'FocusIn'.) */
-     ibus_service_class_add_interfaces (IBUS_SERVICE_CLASS (class), introspection_xml);
- 
--    /* install glib signals that would be handled by other classes like ibusimpl.c and panelproxy.c. */
-+    /* install glib signals that would be handled by other classes like
-+     * ibusimpl.c and panelproxy.c.
-+     */
-     context_signals[PROCESS_KEY_EVENT] =
-         g_signal_new (I_("process-key-event"),
-             G_TYPE_FROM_CLASS (class),
-@@ -576,8 +584,11 @@ bus_input_context_class_init (BusInputContextClass *class)
-             G_TYPE_NONE,
-             0);
- 
--    /* This signal is not for notifying an event on this object, but is for requesting an engine as the name shows.
--     * On the signal emission, ibusimpl.c will immediately update the context->engine variable. */
-+    /* This signal is not for notifying an event on this object, but is for
-+     * requesting an engine as the name shows.
-+     * On the signal emission, ibusimpl.c will immediately update the
-+     * context->engine variable.
-+     */
-     context_signals[REQUEST_ENGINE] =
-         g_signal_new (I_("request-engine"),
-             G_TYPE_FROM_CLASS (class),
-@@ -614,7 +625,8 @@ bus_input_context_class_init (BusInputContextClass *class)
- 
-     text_empty = ibus_text_new_from_string ("");
-     g_object_ref_sink (text_empty);
--    lookup_table_empty = ibus_lookup_table_new (9 /* page size */, 0, FALSE, FALSE);
-+    lookup_table_empty = ibus_lookup_table_new (9 /* page size */,
-+                                                0, FALSE, FALSE);
-     g_object_ref_sink (lookup_table_empty);
-     props_empty = ibus_prop_list_new ();
-     g_object_ref_sink (props_empty);
-@@ -662,9 +674,10 @@ bus_input_context_destroy (BusInputContext *context)
-     }
- 
-     if (context->connection) {
--        g_signal_handlers_disconnect_by_func (context->connection,
--                                         (GCallback) _connection_destroy_cb,
--                                         context);
-+        g_signal_handlers_disconnect_by_func (
-+                context->connection,
-+                (GCallback) _connection_destroy_cb,
-+                context);
-         g_object_unref (context->connection);
-         context->connection = NULL;
-     }
-@@ -674,7 +687,8 @@ bus_input_context_destroy (BusInputContext *context)
-         context->client = NULL;
-     }
- 
--    IBUS_OBJECT_CLASS (bus_input_context_parent_class)->destroy (IBUS_OBJECT (context));
-+    IBUS_OBJECT_CLASS (bus_input_context_parent_class)->
-+            destroy (IBUS_OBJECT (context));
- }
- 
- static gboolean
-@@ -689,25 +703,30 @@ bus_input_context_send_signal (BusInputContext *context,
-         return TRUE;
-     }
- 
--    GDBusMessage *message = g_dbus_message_new_signal (ibus_service_get_object_path ((IBusService *)context),
--                                                       interface_name,
--                                                       signal_name);
-+    GDBusMessage *message = g_dbus_message_new_signal (
-+            ibus_service_get_object_path ((IBusService *)context),
-+            interface_name,
-+            signal_name);
-     g_dbus_message_set_sender (message, "org.freedesktop.IBus");
--    g_dbus_message_set_destination (message, bus_connection_get_unique_name (context->connection));
-+    g_dbus_message_set_destination (
-+            message,
-+            bus_connection_get_unique_name (context->connection));
-     if (parameters != NULL)
-         g_dbus_message_set_body (message, parameters);
- 
--    gboolean retval =  g_dbus_connection_send_message (bus_connection_get_dbus_connection (context->connection),
--                                                       message,
--                                                       G_DBUS_SEND_MESSAGE_FLAGS_NONE,
--                                                       NULL, error);
-+    gboolean retval =  g_dbus_connection_send_message (
-+            bus_connection_get_dbus_connection (context->connection),
-+            message,
-+            G_DBUS_SEND_MESSAGE_FLAGS_NONE,
-+            NULL, error);
-     g_object_unref (message);
-     return retval;
- }
- 
- /**
-  * bus_input_context_emit_signal:
-- * @signal_name: The D-Bus signal name to emit which is in the introspection_xml.
-+ * @signal_name: The D-Bus signal name to emit which is in the
-+ * introspection_xml.
-  *
-  * Emit the D-Bus signal.
-  */
-@@ -850,9 +869,9 @@ _ic_process_key_event_reply_cb (GObject               *source,
-  * org.freedesktop.IBus.InputContext interface.
-  */
- static void
--_ic_process_key_event  (BusInputContext       *context,
--                        GVariant              *parameters,
--                        GDBusMethodInvocation *invocation)
-+_ic_process_key_event (BusInputContext       *context,
-+                       GVariant              *parameters,
-+                       GDBusMethodInvocation *invocation)
- {
-     guint keyval = IBUS_KEY_VoidSymbol;
-     guint keycode = 0;
-@@ -925,7 +944,8 @@ _ic_process_key_event  (BusInputContext       *context,
- /**
-  * _ic_set_cursor_location:
-  *
-- * Implement the "SetCursorLocation" method call of the org.freedesktop.IBus.InputContext interface.
-+ * Implement the "SetCursorLocation" method call of the
-+ * org.freedesktop.IBus.InputContext interface.
-  */
- static void
- _ic_set_cursor_location (BusInputContext       *context,
-@@ -1008,7 +1028,8 @@ _ic_process_hand_writing_event (BusInputContext       *context,
-     /* do nothing if it is a fake input context */
-     if (context->has_focus &&
-         context->engine && context->fake == FALSE) {
--        bus_engine_proxy_process_hand_writing_event (context->engine, parameters);
-+        bus_engine_proxy_process_hand_writing_event (context->engine,
-+                                                     parameters);
-     }
-     g_dbus_method_invocation_return_value (invocation, NULL);
- }
-@@ -1032,7 +1053,8 @@ _ic_cancel_hand_writing (BusInputContext       *context,
- /**
-  * _ic_focus_in:
-  *
-- * Implement the "FocusIn" method call of the org.freedesktop.IBus.InputContext interface.
-+ * Implement the "FocusIn" method call of the org.freedesktop.IBus.InputContext
-+ * interface.
-  */
- static void
- _ic_focus_in (BusInputContext       *context,
-@@ -1044,15 +1066,17 @@ _ic_focus_in (BusInputContext       *context,
-         g_dbus_method_invocation_return_value (invocation, NULL);
-     }
-     else {
--        g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
--                        "The input context does not support focus.");
-+        g_dbus_method_invocation_return_error (
-+                invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
-+                "The input context does not support focus.");
-     }
- }
- 
- /**
-  * _ic_focus_out:
-  *
-- * Implement the "FocusOut" method call of the org.freedesktop.IBus.InputContext interface.
-+ * Implement the "FocusOut" method call of the org.freedesktop.IBus.InputContext
-+ * interface.
-  */
- static void
- _ic_focus_out (BusInputContext       *context,
-@@ -1064,15 +1088,17 @@ _ic_focus_out (BusInputContext       *context,
-         g_dbus_method_invocation_return_value (invocation, NULL);
-     }
-     else {
--        g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
--                        "The input context does not support focus.");
-+        g_dbus_method_invocation_return_error (
-+                invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
-+                "The input context does not support focus.");
-     }
- }
- 
- /**
-  * _ic_reset:
-  *
-- * Implement the "Reset" method call of the org.freedesktop.IBus.InputContext interface.
-+ * Implement the "Reset" method call of the org.freedesktop.IBus.InputContext
-+ * interface.
-  */
- static void
- _ic_reset (BusInputContext       *context,
-@@ -1094,7 +1120,8 @@ _ic_reset (BusInputContext       *context,
- /**
-  * _ic_set_capabilities:
-  *
-- * Implement the "SetCapabilities" method call of the org.freedesktop.IBus.InputContext interface.
-+ * Implement the "SetCapabilities" method call of the
-+ * org.freedesktop.IBus.InputContext interface.
-  */
- static void
- _ic_set_capabilities (BusInputContext       *context,
-@@ -1112,7 +1139,8 @@ _ic_set_capabilities (BusInputContext       *context,
- /**
-  * _ic_property_activate:
-  *
-- * Implement the "PropertyActivate" method call of the org.freedesktop.IBus.InputContext interface.
-+ * Implement the "PropertyActivate" method call of the
-+ * org.freedesktop.IBus.InputContext interface.
-  */
- static void
- _ic_property_activate (BusInputContext       *context,
-@@ -1124,7 +1152,9 @@ _ic_property_activate (BusInputContext       *context,
-     g_variant_get (parameters, "(&su)", &prop_name, &prop_state);
- 
-     if (context->engine) {
--        bus_engine_proxy_property_activate (context->engine, prop_name, prop_state);
-+        bus_engine_proxy_property_activate (context->engine,
-+                                            prop_name,
-+                                            prop_state);
-     }
- 
- #ifdef OS_CHROMEOS
-@@ -1132,9 +1162,12 @@ _ic_property_activate (BusInputContext       *context,
-      * so pass PropertyActivate signal to the focused context.
-      */
-     else if (context->fake) {
--        BusInputContext *focused_context = bus_ibus_impl_get_focused_input_context (BUS_DEFAULT_IBUS);
-+        BusInputContext *focused_context =
-+                bus_ibus_impl_get_focused_input_context (BUS_DEFAULT_IBUS);
-         if (focused_context && focused_context->engine)
--            bus_engine_proxy_property_activate (focused_context->engine, prop_name, prop_state);
-+            bus_engine_proxy_property_activate (focused_context->engine,
-+                                                prop_name,
-+                                                prop_state);
-     }
- #endif
- 
-@@ -1164,7 +1197,8 @@ _ic_set_engine_done (BusInputContext       *context,
- /**
-  * _ic_set_engine:
-  *
-- * Implement the "SetEngine" method call of the org.freedesktop.IBus.InputContext interface.
-+ * Implement the "SetEngine" method call of the
-+ * org.freedesktop.IBus.InputContext interface.
-  */
- static void
- _ic_set_engine (BusInputContext       *context,
-@@ -1205,7 +1239,8 @@ _ic_set_engine (BusInputContext       *context,
- /**
-  * _ic_get_engine:
-  *
-- * Implement the "GetEngine" method call of the org.freedesktop.IBus.InputContext interface.
-+ * Implement the "GetEngine" method call of
-+ * the org.freedesktop.IBus.InputContext interface.
-  */
- static void
- _ic_get_engine (BusInputContext       *context,
-@@ -1218,7 +1253,9 @@ _ic_get_engine (BusInputContext       *context,
- 
- 
-     g_dbus_method_invocation_return_value (invocation,
--            g_variant_new ("(v)", ibus_serializable_serialize ((IBusSerializable *)desc)));
-+            g_variant_new ("(v)",
-+                           ibus_serializable_serialize (
-+                                   (IBusSerializable *)desc)));
- }
- 
- static void
-@@ -1270,7 +1307,8 @@ bus_input_context_service_authorized_method (IBusService     *service,
- /**
-  * bus_input_context_service_method_call:
-  *
-- * Handle a D-Bus method call whose destination and interface name are both "org.freedesktop.IBus.InputContext"
-+ * Handle a D-Bus method call whose destination and interface name are both
-+ * "org.freedesktop.IBus.InputContext"
-  */
- static void
- bus_input_context_service_method_call (IBusService            *service,
-@@ -1283,21 +1321,23 @@ bus_input_context_service_method_call (IBusService            *service,
-                                        GDBusMethodInvocation  *invocation)
- {
-     if (g_strcmp0 (interface_name, IBUS_INTERFACE_INPUT_CONTEXT) != 0) {
--        IBUS_SERVICE_CLASS (bus_input_context_parent_class)->service_method_call (
--                        service,
--                        connection,
--                        sender,
--                        object_path,
--                        interface_name,
--                        method_name,
--                        parameters,
--                        invocation);
-+        IBUS_SERVICE_CLASS (bus_input_context_parent_class)->
-+                service_method_call (service,
-+                                     connection,
-+                                     sender,
-+                                     object_path,
-+                                     interface_name,
-+                                     method_name,
-+                                     parameters,
-+                                     invocation);
-         return;
-     }
- 
-     static const struct {
-         const gchar *method_name;
--        void (* method_callback) (BusInputContext *, GVariant *, GDBusMethodInvocation *);
-+        void (* method_callback) (BusInputContext *,
-+                                  GVariant *,
-+                                  GDBusMethodInvocation *);
-     } methods [] =  {
-         { "ProcessKeyEvent",   _ic_process_key_event },
-         { "SetCursorLocation", _ic_set_cursor_location },
-@@ -1322,7 +1362,9 @@ bus_input_context_service_method_call (IBusService            *service,
- 
-     for (i = 0; i < G_N_ELEMENTS (methods); i++) {
-         if (g_strcmp0 (method_name, methods[i].method_name) == 0) {
--            methods[i].method_callback ((BusInputContext *)service, parameters, invocation);
-+            methods[i].method_callback ((BusInputContext *)service,
-+                                        parameters,
-+                                        invocation);
-             return;
-         }
-     }
-@@ -1465,15 +1507,23 @@ bus_input_context_focus_in (BusInputContext *context)
-                 ibus_service_get_object_path ((IBusService *)context);
-         bus_engine_proxy_focus_in (context->engine, path, context->client);
-         bus_engine_proxy_enable (context->engine);
--        bus_engine_proxy_set_capabilities (context->engine, context->capabilities);
--        bus_engine_proxy_set_cursor_location (context->engine, context->x, context->y, context->w, context->h);
--        bus_engine_proxy_set_content_type (context->engine, context->purpose, context->hints);
-+        bus_engine_proxy_set_capabilities (context->engine,
-+                                           context->capabilities);
-+        bus_engine_proxy_set_cursor_location (context->engine,
-+                                              context->x,
-+                                              context->y,
-+                                              context->w,
-+                                              context->h);
-+        bus_engine_proxy_set_content_type (context->engine,
-+                                           context->purpose,
-+                                           context->hints);
-     }
- 
-     if (context->capabilities & IBUS_CAP_FOCUS) {
-         g_signal_emit (context, context_signals[FOCUS_IN], 0);
-         if (context->engine) {
--            /* if necessary, emit glib signals to the context object to update panel status. see the comment for PREEDIT_CONDITION
-+            /* if necessary, emit glib signals to the context object to update
-+             * panel status. see the comment for PREEDIT_CONDITION
-              * for details. */
-             if (context->preedit_visible && !PREEDIT_CONDITION) {
-                 g_signal_emit (context,
-@@ -1483,14 +1533,16 @@ bus_input_context_focus_in (BusInputContext *context)
-                                context->preedit_cursor_pos,
-                                context->preedit_visible);
-             }
--            if (context->auxiliary_visible && (context->capabilities & IBUS_CAP_AUXILIARY_TEXT) == 0) {
-+            if (context->auxiliary_visible &&
-+                (context->capabilities & IBUS_CAP_AUXILIARY_TEXT) == 0) {
-                 g_signal_emit (context,
-                                context_signals[UPDATE_AUXILIARY_TEXT],
-                                0,
-                                context->auxiliary_text,
-                                context->auxiliary_visible);
-             }
--            if (context->lookup_table_visible && (context->capabilities & IBUS_CAP_LOOKUP_TABLE) == 0) {
-+            if (context->lookup_table_visible &&
-+                (context->capabilities & IBUS_CAP_LOOKUP_TABLE) == 0) {
-                 g_signal_emit (context,
-                                context_signals[UPDATE_LOOKUP_TABLE],
-                                0,
-@@ -1630,14 +1682,17 @@ bus_input_context_property_activate (BusInputContext *context,
-     g_assert (BUS_IS_INPUT_CONTEXT (context));
- 
-     if (context->engine) {
--        bus_engine_proxy_property_activate (context->engine, prop_name, prop_state);
-+        bus_engine_proxy_property_activate (context->engine,
-+                                            prop_name,
-+                                            prop_state);
-     }
- }
- 
- /**
-  * bus_input_context_show_preedit_text:
-  *
-- * Show a preedit text. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client.
-+ * Show a preedit text. Send D-Bus signal to update status of client or send
-+ * glib signal to the panel, depending on capabilities of the client.
-  */
- static void
- bus_input_context_show_preedit_text (BusInputContext *context,
-@@ -1678,7 +1733,8 @@ bus_input_context_show_preedit_text (BusInputContext *context,
- /**
-  * bus_input_context_hide_preedit_text:
-  *
-- * Hide a preedit text. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client.
-+ * Hide a preedit text. Send D-Bus signal to update status of client or send
-+ * glib signal to the panel, depending on capabilities of the client.
-  */
- static void
- bus_input_context_hide_preedit_text (BusInputContext *context,
-@@ -1717,7 +1773,8 @@ bus_input_context_hide_preedit_text (BusInputContext *context,
- /**
-  * bus_input_context_update_auxiliary_text:
-  *
-- * Update an aux text. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client.
-+ * Update an aux text. Send D-Bus signal to update status of client or send
-+ * glib signal to the panel, depending on capabilities of the client.
-  */
- static void
- bus_input_context_update_auxiliary_text (BusInputContext *context,
-@@ -1730,11 +1787,13 @@ bus_input_context_update_auxiliary_text (BusInputContext *context,
-         g_object_unref (context->auxiliary_text);
-     }
- 
--    context->auxiliary_text = (IBusText *) g_object_ref_sink (text ? text : text_empty);
-+    context->auxiliary_text = (IBusText *)g_object_ref_sink (
-+            text ? text : text_empty);
-     context->auxiliary_visible = visible;
- 
-     if (context->capabilities & IBUS_CAP_AUXILIARY_TEXT) {
--        GVariant *variant = ibus_serializable_serialize ((IBusSerializable *)text);
-+        GVariant *variant =
-+                ibus_serializable_serialize ((IBusSerializable *)text);
-         bus_input_context_emit_signal (context,
-                                        "UpdateAuxiliaryText",
-                                        g_variant_new ("(vb)", variant, visible),
-@@ -1752,7 +1811,8 @@ bus_input_context_update_auxiliary_text (BusInputContext *context,
- /**
-  * bus_input_context_show_auxiliary_text:
-  *
-- * Show an aux text. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client.
-+ * Show an aux text. Send D-Bus signal to update status of client or send glib
-+ * signal to the panel, depending on capabilities of the client.
-  */
- static void
- bus_input_context_show_auxiliary_text (BusInputContext *context)
-@@ -1765,7 +1825,8 @@ bus_input_context_show_auxiliary_text (BusInputContext *context)
- 
-     context->auxiliary_visible = TRUE;
- 
--    if ((context->capabilities & IBUS_CAP_AUXILIARY_TEXT) == IBUS_CAP_AUXILIARY_TEXT) {
-+    if ((context->capabilities & IBUS_CAP_AUXILIARY_TEXT)
-+        == IBUS_CAP_AUXILIARY_TEXT) {
-         bus_input_context_emit_signal (context,
-                                        "ShowAuxiliaryText",
-                                        NULL,
-@@ -1781,7 +1842,8 @@ bus_input_context_show_auxiliary_text (BusInputContext *context)
- /**
-  * bus_input_context_hide_auxiliary_text:
-  *
-- * Hide an aux text. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client.
-+ * Hide an aux text. Send D-Bus signal to update status of client or send glib
-+ * signal to the panel, depending on capabilities of the client.
-  */
- static void
- bus_input_context_hide_auxiliary_text (BusInputContext *context)
-@@ -1794,7 +1856,8 @@ bus_input_context_hide_auxiliary_text (BusInputContext *context)
- 
-     context->auxiliary_visible = FALSE;
- 
--    if ((context->capabilities & IBUS_CAP_AUXILIARY_TEXT) == IBUS_CAP_AUXILIARY_TEXT) {
-+    if ((context->capabilities & IBUS_CAP_AUXILIARY_TEXT)
-+        == IBUS_CAP_AUXILIARY_TEXT) {
-         bus_input_context_emit_signal (context,
-                                        "HideAuxiliaryText",
-                                        NULL,
-@@ -1829,11 +1892,13 @@ bus_input_context_update_lookup_table (BusInputContext *context,
-         g_object_unref (context->lookup_table);
-     }
- 
--    context->lookup_table = (IBusLookupTable *) g_object_ref_sink (table ? table : lookup_table_empty);
-+    context->lookup_table = (IBusLookupTable *)g_object_ref_sink (
-+            table ? table : lookup_table_empty);
-     context->lookup_table_visible = visible;
- 
-     if (context->capabilities & IBUS_CAP_LOOKUP_TABLE) {
--        GVariant *variant = ibus_serializable_serialize ((IBusSerializable *)table);
-+        GVariant *variant =
-+                ibus_serializable_serialize ((IBusSerializable *)table);
-         bus_input_context_emit_signal (context,
-                                        "UpdateLookupTable",
-                                        g_variant_new ("(vb)", variant, visible),
-@@ -1851,7 +1916,8 @@ bus_input_context_update_lookup_table (BusInputContext *context,
- /**
-  * bus_input_context_show_lookup_table:
-  *
-- * Show the lookup table. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client.
-+ * Show the lookup table. Send D-Bus signal to update status of client or send
-+ * glib signal to the panel, depending on capabilities of the client.
-  */
- static void
- bus_input_context_show_lookup_table (BusInputContext *context)
-@@ -1864,7 +1930,8 @@ bus_input_context_show_lookup_table (BusInputContext *context)
- 
-     context->lookup_table_visible = TRUE;
- 
--    if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) == IBUS_CAP_LOOKUP_TABLE) {
-+    if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE)
-+        == IBUS_CAP_LOOKUP_TABLE) {
-         bus_input_context_emit_signal (context,
-                                        "ShowLookupTable",
-                                        NULL,
-@@ -1880,7 +1947,8 @@ bus_input_context_show_lookup_table (BusInputContext *context)
- /**
-  * bus_input_context_hide_lookup_table:
-  *
-- * Hide the lookup table. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client.
-+ * Hide the lookup table. Send D-Bus signal to update status of client or send
-+ * glib signal to the panel, depending on capabilities of the client.
-  */
- static void
- bus_input_context_hide_lookup_table (BusInputContext *context)
-@@ -1893,7 +1961,8 @@ bus_input_context_hide_lookup_table (BusInputContext *context)
- 
-     context->lookup_table_visible = FALSE;
- 
--    if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) == IBUS_CAP_LOOKUP_TABLE) {
-+    if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE)
-+        == IBUS_CAP_LOOKUP_TABLE) {
-         bus_input_context_emit_signal (context,
-                                        "HideLookupTable",
-                                        NULL,
-@@ -1909,7 +1978,8 @@ bus_input_context_hide_lookup_table (BusInputContext *context)
- /**
-  * bus_input_context_page_up_lookup_table:
-  *
-- * Change cursor position. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client.
-+ * Change cursor position. Send D-Bus signal to update status of client or send
-+ * glib signal to the panel, depending on capabilities of the client.
-  */
- static void
- bus_input_context_page_up_lookup_table (BusInputContext *context)
-@@ -1920,7 +1990,8 @@ bus_input_context_page_up_lookup_table (BusInputContext *context)
-         return;
-     }
- 
--    if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) == IBUS_CAP_LOOKUP_TABLE) {
-+    if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE)
-+        == IBUS_CAP_LOOKUP_TABLE) {
-         bus_input_context_emit_signal (context,
-                                        "PageUpLookupTable",
-                                        NULL,
-@@ -1936,7 +2007,8 @@ bus_input_context_page_up_lookup_table (BusInputContext *context)
- /**
-  * bus_input_context_page_down_lookup_table:
-  *
-- * Change cursor position. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client.
-+ * Change cursor position. Send D-Bus signal to update status of client or send
-+ * glib signal to the panel, depending on capabilities of the client.
-  */
- static void
- bus_input_context_page_down_lookup_table (BusInputContext *context)
-@@ -1947,7 +2019,8 @@ bus_input_context_page_down_lookup_table (BusInputContext *context)
-         return;
-     }
- 
--    if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) == IBUS_CAP_LOOKUP_TABLE) {
-+    if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE)
-+        == IBUS_CAP_LOOKUP_TABLE) {
-         bus_input_context_emit_signal (context,
-                                        "PageDownLookupTable",
-                                        NULL,
-@@ -1963,7 +2036,8 @@ bus_input_context_page_down_lookup_table (BusInputContext *context)
- /**
-  * bus_input_context_cursor_up_lookup_table:
-  *
-- * Change cursor position. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client.
-+ * Change cursor position. Send D-Bus signal to update status of client or send
-+ * glib signal to the panel, depending on capabilities of the client.
-  */
- static void
- bus_input_context_cursor_up_lookup_table (BusInputContext *context)
-@@ -1974,7 +2048,8 @@ bus_input_context_cursor_up_lookup_table (BusInputContext *context)
-         return;
-     }
- 
--    if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) == IBUS_CAP_LOOKUP_TABLE) {
-+    if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE)
-+        == IBUS_CAP_LOOKUP_TABLE) {
-         bus_input_context_emit_signal (context,
-                                        "CursorUpLookupTable",
-                                        NULL,
-@@ -1990,7 +2065,8 @@ bus_input_context_cursor_up_lookup_table (BusInputContext *context)
- /**
-  * bus_input_context_cursor_down_lookup_table:
-  *
-- * Change cursor position. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client.
-+ * Change cursor position. Send D-Bus signal to update status of client or send
-+ * glib signal to the panel, depending on capabilities of the client.
-  */
- static void
- bus_input_context_cursor_down_lookup_table (BusInputContext *context)
-@@ -2001,7 +2077,8 @@ bus_input_context_cursor_down_lookup_table (BusInputContext *context)
-         return;
-     }
- 
--    if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE) == IBUS_CAP_LOOKUP_TABLE) {
-+    if ((context->capabilities & IBUS_CAP_LOOKUP_TABLE)
-+        == IBUS_CAP_LOOKUP_TABLE) {
-         bus_input_context_emit_signal (context,
-                                        "CursorDownLookupTable",
-                                        NULL,
-@@ -2017,7 +2094,8 @@ bus_input_context_cursor_down_lookup_table (BusInputContext *context)
- /**
-  * bus_input_context_register_properties:
-  *
-- * Register properties. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client.
-+ * Register properties. Send D-Bus signal to update status of client or send
-+ * glib signal to the panel, depending on capabilities of the client.
-  */
- static void
- bus_input_context_register_properties (BusInputContext *context,
-@@ -2027,7 +2105,8 @@ bus_input_context_register_properties (BusInputContext *context,
-     g_assert (IBUS_IS_PROP_LIST (props));
- 
-     if (context->capabilities & IBUS_CAP_PROPERTY) {
--        GVariant *variant = ibus_serializable_serialize ((IBusSerializable *)props);
-+        GVariant *variant =
-+                ibus_serializable_serialize ((IBusSerializable *)props);
-         bus_input_context_emit_signal (context,
-                                        "RegisterProperties",
-                                        g_variant_new ("(v)", variant),
-@@ -2044,7 +2123,8 @@ bus_input_context_register_properties (BusInputContext *context,
- /**
-  * bus_input_context_update_property:
-  *
-- * Update property. Send D-Bus signal to update status of client or send glib signal to the panel, depending on capabilities of the client.
-+ * Update property. Send D-Bus signal to update status of client or send glib
-+ * signal to the panel, depending on capabilities of the client.
-  */
- static void
- bus_input_context_update_property (BusInputContext *context,
-@@ -2054,7 +2134,8 @@ bus_input_context_update_property (BusInputContext *context,
-     g_assert (IBUS_IS_PROPERTY (prop));
- 
-     if (context->capabilities & IBUS_CAP_PROPERTY) {
--        GVariant *variant = ibus_serializable_serialize ((IBusSerializable *)prop);
-+        GVariant *variant =
-+                ibus_serializable_serialize ((IBusSerializable *)prop);
-         bus_input_context_emit_signal (context,
-                                        "UpdateProperty",
-                                        g_variant_new ("(v)", variant),
-@@ -2089,7 +2170,8 @@ _engine_destroy_cb (BusEngineProxy  *engine,
- /**
-  * _engine_commit_text_cb:
-  *
-- * A function to be called when "commit-text" glib signal is sent to the engine object.
-+ * A function to be called when "commit-text" glib signal is sent to the engine
-+ * object.
-  */
- static void
- _engine_commit_text_cb (BusEngineProxy  *engine,
-@@ -2108,7 +2190,8 @@ _engine_commit_text_cb (BusEngineProxy  *engine,
- /**
-  * _engine_forward_key_event_cb:
-  *
-- * A function to be called when "forward-key-event" glib signal is sent to the engine object.
-+ * A function to be called when "forward-key-event" glib signal is sent to the
-+ * engine object.
-  */
- static void
- _engine_forward_key_event_cb (BusEngineProxy    *engine,
-@@ -2124,14 +2207,16 @@ _engine_forward_key_event_cb (BusEngineProxy    *engine,
- 
-     bus_input_context_emit_signal (context,
-                                    "ForwardKeyEvent",
--                                   g_variant_new ("(uuu)", keyval, keycode, state),
-+                                   g_variant_new ("(uuu)",
-+                                                  keyval, keycode, state),
-                                    NULL);
- }
- 
- /**
-  * _engine_delete_surrounding_text_cb:
-  *
-- * A function to be called when "delete-surrounding-text" glib signal is sent to the engine object.
-+ * A function to be called when "delete-surrounding-text" glib signal is sent
-+ * to the engine object.
-  */
- static void
- _engine_delete_surrounding_text_cb (BusEngineProxy    *engine,
-@@ -2146,14 +2231,16 @@ _engine_delete_surrounding_text_cb (BusEngineProxy    *engine,
- 
-     bus_input_context_emit_signal (context,
-                                    "DeleteSurroundingText",
--                                   g_variant_new ("(iu)", offset_from_cursor, nchars),
-+                                   g_variant_new ("(iu)",
-+                                                  offset_from_cursor, nchars),
-                                    NULL);
- }
- 
- /**
-  * _engine_require_surrounding_text_cb:
-  *
-- * A function to be called when "require-surrounding-text" glib signal is sent to the engine object.
-+ * A function to be called when "require-surrounding-text" glib signal is sent
-+ * to the engine object.
-  */
- static void
- _engine_require_surrounding_text_cb (BusEngineProxy    *engine,
-@@ -2173,7 +2260,8 @@ _engine_require_surrounding_text_cb (BusEngineProxy    *engine,
- /**
-  * _engine_update_preedit_text_cb:
-  *
-- * A function to be called when "update-preedit-text" glib signal is sent to the engine object.
-+ * A function to be called when "update-preedit-text" glib signal is sent to
-+ * the engine object.
-  */
- static void
- _engine_update_preedit_text_cb (BusEngineProxy  *engine,
-@@ -2197,7 +2285,8 @@ _engine_update_preedit_text_cb (BusEngineProxy  *engine,
- /**
-  * _engine_update_auxiliary_text_cb:
-  *
-- * A function to be called when "update-auxiliary-text" glib signal is sent to the engine object.
-+ * A function to be called when "update-auxiliary-text" glib signal is sent to
-+ * the engine object.
-  */
- static void
- _engine_update_auxiliary_text_cb (BusEngineProxy   *engine,
-@@ -2217,7 +2306,8 @@ _engine_update_auxiliary_text_cb (BusEngineProxy   *engine,
- /**
-  * _engine_update_lookup_table_cb:
-  *
-- * A function to be called when "update-lookup-table" glib signal is sent to the engine object.
-+ * A function to be called when "update-lookup-table" glib signal is sent to
-+ * the engine object.
-  */
- static void
- _engine_update_lookup_table_cb (BusEngineProxy   *engine,
-@@ -2237,7 +2327,8 @@ _engine_update_lookup_table_cb (BusEngineProxy   *engine,
- /**
-  * _engine_register_properties_cb:
-  *
-- * A function to be called when "register-properties" glib signal is sent to the engine object.
-+ * A function to be called when "register-properties" glib signal is sent to
-+ * the engine object.
-  */
- static void
- _engine_register_properties_cb (BusEngineProxy  *engine,
-@@ -2256,7 +2347,8 @@ _engine_register_properties_cb (BusEngineProxy  *engine,
- /**
-  * _engine_update_property_cb:
-  *
-- * A function to be called when "update-property" glib signal is sent to the engine object.
-+ * A function to be called when "update-property" glib signal is sent to the
-+ * engine object.
-  */
- static void
- _engine_update_property_cb (BusEngineProxy  *engine,
-@@ -2346,10 +2438,11 @@ bus_input_context_new (BusConnection    *connection,
- 
-     BusInputContext *context = NULL;
-     if (connection) {
--        context = (BusInputContext *) g_object_new (BUS_TYPE_INPUT_CONTEXT,
--                                                    "object-path", path,
--                                                    "connection", bus_connection_get_dbus_connection (connection),
--                                                    NULL);
-+        context = (BusInputContext *) g_object_new (
-+                BUS_TYPE_INPUT_CONTEXT,
-+                "object-path", path,
-+                "connection", bus_connection_get_dbus_connection (connection),
-+                NULL);
-     }
-     else {
-         context = (BusInputContext *) g_object_new (BUS_TYPE_INPUT_CONTEXT,
-@@ -2439,28 +2532,37 @@ bus_input_context_disable (BusInputContext *context)
-     }
- }
- 
--/* A list of signals (and their handler functions) that could be emit by the engine proxy object. */
-+/* A list of signals (and their handler functions) that could be emit by the
-+ * engine proxy object.
-+ */
- const static struct {
-     const gchar *name;
-     GCallback    callback;
- } engine_signals [] = {
-     { "commit-text",              G_CALLBACK (_engine_commit_text_cb) },
-     { "forward-key-event",        G_CALLBACK (_engine_forward_key_event_cb) },
--    { "delete-surrounding-text",  G_CALLBACK (_engine_delete_surrounding_text_cb) },
--    { "require-surrounding-text", G_CALLBACK (_engine_require_surrounding_text_cb) },
-+    { "delete-surrounding-text",
-+                              G_CALLBACK (_engine_delete_surrounding_text_cb) },
-+    { "require-surrounding-text",
-+                             G_CALLBACK (_engine_require_surrounding_text_cb) },
-     { "update-preedit-text",      G_CALLBACK (_engine_update_preedit_text_cb) },
-     { "show-preedit-text",        G_CALLBACK (_engine_show_preedit_text_cb) },
-     { "hide-preedit-text",        G_CALLBACK (_engine_hide_preedit_text_cb) },
--    { "update-auxiliary-text",    G_CALLBACK (_engine_update_auxiliary_text_cb) },
-+    { "update-auxiliary-text",
-+                                G_CALLBACK (_engine_update_auxiliary_text_cb) },
-     { "show-auxiliary-text",      G_CALLBACK (_engine_show_auxiliary_text_cb) },
-     { "hide-auxiliary-text",      G_CALLBACK (_engine_hide_auxiliary_text_cb) },
-     { "update-lookup-table",      G_CALLBACK (_engine_update_lookup_table_cb) },
-     { "show-lookup-table",        G_CALLBACK (_engine_show_lookup_table_cb) },
-     { "hide-lookup-table",        G_CALLBACK (_engine_hide_lookup_table_cb) },
--    { "page-up-lookup-table",     G_CALLBACK (_engine_page_up_lookup_table_cb) },
--    { "page-down-lookup-table",   G_CALLBACK (_engine_page_down_lookup_table_cb) },
--    { "cursor-up-lookup-table",   G_CALLBACK (_engine_cursor_up_lookup_table_cb) },
--    { "cursor-down-lookup-table", G_CALLBACK (_engine_cursor_down_lookup_table_cb) },
-+    { "page-up-lookup-table",
-+                                 G_CALLBACK (_engine_page_up_lookup_table_cb) },
-+    { "page-down-lookup-table",
-+                               G_CALLBACK (_engine_page_down_lookup_table_cb) },
-+    { "cursor-up-lookup-table",
-+                               G_CALLBACK (_engine_cursor_up_lookup_table_cb) },
-+    { "cursor-down-lookup-table",
-+                             G_CALLBACK (_engine_cursor_down_lookup_table_cb) },
-     { "register-properties",      G_CALLBACK (_engine_register_properties_cb) },
-     { "update-property",          G_CALLBACK (_engine_update_property_cb) },
-     { "panel-extension",          G_CALLBACK (_engine_panel_extension_cb) },
-@@ -2531,9 +2633,16 @@ bus_input_context_set_engine (BusInputContext *context,
-                     ibus_service_get_object_path ((IBusService *)context);
-             bus_engine_proxy_focus_in (context->engine, path, context->client);
-             bus_engine_proxy_enable (context->engine);
--            bus_engine_proxy_set_capabilities (context->engine, context->capabilities);
--            bus_engine_proxy_set_cursor_location (context->engine, context->x, context->y, context->w, context->h);
--            bus_engine_proxy_set_content_type (context->engine, context->purpose, context->hints);
-+            bus_engine_proxy_set_capabilities (context->engine, 
-+                                               context->capabilities);
-+            bus_engine_proxy_set_cursor_location (context->engine,
-+                                                  context->x,
-+                                                  context->y,
-+                                                  context->w,
-+                                                  context->h);
-+            bus_engine_proxy_set_content_type (context->engine,
-+                                               context->purpose,
-+                                               context->hints);
-         }
-     }
-     g_signal_emit (context,
-@@ -2779,7 +2888,8 @@ bus_input_context_set_capabilities (BusInputContext    *context,
- {
-     g_assert (BUS_IS_INPUT_CONTEXT (context));
- 
--    /* If the context does not support IBUS_CAP_FOCUS, then the client application have to handle all information such as
-+    /* If the context does not support IBUS_CAP_FOCUS, then the client
-+     * application have to handle all information such as
-      * preedit and auxiliary text. */
-     if ((capabilities & IBUS_CAP_FOCUS) == 0) {
-         capabilities |= (IBUS_CAP_PREEDIT_TEXT | IBUS_CAP_AUXILIARY_TEXT | IBUS_CAP_LOOKUP_TABLE | IBUS_CAP_PROPERTY);
--- 
-2.41.0
-
-From 3670faf74a7b4594ceda3b4a8c01515840cc1991 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Wed, 12 Jul 2023 07:50:22 +0900
-Subject: [PATCH 2/3] src: Fix sync ibus_input_context_process_key_event()
-
-The synchronous "ProcessKeyEvent" D-Bus method cannot receive
-"CommitText" and "ForwardKeyEvent" D-Bus signals during calling the method.
-To resolve the issue, now
-ibus_input_context_set_post_process_key_event() and
-ibus_input_context_post_process_key_event() are added newly.
-
-ibus_input_context_post_process_key_event() retries "CommitText" and
-"ForwardKeyEvent" D-Bus signals during calling the "ProcessKeyEvent" D-Bus
-method and ibus-daemon does not handle those signals.
-
-"Since: 1.5.00" is added in header files to available APIs before 1.5.29
-is released. Will think later how to convert the version comments together
-when the new version 1.5.29 is committed.
-
-BUG=https://github.com/ibus/ibus/issues/2486
----
- bus/inputcontext.c          | 252 ++++++++++++++++++++++++++++++++----
- client/gtk2/ibusimcontext.c | 225 ++++++++++++++++++++++----------
- src/ibusinputcontext.c      | 162 +++++++++++++++++++++--
- src/ibusinputcontext.h      |  36 +++++-
- 4 files changed, 567 insertions(+), 108 deletions(-)
-
-diff --git a/bus/inputcontext.c b/bus/inputcontext.c
-index 8aded5d8..4d1fb041 100644
---- a/bus/inputcontext.c
-+++ b/bus/inputcontext.c
-@@ -31,6 +31,8 @@
- #include "marshalers.h"
- #include "types.h"
- 
-+#define MAX_SYNC_DATA 30
-+
- struct _SetEngineByDescData {
-     /* context related to the data */
-     BusInputContext *context;
-@@ -46,6 +48,11 @@ struct _SetEngineByDescData {
- };
- typedef struct _SetEngineByDescData SetEngineByDescData;
- 
-+typedef struct _SyncForwardingData {
-+    gchar     key;
-+    IBusText *text;
-+} SyncForwardingData;
-+
- struct _BusInputContext {
-     IBusService parent;
- 
-@@ -99,6 +106,9 @@ struct _BusInputContext {
- 
-     BusPanelProxy *emoji_extension;
-     gboolean is_extension_lookup_table;
-+    GQueue *queue_during_process_key_event;
-+    gboolean use_post_process_key_event;
-+    gboolean processing_key_event;
- };
- 
- struct _BusInputContextClass {
-@@ -156,6 +166,15 @@ static void     bus_input_context_service_method_call
-                                     const gchar           *method_name,
-                                     GVariant              *parameters,
-                                     GDBusMethodInvocation *invocation);
-+static GVariant *
-+                bus_input_context_service_get_property
-+                                   (IBusService           *service,
-+                                    GDBusConnection       *connection,
-+                                    const gchar           *sender,
-+                                    const gchar           *object_path,
-+                                    const gchar           *interface_name,
-+                                    const gchar           *property_name,
-+                                    GError               **error);
- static gboolean bus_input_context_service_set_property
-                                    (IBusService           *service,
-                                     GDBusConnection       *connection,
-@@ -215,8 +234,21 @@ static const gchar introspection_xml[] =
-     "<node>\n"
-     "  <interface name='org.freedesktop.IBus.InputContext'>\n"
-     /* properties */
-+    "    <property name='PostProcessKeyEvent' type='(a(yv))' access='read'>\n"
-+    "      <annotation name='org.gtk.GDBus.Since'\n"
-+    "          value='1.5.29' />\n"
-+    "      <annotation name='org.gtk.GDBus.DocString'\n"
-+    "          value='Stability: Unstable' />\n"
-+    "    </property>\n"
-     "    <property name='ContentType' type='(uu)' access='write' />\n"
-     "    <property name='ClientCommitPreedit' type='(b)' access='write' />\n"
-+    "    <property name='EffectivePostProcessKeyEvent' type='(b)' \n"
-+    "                                                  access='write'>\n"
-+    "      <annotation name='org.gtk.GDBus.Since'\n"
-+    "          value='1.5.29' />\n"
-+    "      <annotation name='org.gtk.GDBus.DocString'\n"
-+    "          value='Stability: Unstable' />\n"
-+    "    </property>\n"
-     /* methods */
-     "    <method name='ProcessKeyEvent'>\n"
-     "      <arg direction='in'  type='u' name='keyval' />\n"
-@@ -353,6 +385,8 @@ bus_input_context_class_init (BusInputContextClass *class)
-     /* override the parent class's implementation. */
-     IBUS_SERVICE_CLASS (class)->service_method_call =
-         bus_input_context_service_method_call;
-+    IBUS_SERVICE_CLASS (class)->service_get_property =
-+        bus_input_context_service_get_property;
-     IBUS_SERVICE_CLASS (class)->service_set_property =
-         bus_input_context_service_set_property;
-     /* register the xml so that bus_ibus_impl_service_method_call will be
-@@ -782,6 +816,11 @@ bus_input_context_property_changed (BusInputContext *context,
- }
- 
- 
-+typedef struct _PanelProcessKeyEventData {
-+    GDBusMethodInvocation *invocation;
-+    BusInputContext *context;
-+} PanelProcessKeyEventData;
-+
- /**
-  * _panel_process_key_event_cb:
-  *
-@@ -789,14 +828,21 @@ bus_input_context_property_changed (BusInputContext *context,
-  * bus_panel_proxy_process_key_event() is finished.
-  */
- static void
--_panel_process_key_event_cb (GObject               *source,
--                             GAsyncResult          *res,
--                             GDBusMethodInvocation *invocation)
-+_panel_process_key_event_cb (GObject                  *source,
-+                             GAsyncResult             *res,
-+                             PanelProcessKeyEventData *data)
- {
-     GError *error = NULL;
-     GVariant *value = g_dbus_proxy_call_finish ((GDBusProxy *)source,
-                                                  res,
-                                                  &error);
-+    GDBusMethodInvocation *invocation;
-+    BusInputContext *context;
-+
-+    g_assert (data);
-+    invocation = data->invocation;
-+    context = data->context;
-+    g_slice_free (PanelProcessKeyEventData, data);
-     if (value != NULL) {
-         g_dbus_method_invocation_return_value (invocation, value);
-         g_variant_unref (value);
-@@ -805,6 +851,7 @@ _panel_process_key_event_cb (GObject               *source,
-         g_dbus_method_invocation_return_gerror (invocation, error);
-         g_error_free (error);
-     }
-+    context->processing_key_event = FALSE;
- }
- 
- typedef struct _ProcessKeyEventData ProcessKeyEventData;
-@@ -841,21 +888,27 @@ _ic_process_key_event_reply_cb (GObject               *source,
-         gboolean retval = FALSE;
-         g_variant_get (value, "(b)", &retval);
-         if (context->emoji_extension && !retval) {
-+            PanelProcessKeyEventData *pdata =
-+                    g_slice_new (PanelProcessKeyEventData);
-+            pdata->invocation = invocation;
-+            pdata->context = context;
-             bus_panel_proxy_process_key_event (context->emoji_extension,
-                                                keyval,
-                                                keycode,
-                                                modifiers,
-                                                (GAsyncReadyCallback)
-                                                     _panel_process_key_event_cb,
--                                               invocation);
-+                                               pdata);
-         } else {
-             g_dbus_method_invocation_return_value (invocation, value);
-+            context->processing_key_event = FALSE;
-         }
-         g_variant_unref (value);
-     }
-     else {
-         g_dbus_method_invocation_return_gerror (invocation, error);
-         g_error_free (error);
-+        context->processing_key_event = FALSE;
-     }
- 
-     g_object_unref (context);
-@@ -877,6 +930,8 @@ _ic_process_key_event (BusInputContext       *context,
-     guint keycode = 0;
-     guint modifiers = 0;
- 
-+    if (context->use_post_process_key_event)
-+        context->processing_key_event = TRUE;
-     g_variant_get (parameters, "(uuu)", &keyval, &keycode, &modifiers);
-     if (G_UNLIKELY (!context->has_focus)) {
-         /* workaround: set focus if context does not have focus */
-@@ -1372,17 +1427,109 @@ bus_input_context_service_method_call (IBusService            *service,
-     g_return_if_reached ();
- }
- 
--static void
-+/**
-+ * _ic_get_post_process_key_event:
-+ *
-+ * Implement the "PostProcessKeyEvent" get property of the
-+ * org.freedesktop.IBus.InputContext interface because currently the Gio
-+ * D-Bus method calls don't support multiple nested tuples likes
-+ * G_VARIANT_TYPE ("((ba(yv)))")) in "ProcessKeyEvent" D-Bus method
-+ * So these post events are separated from the return value "b" of
-+ * the "ProcessKeyEvent" D-Bus method call.
-+ */
-+static GVariant *
-+_ic_get_post_process_key_event (BusInputContext *context,
-+                                GDBusConnection *connection,
-+                                GError         **error)
-+{
-+    const char *error_message = NULL;
-+    GVariantBuilder array;
-+    SyncForwardingData *data;
-+
-+    do {
-+        if (!BUS_IS_INPUT_CONTEXT (context)) {
-+            error_message = "BusInputContext is freed";
-+            break;
-+        }
-+        if (context->processing_key_event) {
-+            error_message = "Another ProcessKeyEvent is called.";
-+            break;
-+        }
-+        g_variant_builder_init (&array, G_VARIANT_TYPE ("a(yv)"));
-+        while ((data =
-+                g_queue_pop_head (context->queue_during_process_key_event))) {
-+            GVariant *variant = ibus_serializable_serialize_object (
-+                    IBUS_SERIALIZABLE (data->text));
-+            g_variant_builder_add (&array, "(yv)", data->key, variant);
-+            g_object_unref (data->text);
-+            g_slice_free (SyncForwardingData, data);
-+        }
-+    } while (FALSE);
-+    if (error_message) {
-+        g_set_error (error,
-+                     G_DBUS_ERROR,
-+                     G_DBUS_ERROR_FAILED,
-+                     "%s", error_message);
-+        return NULL;
-+    }
-+    return g_variant_builder_end (&array);
-+}
-+
-+static GVariant *
-+bus_input_context_service_get_property (IBusService           *service,
-+                                        GDBusConnection       *connection,
-+                                        const gchar           *sender,
-+                                        const gchar           *object_path,
-+                                        const gchar           *interface_name,
-+                                        const gchar           *property_name,
-+                                        GError               **error)
-+{
-+    int i;
-+    static const struct {
-+        const char *property_name;
-+        GVariant * (* property_callback) (BusInputContext *,
-+                                          GDBusConnection *,
-+                                          GError **);
-+    } properties [] =  {
-+        { "PostProcessKeyEvent",   _ic_get_post_process_key_event },
-+    };
-+
-+    if (error)
-+        *error = NULL;
-+    if (g_strcmp0 (interface_name, IBUS_INTERFACE_INPUT_CONTEXT) != 0) {
-+        return IBUS_SERVICE_CLASS (bus_input_context_parent_class)->
-+                service_get_property (
-+                        service, connection, sender, object_path,
-+                        interface_name, property_name,
-+                        error);
-+    }
-+    for (i = 0; i < G_N_ELEMENTS (properties); i++) {
-+        if (g_strcmp0 (properties[i].property_name, property_name) == 0) {
-+            return properties[i].property_callback ((BusInputContext *)service,
-+                                                    connection,
-+                                                    error);
-+        }
-+    }
-+
-+    g_set_error (error,
-+                 G_DBUS_ERROR,
-+                 G_DBUS_ERROR_FAILED,
-+                 "service_get_property received an unknown property: %s",
-+                 property_name ? property_name : "(null)");
-+    g_return_val_if_reached (NULL);
-+}
-+
-+static gboolean
- _ic_set_content_type (BusInputContext *context,
--                      GVariant        *value)
-+                      GVariant        *value,
-+                      GError         **error)
- {
-     guint purpose = 0;
-     guint hints = 0;
-+    gboolean retval = TRUE;
- 
-     g_variant_get (value, "(uu)", &purpose, &hints);
-     if (purpose != context->purpose || hints != context->hints) {
--        GError *error;
--        gboolean retval;
- 
-         context->purpose = purpose;
-         context->hints = hints;
-@@ -1400,24 +1547,30 @@ _ic_set_content_type (BusInputContext *context,
-                            context->hints);
-         }
- 
--        error = NULL;
-         retval = bus_input_context_property_changed (context,
-                                                      "ContentType",
-                                                      value,
--                                                     &error);
--        if (!retval) {
--            g_warning ("Failed to emit PropertiesChanged signal: %s",
--                       error->message);
--            g_error_free (error);
--        }
-+                                                     error);
-     }
-+    return retval;
- }
- 
--static void
-+static gboolean
- _ic_set_client_commit_preedit (BusInputContext *context,
--                               GVariant        *value)
-+                               GVariant        *value,
-+                               GError         **error)
- {
-     g_variant_get (value, "(b)", &context->client_commit_preedit);
-+    return TRUE;
-+}
-+
-+static gboolean
-+_ic_set_use_post_process_key_event (BusInputContext *context,
-+                                    GVariant        *value,
-+                                    GError         **error)
-+{
-+    g_variant_get (value, "(b)", &context->use_post_process_key_event);
-+    return TRUE;
- }
- 
- static gboolean
-@@ -1430,6 +1583,18 @@ bus_input_context_service_set_property (IBusService     *service,
-                                         GVariant        *value,
-                                         GError         **error)
- {
-+    int i;
-+    static const struct {
-+        const char *property_name;
-+        gboolean (* property_callback) (BusInputContext *,
-+                                        GVariant *,
-+                                        GError **);
-+    } properties [] =  {
-+        { "ContentType",                   _ic_set_content_type },
-+        { "ClientCommitPreedit",           _ic_set_client_commit_preedit },
-+        { "EffectivePostProcessKeyEvent",  _ic_set_use_post_process_key_event },
-+    };
-+
-     if (error)
-         *error = NULL;
-     if (g_strcmp0 (interface_name, IBUS_INTERFACE_INPUT_CONTEXT) != 0) {
-@@ -1460,14 +1625,12 @@ bus_input_context_service_set_property (IBusService     *service,
-                      " ");
-         return FALSE;
-     }
--
--    if (g_strcmp0 (property_name, "ContentType") == 0) {
--        _ic_set_content_type (BUS_INPUT_CONTEXT (service), value);
--        return TRUE;
--    }
--    if (g_strcmp0 (property_name, "ClientCommitPreedit") == 0) {
--        _ic_set_client_commit_preedit (BUS_INPUT_CONTEXT (service), value);
--        return TRUE;
-+    for (i = 0; i < G_N_ELEMENTS (properties); i++) {
-+        if (g_strcmp0 (properties[i].property_name, property_name) == 0) {
-+            return properties[i].property_callback ((BusInputContext *) service,
-+                                                    value,
-+                                                    error);
-+        }
-     }
- 
-     g_set_error (error,
-@@ -2204,7 +2367,23 @@ _engine_forward_key_event_cb (BusEngineProxy    *engine,
-     g_assert (BUS_IS_INPUT_CONTEXT (context));
- 
-     g_assert (context->engine == engine);
--
-+    g_assert (context->queue_during_process_key_event);
-+
-+    if (context->processing_key_event && g_queue_get_length (
-+                   context->queue_during_process_key_event) <= MAX_SYNC_DATA) {
-+        SyncForwardingData *data;
-+        IBusText *text = ibus_text_new_from_printf ("%u,%u,%u",
-+                                                    keyval, keycode, state);
-+        if (g_queue_get_length (context->queue_during_process_key_event)
-+            == MAX_SYNC_DATA) {
-+            g_warning ("Exceed max number of post process_key_event data");
-+        }
-+        data = g_slice_new (SyncForwardingData);
-+        data->key = 'f';
-+        data->text = text;
-+        g_queue_push_tail (context->queue_during_process_key_event, data);
-+        return;
-+    }
-     bus_input_context_emit_signal (context,
-                                    "ForwardKeyEvent",
-                                    g_variant_new ("(uuu)",
-@@ -2455,6 +2634,7 @@ bus_input_context_new (BusConnection    *connection,
- 
-     /* it is a fake input context, just need process hotkey */
-     context->fake = (strncmp (client, "fake", 4) == 0);
-+    context->queue_during_process_key_event = g_queue_new ();
- 
-     if (connection) {
-         g_object_ref_sink (connection);
-@@ -2938,11 +3118,17 @@ bus_input_context_set_content_type (BusInputContext *context,
-                                     guint            hints)
- {
-     GVariant *value;
-+    GError *error = NULL;
- 
-     g_assert (BUS_IS_INPUT_CONTEXT (context));
- 
-     value = g_variant_ref_sink (g_variant_new ("(uu)", purpose, hints));
--    _ic_set_content_type (context, value);
-+    _ic_set_content_type (context, value, &error);
-+    if (error) {
-+        g_warning ("Failed to emit PropertiesChanged signal: %s",
-+                   error->message);
-+        g_error_free (error);
-+    }
-     g_variant_unref (value);
- }
- 
-@@ -2952,12 +3138,24 @@ bus_input_context_commit_text_use_extension (BusInputContext *context,
-                                              gboolean         use_extension)
- {
-     g_assert (BUS_IS_INPUT_CONTEXT (context));
-+    g_assert (context->queue_during_process_key_event);
- 
-     if (text == text_empty || text == NULL)
-         return;
- 
-     if (use_extension && context->emoji_extension) {
-         bus_panel_proxy_commit_text_received (context->emoji_extension, text);
-+    } else if (context->processing_key_event && g_queue_get_length (
-+                   context->queue_during_process_key_event) <= MAX_SYNC_DATA) {
-+        SyncForwardingData *data;
-+        if (g_queue_get_length (context->queue_during_process_key_event)
-+            == MAX_SYNC_DATA) {
-+            g_warning ("Exceed max number of sync process_key_event data");
-+        }
-+        data = g_slice_new (SyncForwardingData);
-+        data->key = 'c';
-+        data->text = g_object_ref (text);
-+        g_queue_push_tail (context->queue_during_process_key_event, data);
-     } else {
-         GVariant *variant = ibus_serializable_serialize (
-                 (IBusSerializable *)text);
-diff --git a/client/gtk2/ibusimcontext.c b/client/gtk2/ibusimcontext.c
-index ea8270bb..7ccc129d 100644
---- a/client/gtk2/ibusimcontext.c
-+++ b/client/gtk2/ibusimcontext.c
-@@ -111,7 +111,7 @@ static guint    _signal_delete_surrounding_id = 0;
- static guint    _signal_retrieve_surrounding_id = 0;
- 
- #if GTK_CHECK_VERSION (3, 98, 4)
--static char _use_sync_mode = 2;
-+static char _use_sync_mode = 1;
- #else
- static const gchar *_no_snooper_apps = NO_SNOOPER_APPS;
- static gboolean _use_key_snooper = ENABLE_SNOOPER;
-@@ -386,6 +386,7 @@ typedef struct {
-     gboolean  retval;
- } ProcessKeyEventReplyData;
- 
-+
- static void
- _process_key_event_done (GObject      *object,
-                          GAsyncResult *res,
-@@ -435,6 +436,7 @@ _process_key_event_done (GObject      *object,
- #endif
- }
- 
-+
- static void
- _process_key_event_reply_done (GObject      *object,
-                                GAsyncResult *res,
-@@ -457,6 +459,7 @@ _process_key_event_reply_done (GObject      *object,
-     g_source_remove (data->count_cb_id);
- }
- 
-+
- static gboolean
- _process_key_event_count_cb (gpointer user_data)
- {
-@@ -472,6 +475,101 @@ _process_key_event_count_cb (gpointer user_data)
-     return G_SOURCE_CONTINUE;
- }
- 
-+
-+static gboolean
-+_process_key_event_sync (IBusInputContext *context,
-+                         guint             keyval,
-+                         guint             keycode,
-+                         guint             state)
-+{
-+    gboolean retval;
-+
-+    g_assert (IBUS_IS_INPUT_CONTEXT (context));
-+    retval = ibus_input_context_process_key_event (context,
-+                                                   keyval,
-+                                                   keycode - 8,
-+                                                   state);
-+    ibus_input_context_post_process_key_event (context);
-+    return retval;
-+}
-+
-+
-+static gboolean
-+_process_key_event_async (IBusInputContext *context,
-+                          guint             keyval,
-+                          guint             keycode,
-+                          guint             state,
-+                          GdkEvent         *event,
-+                          IBusIMContext    *ibusimcontext)
-+{
-+    ProcessKeyEventData *data = g_slice_new0 (ProcessKeyEventData);
-+
-+    g_assert (event);
-+    if (!data) {
-+        g_warning ("Cannot allocate async data");
-+        return _process_key_event_sync (context, keyval, keycode, state);
-+    }
-+#if GTK_CHECK_VERSION (3, 98, 4)
-+    data->event = gdk_event_ref (event);
-+#else
-+    data->event = gdk_event_copy (event);
-+#endif
-+    data->ibusimcontext = ibusimcontext;
-+    ibus_input_context_process_key_event_async (context,
-+            keyval,
-+            keycode - 8,
-+            state,
-+            -1,
-+            NULL,
-+            _process_key_event_done,
-+            data);
-+
-+    return TRUE;
-+}
-+
-+
-+static gboolean
-+_process_key_event_hybrid_async (IBusInputContext *context,
-+                                 guint             keyval,
-+                                 guint             keycode,
-+                                 guint             state)
-+{
-+    GSource *source = g_timeout_source_new (1);
-+    ProcessKeyEventReplyData *data = NULL;
-+    gboolean retval = FALSE;
-+
-+    if (source)
-+        data = g_slice_new0 (ProcessKeyEventReplyData);
-+    if (!data) {
-+        g_warning ("Cannot wait for the reply of the process key event.");
-+        retval = _process_key_event_sync (context, keyval, keycode, state);
-+        if (source)
-+            g_source_destroy (source);
-+        return retval;
-+    }
-+    data->count = 1;
-+    g_source_attach (source, NULL);
-+    g_source_unref (source);
-+    data->count_cb_id = g_source_get_id (source);
-+    ibus_input_context_process_key_event_async (context,
-+            keyval,
-+            keycode - 8,
-+            state,
-+            -1,
-+            NULL,
-+            _process_key_event_reply_done,
-+            data);
-+    g_source_set_callback (source, _process_key_event_count_cb, data, NULL);
-+    while (data->count)
-+        g_main_context_iteration (NULL, TRUE);
-+    /* #2498 Checking source->ref_count might cause Nautilus hang up
-+     */
-+    retval = data->retval;
-+    g_slice_free (ProcessKeyEventReplyData, data);
-+    return retval;
-+}
-+
-+
- static gboolean
- _process_key_event (IBusInputContext *context,
- #if GTK_CHECK_VERSION (3, 98, 4)
-@@ -505,70 +603,20 @@ _process_key_event (IBusInputContext *context,
- 
-     switch (_use_sync_mode) {
-     case 1: {
--        retval = ibus_input_context_process_key_event (context,
--                                                       keyval,
--                                                       keycode - 8,
--                                                       state);
-+        retval = _process_key_event_sync (context, keyval, keycode, state);
-         break;
-     }
-     case 2: {
--        GSource *source = g_timeout_source_new (1);
--        ProcessKeyEventReplyData *data = NULL;
--
--        if (source)
--            data = g_slice_new0 (ProcessKeyEventReplyData);
--        if (!data) {
--            g_warning ("Cannot wait for the reply of the process key event.");
--            retval = ibus_input_context_process_key_event (context,
--                                                           keyval,
--                                                           keycode - 8,
--                                                           state);
--            if (source)
--                g_source_destroy (source);
--            break;
--        }
--        data->count = 1;
--        g_source_attach (source, NULL);
--        g_source_unref (source);
--        data->count_cb_id = g_source_get_id (source);
--        ibus_input_context_process_key_event_async (context,
--            keyval,
--            keycode - 8,
--            state,
--            -1,
--            NULL,
--            _process_key_event_reply_done,
--            data);
--        g_source_set_callback (source, _process_key_event_count_cb, data, NULL);
--        while (data->count)
--            g_main_context_iteration (NULL, TRUE);
--        if (source->ref_count > 0) {
--            /* g_source_get_id() could causes a SEGV */
--            g_info ("Broken GSource.ref_count and maybe a timing issue in %p.",
--                    source);
--        }
--        retval = data->retval;
--        g_slice_free (ProcessKeyEventReplyData, data);
-+        retval = _process_key_event_hybrid_async (context,
-+                                                  keyval, keycode, state);
-         break;
-     }
-     default: {
--        ProcessKeyEventData *data = g_slice_new0 (ProcessKeyEventData);
--#if GTK_CHECK_VERSION (3, 98, 4)
--        data->event = gdk_event_ref (event);
--#else
--        data->event = gdk_event_copy ((GdkEvent *)event);
--#endif
--        data->ibusimcontext = ibusimcontext;
--        ibus_input_context_process_key_event_async (context,
--            keyval,
--            keycode - 8,
--            state,
--            -1,
--            NULL,
--            _process_key_event_done,
--            data);
--
--        retval = TRUE;
-+        retval = _process_key_event_async (context,
-+                                           keyval, keycode, state,
-+                                           (GdkEvent *)event,
-+                                           ibusimcontext);
-+        break;
-     }
-     }
- 
-@@ -877,7 +925,55 @@ ibus_im_context_class_init (IBusIMContextClass *class)
-     g_assert (_signal_retrieve_surrounding_id != 0);
- 
- #if GTK_CHECK_VERSION (3, 98, 4)
--    _use_sync_mode = _get_char_env ("IBUS_ENABLE_SYNC_MODE", 2);
-+    /* IBus GtkIMModule, QtIMModlue, ibus-x11, ibus-wayland are called as
-+     * IBus clients.
-+     * Each GTK application, each QT application, Xorg server, Wayland
-+     * comppsitor are called as IBus event owners here.
-+     *
-+     * The IBus client processes the key events between the IBus event owner
-+     * and the IBus daemon and the procedure step is to:
-+     *
-+     * receive the key event from the IBus event owner and forward the
-+     * event to the IBus daemon with the "ProcessKeyEvent" D-Bus method at
-+     * first,
-+     *
-+     * receive the return value from the IBus daemon with the "ProessKeyEvent"
-+     * D-Bus method and forward the value to the IBus event owner secondly and
-+     * the return value includes if the key event is processed normally or not.
-+     *
-+     * The procedure behavior can be changed by the "IBUS_ENABLE_SYNC_MODE"
-+     * environment variable with the synchronous procedure or asynchronous
-+     * one and value is:
-+     *
-+     * 1: Synchronous process key event:
-+     *    Wait for the return of the IBus "ProcessKeyEvent" D-Bus method
-+     *    synchronously and forward the return value to the IBus event owner
-+     *    synchronously.
-+     * 0: Asynchronous process key event:
-+     *    Return to the IBus event owner as the key event is processed normally
-+     *    at first as soon as the IBus client receives the event from the
-+     *    IBus event owner and also forward the event to the IBus daemon with
-+     *    the "ProcessKeyEvent" D-Bus method and wait for the return value of
-+     *    the D-Bus method *asynchronously*.
-+     *    If the return value indicates the key event is disposed by IBus,
-+     *    the IBus client does not perform anything. Otherwise the IBus client
-+     *    forwards the key event with the gdk_event_put() in GTK3,
-+     *    gtk_im_context_filter_key() in GTK4, IMForwardEvent() in XIM API.
-+     * 2: Hybrid asynchronous process key event:
-+     *    Wait for the return of the IBus "ProcessKeyEvent" D-Bus method
-+     *    *asynchronously* with a GSource loop and forward the return value
-+     *    to the IBus event owner synchronously. So IBus clients perform
-+     *    virtually synchronously to cover problems of IBus synchronous APIs.
-+     *
-+     * The purpose of the asynchronous process is that each IBus input
-+     * method can process the key events without D-Bus timeout and also
-+     * the IBus synchronous process has a problem that the IBus
-+     * "ProcessKeyEvent" D-Bus method cannot send the commit-text and
-+     * forwar-key-event D-Bus signals until the D-Bus method is finished.
-+     *
-+     * Relative issues: #1713, #2486
-+     */
-+    _use_sync_mode = _get_char_env ("IBUS_ENABLE_SYNC_MODE", 1);
- #else
-     _use_key_snooper = !_get_boolean_env ("IBUS_DISABLE_SNOOPER",
-                                           !(ENABLE_SNOOPER));
-@@ -1004,8 +1100,6 @@ ibus_im_context_init (GObject *obj)
- #else
-     ibusimcontext->caps = IBUS_CAP_PREEDIT_TEXT | IBUS_CAP_FOCUS;
- #endif
--    if (_use_sync_mode == 1)
--        ibusimcontext->caps |= IBUS_CAP_SYNC_PROCESS_KEY_V2;
- 
-     ibusimcontext->events_queue = g_queue_new ();
- 
-@@ -2265,6 +2359,8 @@ _create_input_context_done (IBusBus       *bus,
-     else {
-         gboolean requested_surrounding_text = FALSE;
-         ibus_input_context_set_client_commit_preedit (context, TRUE);
-+        if (_use_sync_mode == 1)
-+            ibus_input_context_set_post_process_key_event (context, TRUE);
-         ibusimcontext->ibuscontext = context;
- 
-         g_signal_connect (ibusimcontext->ibuscontext,
-@@ -2489,9 +2585,8 @@ _create_fake_input_context_done (IBusBus       *bus,
-                       G_CALLBACK (_ibus_fake_context_destroy_cb),
-                       NULL);
- 
--    guint32 caps = IBUS_CAP_PREEDIT_TEXT | IBUS_CAP_FOCUS | IBUS_CAP_SURROUNDING_TEXT;
--    if (_use_sync_mode == 1)
--        caps |= IBUS_CAP_SYNC_PROCESS_KEY_V2;
-+    guint32 caps = IBUS_CAP_PREEDIT_TEXT | IBUS_CAP_FOCUS
-+                   | IBUS_CAP_SURROUNDING_TEXT;
-     ibus_input_context_set_capabilities (_fake_context, caps);
- 
-     /* focus in/out the fake context */
-diff --git a/src/ibusinputcontext.c b/src/ibusinputcontext.c
-index 28ae04ad..def23b25 100644
---- a/src/ibusinputcontext.c
-+++ b/src/ibusinputcontext.c
-@@ -2,7 +2,7 @@
- /* vim:set et sts=4: */
- /* ibus - The Input Bus
-  * Copyright (C) 2008-2013 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright (C) 2018-2022 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2018-2023 Takao Fujiwara <takao.fujiwara1@gmail.com>
-  * Copyright (C) 2008-2019 Red Hat, Inc.
-  *
-  * This library is free software; you can redistribute it and/or
-@@ -1190,14 +1190,14 @@ ibus_input_context_set_content_type (IBusInputContext *context,
-     g_assert (IBUS_IS_INPUT_CONTEXT (context));
- 
-     cached_content_type =
--        g_dbus_proxy_get_cached_property ((GDBusProxy *) context,
-+        g_dbus_proxy_get_cached_property ((GDBusProxy *)context,
-                                           "ContentType");
-     content_type = g_variant_new ("(uu)", purpose, hints);
- 
-     g_variant_ref_sink (content_type);
--    if (cached_content_type == NULL ||
-+    if (!cached_content_type ||
-         !g_variant_equal (content_type, cached_content_type)) {
--        g_dbus_proxy_call ((GDBusProxy *) context,
-+        g_dbus_proxy_call ((GDBusProxy *)context,
-                            "org.freedesktop.DBus.Properties.Set",
-                            g_variant_new ("(ssv)",
-                                           IBUS_INTERFACE_INPUT_CONTEXT,
-@@ -1209,9 +1209,13 @@ ibus_input_context_set_content_type (IBusInputContext *context,
-                            NULL, /* callback */
-                            NULL  /* user_data */
-                            );
-+        /* Need to update the cache by manual since there is a timing issue. */
-+        g_dbus_proxy_set_cached_property ((GDBusProxy *)context,
-+                                          "ContentType",
-+                                          content_type);
-     }
- 
--    if (cached_content_type != NULL)
-+    if (cached_content_type)
-         g_variant_unref (cached_content_type);
-     g_variant_unref (content_type);
- }
-@@ -1324,19 +1328,20 @@ void
- ibus_input_context_set_client_commit_preedit (IBusInputContext *context,
-                                               gboolean          client_commit)
- {
--    GVariant *cached_content_type;
-+    GVariant *cached_var_client_commit;
-     GVariant *var_client_commit;
- 
-     g_assert (IBUS_IS_INPUT_CONTEXT (context));
- 
--    cached_content_type =
--        g_dbus_proxy_get_cached_property ((GDBusProxy *) context,
-+    cached_var_client_commit =
-+        g_dbus_proxy_get_cached_property ((GDBusProxy *)context,
-                                           "ClientCommitPreedit");
-     var_client_commit = g_variant_new ("(b)", client_commit);
- 
-     g_variant_ref_sink (var_client_commit);
--    if (cached_content_type == NULL) {
--        g_dbus_proxy_call ((GDBusProxy *) context,
-+    if (!cached_var_client_commit ||
-+        !g_variant_equal (var_client_commit, cached_var_client_commit)) {
-+        g_dbus_proxy_call ((GDBusProxy *)context,
-                            "org.freedesktop.DBus.Properties.Set",
-                            g_variant_new ("(ssv)",
-                                           IBUS_INTERFACE_INPUT_CONTEXT,
-@@ -1348,13 +1353,146 @@ ibus_input_context_set_client_commit_preedit (IBusInputContext *context,
-                            NULL, /* callback */
-                            NULL  /* user_data */
-                            );
-+        /* Need to update the cache by manual since there is a timing issue. */
-+        g_dbus_proxy_set_cached_property ((GDBusProxy *)context,
-+                                          "ClientCommitPreedit",
-+                                          var_client_commit);
-     }
- 
--    if (cached_content_type != NULL)
--        g_variant_unref (cached_content_type);
-+    if (cached_var_client_commit)
-+        g_variant_unref (cached_var_client_commit);
-     g_variant_unref (var_client_commit);
- }
- 
-+void
-+ibus_input_context_set_post_process_key_event (IBusInputContext *context,
-+                                               gboolean          enable)
-+{
-+    GVariant *cached_var_post;
-+    GVariant *var_post;
-+
-+    g_assert (IBUS_IS_INPUT_CONTEXT (context));
-+
-+    cached_var_post =
-+        g_dbus_proxy_get_cached_property ((GDBusProxy *)context,
-+                                          "EffectivePostProcessKeyEvent");
-+    var_post = g_variant_new ("(b)", enable);
-+    g_variant_ref_sink (var_post);
-+    if (!cached_var_post ||
-+        !g_variant_equal (var_post, cached_var_post)) {
-+        g_dbus_proxy_call ((GDBusProxy *)context,
-+                           "org.freedesktop.DBus.Properties.Set",
-+                           g_variant_new ("(ssv)",
-+                                          IBUS_INTERFACE_INPUT_CONTEXT,
-+                                          "EffectivePostProcessKeyEvent",
-+                                          var_post),
-+                           G_DBUS_CALL_FLAGS_NONE,
-+                           -1,
-+                           NULL, /* cancellable */
-+                           NULL, /* callback */
-+                           NULL  /* user_data */
-+                           );
-+        /* Need to update the cache by manual since there is a timing issue. */
-+        g_dbus_proxy_set_cached_property ((GDBusProxy *)context,
-+                                          "EffectivePostProcessKeyEvent",
-+                                          var_post);
-+    }
-+
-+    if (cached_var_post)
-+        g_variant_unref (cached_var_post);
-+    g_variant_unref (var_post);
-+}
-+
-+void
-+ibus_input_context_post_process_key_event (IBusInputContext *context)
-+{
-+    GVariant *cached_var_post;
-+    gboolean enable = FALSE;
-+    GVariant *result;
-+    GError *error = NULL;
-+    GVariant *variant = NULL;
-+    GVariantIter iter;
-+    gsize size;
-+    char type = 0;
-+    GVariant *vtext = NULL;
-+
-+    g_assert (IBUS_IS_INPUT_CONTEXT (context));
-+
-+    cached_var_post =
-+        g_dbus_proxy_get_cached_property ((GDBusProxy *)context,
-+                                          "EffectivePostProcessKeyEvent");
-+    if (cached_var_post)
-+        g_variant_get (cached_var_post, "(b)", &enable);
-+    if (!enable) {
-+        g_warning ("%s: ibus_input_context_set_post_process_key_event() "
-+                   "needs to be called before.",
-+                   G_STRFUNC);
-+        if (cached_var_post)
-+            g_variant_unref (cached_var_post);
-+        return;
-+    }
-+    g_variant_unref (cached_var_post);
-+    result = g_dbus_proxy_call_sync (
-+            (GDBusProxy *)context,
-+            "org.freedesktop.DBus.Properties.Get",
-+            g_variant_new ("(ss)",
-+                           IBUS_INTERFACE_INPUT_CONTEXT,
-+                           "PostProcessKeyEvent"),
-+            G_DBUS_CALL_FLAGS_NONE,
-+            -1,
-+            NULL,
-+            &error);
-+    if (error) {
-+        g_warning ("%s: %s", G_STRFUNC, error->message);
-+        g_error_free (error);
-+        return;
-+    }
-+
-+    g_variant_get (result, "(v)", &variant);
-+    g_assert (variant);
-+    g_variant_iter_init (&iter, variant);
-+    size = g_variant_iter_n_children (&iter);
-+    while (size >0 && g_variant_iter_loop (&iter, "(yv)", &type, &vtext)) {
-+        IBusText *text =
-+                (IBusText *)ibus_serializable_deserialize_object (vtext);
-+        if (!IBUS_IS_TEXT (text)) {
-+            g_warning ("%s: %s", G_STRFUNC, "text is not IBusText");
-+            break;
-+        }
-+        switch (type) {
-+        case 'c':
-+            g_signal_emit (context, context_signals[COMMIT_TEXT], 0, text);
-+            break;
-+        case 'f': {
-+            gchar **array = NULL;
-+            guint keyval, keycode, state;
-+            array = g_strsplit (text->text, ",", -1);
-+            keyval = g_ascii_strtoull (array[0], NULL, 10);
-+            keycode = g_ascii_strtoull (array[1], NULL, 10);
-+            state = g_ascii_strtoull (array[2], NULL, 10);
-+            g_strfreev (array);
-+            g_signal_emit (context,
-+                           context_signals[FORWARD_KEY_EVENT],
-+                           0,
-+                           keyval,
-+                           keycode,
-+                           state | IBUS_FORWARD_MASK);
-+            break;
-+        }
-+        default:
-+            g_warning ("%s: Type '%c' is not supported.", G_STRFUNC, type);
-+        }
-+        if (g_object_is_floating (text)) {
-+            g_object_ref_sink (text);
-+            g_object_unref (text);
-+        }
-+        g_clear_pointer (&vtext, g_variant_unref);
-+    }
-+
-+    g_variant_unref (variant);
-+    g_variant_unref (result);
-+}
-+
- #define DEFINE_FUNC(name, Name)                                         \
-     void                                                                \
-     ibus_input_context_##name (IBusInputContext *context)               \
-diff --git a/src/ibusinputcontext.h b/src/ibusinputcontext.h
-index 09992148..ca604670 100644
---- a/src/ibusinputcontext.h
-+++ b/src/ibusinputcontext.h
-@@ -2,7 +2,7 @@
- /* vim:set et sts=4: */
- /* ibus - The Input Bus
-  * Copyright (C) 2008-2013 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright (C) 2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2018-2023 Takao Fujiwara <takao.fujiwara1@gmail.com>
-  * Copyright (C) 2008-2018 Red Hat, Inc.
-  *
-  * This library is free software; you can redistribute it and/or
-@@ -298,7 +298,6 @@ gboolean     ibus_input_context_process_key_event
-                                              guint32             keycode,
-                                              guint32             state);
- 
--
- /**
-  * ibus_input_context_set_cursor_location:
-  * @context: An IBusInputContext.
-@@ -519,9 +518,38 @@ void         ibus_input_context_set_content_type
-  *
-  * See also ibus_engine_update_preedit_text_with_mode().
-  */
--void         ibus_input_context_set_client_commit_preedit (
--                                             IBusInputContext   *context,
-+void         ibus_input_context_set_client_commit_preedit
-+                                            (IBusInputContext   *context,
-                                              gboolean            client_commit);
- 
-+/**
-+ * ibus_input_context_set_post_process_key_event:
-+ * @context: An #IBusInputContext.
-+ * @enable: Can use ibus_input_context_post_process_key_event() to retrieve
-+ * commit-text and forwar-key-event signals during
-+ * calling ibus_input_context_process_key_event() if it's %TRUE.
-+ *
-+ * Since: 1.5.00
-+ * Stability: Unstable
-+ */
-+void         ibus_input_context_set_post_process_key_event
-+                                            (IBusInputContext   *context,
-+                                             gboolean            enable);
-+/**
-+ * ibus_input_context_post_process_key_event:
-+ * @context: An #IBusInputContext.
-+ *
-+ * Call this API after ibus_input_context_process_key_event() returns
-+ * to retrieve commit-text and forwar-key-event signals during
-+ * calling ibus_input_context_process_key_event().
-+ *
-+ * See also ibus_input_context_set_post_process_key_event().
-+ *
-+ * Since: 1.5.00
-+ * Stability: Unstable
-+ */
-+void         ibus_input_context_post_process_key_event
-+                                            (IBusInputContext   *context);
-+
- G_END_DECLS
- #endif
--- 
-2.41.0
-
-From e495f8068380856c01fd22ceebb9398072fd65d8 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Wed, 12 Jul 2023 07:52:21 +0900
-Subject: [PATCH 3/3] client/x11: Fix sync
- ibus_input_context_process_key_event()
-
-Fix the synchronous "ProcessKeyEvent" D-Bus method in ibus-x11 too.
-
-Fixes: https://github.com/ibus/ibus/commit/3670faf
-
-BUG=https://github.com/ibus/ibus/issues/2486
----
- client/x11/main.c | 234 ++++++++++++++++++++++++++--------------------
- 1 file changed, 134 insertions(+), 100 deletions(-)
-
-diff --git a/client/x11/main.c b/client/x11/main.c
-index 83d95cb7..b7eb5961 100644
---- a/client/x11/main.c
-+++ b/client/x11/main.c
-@@ -126,7 +126,7 @@ static gint     g_debug_level = 0;
- 
- static IBusBus *_bus = NULL;
- 
--static char _use_sync_mode = 2;
-+static char _use_sync_mode = 1;
- 
- static void
- _xim_preedit_start (XIMS xims, const X11IC *x11ic)
-@@ -380,9 +380,9 @@ xim_create_ic (XIMS xims, IMChangeICStruct *call_data)
- 
-     if (x11ic->input_style & XIMPreeditCallbacks)
-         capabilities |= IBUS_CAP_PREEDIT_TEXT;
--    if (_use_sync_mode == 1)
--        capabilities |= IBUS_CAP_SYNC_PROCESS_KEY_V2;
-     ibus_input_context_set_capabilities (x11ic->context, capabilities);
-+    if (_use_sync_mode == 1)
-+        ibus_input_context_set_post_process_key_event (x11ic->context, TRUE);
- 
-     g_hash_table_insert (_x11_ic_table,
-                          GINT_TO_POINTER (x11ic->icid), (gpointer)x11ic);
-@@ -427,6 +427,7 @@ xim_destroy_ic (XIMS xims, IMChangeICStruct *call_data)
-     return 1;
- }
- 
-+
- static int
- xim_set_ic_focus (XIMS xims, IMChangeFocusStruct *call_data)
- {
-@@ -445,6 +446,7 @@ xim_set_ic_focus (XIMS xims, IMChangeFocusStruct *call_data)
-     return 1;
- }
- 
-+
- static int
- xim_unset_ic_focus (XIMS xims, IMChangeFocusStruct *call_data)
- {
-@@ -463,6 +465,7 @@ xim_unset_ic_focus (XIMS xims, IMChangeFocusStruct *call_data)
- 
- }
- 
-+
- static void
- _xim_forward_key_event_done (X11IC   *x11ic,
-                              XEvent  *event,
-@@ -498,6 +501,7 @@ typedef struct {
-     XEvent                event;
- } ProcessKeyEventReplyData;
- 
-+
- static void
- _process_key_event_done (GObject      *object,
-                          GAsyncResult *res,
-@@ -529,6 +533,7 @@ _process_key_event_done (GObject      *object,
-     g_slice_free (ProcessKeyEventReplyData, data);
- }
- 
-+
- static void
- _process_key_event_reply_done (GObject      *object,
-                                GAsyncResult *res,
-@@ -566,6 +571,7 @@ _process_key_event_reply_done (GObject      *object,
-     g_source_remove (data->count_cb_id);
- }
- 
-+
- static gboolean
- _process_key_event_count_cb (gpointer user_data)
- {
-@@ -580,19 +586,131 @@ _process_key_event_count_cb (gpointer user_data)
-     return G_SOURCE_CONTINUE;
- }
- 
-+
-+static int
-+_process_key_event_sync (X11IC                *x11ic,
-+                         IMForwardEventStruct *call_data,
-+                         GdkEventKey          *event)
-+{
-+    gboolean retval;
-+
-+    g_assert (x11ic);
-+    g_assert (call_data);
-+    g_assert (event);
-+    retval = ibus_input_context_process_key_event (
-+            x11ic->context,
-+            event->keyval,
-+            event->hardware_keycode - 8,
-+            event->state);
-+    ibus_input_context_post_process_key_event (x11ic->context);
-+    _xim_forward_key_event_done (x11ic, &call_data->event, retval);
-+    return 1;
-+}
-+
-+
-+static int
-+_process_key_event_async (X11IC                *x11ic,
-+                          IMForwardEventStruct *call_data,
-+                          GdkEventKey          *event)
-+{
-+    ProcessKeyEventReplyData *data;
-+
-+    g_assert (x11ic);
-+    g_assert (call_data);
-+    g_assert (event);
-+    if (!(data = g_slice_new0 (ProcessKeyEventReplyData))) {
-+        g_warning ("Cannot allocate async data");
-+        return _process_key_event_sync (x11ic, call_data, event);
-+    }
-+    data->connect_id = call_data->connect_id;
-+    data->x11ic = x11ic;
-+    data->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,
-+                                                data);
-+    return 1;
-+}
-+
-+
-+static int
-+_process_key_event_hybrid_async (X11IC                *x11ic,
-+                                 IMForwardEventStruct *call_data,
-+                                 GdkEventKey          *event)
-+{
-+    GSource *source;
-+    ProcessKeyEventReplyData *data = NULL;
-+    gboolean bus_retval;
-+
-+    g_assert (x11ic);
-+    g_assert (call_data);
-+    g_assert (event);
-+    source = g_timeout_source_new (1);
-+    if (source)
-+        data = g_slice_new0 (ProcessKeyEventReplyData);
-+    if (!data) {
-+        int xim_retval;
-+        g_warning ("Cannot wait for the reply of the process key event.");
-+        xim_retval = _process_key_event_sync (x11ic, call_data, event);
-+        if (source)
-+            g_source_destroy (source);
-+        return xim_retval;
-+    }
-+    data->count = 1;
-+    g_source_attach (source, NULL);
-+    g_source_unref (source);
-+    data->count_cb_id = g_source_get_id (source);
-+    data->connect_id = call_data->connect_id;
-+    data->x11ic = x11ic;
-+    data->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_reply_done,
-+                                                data);
-+    g_source_set_callback (source, _process_key_event_count_cb,
-+                           data, NULL);
-+    while (data->count > 0 && data->count < MAX_WAIT_KEY_TIME)
-+        g_main_context_iteration (NULL, TRUE);
-+    /* #2498 Checking source->ref_count might cause Nautilus hang up
-+     */
-+    bus_retval = data->retval;
-+    if (data->count == 0) {
-+        g_slice_free (ProcessKeyEventReplyData, data);
-+        return 1;
-+    }
-+
-+    g_slice_free (ProcessKeyEventReplyData, data);
-+    if (g_hash_table_lookup (_connections,
-+                             GINT_TO_POINTER ((gint)call_data->connect_id))
-+        == NULL) {
-+        return 1;
-+    }
-+    _xim_forward_key_event_done (x11ic, &call_data->event, bus_retval);
-+    return 1;
-+}
-+
-+
- static int
- xim_forward_event (XIMS xims, IMForwardEventStruct *call_data)
- {
-     X11IC *x11ic;
-     XKeyEvent *xevent;
-     GdkEventKey event;
--    gboolean retval;
- 
-     LOG (1, "XIM_FORWARD_EVENT ic=%d connect_id=%d",
--                call_data->icid, call_data->connect_id);
-+         call_data->icid, call_data->connect_id);
- 
--    x11ic = (X11IC *) g_hash_table_lookup (_x11_ic_table,
--                                           GINT_TO_POINTER ((gint) call_data->icid));
-+    x11ic = (X11IC *) g_hash_table_lookup (
-+            _x11_ic_table,
-+            GINT_TO_POINTER ((gint) call_data->icid));
-     g_return_val_if_fail (x11ic != NULL, 0);
- 
-     xevent = (XKeyEvent*) &(call_data->event);
-@@ -608,99 +726,15 @@ xim_forward_event (XIMS xims, IMForwardEventStruct *call_data)
-     }
- 
-     switch (_use_sync_mode) {
--    case 1: {
--        retval = ibus_input_context_process_key_event (
--                                      x11ic->context,
--                                      event.keyval,
--                                      event.hardware_keycode - 8,
--                                      event.state);
--        _xim_forward_key_event_done (x11ic, &call_data->event, retval);
--        retval = 1;
--        break;
--    }
--    case 2: {
--        GSource *source = g_timeout_source_new (1);
--        ProcessKeyEventReplyData *data = NULL;
--
--        if (source)
--            data = g_slice_new0 (ProcessKeyEventReplyData);
--        if (!data) {
--            g_warning ("Cannot wait for the reply of the process key event.");
--            retval = ibus_input_context_process_key_event (
--                    x11ic->context,
--                    event.keyval,
--                    event.hardware_keycode - 8,
--                    event.state);
--            if (source)
--                g_source_destroy (source);
--        } else {
--            data->count = 1;
--            g_source_attach (source, NULL);
--            g_source_unref (source);
--            data->count_cb_id = g_source_get_id (source);
--            data->connect_id = call_data->connect_id;
--            data->x11ic = x11ic;
--            data->event = *((XEvent*)xevent);
--            ibus_input_context_process_key_event_async (
--                    x11ic->context,
--                    event.keyval,
--                    event.hardware_keycode - 8,
--                    event.state,
--                    -1,
--                    NULL,
--                    _process_key_event_reply_done,
--                    data);
--            g_source_set_callback (source, _process_key_event_count_cb,
--                                   data, NULL);
--            while (data->count > 0 && data->count < MAX_WAIT_KEY_TIME)
--                g_main_context_iteration (NULL, TRUE);
--            if (source->ref_count > 0) {
--                /* g_source_get_id() could causes a SEGV */
--                g_info ("Broken GSource.ref_count and maybe a timing "
--                        "issue in %p.", source);
--            }
--            retval = data->retval;
--            if (data->count == 0) {
--                g_slice_free (ProcessKeyEventReplyData, data);
--                return 1;
--            }
--        }
--
--        g_slice_free (ProcessKeyEventReplyData, data);
--        if (g_hash_table_lookup (_connections,
--                                 GINT_TO_POINTER ((gint)call_data->connect_id))
--                == NULL) {
--                return 1;
--        }
--        _xim_forward_key_event_done (x11ic, &call_data->event, retval);
--        retval = 1;
--        break;
--    }
--    default: {
--        ProcessKeyEventReplyData *data;
--
--        if (!(data = g_slice_new0 (ProcessKeyEventReplyData))) {
--            g_warning ("Cannot allocate async data");
--            _xim_forward_key_event_done (x11ic, &call_data->event, 0);
--            return 1;
--        }
--        data->connect_id = call_data->connect_id;
--        data->x11ic = x11ic;
--        data->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,
--                                      data);
--        retval = 1;
--    }
-+    case 1:
-+        return _process_key_event_sync (x11ic, call_data, &event);
-+    case 2:
-+        return _process_key_event_hybrid_async (x11ic, call_data, &event);
-+    default:
-+        return _process_key_event_async (x11ic, call_data, &event);
-     }
--    return retval;
-+    g_assert_not_reached ();
-+    return 0;
- }
- 
- 
-@@ -1186,7 +1220,7 @@ _init_ibus (void)
-                         G_CALLBACK (_bus_disconnected_cb), NULL);
- 
-     /* https://github.com/ibus/ibus/issues/1713 */
--    _use_sync_mode = _get_char_env ("IBUS_ENABLE_SYNC_MODE", 2);
-+    _use_sync_mode = _get_char_env ("IBUS_ENABLE_SYNC_MODE", 1);
- }
- 
- static void
--- 
-2.41.0
-

^ permalink raw reply related	[flat|nested] 8+ messages in thread
* [rpms/ibus] autotool: Delete upstreamed ibus-HEAD.patch
@ 2026-05-31  2:07 Takao Fujiwara
  0 siblings, 0 replies; 8+ messages in thread
From: Takao Fujiwara @ 2026-05-31  2:07 UTC (permalink / raw)
  To: git-commits

A new commit has been pushed.

Repo   : rpms/ibus
Branch : autotool
Commit : 0829fa055cbb2f3b69cfe8350b7c9a923c84c04f
Author : Takao Fujiwara <tfujiwar@redhat.com>
Date   : 2022-03-14T14:40:28+09:00
Stats  : +0/-2676 in 1 file(s)
URL    : https://src.fedoraproject.org/rpms/ibus/c/0829fa055cbb2f3b69cfe8350b7c9a923c84c04f?branch=autotool

Log:
Delete upstreamed ibus-HEAD.patch

---
diff --git a/ibus-HEAD.patch b/ibus-HEAD.patch
deleted file mode 100644
index 36d5f6d..0000000
--- a/ibus-HEAD.patch
+++ /dev/null
@@ -1,2676 +0,0 @@
-From 571e3b6e4f386abf12d3db70b9468e092c8d72bd Mon Sep 17 00:00:00 2001
-From: Alynx Zhou <alynx.zhou@gmail.com>
-Date: Tue, 24 Aug 2021 10:12:52 +0800
-Subject: [PATCH] client/gtk2/ibusimcontext: Fix wrong cursor location in gtk3
- apps
-
-If you apply this patch in your tarball, please also apply this to
-client/gtk3/ibusimcontext.c besides client/gtk2/ibusimcontext.c .
-
-BUG=https://github.com/ibus/ibus/issues/2337
----
- client/gtk2/ibusimcontext.c | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
-
-diff --git a/client/gtk2/ibusimcontext.c b/client/gtk2/ibusimcontext.c
-index da9a402f..b1ccede9 100644
---- a/client/gtk2/ibusimcontext.c
-+++ b/client/gtk2/ibusimcontext.c
-@@ -1497,7 +1497,10 @@ _set_cursor_location_internal (IBusIMContext *ibusimcontext)
- 
- #if GTK_CHECK_VERSION (3, 98, 4)
- #elif GTK_CHECK_VERSION (2, 91, 0)
--    area.y += gdk_window_get_height (ibusimcontext->client_window);
-+    if (area.x == -1 && area.y == -1 && area.width == 0 && area.height == 0) {
-+        area.x = 0;
-+        area.y += gdk_window_get_height (ibusimcontext->client_window);
-+    }
- #else
-     if (area.x == -1 && area.y == -1 && area.width == 0 && area.height == 0) {
-         gint w, h;
--- 
-2.31.1
-
-From 5487a6baa4b22605ba8197ca1a0fa43c91d57786 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Mon, 6 Sep 2021 20:23:59 +0900
-Subject: [PATCH] client/gtk2/ibusimcontext: Implement clear preedit for GTK4
-
-IBus IM module uses synchornized key processes for GTK4 and the timing
-of the GTK reset siginal may work with focus-in/out between windows.
-(I don't test GTK4 firefox and terminal yet and the verification is not
-completed.)
-So ibus_im_context_clear_preedit_text() is now called with the GTK4 reset
-siginal.
-ibus_im_context_clear_preedit_text() works with ibus-setup-anthy ->
-"Conversion" tab -> "Behavior on Focus Out" pull down menu.
-
-BUG=https://github.com/ibus/ibus/issues/2334
----
- client/gtk2/ibusimcontext.c | 9 ++++++---
- 1 file changed, 6 insertions(+), 3 deletions(-)
-
-diff --git a/client/gtk2/ibusimcontext.c b/client/gtk2/ibusimcontext.c
-index b1ccede9..e12be45d 100644
---- a/client/gtk2/ibusimcontext.c
-+++ b/client/gtk2/ibusimcontext.c
-@@ -1270,6 +1270,8 @@ ibus_im_context_reset (GtkIMContext *context)
-          * IBus uses button-press-event instead until GTK is fixed.
-          * https://gitlab.gnome.org/GNOME/gtk/issues/1534
-          */
-+        if (_use_sync_mode)
-+            ibus_im_context_clear_preedit_text (ibusimcontext);
-         ibus_input_context_reset (ibusimcontext->ibuscontext);
-     }
-     gtk_im_context_reset (ibusimcontext->slave);
-@@ -1383,7 +1385,7 @@ ibus_im_context_set_client_window (GtkIMContext *context,
- 
-     if (ibusimcontext->client_window) {
- #if !GTK_CHECK_VERSION (3, 98, 4)
--        if (ibusimcontext->use_button_press_event)
-+        if (ibusimcontext->use_button_press_event && !_use_sync_mode)
-             _connect_button_press_event (ibusimcontext, FALSE);
- #endif
-         g_object_unref (ibusimcontext->client_window);
-@@ -1393,7 +1395,7 @@ ibus_im_context_set_client_window (GtkIMContext *context,
-     if (client != NULL) {
-         ibusimcontext->client_window = g_object_ref (client);
- #if !GTK_CHECK_VERSION (3, 98, 4)
--        if (!ibusimcontext->use_button_press_event)
-+        if (!ibusimcontext->use_button_press_event && !_use_sync_mode)
-             _connect_button_press_event (ibusimcontext, TRUE);
- #endif
-     }
-@@ -1994,7 +1996,8 @@ _ibus_context_update_preedit_text_cb (IBusInputContext  *ibuscontext,
- 
- #if !GTK_CHECK_VERSION (3, 98, 4)
-     if (!ibusimcontext->use_button_press_event &&
--        mode == IBUS_ENGINE_PREEDIT_COMMIT) {
-+        mode == IBUS_ENGINE_PREEDIT_COMMIT &&
-+        !_use_sync_mode) {
-         if (ibusimcontext->client_window) {
-             _connect_button_press_event (ibusimcontext, TRUE);
-         }
--- 
-2.28.0
-
-From 4957d1468db4fc5ed30c3ae1f2afac9e51b329d6 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Mon, 6 Sep 2021 20:25:52 +0900
-Subject: [PATCH] client/gtk2/ibusimcontext: Calculate keycode from keysym in
- GTK3 forward-key-event
-
-IBus GTK3 mode also calculates keycode from keysym if keycode == 0
-with forward-key-event signal to follow GTK4.
----
- client/gtk2/ibusimcontext.c | 22 ++++++++++++++++++----
- 1 file changed, 18 insertions(+), 4 deletions(-)
-
-diff --git a/client/gtk2/ibusimcontext.c b/client/gtk2/ibusimcontext.c
-index e12be45d..b1424e87 100644
---- a/client/gtk2/ibusimcontext.c
-+++ b/client/gtk2/ibusimcontext.c
-@@ -1939,13 +1939,16 @@ _ibus_context_forward_key_event_cb (IBusInputContext  *ibuscontext,
-     int group = 0;
-     g_return_if_fail (GTK_IS_IM_CONTEXT (ibusimcontext));
-     if (keycode == 0 && ibusimcontext->client_window) {
--        GdkDisplay *display = gtk_widget_get_display (ibusimcontext->client_window);
-+        GdkDisplay *display =
-+                gtk_widget_get_display (ibusimcontext->client_window);
-         GdkKeymapKey *keys = NULL;
-         gint n_keys = 0;
--        if (!gdk_display_map_keyval (display, keyval, &keys, &n_keys))
-+        if (gdk_display_map_keyval (display, keyval, &keys, &n_keys)) {
-+            keycode = keys->keycode;
-+            group = keys->group;
-+        } else {
-             g_warning ("Failed to parse keycode from keyval %x", keyval);
--       keycode = keys->keycode;
--       group = keys->group;
-+        }
-     }
-     gtk_im_context_filter_key (
-         GTK_IM_CONTEXT (ibusimcontext),
-@@ -1957,6 +1960,17 @@ _ibus_context_forward_key_event_cb (IBusInputContext  *ibuscontext,
-         (GdkModifierType)state,
-         group);
- #else
-+    if (keycode == 0 && ibusimcontext->client_window) {
-+        GdkDisplay *display =
-+                gdk_window_get_display (ibusimcontext->client_window);
-+        GdkKeymap *keymap = gdk_keymap_get_for_display (display);
-+        GdkKeymapKey *keys = NULL;
-+        gint n_keys = 0;
-+        if (gdk_keymap_get_entries_for_keyval (keymap, keyval, &keys, &n_keys))
-+            keycode = keys->keycode;
-+        else
-+            g_warning ("Failed to parse keycode from keyval %x", keyval);
-+    }
-     GdkEventKey *event = _create_gdk_event (ibusimcontext, keyval, keycode, state);
-     gdk_event_put ((GdkEvent *)event);
-     gdk_event_free ((GdkEvent *)event);
--- 
-2.28.0
-
-From fbea5441fc53ae1d5533bed1ee53009141cf905a Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Fri, 10 Sep 2021 00:09:26 +0900
-Subject: [PATCH] Fix build errors in Ubuntu focal
-
-- Ubuntu focal uses glib 2.64.6 which does not include errno.h
-  so config.h includes errno.h as the workaround.
-- make autogen.sh not to delete dist files in Travis
-- Call $(PYTHON) for gensimple.py for Ubuntu python3
-- Add a code review in src/ibuscomposetable.c
-
-BUG=https://github.com/ibus/ibus/pull/2348
----
- autogen.sh             | 2 +-
- configure.ac           | 9 +++++++++
- engine/Makefile.am     | 2 +-
- src/ibuscomposetable.c | 4 ++++
- src/ibusregistry.c     | 4 ++++
- src/ibusshare.c        | 3 +++
- 6 files changed, 26 insertions(+), 2 deletions(-)
-
-diff --git a/autogen.sh b/autogen.sh
-index 693a2740..ea633e06 100755
---- a/autogen.sh
-+++ b/autogen.sh
-@@ -53,4 +53,4 @@ ACLOCAL_FLAGS="$ACLOCAL_FLAGS -I m4" REQUIRED_AUTOMAKE_VERSION=1.11 CFLAGS="$CFL
-         echo "rm $f"
-         rm $f
-     done
--}
-+} || :
-diff --git a/configure.ac b/configure.ac
-index 29f8b3db..ce096ad3 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -162,6 +162,15 @@ PKG_CHECK_MODULES(GIO2, [
- PKG_CHECK_MODULES(GTHREAD2, [
-     gthread-2.0 >= glib_required_version
- ])
-+PKG_CHECK_EXISTS(
-+    [glib-2.0 >= 2.65.0],
-+    [AC_DEFINE(GLIB2_EMBED_ERRNO_H, TRUE, [glib2 include errno.h])]
-+)
-+AH_BOTTOM([
-+#ifndef GLIB2_EMBED_ERRNO_H
-+#  include <errno.h>
-+#endif
-+])
- 
- # --disable-tests option.
- AC_ARG_ENABLE(tests,
-diff --git a/engine/Makefile.am b/engine/Makefile.am
-index 84bc7f6c..03867f52 100644
---- a/engine/Makefile.am
-+++ b/engine/Makefile.am
-@@ -99,7 +99,7 @@ simple.xml: simple.xml.in
- 	    mv $@.tmp $@
- 
- simple.xml.in:
--	$(srcdir)/gensimple.py \
-+	$(PYTHON) $(srcdir)/gensimple.py \
- 	    --input=$(XKBCONFIG_BASE)/rules/evdev.xml \
- 	    --output=$@ \
- 	    --version=$(VERSION).`date '+%Y%m%d'` \
-diff --git a/src/ibuscomposetable.c b/src/ibuscomposetable.c
-index d4184d30..b76464bc 100644
---- a/src/ibuscomposetable.c
-+++ b/src/ibuscomposetable.c
-@@ -18,6 +18,9 @@
-  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
-  * USA
-  */
-+#ifdef HAVE_CONFIG_H
-+#include <config.h>
-+#endif
- 
- #include <glib.h>
- #include <glib/gstdio.h>
-@@ -1606,6 +1609,7 @@ ibus_compose_table_compact_check (const IBusComposeTableCompactEx
-             row_stride = i + 1;
- 
-             if (seq_index[i + 1] - seq_index[i] > 0) {
-+                g_assert (row_stride);
-                 seq = bsearch (compose_buffer + 1,
-                                table->data + seq_index[i],
-                                (seq_index[i + 1] - seq_index[i]) / row_stride,
-diff --git a/src/ibusregistry.c b/src/ibusregistry.c
-index 23c5ca1b..962afb20 100644
---- a/src/ibusregistry.c
-+++ b/src/ibusregistry.c
-@@ -20,6 +20,10 @@
-  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
-  * USA
-  */
-+#ifdef HAVE_CONFIG_H
-+#include <config.h>
-+#endif
-+
- #include <gio/gio.h>
- #include <glib/gstdio.h>
- #include <string.h>
-diff --git a/src/ibusshare.c b/src/ibusshare.c
-index 8974511a..0c0bda10 100644
---- a/src/ibusshare.c
-+++ b/src/ibusshare.c
-@@ -20,6 +20,9 @@
-  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
-  * USA
-  */
-+#ifdef HAVE_CONFIG_H
-+#include <config.h>
-+#endif
- 
- #include "ibusshare.h"
- #include <glib.h>
--- 
-2.33.1
-
-From 943d37444d9cc0881cb5fff87bdd4b9efd5abdb4 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Mon, 9 Aug 2021 12:49:15 +0900
-Subject: [PATCH] client/gtk2/ibusimcontext: Fix a key event loop with
- forwarding keys.
-
-_ibus_context_forward_key_event_cb() caused a key event loop in
-_key_snooper_cb() with key release events.
----
- client/gtk2/ibusimcontext.c | 11 +++++++++--
- 1 file changed, 9 insertions(+), 2 deletions(-)
-
-diff --git a/client/gtk2/ibusimcontext.c b/client/gtk2/ibusimcontext.c
-index da9a402f..e66125df 100644
---- a/client/gtk2/ibusimcontext.c
-+++ b/client/gtk2/ibusimcontext.c
-@@ -366,6 +366,10 @@ ibus_im_context_commit_event (IBusIMContext *ibusimcontext,
-         g_signal_emit (ibusimcontext, _signal_commit_id, 0, text->text);
-         g_object_unref (text);
-         _request_surrounding_text (ibusimcontext);
-+#if !GTK_CHECK_VERSION (3, 98, 4)
-+        /* Avoid a loop with _ibus_context_forward_key_event_cb() */
-+        event->state |= IBUS_HANDLED_MASK;
-+#endif
-         return TRUE;
-     }
-    return FALSE;
-@@ -643,12 +647,15 @@ _key_snooper_cb (GtkWidget   *widget,
- 
-     } while (0);
- 
--    if (ibusimcontext != NULL) {
-+    if (ibusimcontext != NULL && event->type == GDK_KEY_PRESS) {
-         /* "retrieve-surrounding" signal sometimes calls unref by
-          * gtk_im_multicontext_get_slave() because priv->context_id is not
-          * the latest than global_context_id in GtkIMMulticontext.
-          * Since _focus_im_context is gotten by the focus_in event,
-          * it would be good to call ref here.
-+         *
-+         * Most release key events would be redundant from
-+         * _ibus_context_forward_key_event_cb ().
-          */
-         g_object_ref (ibusimcontext);
-         _request_surrounding_text (ibusimcontext);
-@@ -657,7 +664,7 @@ _key_snooper_cb (GtkWidget   *widget,
- 
-     retval = _process_key_event (ibuscontext, event, ibusimcontext);
- 
--    if (ibusimcontext != NULL) {
-+    if (ibusimcontext != NULL && event->type == GDK_KEY_PRESS) {
-         /* unref ibusimcontext could call ibus_im_context_finalize here
-          * because "retrieve-surrounding" signal could call unref.
-          */
--- 
-2.28.0
-
-From 179ebddf4dbde1cef1cea2df4e659cf4940d1a30 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Fri, 27 Aug 2021 20:05:02 +0900
-Subject: [PATCH] src/tests: Add --screendump option in
- ibus-desktop-testing-runner
-
-The screendump is useful in CI to if check gnome-shell-extension-no-overview
-works.
-Also add ibus-desktop-testing-autostart to get the debug info in CI.
-You can copy ibus-desktop-testing.desktop to $HOME/.config/autostart
-if CI fails.
----
- src/tests/Makefile.am                     | 11 +++++
- src/tests/ibus-desktop-testing-autostart  | 55 +++++++++++++++++++++++
- src/tests/ibus-desktop-testing-runner.in  | 20 +++++++--
- src/tests/ibus-desktop-testing.desktop.in | 11 +++++
- 4 files changed, 93 insertions(+), 4 deletions(-)
- create mode 100755 src/tests/ibus-desktop-testing-autostart
- create mode 100644 src/tests/ibus-desktop-testing.desktop.in
-
-diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am
-index 13c06eb4..7d00f236 100644
---- a/src/tests/Makefile.am
-+++ b/src/tests/Makefile.am
-@@ -96,6 +96,7 @@ test_sourcesdir = $(datadir)/installed-tests/ibus
- CLEANFILES += \
-     $(test_metas) \
-     ibus-desktop-testing-runner \
-+    org.freedesktop.IBus.Desktop.Testing.desktop \
-     $(NULL)
- 
- test_execs_PROGRAMS = $(TESTS)
-@@ -106,6 +107,14 @@ CLEANFILES += \
-     $(NULL)
- endif
- test_execsdir = $(libexecdir)/installed-tests/ibus
-+libexec_SCRIPTS = ibus-desktop-testing-autostart
-+
-+test_frame_DATA = org.freedesktop.IBus.Desktop.Testing.desktop
-+test_framedir = $(pkgdatadir)/tests
-+org.freedesktop.IBus.Desktop.Testing.desktop: ibus-desktop-testing.desktop.in
-+	$(AM_V_GEN) sed -e "s|\@libexecdir\@|$(libexecdir)|g" \
-+	$< > $@.tmp && \
-+	mv $@.tmp $@
- endif
- 
- $(test_metas): $(test_metas_in) $(test_programs)
-@@ -133,6 +142,8 @@ EXTRA_DIST = \
-     ibus-compose.emoji \
-     ibus-compose.env \
-     ibus-compose-locales.in \
-+    ibus-desktop-testing.desktop.in \
-+    ibus-desktop-testing-autostart \
-     ibus-desktop-testing-runner.in \
-     $(NULL)
- 
-diff --git a/src/tests/ibus-desktop-testing-autostart b/src/tests/ibus-desktop-testing-autostart
-new file mode 100755
-index 00000000..da22b64e
---- /dev/null
-+++ b/src/tests/ibus-desktop-testing-autostart
-@@ -0,0 +1,55 @@
-+#!/bin/sh
-+# -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*-
-+# vim:set noet ts=4:
-+#
-+# ibus - The Input Bus
-+#
-+# Copyright (c) 2021 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+# Copyright (c) 2021 Red Hat, Inc.
-+#
-+# This program is free software; you can redistribute it and/or modify
-+# it under the terms of the GNU General Public License as published by
-+# the Free Software Foundation; either version 2 of the License, or
-+# (at your option) any later version.
-+#
-+# This program 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 General Public License for more details.
-+#
-+# You should have received a copy of the GNU General Public License along
-+# with this program; if not, write to the Free Software Foundation, Inc.,
-+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-+
-+TEST_LOG=
-+COMMANDS='
-+id
-+echo $DISPLAY
-+pwd
-+pstree -asp $$
-+gsettings list-recursively org.gnome.shell
-+rpm -q gnome-shell-extension-no-overview gnome-shell gnome-session
-+'
-+
-+if [ $# -gt 0 ] ; then
-+    TEST_LOG=$1
-+fi
-+
-+run_test()
-+{
-+while read cmd ; do
-+    if [ x"$cmd" = x ] ; then
-+        continue
-+    fi
-+    echo "# $cmd"
-+    eval "$cmd"
-+done << EOF_COMMANDS
-+`echo "$COMMANDS"`
-+EOF_COMMANDS
-+}
-+
-+if [ x"$TEST_LOG" = x ] ; then
-+    run_test
-+else
-+    run_test 2>>$TEST_LOG 1>>$TEST_LOG
-+fi
-diff --git a/src/tests/ibus-desktop-testing-runner.in b/src/tests/ibus-desktop-testing-runner.in
-index c1016703..48528326 100755
---- a/src/tests/ibus-desktop-testing-runner.in
-+++ b/src/tests/ibus-desktop-testing-runner.in
-@@ -36,13 +36,14 @@
- 
- 
- PROGNAME=`basename $0`
--VERSION=0.2
-+VERSION=0.3
- DISPLAY=:99.0
- BUILDDIR="."
- SRCDIR="."
- TEST_LOG="test-suite.log"
- TEST_LOG_STDOUT=0
- RESULT_LOG=""
-+SCREEN_LOG=""
- HAVE_GRAPHICS=1
- DESKTOP_COMMAND="dbus-launch --exit-with-session gnome-session"
- PID_XORG=0
-@@ -90,14 +91,15 @@ usage()
- "-T, --timeout=TIMEOUT            Set timeout (default TIMEOUT is 300 sec).\n" \
- "-o, --output=OUTPUT_FILE         OUtput the log to OUTPUT_FILE\n"             \
- "-O, --result=RESULT_FILE         OUtput the result to RESULT_FILE\n"          \
-+"-S, --screendump=DUMP_FILE       OUtput the screen to DUMP_FILE ('STDOUT' can be stdout)\n" \
- ""
- }
- 
- parse_args()
- {
-     # This is GNU getopt. "sudo port getopt" in BSD?
--    ARGS=`getopt -o hvb:s:cd:t:r:T:o:O: --long \
--          help,version,builddir:,srcdir:,no-graphics,desktop:,tests:,runner:,timeout:,output:,result:\
-+    ARGS=`getopt -o hvb:s:cd:t:r:T:o:O:S: --long \
-+          help,version,builddir:,srcdir:,no-graphics,desktop:,tests:,runner:,timeout:,output:,result:,screendump:\
-         -- "$@"`;
-     eval set -- "$ARGS"
-     while [ 1 ] ; do
-@@ -113,6 +115,7 @@ parse_args()
-         -T | --timeout )     TIMEOUT="$2"; shift 2;;
-         -o | --output )      TEST_LOG="$2"; shift 2;;
-         -O | --result )      RESULT_LOG="$2"; shift 2;;
-+        -S | --screendump )  SCREEN_LOG="$2"; shift 2;;
-         -- )                 shift; break;;
-         * )                  usage; exit 1;;
-         esac
-@@ -259,6 +262,7 @@ run_desktop()
- {
-     echo "$DESKTOP_COMMAND" | grep gnome-session > /dev/null
-     HAS_GNOME=$?
-+    export DISPLAY=$DISPLAY
-     if test $HAVE_GRAPHICS -eq 1 ; then
-         /usr/libexec/Xorg.wrap -noreset +extension GLX +extension RANDR +extension RENDER -logfile ./xorg.log -config ./xorg.conf -configdir . $DISPLAY &
-     else
-@@ -266,7 +270,6 @@ run_desktop()
-     fi
-     PID_XORG=$!
-     sleep 1
--    export DISPLAY=$DISPLAY
-     # init_gnome need to be called with $DISPLAY before gnome-session is called
-     if [  $HAS_GNOME -eq 0 ] ; then
-         init_gnome
-@@ -454,6 +457,15 @@ main()
-     init_desktop
-     run_dbus_daemon 2>>$TEST_LOG 1>>$TEST_LOG
-     run_desktop 2>>$TEST_LOG 1>>$TEST_LOG
-+    if [ x"$SCREEN_LOG" != x ] ; then
-+        SCREEN_PNG="`date '+%Y%m%d%H%M%S'`.png"
-+        gnome-screenshot --file=$SCREEN_PNG
-+        if [ x"$SCREEN_LOG" = xSTDOUT ] ; then
-+            base64 $SCREEN_PNG
-+        else
-+            base64 $SCREEN_PNG > $SCREEN_LOG
-+        fi
-+    fi
-     run_test_suite
-     finit
- }
-diff --git a/src/tests/ibus-desktop-testing.desktop.in b/src/tests/ibus-desktop-testing.desktop.in
-new file mode 100644
-index 00000000..fa0c9b40
---- /dev/null
-+++ b/src/tests/ibus-desktop-testing.desktop.in
-@@ -0,0 +1,11 @@
-+[Desktop Entry]
-+Name=IBus Desktop Testing Runner
-+GenericName=Input Method Desktop Testing Runner
-+Comment=Test plugin for IBus Desktop Testing
-+Exec=@ibexecdir@/ibus-desktop-testing-autostart /var/tmp/ibus-ci-autostart.log
-+Terminal=false
-+Type=Application
-+Encoding=UTF-8
-+Icon=ibus
-+Categories=System
-+Keywords=im;
--- 
-2.28.0
-
-From acc5570511698c7b5cc037eb81be2c4be52a824f Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Fri, 29 Oct 2021 12:56:49 +0900
-Subject: [PATCH] ui/gtk3: Erase Emojier preedit/lookup popup between
- applications
-
-It would be better to erase Emojier popup window when users change
-the input focus between applications. But it hasn't been implemented
-because the focus-out/in events also happen when the Emojier popup window
-is launching or rebuilding to the category list in GNOME Wayland.
-The focus-out/in events do not happen in Xorg desktops with the rebuilding
-GUI because GTK popup window causes focus-in/out evnets in Wayland.
-
-Now I'm convinced with several issues and added a little complicated logic
-to erase Emojier popup window with the focus changes between input contexts
-to handle focus-in/out events in Wayland.
-
-BUG=rhbz#1942970
----
- ui/gtk3/emojier.vala      | 69 ++++++++++++++++++++++++++++++++++++---
- ui/gtk3/emojierapp.vala   | 12 +++++--
- ui/gtk3/panelbinding.vala | 21 ++++++++++--
- 3 files changed, 94 insertions(+), 8 deletions(-)
-
-diff --git a/ui/gtk3/emojier.vala b/ui/gtk3/emojier.vala
-index 9e6e9263..69fb8abe 100644
---- a/ui/gtk3/emojier.vala
-+++ b/ui/gtk3/emojier.vala
-@@ -2,7 +2,7 @@
-  *
-  * ibus - The Input Bus
-  *
-- * Copyright (c) 2017-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (c) 2017-2021 Takao Fujiwara <takao.fujiwara1@gmail.com>
-  *
-  * This library is free software; you can redistribute it and/or
-  * modify it under the terms of the GNU Lesser General Public
-@@ -227,6 +227,8 @@ public class IBusEmojier : Gtk.ApplicationWindow {
-         BACKWARD,
-     }
- 
-+    public bool is_wayland { get; set; }
-+
-     public const uint BUTTON_CLOSE_BUTTON = 1000;
- 
-     private const uint EMOJI_GRID_PAGE = 10;
-@@ -317,15 +319,18 @@ public class IBusEmojier : Gtk.ApplicationWindow {
-     private Gdk.Rectangle m_cursor_location;
-     private bool m_is_up_side_down = false;
-     private uint m_redraw_window_id;
-+    private bool m_rebuilding_gui = false;
-+    private uint m_rebuilding_gui_timeout_id;
- 
-     public signal void candidate_clicked(uint index, uint button, uint state);
-     public signal void commit_text(string text);
-     public signal void cancel();
- 
--    public IBusEmojier() {
-+    public IBusEmojier(bool is_wayland) {
-         GLib.Object(
-             type : Gtk.WindowType.POPUP
-         );
-+        this.is_wayland = is_wayland;
- 
-         // GLib.ActionEntry accepts const variables only.
-         var action = new GLib.SimpleAction.stateful(
-@@ -1002,6 +1007,7 @@ public class IBusEmojier : Gtk.ApplicationWindow {
-         button.button_press_event.connect((w, e) => {
-             m_category_active_index = -1;
-             m_show_unicode = false;
-+            start_rebuild_gui(false);
-             hide_candidate_panel();
-             show_all();
-             return true;
-@@ -1458,6 +1464,7 @@ public class IBusEmojier : Gtk.ApplicationWindow {
-                     show_emoji_for_category(m_backward);
-                     show_candidate_panel();
-                 } else {
-+                    start_rebuild_gui(false);
-                     hide_candidate_panel();
-                     show_all();
-                 }
-@@ -1778,6 +1785,34 @@ public class IBusEmojier : Gtk.ApplicationWindow {
-     }
- 
- 
-+    private void start_rebuild_gui(bool initial_launching) {
-+        if (!this.is_wayland)
-+            return;
-+        if (!initial_launching && !base.get_visible())
-+            return;
-+        if (initial_launching && base.get_visible())
-+            return;
-+        if (m_rebuilding_gui_timeout_id != 0) {
-+            GLib.Source.remove(m_rebuilding_gui_timeout_id);
-+            m_rebuilding_gui_timeout_id = 0;
-+        }
-+
-+        m_rebuilding_gui = true;
-+        m_rebuilding_gui_timeout_id =
-+                GLib.Timeout.add_seconds(10, () => {
-+                    if (!m_rebuilding_gui) {
-+                        m_rebuilding_gui_timeout_id = 0;
-+                        return false;
-+                    }
-+                    warning("Rebuilding GUI is time out.");
-+                    m_rebuilding_gui = false;
-+                    m_rebuilding_gui_timeout_id = 0;
-+                    return false;
-+                },
-+                GLib.Priority.DEFAULT_IDLE);
-+    }
-+
-+
-     public bool has_variants(uint index,
-                              bool need_commit_signal) {
-         if (index >= m_lookup_table.get_number_of_candidates())
-@@ -1880,12 +1915,17 @@ public class IBusEmojier : Gtk.ApplicationWindow {
-                 m_show_unicode = false;
-                 m_category_active_index = -1;
-             }
-+            start_rebuild_gui(false);
-             hide_candidate_panel();
-             return true;
-         } else if (m_backward_index >= 0 && m_backward != null) {
-+            // Escape on Emoji variants window does not call focus-out events
-+            // because hide() is not called here so start_rebuild_gui()
-+            // is not called.
-             show_emoji_for_category(m_backward);
-             return true;
-         } else if (m_candidate_panel_is_visible && m_backward != null) {
-+            start_rebuild_gui(false);
-             hide_candidate_panel();
-             return true;
-         }
-@@ -2218,7 +2258,7 @@ public class IBusEmojier : Gtk.ApplicationWindow {
- 
-         /* Some window managers, e.g. MATE, GNOME, Plasma desktops,
-          * does not give the keyboard focus when Emojier is lauched
--         * twice with Ctrl-Shift-e via XIEvent, if present_with_time()
-+         * twice with Ctrl-period via XIEvent, if present_with_time()
-          * is not applied.
-          * But XFCE4 desktop does not effect this bug.
-          * Seems this is caused by the window manager's focus stealing
-@@ -2265,8 +2305,10 @@ public class IBusEmojier : Gtk.ApplicationWindow {
- #endif
- 
- 
--    /* override virtual functions */
-+    // override virtual functions
-     public override void show_all() {
-+        // Ctrl-period, space keys causes focus-out/in events in GNOME Wayland.
-+        start_rebuild_gui(true);
-         base.show_all();
-         if (m_candidate_panel_mode)
-             show_candidate_panel();
-@@ -2416,6 +2458,17 @@ public class IBusEmojier : Gtk.ApplicationWindow {
-     }
- 
- 
-+    public override bool focus_in_event(Gdk.EventFocus event) {
-+        m_rebuilding_gui = false;
-+        return base.focus_in_event(event);
-+    }
-+
-+
-+    public override bool focus_out_event(Gdk.EventFocus event) {
-+        return base.focus_out_event(event);
-+    }
-+
-+
-     public bool is_running() {
-         return m_is_running;
-     }
-@@ -2511,6 +2564,14 @@ public class IBusEmojier : Gtk.ApplicationWindow {
-     }
- 
- 
-+    public bool is_rebuilding_gui() {
-+        /* The candidate window and preedit text should not be closed
-+         * when the GUI is rebuilding.
-+         */
-+        return m_rebuilding_gui;
-+    }
-+
-+
-     public static bool has_loaded_emoji_dict() {
-         if (m_emoji_to_data_dict == null)
-             return false;
-diff --git a/ui/gtk3/emojierapp.vala b/ui/gtk3/emojierapp.vala
-index 783c611c..812356f0 100644
---- a/ui/gtk3/emojierapp.vala
-+++ b/ui/gtk3/emojierapp.vala
-@@ -3,7 +3,7 @@
-  * ibus - The Input Bus
-  *
-  * Copyright (c) 2017 Peng Wu <alexepico@gmail.com>
-- * Copyright (c) 2017-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (c) 2017-2021 Takao Fujiwara <takao.fujiwara1@gmail.com>
-  *
-  * This library is free software; you can redistribute it and/or
-  * modify it under the terms of the GNU Lesser General Public
-@@ -208,7 +208,15 @@ public class EmojiApplication : Gtk.Application {
-         IBusEmojier.load_unicode_dict();
- 
-         if (m_emojier == null) {
--            m_emojier = new IBusEmojier();
-+            bool is_wayland = false;
-+#if USE_GDK_WAYLAND
-+            Type instance_type = Gdk.Display.get_default().get_type();
-+            Type wayland_type = typeof(GdkWayland.Display);
-+            is_wayland = instance_type.is_a(wayland_type);
-+#else
-+            warning("Checking Wayland is disabled");
-+#endif
-+            m_emojier = new IBusEmojier(is_wayland);
-             // For title handling in gnome-shell
-             add_window(m_emojier);
-             m_emojier.candidate_clicked.connect((i, b, s) => {
-diff --git a/ui/gtk3/panelbinding.vala b/ui/gtk3/panelbinding.vala
-index 861255b1..e63d93f2 100644
---- a/ui/gtk3/panelbinding.vala
-+++ b/ui/gtk3/panelbinding.vala
-@@ -3,7 +3,7 @@
-  * ibus - The Input Bus
-  *
-  * Copyright(c) 2018 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright(c) 2018-2020 Takao Fujwiara <takao.fujiwara1@gmail.com>
-+ * Copyright(c) 2018-2021 Takao Fujwiara <takao.fujiwara1@gmail.com>
-  *
-  * This library is free software; you can redistribute it and/or
-  * modify it under the terms of the GNU Lesser General Public
-@@ -799,6 +799,23 @@ class PanelBinding : IBus.PanelService {
- 
-     public override void focus_out(string input_context_path) {
-         m_current_context_path = "";
-+        /* Close emoji typing when the focus out happens but it's not a
-+         * rebuilding GUI.
-+         * Emojier rebuilding GUI happens when Escape key is pressed on
-+         * Emojier candidate list and the rebuilding also causes focus-out/in
-+         * events in GNOME Wayland but not Xorg desktops.
-+         * The rebuilding GUI can be checked with m_emojier.is_rebuilding_gui()
-+         * in Wayland.
-+         * m_emojier.is_rebuilding_gui() always returns false in Xorg desktops
-+         * since focus-out/in events does not happen.
-+         */
-+        if (m_emojier != null && !m_emojier.is_rebuilding_gui()) {
-+            m_preedit.reset();
-+            m_emojier.set_annotation("");
-+            if (m_wayland_lookup_table_is_visible)
-+                hide_wayland_lookup_table();
-+            key_press_escape();
-+        }
-     }
- 
- 
-@@ -822,7 +839,7 @@ class PanelBinding : IBus.PanelService {
-             m_loaded_unicode = true;
-         }
-         if (m_emojier == null) {
--            m_emojier = new IBusEmojier();
-+            m_emojier = new IBusEmojier(m_is_wayland);
-             // For title handling in gnome-shell
-             m_application.add_window(m_emojier);
-             m_emojier.candidate_clicked.connect((i, b, s) => {
--- 
-2.28.0
-
-From 28acfd433b3df1673b7c7177915c027ce48c061e Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Fri, 5 Nov 2021 07:22:34 +0900
-Subject: [PATCH] ui/gtk2: Deprecate gettext.bind_textdomain_codeset()
- since Python 3.8
-
-setup/i18n.py is a symlink of ui/gtk2/i18n.py
-env PYTHONWARNINGS='d' ibus-setup
-
-BUG=https://github.com/ibus/ibus/issues/2276
----
- setup/i18n.py | 8 +++++++-
- 1 file changed, 7 insertions(+), 1 deletion(-)
-
-diff --git a/setup/i18n.py b/setup/i18n.py
-index 976d1aee..af14efc6 100644
---- a/setup/i18n.py
-+++ b/setup/i18n.py
-@@ -3,7 +3,9 @@
- # ibus - The Input Bus
- #
- # Copyright(c) 2007-2015 Peng Huang <shawn.p.huang@gmail.com>
-+# Copyright(c) 2012-2021 Takao Fujiwara <takao.fujiwara1@gmail.com>
- # Copyright(c) 2007-2015 Google, Inc.
-+# Copyright(c) 2012-2021 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
-@@ -23,12 +25,14 @@
- import locale
- import gettext
- import os
-+import sys
- 
- DOMAINNAME = "ibus10"
- 
- _ = lambda a: gettext.dgettext(DOMAINNAME, a)
- N_ = lambda a: a
- 
-+PY3K = sys.version_info >= (3, 0)
- LOCALEDIR = os.getenv("IBUS_LOCALEDIR")
- 
- def init_textdomain(domainname):
-@@ -42,7 +46,9 @@ def init_textdomain(domainname):
-     except AttributeError:
-         pass
-     gettext.bindtextdomain(domainname, LOCALEDIR)
--    gettext.bind_textdomain_codeset(domainname, 'UTF-8')
-+    # https://docs.python.org/3/library/gettext.html#gettext.lgettext
-+    if not PY3K:
-+        gettext.bind_textdomain_codeset(domainname, 'UTF-8')
- 
- def gettext_engine_longname(engine):
-     name = engine.get_name()
--- 
-2.33.1
-
-From cfcc6f194cfc95ab0cf1b3b719d77321c249a83b Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Na=C3=AFm=20Favier?= <n@monade.li>
-Date: Tue, 16 Nov 2021 00:33:37 +0100
-Subject: [PATCH] src/ibuscomposetable: invalidate cache based on symlink
- mtime too
-
-When the compose file is a symbolic link, take the link itself's
-modification time into account (in addition to its target's) in
-determining whether to invalidate the compose cache.
-
-This is useful e.g. on NixOS systems where the compose file might point
-to a store path with an irrelevant modification time, and we want the
-cache to expire when the symlink itself changes.
-
-BUG=https://github.com/ibus/ibus/pull/2362
----
- src/ibuscomposetable.c | 8 ++++++--
- 1 file changed, 6 insertions(+), 2 deletions(-)
-
-diff --git a/src/ibuscomposetable.c b/src/ibuscomposetable.c
-index b76464bc..250e0139 100644
---- a/src/ibuscomposetable.c
-+++ b/src/ibuscomposetable.c
-@@ -1040,10 +1040,14 @@ ibus_compose_table_load_cache (const gchar *compose_file)
-         if (!g_file_test (path, G_FILE_TEST_EXISTS))
-             break;
- 
--        if (g_stat (compose_file, &original_buf))
--            break;
-         if (g_stat (path, &cache_buf))
-             break;
-+        if (g_lstat (compose_file, &original_buf))
-+            break;
-+        if (original_buf.st_mtime > cache_buf.st_mtime)
-+            break;
-+        if (g_stat (compose_file, &original_buf))
-+            break;
-         if (original_buf.st_mtime > cache_buf.st_mtime)
-             break;
-         if (!g_file_get_contents (path, &contents, &length, &error)) {
--- 
-2.33.1
-
-From 2bc47f09832073c87ccdf1060bd93ff95878685a Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Thu, 2 Dec 2021 23:52:36 +0900
-Subject: [PATCH] autogen: Delete gnome-autogen dependency
-
-You may like to call ./autogen.sh --enable-gtk-doc with your custom
-configure options.
-Also set SAVE_DIST_FILE=1 by default
----
- autogen.sh      | 96 +++++++++++++++++++++++++++++++++----------------
- src/Makefile.am | 18 ++++++----
- 3 files changed, 80 insertions(+), 41 deletions(-)
-
-diff --git a/autogen.sh b/autogen.sh
-index ea633e06..1acbf705 100755
---- a/autogen.sh
-+++ b/autogen.sh
-@@ -1,22 +1,47 @@
- #!/bin/sh
- # Run this to generate all the initial makefiles, etc.
- 
--srcdir=`dirname $0`
--test -z "$srcdir" && srcdir=.
--
--PKG_NAME="ibus"
--DIST_FILES="
--engine/simple.xml.in
--src/ibusemojigen.h
--src/ibusunicodegen.h
--"
-+: ${srcdir=$(dirname $0)}
-+: ${srcdir:=.}
-+: ${SAVE_DIST_FILES:=0}
-+
-+olddir=$(pwd)
-+# shellcheck disable=SC2016
-+PKG_NAME=$(autoconf --trace 'AC_INIT:$1' configure.ac)
-+WANT_GTK_DOC=0
-+GCC_VERSION=$(gcc --version | head -1 | awk '{print $3}')
-+GCC_MAJOR_VERSION=$(echo "$GCC_VERSION" | awk -F. '{print $1}')
- FEDORA_PKG1='autoconf automake libtool gettext-devel'
- FEDORA_PKG2='glib2-devel gtk2-devel gtk3-devel
-  wayland-devel'
- FEDORA_PKG3='cldr-emoji-annotation iso-codes-devel unicode-emoji unicode-ucd
-  xkeyboard-config-devel'
- 
--(test -z "$DISABLE_INSTALL_PKGS") && {
-+CFLAGS=${CFLAGS-"-Wall -Wformat -Werror=format-security"}
-+(test $GCC_MAJOR_VERSION -ge 10) && {
-+    CFLAGS="$CFLAGS -fanalyzer -fsanitize=address -fsanitize=leak"
-+    FEDORA_PKG1="$FEDORA_PKG1 libasan"
-+}
-+
-+cd "$srcdir"
-+
-+(test -f configure.ac \
-+  && test -f README ) || {
-+    echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
-+    echo " top-level $PKG_NAME directory"
-+    exit 1
-+}
-+
-+(test $(grep -q "^GTK_DOC_CHECK" configure.ac)) || {
-+    WANT_GTK_DOC=1
-+    FEDORA_PKG2="$FEDORA_PKG2 gtk-doc"
-+}
-+
-+(test -f ChangeLog) || {
-+    touch ChangeLog
-+}
-+
-+(test "x$DISABLE_INSTALL_PKGS" = "x") && {
-     (test -f /etc/fedora-release ) && {
-         rpm -q $FEDORA_PKG1 || exit 1
-         rpm -q $FEDORA_PKG2 || exit 1
-@@ -27,30 +52,39 @@ FEDORA_PKG3='cldr-emoji-annotation iso-codes-devel unicode-emoji unicode-ucd
-     }
- }
- 
--(test -f $srcdir/configure.ac \
--  && test -f $srcdir/README ) || {
--    echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
--    echo " top-level $PKG_NAME directory"
--    exit 1
--}
--
--which gnome-autogen.sh || {
--    echo "Not found gnome-autogen.sh. You may need to install gnome-common"
--    exit 1
-+CONFIGFLAGS="$@"
-+(test "$#" = 0 -a "x$NOCONFIGURE" = "x" ) && {
-+    echo "*** WARNING: I am going to run 'configure' with no arguments." >&2
-+    echo "*** If you wish to pass any to it, please specify them on the" >&2
-+    echo "*** '$0' command line." >&2
-+    echo "" >&2
-+    (test $WANT_GTK_DOC -eq 1) && CONFIGFLAGS="--enable-gtk-doc $@"
- }
- 
--(test -f $srcdir/ChangeLog) || {
--    touch $srcdir/ChangeLog
--}
-+(test $WANT_GTK_DOC -eq 1) && gtkdocize --copy
- 
--CFLAGS=${CFLAGS-"-Wall -Wformat -Werror=format-security"}
-+ACLOCAL_FLAGS="$ACLOCAL_FLAGS -I m4" REQUIRED_AUTOMAKE_VERSION=1.11 \
-+autoreconf --verbose --force --install || exit 1
- 
--# need --enable-gtk-doc for gnome-autogen.sh to make dist
--ACLOCAL_FLAGS="$ACLOCAL_FLAGS -I m4" REQUIRED_AUTOMAKE_VERSION=1.11 CFLAGS="$CFLAGS" . gnome-autogen.sh "$@"
-+cd "$olddir"
-+(test "x$NOCONFIGURE" = "x" ) && {
-+    echo "$srcdir/configure $CONFIGFLAGS"
-+    $srcdir/configure $CONFIGFLAGS || exit 1
-+    (test "$1" = "--help" ) && {
-+        exit 0
-+    } || {
-+        echo "Now type 'make' to compile $PKG_NAME" || exit 1
-+    }
-+} || {
-+    echo "Skipping configure process."
-+}
- 
--(test -z "$SAVE_DIST_FILES") && {
--    for f in $DIST_FILES ; do
--        echo "rm $f"
--        rm $f
--    done
-+cd "$srcdir"
-+(test "x$SAVE_DIST_FILES" = "x0" ) && {
-+    # rm engine/simple.xml.in src/ibusemojigen.h src/ibusunicodegen.h
-+    for d in engine src; do
-+        echo "make -C $d maintainer-clean-generic"
-+        make -C $d maintainer-clean-generic
-+   done
- } || :
-+cd "$olddir"
-diff --git a/src/Makefile.am b/src/Makefile.am
-index 742ee7d7..578694b5 100644
---- a/src/Makefile.am
-+++ b/src/Makefile.am
-@@ -3,7 +3,7 @@
- # ibus - The Input Bus
- #
- # Copyright (c) 2007-2015 Peng Huang <shawn.p.huang@gmail.com>
--# Copyright (c) 2015-2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+# Copyright (c) 2015-2021 Takao Fujiwara <takao.fujiwara1@gmail.com>
- # Copyright (c) 2007-2017 Red Hat, Inc.
- #
- # This library is free software; you can redistribute it and/or
-@@ -296,8 +296,8 @@ dicts/emoji-%.dict: emoji-parser
- 	    echo "Skip $$plus_comment $@"; \
- 	fi;
- 
--ibusemojigen.h: dicts/emoji-en.dict
--	$(NULL)
-+ibusemojigen.h:
-+	$(MAKE) $(AM_MAKEFLAGS) dicts/emoji-en.dict
- 
- # We put dicts/emoji-%.dict as the make target for the parallel build
- # and the make target has to be genarated even if the file size is zero.
-@@ -364,8 +364,8 @@ dicts/unicode-blocks.dict: unicode-parser
- 	    echo "Generated $@"; \
- 	fi;
- 
--ibusunicodegen.h: dicts/unicode-blocks.dict
--	$(NULL)
-+ibusunicodegen.h:
-+	$(MAKE) $(AM_MAKEFLAGS) dicts/unicode-blocks.dict
- 
- unicode_parser_SOURCES =        \
-     unicode-parser.c            \
-@@ -398,9 +398,15 @@ CLEANFILES +=                   \
-     stamp-ibusenumtypes.h       \
-     $(NULL)
- 
--DISTCLEANFILES =                \
-+MAINTAINERCLEANFILES =          \
-     ibusemojigen.h              \
-     ibusunicodegen.h            \
-+    dicts/emoji-en.dict         \
-+    dicts/unicode-blocks.dict   \
-+    $(NULL)
-+
-+DISTCLEANFILES =                \
-+    $(MAINTAINERCLEANFILES)     \
-     ibusversion.h               \
-     $(NULL)
- 
--- 
-2.33.1
-
-From 104148bcdada1f8f22ef905c930f9944f3e99a63 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Thu, 2 Dec 2021 23:53:28 +0900
-Subject: [PATCH] src: Disable emoji shortcut key with no-emoji hint
-
-BUG=https://gitlab.gnome.org/GNOME/gtk/-/issues/4337
----
- src/ibusengine.c | 8 ++++++--
- 1 file changed, 6 insertions(+), 2 deletions(-)
-
-diff --git a/src/ibusengine.c b/src/ibusengine.c
-index 9aeafbf9..7e844838 100644
---- a/src/ibusengine.c
-+++ b/src/ibusengine.c
-@@ -2,8 +2,8 @@
- /* vim:set et sts=4: */
- /* ibus - The Input Bus
-  * Copyright (C) 2008-2013 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright (C) 2018-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
-- * Copyright (C) 2008-2019 Red Hat, Inc.
-+ * Copyright (C) 2018-2021 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2008-2021 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
-@@ -954,6 +954,10 @@ ibus_engine_filter_key_event (IBusEngine *engine,
-         return FALSE;
-     for (n = names; n; n = n->next) {
-         const gchar *name = (const gchar *)n->data;
-+        if (!g_strcmp0 (name, "emoji") &&
-+            (engine->priv->content_hints & IBUS_INPUT_HINT_NO_EMOJI)) {
-+            continue;
-+        }
-         keys = g_hash_table_lookup (priv->extension_keybindings, name);
-         for (; keys; keys++) {
-             if (keys->keyval == 0 && keys->keycode == 0 && keys->state == 0)
--- 
-2.33.1
-
-From f5757ada54edaa7d2e3ea948d340cdf48064e30c Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Thu, 6 Jan 2022 11:20:26 +0900
-Subject: [PATCH] ibusenginesimple: Fix to send char position at
- update_preedit_text
-
-ibus_engine_update_preedit_text() should send the character position
-instead of the byte position.
-
-BUG=https://github.com/ibus/ibus/issues/2368
----
- src/ibusenginesimple.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/src/ibusenginesimple.c b/src/ibusenginesimple.c
-index 83b04ebc..a80e41a5 100644
---- a/src/ibusenginesimple.c
-+++ b/src/ibusenginesimple.c
-@@ -2,7 +2,7 @@
- /* vim:set et sts=4: */
- /* ibus - The Input Bus
-  * Copyright (C) 2014 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright (C) 2015-2021 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2015-2022 Takao Fujiwara <takao.fujiwara1@gmail.com>
-  * Copyright (C) 2014-2017 Red Hat, Inc.
-  *
-  * This library is free software; you can redistribute it and/or
-@@ -386,7 +386,7 @@ ibus_engine_simple_update_preedit_text (IBusEngineSimple *simple)
-     } else if (s->len >= G_MAXINT) {
-         g_warning ("%s is too long compose length: %lu", s->str, s->len);
-     } else {
--        int len = (int)s->len;
-+        guint len = (guint)g_utf8_strlen (s->str, -1);
-         IBusText *text = ibus_text_new_from_string (s->str);
-         ibus_text_append_attribute (text,
-                 IBUS_ATTR_TYPE_UNDERLINE, IBUS_ATTR_UNDERLINE_SINGLE, 0, len);
--- 
-2.33.1
-
-From 0e118e7e57caaa298e367ed99f2051ba47a35f81 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Thu, 20 Jan 2022 16:33:11 +0900
-Subject: [PATCH] data/dconf: Change XKB layout string color in panel
-
-Replace '#415099' with '#51a2da' in XKB layout string color
-
-BUG=https://github.com/ibus/ibus/issues/2364
----
- data/dconf/org.freedesktop.ibus.gschema.xml | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/data/dconf/org.freedesktop.ibus.gschema.xml b/data/dconf/org.freedesktop.ibus.gschema.xml
-index 099b9c60..e90ee5ab 100644
---- a/data/dconf/org.freedesktop.ibus.gschema.xml
-+++ b/data/dconf/org.freedesktop.ibus.gschema.xml
-@@ -146,7 +146,7 @@
-       <description>Show input method name on language bar</description>
-     </key>
-     <key name="xkb-icon-rgba" type="s">
--      <default>'#415099'</default>
-+      <default>'#51a2da'</default>
-       <summary>RGBA value of XKB icon</summary>
-       <description>XKB icon shows the layout string and the string is rendered with the RGBA value. The RGBA value can be 1. a color name from X11, 2. a hex value in form '#rrggbb' where 'r', 'g' and 'b' are hex digits of the red, green, and blue, 3. a RGB color in form 'rgb(r,g,b)' or 4. a RGBA color in form 'rgba(r,g,b,a)' where 'r', 'g', and 'b' are either integers in the range 0 to 255 or percentage values in the range 0% to 100%, and 'a' is a floating point value in the range 0 to 1 of the alpha.</description>
-     </key>
--- 
-2.33.1
-
-From d9ff2bb6b04a7cf7d99f4e9832b4b8905858178c Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Thu, 20 Jan 2022 16:41:37 +0900
-Subject: [PATCH] data/dconf: Add Ctrl-semicolon to Emoji shortcut key
-
-period key is needed Shift key in French keyboard and Ctrl-period does
-not work.
-Add Ctrl-semicolon in org.freedesktop.ibus.panel.emoji.hotkey to fix
-the problem.
-
-BUG=https://github.com/ibus/ibus/issues/2360
----
- data/dconf/org.freedesktop.ibus.gschema.xml | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/data/dconf/org.freedesktop.ibus.gschema.xml b/data/dconf/org.freedesktop.ibus.gschema.xml
-index e90ee5ab..516f7520 100644
---- a/data/dconf/org.freedesktop.ibus.gschema.xml
-+++ b/data/dconf/org.freedesktop.ibus.gschema.xml
-@@ -183,7 +183,7 @@
-       <description>The shortcut keys for turning Unicode typing on or off</description>
-     </key>
-     <key name="hotkey" type="as">
--      <default>[ '&lt;Control&gt;period' ]</default>
-+      <default>[ '&lt;Control&gt;period', '&lt;Control&gt;semicolon' ]</default>
-       <summary>Emoji shortcut keys for gtk_accelerator_parse</summary>
-       <description>The shortcut keys for turning emoji typing on or off</description>
-     </key>
--- 
-2.33.1
-
-From 5a455b1ead5d72483952356ddfe25b9e3b637e6f Mon Sep 17 00:00:00 2001
-From: Eberhard Beilharz <eb1@sil.org>
-Date: Wed, 13 Oct 2021 19:00:47 +0200
-Subject: [PATCH] Fix unref problems with floating references
-
-When running with debug-enabled GLIB there are several critical
-errors output: "A floating object ... was finalized. This means
-that someone called g_object_unref() on an object that had only
-a floating reference; the initial floating reference is not
-owned by anyone and must be removed with g_object_ref_sink()."
-
-This change fixes this by calling `g_object_ref_sink()` before
-`g_object_unref()` if we have a floating reference.
-
-It also fixes another related problem where we called
-`g_object_unref()` on a static IBusText string (created with
-`ibus_text_new_from_static_string()`) for which the API documentation
-says not to free.
-
-BUG=https://github.com/ibus/ibus/pull/2359
----
- src/ibusinputcontext.c | 21 ++++++++++++++-------
- src/ibusproperty.c     | 32 ++++++++++++++++----------------
- 2 files changed, 30 insertions(+), 23 deletions(-)
-
-diff --git a/src/ibusinputcontext.c b/src/ibusinputcontext.c
-index 2b1438fc..4b27551b 100644
---- a/src/ibusinputcontext.c
-+++ b/src/ibusinputcontext.c
-@@ -550,7 +550,8 @@ ibus_input_context_g_signal (GDBusProxy  *proxy,
-         g_signal_emit (context, context_signals[COMMIT_TEXT], 0, text);
- 
-         if (g_object_is_floating (text))
--            g_object_unref (text);
-+            g_object_ref_sink (text);
-+        g_object_unref (text);
-         return;
-     }
-     if (g_strcmp0 (signal_name, "UpdatePreeditText") == 0) {
-@@ -569,7 +570,8 @@ ibus_input_context_g_signal (GDBusProxy  *proxy,
-                        visible);
- 
-         if (g_object_is_floating (text))
--            g_object_unref (text);
-+            g_object_ref_sink (text);
-+        g_object_unref (text);
-         return;
-     }
-     if (g_strcmp0 (signal_name, "UpdatePreeditTextWithMode") == 0) {
-@@ -591,7 +593,8 @@ ibus_input_context_g_signal (GDBusProxy  *proxy,
-                        mode);
- 
-         if (g_object_is_floating (text))
--            g_object_unref (text);
-+            g_object_ref_sink (text);
-+        g_object_unref (text);
-         return;
-     }
- 
-@@ -619,7 +622,8 @@ ibus_input_context_g_signal (GDBusProxy  *proxy,
-                        text,
-                        visible);
-         if (g_object_is_floating (text))
--            g_object_unref (text);
-+            g_object_ref_sink (text);
-+        g_object_unref (text);
-         return;
-     }
- 
-@@ -637,7 +641,8 @@ ibus_input_context_g_signal (GDBusProxy  *proxy,
-                        table,
-                        visible);
-         if (g_object_is_floating (table))
--            g_object_unref (table);
-+            g_object_ref_sink (table);
-+        g_object_unref (table);
-         return;
- 
-     }
-@@ -655,7 +660,8 @@ ibus_input_context_g_signal (GDBusProxy  *proxy,
-                        prop_list);
- 
-         if (g_object_is_floating (prop_list))
--            g_object_unref (prop_list);
-+            g_object_ref_sink (prop_list);
-+        g_object_unref (prop_list);
-         return;
-     }
- 
-@@ -668,7 +674,8 @@ ibus_input_context_g_signal (GDBusProxy  *proxy,
-         g_signal_emit (context, context_signals[UPDATE_PROPERTY], 0, prop);
- 
-         if (g_object_is_floating (prop))
--            g_object_unref (prop);
-+            g_object_ref_sink (prop);
-+        g_object_unref (prop);
-         return;
-     }
- 
-diff --git a/src/ibusproperty.c b/src/ibusproperty.c
-index e87d26b6..6d4ed088 100644
---- a/src/ibusproperty.c
-+++ b/src/ibusproperty.c
-@@ -336,17 +336,20 @@ ibus_property_destroy (IBusProperty *prop)
-     prop->priv->icon = NULL;
- 
-     if (prop->priv->label) {
--        g_object_unref (prop->priv->label);
-+        if (!ibus_text_get_is_static (prop->priv->label))
-+            g_object_unref (prop->priv->label);
-         prop->priv->label = NULL;
-     }
- 
-     if (prop->priv->symbol) {
--        g_object_unref (prop->priv->symbol);
-+        if (!ibus_text_get_is_static (prop->priv->symbol))
-+            g_object_unref (prop->priv->symbol);
-         prop->priv->symbol = NULL;
-     }
- 
-     if (prop->priv->tooltip) {
--        g_object_unref (prop->priv->tooltip);
-+        if (!ibus_text_get_is_static (prop->priv->tooltip))
-+            g_object_unref (prop->priv->tooltip);
-         prop->priv->tooltip = NULL;
-     }
- 
-@@ -401,7 +404,7 @@ ibus_property_deserialize (IBusProperty *prop,
-     g_variant_get_child (variant, retval++, "u", &prop->priv->type);
- 
-     GVariant *subvar = g_variant_get_child_value (variant, retval++);
--    if (prop->priv->label != NULL) {
-+    if (prop->priv->label && !ibus_text_get_is_static (prop->priv->label)) {
-         g_object_unref (prop->priv->label);
-     }
-     prop->priv->label = IBUS_TEXT (ibus_serializable_deserialize (subvar));
-@@ -411,7 +414,7 @@ ibus_property_deserialize (IBusProperty *prop,
-     ibus_g_variant_get_child_string (variant, retval++, &prop->priv->icon);
- 
-     subvar = g_variant_get_child_value (variant, retval++);
--    if (prop->priv->tooltip != NULL) {
-+    if (prop->priv->tooltip && !ibus_text_get_is_static (prop->priv->tooltip)) {
-         g_object_unref (prop->priv->tooltip);
-     }
-     prop->priv->tooltip = IBUS_TEXT (ibus_serializable_deserialize (subvar));
-@@ -432,7 +435,7 @@ ibus_property_deserialize (IBusProperty *prop,
- 
-     /* Keep the serialized order for the compatibility when add new members. */
-     subvar = g_variant_get_child_value (variant, retval++);
--    if (prop->priv->symbol != NULL) {
-+    if (prop->priv->symbol && !ibus_text_get_is_static (prop->priv->symbol)) {
-         g_object_unref (prop->priv->symbol);
-     }
-     prop->priv->symbol = IBUS_TEXT (ibus_serializable_deserialize (subvar));
-@@ -564,7 +567,7 @@ ibus_property_set_label (IBusProperty *prop,
-     g_assert (IBUS_IS_PROPERTY (prop));
-     g_return_if_fail (label == NULL || IBUS_IS_TEXT (label));
- 
--    if (prop->priv->label) {
-+    if (prop->priv->label && !ibus_text_get_is_static (prop->priv->label)) {
-         g_object_unref (prop->priv->label);
-     }
- 
-@@ -583,7 +586,7 @@ ibus_property_set_symbol (IBusProperty *prop,
-     g_assert (IBUS_IS_PROPERTY (prop));
-     g_return_if_fail (symbol == NULL || IBUS_IS_TEXT (symbol));
- 
--    if (prop->priv->symbol) {
-+    if (prop->priv->symbol && !ibus_text_get_is_static (prop->priv->symbol)) {
-         g_object_unref (prop->priv->symbol);
-     }
- 
-@@ -612,19 +615,16 @@ ibus_property_set_tooltip (IBusProperty *prop,
-     g_assert (IBUS_IS_PROPERTY (prop));
-     g_assert (tooltip == NULL || IBUS_IS_TEXT (tooltip));
- 
--    IBusPropertyPrivate *priv = prop->priv;
--
--    if (priv->tooltip) {
--        g_object_unref (priv->tooltip);
-+    if (prop->priv->tooltip && !ibus_text_get_is_static (prop->priv->tooltip)) {
-+        g_object_unref (prop->priv->tooltip);
-     }
- 
-     if (tooltip == NULL) {
--        priv->tooltip = ibus_text_new_from_static_string ("");
--        g_object_ref_sink (priv->tooltip);
-+        prop->priv->tooltip = ibus_text_new_from_static_string ("");
-     }
-     else {
--        priv->tooltip = tooltip;
--        g_object_ref_sink (priv->tooltip);
-+        prop->priv->tooltip = tooltip;
-+        g_object_ref_sink (prop->priv->tooltip);
-     }
- }
- 
--- 
-2.33.1
-
-From ad95015dc411f84dd9b8869e596e4707cd2ccd2b Mon Sep 17 00:00:00 2001
-From: Sibo Dong <46512211+dongsibo@users.noreply.github.com>
-Date: Wed, 2 Feb 2022 19:18:02 +0900
-Subject: [PATCH] ui/gtk3: Update man page for Emoji shortcut key
-
-The default Emoji shortcut key was changed but not updated in
-the ibus-emoji.7 man page.
-
-BUG=https://github.com/ibus/ibus/pull/2353
----
- ui/gtk3/ibus-emoji.7.in | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
-
-diff --git a/ui/gtk3/ibus-emoji.7.in b/ui/gtk3/ibus-emoji.7.in
-index 9c6d3c6f..b4d941ec 100644
---- a/ui/gtk3/ibus-emoji.7.in
-+++ b/ui/gtk3/ibus-emoji.7.in
-@@ -1,8 +1,8 @@
- .\" This file is distributed under the same license as the ibus
- .\" package.
--.\" Copyright (C) Takao Fujiwara <takao.fujiwara1@gmail.com>, 2017-2018.
-+.\" Copyright (C) Takao Fujiwara <takao.fujiwara1@gmail.com>, 2017-2022.
- .\"
--.TH "IBUS EMOJI" 7 "August 2018" "@VERSION@" "User Commands"
-+.TH "IBUS EMOJI" 7 "February 2022" "@VERSION@" "User Commands"
- .SH NAME
- .B ibus-emoji
- \- Call the IBus emoji utility by
-@@ -51,7 +51,7 @@ E.g. "Noto Color Emoji", "Android Emoji" font.
- 
- .SH "KEYBOARD OPERATIONS"
- .TP
--\fBControl-Shift-e\fR
-+\fBControl-Period or Control-Semicolon\fR
- Launch IBus Emojier. The shortcut key can be customized by
- .B ibus\-setup (1).
- .TP
--- 
-2.33.1
-
-From 0f1485bfa687386f26ef5909c123e0ae2e3e11b9 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Thu, 3 Feb 2022 14:03:30 +0900
-Subject: [PATCH] src: Add IBUS_INPUT_HINT_PRIVATE for browser private mode
-
-GTK4 added GTK_INPUT_HINT_PRIVATE recently for Web brower
-private or guest mode.
-
-BUG=https://github.com/ibus/ibus/issues/2315
----
- src/ibustypes.h | 8 ++++++--
- 1 file changed, 6 insertions(+), 2 deletions(-)
-
-diff --git a/src/ibustypes.h b/src/ibustypes.h
-index 798ad04d..990659ac 100644
---- a/src/ibustypes.h
-+++ b/src/ibustypes.h
-@@ -2,7 +2,8 @@
- /* vim:set et sts=4: */
- /* ibus - The Input Bus
-  * Copyright (C) 2008-2013 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright (C) 2008-2020 Red Hat, Inc.
-+ * Copyright (C) 2010-2022 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2008-2022 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
-@@ -300,6 +301,8 @@ typedef enum
-  * @IBUS_INPUT_HINT_VERTICAL_WRITING: The text is vertical. Since 1.5.11
-  * @IBUS_INPUT_HINT_EMOJI: Suggest offering Emoji support. Since 1.5.24
-  * @IBUS_INPUT_HINT_NO_EMOJI: Suggest not offering Emoji support. Since 1.5.24
-+ * @IBUS_INPUT_HINT_PRIVATE: Request that the input method should not
-+ *     update personalized data (like typing history). Since 1.5.26
-  *
-  * Describes hints that might be taken into account by engines.  Note
-  * that engines may already tailor their behaviour according to the
-@@ -326,7 +329,8 @@ typedef enum
-     IBUS_INPUT_HINT_INHIBIT_OSK         = 1 << 7,
-     IBUS_INPUT_HINT_VERTICAL_WRITING    = 1 << 8,
-     IBUS_INPUT_HINT_EMOJI               = 1 << 9,
--    IBUS_INPUT_HINT_NO_EMOJI            = 1 << 10
-+    IBUS_INPUT_HINT_NO_EMOJI            = 1 << 10,
-+    IBUS_INPUT_HINT_PRIVATE             = 1 << 11
- } IBusInputHints;
- 
- #endif
--- 
-2.33.1
-
-From 787b564982d17017cb35ab87b71b6a16d7440387 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Thu, 3 Feb 2022 14:34:34 +0900
-Subject: [PATCH] bus: mkdir socket dirs instead of socket paths
-
-IBus ran mkdir for socket paths for --address=unix:path
-but should does the socket directories instead.
-
-BUG=https://github.com/ibus/ibus/issues/2363
----
- bus/server.c | 39 +++++++++++++++++++++++----------------
- 1 file changed, 23 insertions(+), 16 deletions(-)
-
-diff --git a/bus/server.c b/bus/server.c
-index e8d0ce2b..6abf8427 100644
---- a/bus/server.c
-+++ b/bus/server.c
-@@ -2,7 +2,7 @@
- /* vim:set et sts=4: */
- /* bus - The Input Bus
-  * Copyright (C) 2008-2010 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright (C) 2011-2021 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2011-2022 Takao Fujiwara <takao.fujiwara1@gmail.com>
-  * Copyright (C) 2008-2021 Red Hat, Inc.
-  *
-  * This library is free software; you can redistribute it and/or
-@@ -38,14 +38,14 @@ static GDBusServer *server = NULL;
- static GMainLoop *mainloop = NULL;
- static BusDBusImpl *dbus = NULL;
- static BusIBusImpl *ibus = NULL;
--static gchar *address = NULL;
-+static char *address = NULL;
- static gboolean _restart = FALSE;
- 
- static void
- _restart_server (void)
- {
--    gchar *exe;
--    gint fd;
-+    char *exe;
-+    int fd;
-     ssize_t r;
-     int MAXSIZE = 0xFFF;
-     char proclnk[MAXSIZE];
-@@ -201,11 +201,11 @@ bus_acquired_handler (GDBusConnection       *connection,
-                             NULL);
- }
- 
--static gchar *
-+static char *
- _bus_extract_address (void)
- {
--    gchar *socket_address = g_strdup (g_address);
--    gchar *p;
-+    char *socket_address = g_strdup (g_address);
-+    char *p;
- 
- #define IF_REPLACE_VARIABLE_WITH_FUNC(variable, func, format)           \
-     if ((p = g_strstr_len (socket_address, -1, (variable)))) {          \
-@@ -242,12 +242,12 @@ bus_server_init (void)
- #define IBUS_UNIX_ABSTRACT      "unix:abstract="
- #define IBUS_UNIX_DIR           "unix:dir="
- 
--    gchar *socket_address;
-+    char *socket_address;
-     GDBusServerFlags flags = G_DBUS_SERVER_FLAGS_NONE;
--    gchar *guid;
-+    char *guid;
-     GDBusAuthObserver *observer;
-     GError *error = NULL;
--    gchar *unix_dir = NULL;
-+    char *unix_dir = NULL;
- 
-     dbus = bus_dbus_impl_get_default ();
-     ibus = bus_ibus_impl_get_default ();
-@@ -256,18 +256,24 @@ bus_server_init (void)
-     /* init server */
-     socket_address = _bus_extract_address ();
- 
--#define IF_GET_UNIX_DIR(prefix)                                         \
-+#define IF_GET_UNIX_DIR_FROM_DIR(prefix)                                \
-     if (g_str_has_prefix (socket_address, (prefix))) {                  \
-         unix_dir = g_strdup (socket_address + strlen (prefix));         \
-     }
-+#define IF_GET_UNIX_DIR_FROM_PATH(prefix)                               \
-+    if (g_str_has_prefix (socket_address, (prefix))) {                  \
-+        const char *unix_path = socket_address + strlen (prefix);       \
-+        unix_dir = g_path_get_dirname (unix_path);                      \
-+    }
-+
- 
--    IF_GET_UNIX_DIR (IBUS_UNIX_TMPDIR)
-+    IF_GET_UNIX_DIR_FROM_DIR (IBUS_UNIX_TMPDIR)
-     else
--    IF_GET_UNIX_DIR (IBUS_UNIX_PATH)
-+    IF_GET_UNIX_DIR_FROM_PATH (IBUS_UNIX_PATH)
-     else
--    IF_GET_UNIX_DIR (IBUS_UNIX_ABSTRACT)
-+    IF_GET_UNIX_DIR_FROM_PATH (IBUS_UNIX_ABSTRACT)
-     else
--    IF_GET_UNIX_DIR (IBUS_UNIX_DIR)
-+    IF_GET_UNIX_DIR_FROM_DIR (IBUS_UNIX_DIR)
-     else {
-         g_error ("Your socket address \"%s\" does not correspond with "
-                  "one of the following formats; "
-@@ -329,7 +335,8 @@ bus_server_init (void)
-                     bus_acquired_handler,
-                     NULL, NULL, NULL, NULL);
- 
--#undef IF_GET_UNIX_DIR
-+#undef IF_GET_UNIX_DIR_FROM_DIR
-+#undef IF_GET_UNIX_DIR_FROM_PATH
- #undef IBUS_UNIX_TMPDIR
- #undef IBUS_UNIX_PATH
- #undef IBUS_UNIX_ABSTRACT
--- 
-2.33.1
-
-From dfd3fbf26fa4b5ff20512b166a8dd321afc10344 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Thu, 3 Feb 2022 17:31:08 +0900
-Subject: [PATCH] bus: Do not mkdir abstract unix socket
-
-IBus ran mkdir for unix abstract sockets for --address=unix:abstract
-but should not need to mkdir.
-
-BUG=https://github.com/ibus/ibus/issues/2363
----
- bus/server.c | 8 ++++++--
- 1 file changed, 6 insertions(+), 2 deletions(-)
-
-diff --git a/bus/server.c b/bus/server.c
-index 6abf8427..968d5346 100644
---- a/bus/server.c
-+++ b/bus/server.c
-@@ -265,13 +265,15 @@ bus_server_init (void)
-         const char *unix_path = socket_address + strlen (prefix);       \
-         unix_dir = g_path_get_dirname (unix_path);                      \
-     }
-+#define IF_GET_UNIX_DIR_FROM_ABSTRACT(prefix)                           \
-+    if (g_str_has_prefix (socket_address, (prefix))) {}
- 
- 
-     IF_GET_UNIX_DIR_FROM_DIR (IBUS_UNIX_TMPDIR)
-     else
-     IF_GET_UNIX_DIR_FROM_PATH (IBUS_UNIX_PATH)
-     else
--    IF_GET_UNIX_DIR_FROM_PATH (IBUS_UNIX_ABSTRACT)
-+    IF_GET_UNIX_DIR_FROM_ABSTRACT (IBUS_UNIX_ABSTRACT)
-     else
-     IF_GET_UNIX_DIR_FROM_DIR (IBUS_UNIX_DIR)
-     else {
-@@ -281,7 +283,8 @@ bus_server_init (void)
-                  IBUS_UNIX_ABSTRACT "FILE, " IBUS_UNIX_DIR "DIR.",
-                  socket_address);
-     }
--    if (!g_file_test (unix_dir, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) {
-+    if (unix_dir &&
-+        !g_file_test (unix_dir, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) {
-         /* Require mkdir for BSD system.
-          * The mode 0700 can eliminate malicious users change the mode.
-          * `chmod` runs for the last directory only not to change the modes
-@@ -337,6 +340,7 @@ bus_server_init (void)
- 
- #undef IF_GET_UNIX_DIR_FROM_DIR
- #undef IF_GET_UNIX_DIR_FROM_PATH
-+#undef IF_GET_UNIX_DIR_FROM_ABSTRACT
- #undef IBUS_UNIX_TMPDIR
- #undef IBUS_UNIX_PATH
- #undef IBUS_UNIX_ABSTRACT
--- 
-2.33.1
-
-From c69b61aa66239e1b13c9764b2d3bf6f02d086785 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Fri, 4 Feb 2022 15:08:36 +0900
-Subject: [PATCH] src: Fix ibus_key_event_from_string for
- gobject-introspection
-
-BUG=https://github.com/ibus/ibus/issues/2330
----
- src/ibusshare.h | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
-
-diff --git a/src/ibusshare.h b/src/ibusshare.h
-index d70af29f..d739e2ff 100644
---- a/src/ibusshare.h
-+++ b/src/ibusshare.h
-@@ -2,8 +2,8 @@
- /* vim:set et sts=4: */
- /* ibus - The Input Bus
-  * Copyright (C) 2008-2013 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright (C) 2015-2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
-- * Copyright (C) 2008-2018 Red Hat, Inc.
-+ * Copyright (C) 2015-2022 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2008-2022 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
-@@ -333,8 +333,8 @@ gchar           *ibus_key_event_to_string
- /**
-  * ibus_key_event_from_string:
-  * @string: Key event string.
-- * @keyval: Variable that hold key symbol result.
-- * @modifiers: Variable that hold modifiers result.
-+ * @keyval: (out): Variable that hold key symbol result.
-+ * @modifiers: (out): Variable that hold modifiers result.
-  *
-  * Parse key event string and return key symbol and modifiers.
-  *
--- 
-2.33.1
-
-From a076b388d856aeb4c8f8317dd6cd9dd6d61fe9ac Mon Sep 17 00:00:00 2001
-From: Carlos Garnacho <carlosg@gnome.org>
-Date: Wed, 4 Nov 2020 10:48:45 +0100
-Subject: [PATCH] src, client/x11: Add systemd unit file
-
-This so far depends on GNOME targets, and is thus just usable there.
-Other DEs wishing to use systemd and ibus will need to add the
-necessary dependencies where applicable.
-
-There are 2 scenarios here:
-- On X11 sessions, ibus-daemon will be launched with --xim parameter,
-  so ibus-x11 is started with it.
-- On Wayland sessions, ibus-daemon will be started without XIM support,
-  ibus-x11 will be launched and tear down together with all other
-  session X11 services while Xwayland is running.
-
-For the second part of the second situation, additionally install
-a script at /etc/xdg/Xwayland-session.d, which takes care of X11
-service initialization together with the Xwayland instance.
-
-BUG=https://github.com/ibus/ibus/pull/2377
----
- client/x11/10-ibus-x11.in                     |  2 ++
- client/x11/Makefile.am                        | 18 ++++++++++++
- configure.ac                                  | 17 +++++++++++
- src/Makefile.am                               | 16 +++++++++++
- ....freedesktop.IBus.session.GNOME.service.in | 28 +++++++++++++++++++
- 5 files changed, 81 insertions(+)
- create mode 100755 client/x11/10-ibus-x11.in
- create mode 100644 bus/services/org.freedesktop.IBus.session.GNOME.service.in
-
-diff --git a/client/x11/10-ibus-x11.in b/client/x11/10-ibus-x11.in
-new file mode 100755
-index 00000000..973cbb6f
---- /dev/null
-+++ b/client/x11/10-ibus-x11.in
-@@ -0,0 +1,2 @@
-+#!/bin/sh
-+@libexecdir@/ibus-x11 &
-diff --git a/client/x11/Makefile.am b/client/x11/Makefile.am
-index 12de6ea8..90454bcf 100644
---- a/client/x11/Makefile.am
-+++ b/client/x11/Makefile.am
-@@ -67,6 +67,16 @@ noinst_HEADERS = \
- 	locales.h \
- 	$(NULL)
- 
-+xwaylandsessiond_in_files = 10-ibus-x11.in
-+xwaylandsessiond_DATA = $(xwaylandsessiond_in_files:.in=)
-+xwaylandsessionddir=$(sysconfdir)/xdg/Xwayland-session.d
-+
-+10-ibus-x11: 10-ibus-x11.in
-+	$(AM_V_GEN) sed -e "s|\@libexecdir\@|$(libexecdir)|"  $< > $@.tmp && mv $@.tmp $@
-+
-+install-data-hook:
-+	chmod 755 $(DESTDIR)$(xwaylandsessionddir)/10-ibus-x11
-+
- $(libIMdkit):
- 	(cd $(top_builddir)/util/IMdkit; make)
- 
-@@ -81,4 +91,12 @@ locales.h:
- 		xargs python -c 'import sys;print "#define LOCALES_STRING \"%s\"" % ",".join(sys.argv[1:])' \
- 	 ) > $@
- 
-+CLEANFILES =                    \
-+    $(xwaylandsessiond_DATA)    \
-+    $(NULL)
-+
-+EXTRA_DIST =                    \
-+    10-ibus-x11.in              \
-+    $(NULL)
-+
- -include $(top_srcdir)/git.mk
-diff --git a/configure.ac b/configure.ac
-index ce096ad3..73c5e429 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -393,6 +393,22 @@ if test x"$enable_dconf" = x"yes"; then
-     enable_dconf="yes (enabled, use --disable-dconf to disable)"
- fi
- 
-+AC_ARG_ENABLE(systemd-services,
-+    AS_HELP_STRING([--disable-systemd-services],
-+                   [Disable systemd services installation]),
-+    [enable_systemd=$enableval],
-+    [enable_systemd=yes]
-+)
-+AM_CONDITIONAL([ENABLE_SYSTEMD], [test x"$enable_systemd" = x"yes"])
-+
-+if test x"$enable_systemd" = x"yes"; then
-+    PKG_CHECK_MODULES(SYSTEMD, [
-+        systemd >= 0.7.5
-+    ])
-+    AC_SUBST([SYSTEMD_USER_UNIT_DIR], [`$PKG_CONFIG --variable systemduserunitdir systemd`])
-+    enable_systemd="yes (enabled, use --disable-systemd-services to disable)"
-+fi
-+
- # Check env.
- AC_PATH_PROG(ENV_IBUS_TEST, env)
- AC_SUBST(ENV_IBUS_TEST)
-@@ -860,6 +876,7 @@ Build options:
-   UCD directory                 $UCD_DIR
-   Socket directory              "$IBUS_SOCKET_DIR"
-   XFixes client disconnect      $have_xfixes
-+  Install systemd service       $enable_systemd
-   Run test cases                $enable_tests
-   Install tests                 $enable_install_tests
- ])
-diff --git a/src/Makefile.am b/src/Makefile.am
-index 578694b5..bbaa6c90 100644
---- a/src/Makefile.am
-+++ b/src/Makefile.am
-@@ -317,6 +317,11 @@ install-data-hook:
- 	        rm "$(DESTDIR)$(dictdir)/$$file" || exit $$?; \
- 	    fi; \
- 	done
-+	$(MKDIR_P) "$(DESTDIR)$(SYSTEMD_USER_UNIT_DIR)/gnome-session.target.wants/"
-+	( \
-+		cd "$(DESTDIR)$(SYSTEMD_USER_UNIT_DIR)/gnome-session.target.wants" ; \
-+		$(LN_S) -f "../org.freedesktop.IBus.session.GNOME.service" .; \
-+	)
- 
- emoji_parser_SOURCES =          \
-     emoji-parser.c              \
-@@ -383,7 +388,17 @@ clean-local:
- 	$(NULL)
- endif
- 
-+if ENABLE_SYSTEMD
-+systemdservice_in_files = org.freedesktop.IBus.session.GNOME.service.in
-+systemdservice_DATA = $(systemdservice_in_files:.service.in=.service)
-+systemdservicedir=$(SYSTEMD_USER_UNIT_DIR)
-+
-+org.freedesktop.IBus.session.GNOME.service: org.freedesktop.IBus.session.GNOME.service.in
-+	$(AM_V_GEN) sed -e "s|\@bindir\@|$(bindir)|"  $< > $@.tmp && mv $@.tmp $@
-+endif
-+
- EXTRA_DIST =                    \
-+    org.freedesktop.IBus.session.GNOME.service.in \
-     emoji-parser.c              \
-     ibusversion.h.in            \
-     ibusmarshalers.list         \
-@@ -393,6 +408,7 @@ EXTRA_DIST =                    \
-     $(NULL)
- 
- CLEANFILES +=                   \
-+    $(systemdservice_DATA)      \
-     $(BUILT_SOURCES)            \
-     stamp-ibusmarshalers.h      \
-     stamp-ibusenumtypes.h       \
-diff --git a/bus/services/org.freedesktop.IBus.session.GNOME.service.in b/bus/services/org.freedesktop.IBus.session.GNOME.service.in
-new file mode 100644
-index 00000000..76444dbd
---- /dev/null
-+++ b/bus/services/org.freedesktop.IBus.session.GNOME.service.in
-@@ -0,0 +1,28 @@
-+[Unit]
-+Description=IBus Daemon
-+CollectMode=inactive-or-failed
-+
-+# Require GNOME session and specify startup ordering
-+Requisite=gnome-session-initialized.target
-+After=gnome-session-initialized.target
-+PartOf=gnome-session-initialized.target
-+Before=gnome-session.target
-+
-+# Needs to run when DISPLAY/WAYLAND_DISPLAY is set
-+After=gnome-session-initialized.target
-+PartOf=gnome-session-initialized.target
-+
-+# Never run in GDM
-+Conflicts=gnome-session@gnome-login.target
-+
-+[Service]
-+Type=dbus
-+# Only pull --xim in X11 session, it is done via Xwayland-session.d on Wayland
-+ExecStart=sh -c '@bindir@/ibus-daemon --panel disable $([[ $XDG_SESSION_TYPE == "x11" ]] && echo "--xim")'
-+Restart=on-abnormal
-+BusName=org.freedesktop.IBus
-+TimeoutStopSec=5
-+Slice=session.slice
-+
-+[Install]
-+WantedBy=gnome-session.target
--- 
-2.33.1
-
-From b5423f0cff78e627fec12378bfcc70efa79e9379 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Thu, 17 Feb 2022 20:15:38 +0900
-Subject: [PATCH] src/services: Add org.freedesktop.IBus.session.generic.service
-
-Move bus/*.service.in & src/*.service.in into bus/services
-
-BUG=https://github.com/ibus/ibus/pull/2381
----
- bus/Makefile.am                               | 16 +----
- bus/services/Makefile.am                      | 68 +++++++++++++++++++
- .../org.freedesktop.IBus.service.in           |  0
- ....freedesktop.IBus.session.GNOME.service.in |  2 +-
- ...reedesktop.IBus.session.generic.service.in | 15 ++++
- configure.ac                                  | 48 ++++++-------
- src/Makefile.am                               | 16 -----
- 7 files changed, 112 insertions(+), 53 deletions(-)
- create mode 100644 bus/services/Makefile.am
- create mode 100644 bus/services/org.freedesktop.IBus.service.in
- create mode 100644 bus/services/org.freedesktop.IBus.session.generic.service.in
-
-diff --git a/bus/Makefile.am b/bus/Makefile.am
-index 4383a874..e173ee25 100644
---- a/bus/Makefile.am
-+++ b/bus/Makefile.am
-@@ -3,8 +3,8 @@
- # ibus - The Input Bus
- #
- # Copyright (c) 2007-2013 Peng Huang <shawn.p.huang@gmail.com>
--# Copyright (c) 2013-2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
--# Copyright (c) 2007-2018 Red Hat, Inc.
-+# Copyright (c) 2013-2022 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+# Copyright (c) 2007-2022 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
-@@ -22,6 +22,7 @@
- # USA
- 
- NULL =
-+SUBDIRS = . services
- 
- libibus = $(top_builddir)/src/libibus-@IBUS_API_VERSION@.la
- 
-@@ -190,15 +191,4 @@ man_onedir = $(mandir)/man1
- %.1.gz: %.1
- 	$(AM_V_GEN) gzip -c $< > $@.tmp && mv $@.tmp $@
- 
--
--dbusservice_in_files = org.freedesktop.IBus.service.in
--dbusservice_DATA = $(dbusservice_in_files:.service.in=.service)
--dbusservicedir=${datadir}/dbus-1/services
--
--org.freedesktop.IBus.service: org.freedesktop.IBus.service.in
--	$(AM_V_GEN) sed -e "s|\@bindir\@|$(bindir)|" -e "s|\@xim_cli_arg\@|$(XIM_CLI_ARG)|" $< > $@.tmp && mv $@.tmp $@
--
--EXTRA_DIST += $(dbusservice_in_files)
--CLEANFILES += $(dbusservice_DATA)
--
- -include $(top_srcdir)/git.mk
-diff --git a/bus/services/Makefile.am b/bus/services/Makefile.am
-new file mode 100644
-index 00000000..9cc42153
---- /dev/null
-+++ b/bus/services/Makefile.am
-@@ -0,0 +1,68 @@
-+# vim:set noet ts=4:
-+#
-+# ibus - The Input Bus
-+#
-+# Copyright (c) 2022 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+# Copyright (c) 2022 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.1 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
-+# USA
-+
-+NULL =
-+
-+# Originally this D-Bus service file was added for GNOME but seems not to
-+# be used at present.
-+#
-+# TODO: Check if flatpack uses this file and we could delete
-+# org.freedesktop.IBus.service file in the future.
-+dbusservice_in_files = org.freedesktop.IBus.service.in
-+dbusservice_DATA = $(dbusservice_in_files:.service.in=.service)
-+dbusservicedir=${datadir}/dbus-1/services
-+
-+systemdservice_in_files = \
-+    org.freedesktop.IBus.session.generic.service.in \
-+    org.freedesktop.IBus.session.GNOME.service.in \
-+    $(NULL)
-+
-+%.service: %.service.in
-+	$(AM_V_GEN) sed -e "s|\@bindir\@|$(bindir)|" \
-+	                -e "s|\@xim_cli_arg\@|$(XIM_CLI_ARG)|" $< > $@.tmp && \
-+	            mv $@.tmp $@
-+
-+if ENABLE_SYSTEMD
-+systemdservice_DATA = $(systemdservice_in_files:.service.in=.service)
-+systemdservicedir = $(SYSTEMD_USER_UNIT_DIR)
-+
-+# in install-data-hook.
-+install-data-hook:
-+	$(MKDIR_P) "$(DESTDIR)$(SYSTEMD_USER_UNIT_DIR)/gnome-session.target.wants/"
-+	( \
-+		cd "$(DESTDIR)$(SYSTEMD_USER_UNIT_DIR)/gnome-session.target.wants" ; \
-+		$(LN_S) -f "../org.freedesktop.IBus.session.GNOME.service" .; \
-+	)
-+	$(NULL)
-+endif
-+
-+EXTRA_DIST =                    \
-+    $(dbusservice_in_files)     \
-+    $(systemdservice_in_files)  \
-+    $(NULL)
-+
-+CLEANFILES =                    \
-+    $(dbusservice_DATA)         \
-+    $(systemdservice_DATA)      \
-+    $(NULL)
-+
-+-include $(top_srcdir)/git.mk
-diff --git a/bus/org.freedesktop.IBus.service.in b/bus/services/org.freedesktop.IBus.service.in
-new file mode 100644
-index 00000000..9d493159
---- /dev/null
-+++ b/bus/services/org.freedesktop.IBus.service.in
-@@ -0,0 +1,3 @@
-+[D-BUS Service]
-+Name=org.freedesktop.IBus
-+Exec=@bindir@/ibus-daemon --replace --panel disable @xim_cli_arg@
-diff --git a/bus/services/org.freedesktop.IBus.session.GNOME.service.in b/bus/services/org.freedesktop.IBus.session.GNOME.service.in
-index 76444dbd..a99370fa 100644
---- a/bus/services/org.freedesktop.IBus.session.GNOME.service.in
-+++ b/bus/services/org.freedesktop.IBus.session.GNOME.service.in
-@@ -1,5 +1,5 @@
- [Unit]
--Description=IBus Daemon
-+Description=IBus Daemon for GNOME
- CollectMode=inactive-or-failed
- 
- # Require GNOME session and specify startup ordering
-diff --git a/bus/services/org.freedesktop.IBus.session.generic.service.in b/bus/services/org.freedesktop.IBus.session.generic.service.in
-new file mode 100644
-index 00000000..9d493159
---- /dev/null
-+++ b/bus/services/org.freedesktop.IBus.session.generic.service.in
-@@ -0,0 +1,15 @@
-+[Unit]
-+Description=IBus Daemon for generic sessions
-+CollectMode=inactive-or-failed
-+
-+# Never run in GNOME
-+Conflicts=gnome-session-initialized.target
-+
-+[Service]
-+Type=dbus
-+# Only pull --xim in X11 session, it is done via Xwayland-session.d on Wayland
-+ExecStart=sh -c '@bindir@/ibus-daemon $IBUS_DAEMON_ARGS'
-+Restart=on-abnormal
-+BusName=org.freedesktop.IBus
-+TimeoutStopSec=5
-+Slice=session.slice
-diff --git a/configure.ac b/configure.ac
-index 73c5e429..4137e6cc 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -3,8 +3,8 @@
- # ibus - The Input Bus
- #
- # Copyright (c) 2007-2016 Peng Huang <shawn.p.huang@gmail.com>
--# Copyright (c) 2015-2021 Takao Fujiwara <takao.fujiwara1@gmail.com>
--# Copyright (c) 2007-2021 Red Hat, Inc.
-+# Copyright (c) 2015-2022 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+# Copyright (c) 2007-2022 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
-@@ -791,24 +791,22 @@ AC_SUBST(XKBCONFIG_BASE)
- AC_SUBST([GDBUS_CODEGEN], [`$PKG_CONFIG --variable gdbus_codegen gio-2.0`])
- 
- # OUTPUT files
--AC_CONFIG_FILES([ po/Makefile.in
--Makefile
--ibus-1.0.pc
--ibus.spec
-+AC_CONFIG_FILES([
-+po/Makefile.in
-+bindings/Makefile
-+bindings/pygobject/Makefile
-+bindings/vala/Makefile
-+bus/Makefile
-+bus/services/Makefile
- client/Makefile
- client/gtk2/Makefile
- client/gtk3/Makefile
- client/gtk4/Makefile
- client/x11/Makefile
- client/wayland/Makefile
--src/Makefile
--src/ibusversion.h
--src/tests/Makefile
--bus/Makefile
--portal/Makefile
--engine/Makefile
--util/Makefile
--util/IMdkit/Makefile
-+conf/Makefile
-+conf/dconf/Makefile
-+conf/memconf/Makefile
- data/Makefile
- data/annotations/Makefile
- data/icons/Makefile
-@@ -819,20 +817,24 @@ docs/Makefile
- docs/reference/Makefile
- docs/reference/ibus/ibus-docs.sgml
- docs/reference/ibus/Makefile
--m4/Makefile
-+engine/Makefile
- ibus/_config.py
- ibus/Makefile
- ibus/interface/Makefile
--ui/Makefile
--ui/gtk3/Makefile
-+m4/Makefile
-+portal/Makefile
- setup/Makefile
--bindings/Makefile
--bindings/pygobject/Makefile
--bindings/vala/Makefile
--conf/Makefile
--conf/dconf/Makefile
--conf/memconf/Makefile
-+src/Makefile
-+src/ibusversion.h
-+src/tests/Makefile
- tools/Makefile
-+ui/Makefile
-+ui/gtk3/Makefile
-+util/Makefile
-+util/IMdkit/Makefile
-+Makefile
-+ibus-1.0.pc
-+ibus.spec
- ])
- 
- AC_OUTPUT
-diff --git a/src/Makefile.am b/src/Makefile.am
-index bbaa6c90..578694b5 100644
---- a/src/Makefile.am
-+++ b/src/Makefile.am
-@@ -317,11 +317,6 @@ install-data-hook:
- 	        rm "$(DESTDIR)$(dictdir)/$$file" || exit $$?; \
- 	    fi; \
- 	done
--	$(MKDIR_P) "$(DESTDIR)$(SYSTEMD_USER_UNIT_DIR)/gnome-session.target.wants/"
--	( \
--		cd "$(DESTDIR)$(SYSTEMD_USER_UNIT_DIR)/gnome-session.target.wants" ; \
--		$(LN_S) -f "../org.freedesktop.IBus.session.GNOME.service" .; \
--	)
- 
- emoji_parser_SOURCES =          \
-     emoji-parser.c              \
-@@ -388,17 +383,7 @@ clean-local:
- 	$(NULL)
- endif
- 
--if ENABLE_SYSTEMD
--systemdservice_in_files = org.freedesktop.IBus.session.GNOME.service.in
--systemdservice_DATA = $(systemdservice_in_files:.service.in=.service)
--systemdservicedir=$(SYSTEMD_USER_UNIT_DIR)
--
--org.freedesktop.IBus.session.GNOME.service: org.freedesktop.IBus.session.GNOME.service.in
--	$(AM_V_GEN) sed -e "s|\@bindir\@|$(bindir)|"  $< > $@.tmp && mv $@.tmp $@
--endif
--
- EXTRA_DIST =                    \
--    org.freedesktop.IBus.session.GNOME.service.in \
-     emoji-parser.c              \
-     ibusversion.h.in            \
-     ibusmarshalers.list         \
-@@ -408,7 +393,6 @@ EXTRA_DIST =                    \
-     $(NULL)
- 
- CLEANFILES +=                   \
--    $(systemdservice_DATA)      \
-     $(BUILT_SOURCES)            \
-     stamp-ibusmarshalers.h      \
-     stamp-ibusenumtypes.h       \
--- 
-2.33.1
-
-From 5cfe838715097d61b50da55f80bcff2c698ca885 Mon Sep 17 00:00:00 2001
-From: Changwoo Ryu <cwryu@debian.org>
-Date: Fri, 18 Feb 2022 09:07:02 +0900
-Subject: [PATCH] client/gtk2/ibusimcontext: Fix forward key keycode for GTK4
-
-When a keycode is provided (!= 0) for a forwarded key event, convert it to a
-GTK keycode before passing it to gtk_im_context_filter_key().
-
-Also free GdkKeymapKey after gdk_display_map_keyval() is called.
-
-BUG=https://github.com/ibus/ibus/issues/2380
-BUG=https://github.com/ibus/ibus/issues/2382
----
- client/gtk2/ibusimcontext.c | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
-
-diff --git a/client/gtk2/ibusimcontext.c b/client/gtk2/ibusimcontext.c
-index c2df3a87..a5e5e792 100644
---- a/client/gtk2/ibusimcontext.c
-+++ b/client/gtk2/ibusimcontext.c
-@@ -1945,7 +1945,9 @@ _ibus_context_forward_key_event_cb (IBusInputContext  *ibuscontext,
- #if GTK_CHECK_VERSION (3, 98, 4)
-     int group = 0;
-     g_return_if_fail (GTK_IS_IM_CONTEXT (ibusimcontext));
--    if (keycode == 0 && ibusimcontext->client_window) {
-+    if (keycode != 0) {
-+        keycode += 8; // to GTK keycode
-+    } else if (ibusimcontext->client_window) {
-         GdkDisplay *display =
-                 gtk_widget_get_display (ibusimcontext->client_window);
-         GdkKeymapKey *keys = NULL;
-@@ -1953,6 +1955,7 @@ _ibus_context_forward_key_event_cb (IBusInputContext  *ibuscontext,
-         if (gdk_display_map_keyval (display, keyval, &keys, &n_keys)) {
-             keycode = keys->keycode;
-             group = keys->group;
-+            g_free (keys);
-         } else {
-             g_warning ("Failed to parse keycode from keyval %x", keyval);
-         }
--- 
-2.33.1
-
-From a82bda58a45470c4be0f3db21eaddc73a230807f Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Fri, 18 Feb 2022 12:04:09 +0900
-Subject: [PATCH] src/tests: Fix typos
-
-- test_metas_in location
-- Check ibus processes in CI
-- Fix libexec path
----
- src/tests/Makefile.am                     | 8 ++++----
- src/tests/ibus-desktop-testing-autostart  | 2 ++
- src/tests/ibus-desktop-testing.desktop.in | 2 +-
- 3 files changed, 7 insertions(+), 5 deletions(-)
-
-diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am
-index 7d00f236..f932f18f 100644
---- a/src/tests/Makefile.am
-+++ b/src/tests/Makefile.am
-@@ -3,7 +3,7 @@
- # ibus - The Input Bus
- #
- # Copyright (c) 2007-2015 Peng Huang <shawn.p.huang@gmail.com>
--# Copyright (c) 2015-2021 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+# Copyright (c) 2015-2022 Takao Fujiwara <takao.fujiwara1@gmail.com>
- # Copyright (c) 2007-2018 Red Hat, Inc.
- #
- # This library is free software; you can redistribute it and/or
-@@ -117,11 +117,11 @@ org.freedesktop.IBus.Desktop.Testing.desktop: ibus-desktop-testing.desktop.in
- 	mv $@.tmp $@
- endif
- 
--$(test_metas): $(test_metas_in) $(test_programs)
-+$(test_metas): $(test_metas_in)
- 	f=`echo $@ | sed -e 's/\.test//'`; \
- 	TEST_EXEC=$(test_execsdir)/$$f; \
--	sed -e "s|@TEST_EXEC[@]|$$TEST_EXEC|g" $(test_metas_in) > $@.tmp; \
--	mv $@.tmp $@; \
-+	sed -e "s|@TEST_EXEC[@]|$$TEST_EXEC|g" $(srcdir)/$(test_metas_in) \
-+	    > $@.tmp && mv $@.tmp $@; \
- 	$(NULL)
- 
- ibus-compose-locales: ibus-compose-locales.in
-diff --git a/src/tests/ibus-desktop-testing-autostart b/src/tests/ibus-desktop-testing-autostart
-index da22b64e..1e1eb180 100755
---- a/src/tests/ibus-desktop-testing-autostart
-+++ b/src/tests/ibus-desktop-testing-autostart
-@@ -29,6 +29,8 @@ pwd
- pstree -asp $$
- gsettings list-recursively org.gnome.shell
- rpm -q gnome-shell-extension-no-overview gnome-shell gnome-session
-+ps -ef | grep ibus | grep -v grep
-+ibus address
- '
- 
- if [ $# -gt 0 ] ; then
-diff --git a/src/tests/ibus-desktop-testing.desktop.in b/src/tests/ibus-desktop-testing.desktop.in
-index fa0c9b40..1b815345 100644
---- a/src/tests/ibus-desktop-testing.desktop.in
-+++ b/src/tests/ibus-desktop-testing.desktop.in
-@@ -2,7 +2,7 @@
- Name=IBus Desktop Testing Runner
- GenericName=Input Method Desktop Testing Runner
- Comment=Test plugin for IBus Desktop Testing
--Exec=@ibexecdir@/ibus-desktop-testing-autostart /var/tmp/ibus-ci-autostart.log
-+Exec=@libexecdir@/ibus-desktop-testing-autostart /var/tmp/ibus-ci-autostart.log
- Terminal=false
- Type=Application
- Encoding=UTF-8
--- 
-2.33.1
-
-From 19377ad22d8145ea431e5de51f047061c98f8d21 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Tue, 1 Mar 2022 18:26:21 +0900
-Subject: [PATCH] src/ibuscompose: Check algorithm dead key by 9 length
-
-This change fixes the D-Bus timeout by a long compose preedit text.
-check_normalize_nfc() calculates the factorical of the compse preedit
-length and assigne the value to an INT variable and it could excceed
-the MAX_INT.
-Probably I think the length of the compose algorizhm dead key would be
-enough 9. I.e. 9! == 46320 <= SHRT_MAX == 32767
-
-BUG=https://github.com/ibus/ibus/issues/2385
----
- src/ibuscomposetable.c | 35 +++++++++++++++++++++++------------
- 1 file changed, 23 insertions(+), 12 deletions(-)
-
-diff --git a/src/ibuscomposetable.c b/src/ibuscomposetable.c
-index 250e0139..387a24a8 100644
---- a/src/ibuscomposetable.c
-+++ b/src/ibuscomposetable.c
-@@ -1,7 +1,7 @@
- /* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
- /* ibus - The Input Bus
-  * Copyright (C) 2013-2014 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright (C) 2013-2021 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2013-2022 Takao Fujiwara <takao.fujiwara1@gmail.com>
-  *
-  * This library is free software; you can redistribute it and/or
-  * modify it under the terms of the GNU Lesser General Public
-@@ -46,6 +46,7 @@
- #define IBUS_COMPOSE_TABLE_MAGIC "IBusComposeTable"
- #define IBUS_COMPOSE_TABLE_VERSION (4)
- #define X11_DATADIR X11_DATA_PREFIX "/share/X11/locale"
-+#define IBUS_MAX_COMPOSE_ALGORITHM_LEN 9
- 
- typedef struct {
-   gunichar     *sequence;
-@@ -1659,7 +1660,7 @@ ibus_compose_table_compact_check (const IBusComposeTableCompactEx
- static gboolean
- check_normalize_nfc (gunichar* combination_buffer, int n_compose)
- {
--    gunichar combination_buffer_temp[IBUS_MAX_COMPOSE_LEN];
-+    gunichar combination_buffer_temp[IBUS_MAX_COMPOSE_ALGORITHM_LEN + 1];
-     char *combination_utf8_temp = NULL;
-     char *nfc_temp = NULL;
-     int n_combinations;
-@@ -1682,7 +1683,7 @@ check_normalize_nfc (gunichar* combination_buffer, int n_compose)
- 
-     memcpy (combination_buffer_temp,
-             combination_buffer,
--            IBUS_MAX_COMPOSE_LEN * sizeof (gunichar) );
-+            IBUS_MAX_COMPOSE_ALGORITHM_LEN * sizeof (gunichar) );
- 
-     for (i = 0; i < n_combinations; i++ ) {
-         g_unicode_canonical_ordering (combination_buffer_temp, n_compose);
-@@ -1694,7 +1695,7 @@ check_normalize_nfc (gunichar* combination_buffer, int n_compose)
-         if (g_utf8_strlen (nfc_temp, -1) == 1) {
-             memcpy (combination_buffer,
-                     combination_buffer_temp,
--                    IBUS_MAX_COMPOSE_LEN * sizeof (gunichar) );
-+                    IBUS_MAX_COMPOSE_ALGORITHM_LEN * sizeof (gunichar) );
- 
-             g_free (combination_utf8_temp);
-             g_free (nfc_temp);
-@@ -1708,14 +1709,14 @@ check_normalize_nfc (gunichar* combination_buffer, int n_compose)
-         if (n_compose > 2) {
-             int j = i % (n_compose - 1) + 1;
-             int k = (i+1) % (n_compose - 1) + 1;
--            if (j >= IBUS_MAX_COMPOSE_LEN) {
--                g_warning ("j >= IBUS_MAX_COMPOSE_LEN for " \
--                           "combination_buffer_temp");
-+            if (j >= IBUS_MAX_COMPOSE_ALGORITHM_LEN) {
-+                g_warning ("j >= %d for combination_buffer_temp",
-+                           IBUS_MAX_COMPOSE_ALGORITHM_LEN);
-                 break;
-             }
--            if (k >= IBUS_MAX_COMPOSE_LEN) {
--                g_warning ("k >= IBUS_MAX_COMPOSE_LEN for " \
--                           "combination_buffer_temp");
-+            if (k >= IBUS_MAX_COMPOSE_ALGORITHM_LEN) {
-+                g_warning ("k >= %d for combination_buffer_temp",
-+                           IBUS_MAX_COMPOSE_ALGORITHM_LEN);
-                 break;
-             }
-             temp_swap = combination_buffer_temp[j];
-@@ -1737,13 +1738,23 @@ ibus_check_algorithmically (const guint16 *compose_buffer,
- 
- {
-     int i;
--    gunichar combination_buffer[IBUS_MAX_COMPOSE_LEN];
-+    gunichar combination_buffer[IBUS_MAX_COMPOSE_ALGORITHM_LEN + 1];
-     char *combination_utf8, *nfc;
- 
-     if (output_char)
-         *output_char = 0;
- 
--    if (n_compose >= IBUS_MAX_COMPOSE_LEN)
-+    /* Check the IBUS_MAX_COMPOSE_ALGORITHM_LEN length only here instead of
-+     * IBUS_MAX_COMPOSE_LEN length.
-+     * Because this API calls check_normalize_nfc() which calculates the factorial
-+     * of `n_compose` and assigns the value to `n_combinations`.
-+     * I.e. 9! == 40320 <= SHRT_MAX == 32767
-+     * The factorial of exceeding INT_MAX spends a long time in check_normalize_nfc()
-+     * and causes a D-Bus timeout between GTK clients and IBusEngineSimple.
-+     * Currenlty IBUS_MAX_COMPOSE_LEN is much larger and supports the long compose
-+     * sequence however the max 9 would be enough for this mechanical compose.
-+     */
-+    if (n_compose > IBUS_MAX_COMPOSE_ALGORITHM_LEN)
-         return FALSE;
- 
-     for (i = 0; i < n_compose && IS_DEAD_KEY (compose_buffer[i]); i++)
--- 
-2.34.1
-
-From df664b1f18a9c630ccd884f8ff698abf6cbb1578 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Tue, 1 Mar 2022 19:23:25 +0900
-Subject: [PATCH] src/ibusenginesimple: Support GTK4 coompose file
-
-Load $XDG_CONFIG_HOME/gtk-4.0/Compose
----
- src/ibusenginesimple.c | 27 +++++++++++++++------------
- 1 file changed, 15 insertions(+), 12 deletions(-)
-
-diff --git a/src/ibusenginesimple.c b/src/ibusenginesimple.c
-index a80e41a5..c57a3ea5 100644
---- a/src/ibusenginesimple.c
-+++ b/src/ibusenginesimple.c
-@@ -1448,8 +1448,16 @@ ibus_engine_simple_add_table_by_locale (IBusEngineSimple *simple,
-             g_free (path);
-             return retval;
-         }
--        g_free (path);
--        path = NULL;
-+        g_clear_pointer(&path, g_free);
-+
-+        path = g_build_filename (g_get_user_config_dir (),
-+                                 "gtk-4.0", "Compose", NULL);
-+        if (g_file_test (path, G_FILE_TEST_EXISTS)) {
-+            ibus_engine_simple_add_compose_file (simple, path);
-+            g_free (path);
-+            return retval;
-+        }
-+        g_clear_pointer(&path, g_free);
- 
-         path = g_build_filename (g_get_user_config_dir (),
-                                  "gtk-3.0", "Compose", NULL);
-@@ -1458,8 +1466,7 @@ ibus_engine_simple_add_table_by_locale (IBusEngineSimple *simple,
-             g_free (path);
-             return retval;
-         }
--        g_free (path);
--        path = NULL;
-+        g_clear_pointer(&path, g_free);
- 
-         home = g_get_home_dir ();
-         if (home == NULL)
-@@ -1471,8 +1478,7 @@ ibus_engine_simple_add_table_by_locale (IBusEngineSimple *simple,
-             g_free (path);
-             return retval;
-         }
--        g_free (path);
--        path = NULL;
-+        g_clear_pointer(&path, g_free);
- 
- #if GLIB_CHECK_VERSION (2, 58, 0)
-         langs = g_get_language_names_with_category ("LC_CTYPE");
-@@ -1508,8 +1514,7 @@ ibus_engine_simple_add_table_by_locale (IBusEngineSimple *simple,
- 
-             if (g_file_test (path, G_FILE_TEST_EXISTS))
-                 break;
--            g_free (path);
--            path = NULL;
-+            g_clear_pointer(&path, g_free);
-         }
- 
- #if !GLIB_CHECK_VERSION (2, 58, 0)
-@@ -1518,15 +1523,13 @@ ibus_engine_simple_add_table_by_locale (IBusEngineSimple *simple,
- 
-         if (path != NULL)
-             ibus_engine_simple_add_compose_file (simple, path);
--        g_free (path);
--        path = NULL;
-+        g_clear_pointer(&path, g_free);
-     } else {
-         path = g_build_filename (X11_DATADIR, locale, "Compose", NULL);
-         do {
-             if (g_file_test (path, G_FILE_TEST_EXISTS))
-                 break;
--            g_free (path);
--            path = NULL;
-+            g_clear_pointer(&path, g_free);
-         } while (0);
-         if (path == NULL)
-             return retval;
--- 
-2.34.1
-
-From 5ad3d8d5296cd337d3b41730406680eb9b250f8f Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Fri, 4 Mar 2022 20:50:08 +0900
-Subject: [PATCH] ui/gtk3: Use XDG_SESSION_DESKTOP for Plasma desktop
-
-If ibus-dameon is launched from systemd, XDG_CURRENT_DESKTOP
-environment variable could be set after ibus-dameon would be
-launched and XDG_CURRENT_DESKTOP could be "(null)".
-But XDG_SESSION_DESKTOP can be set with systemd's PAM.
----
- ui/gtk3/panel.vala | 19 +++++++++++++++++--
- 1 file changed, 17 insertions(+), 2 deletions(-)
-
-diff --git a/ui/gtk3/panel.vala b/ui/gtk3/panel.vala
-index ab2005d7..bfd6ef56 100644
---- a/ui/gtk3/panel.vala
-+++ b/ui/gtk3/panel.vala
-@@ -3,7 +3,7 @@
-  * ibus - The Input Bus
-  *
-  * Copyright(c) 2011-2014 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright(c) 2015-2020 Takao Fujwiara <takao.fujiwara1@gmail.com>
-+ * Copyright(c) 2015-2022 Takao Fujwiara <takao.fujiwara1@gmail.com>
-  *
-  * This library is free software; you can redistribute it and/or
-  * modify it under the terms of the GNU Lesser General Public
-@@ -260,8 +260,23 @@ class Panel : IBus.PanelService {
- 
- #if INDICATOR
-     private static bool is_kde() {
--        if (Environment.get_variable("XDG_CURRENT_DESKTOP") == "KDE")
-+        unowned string? desktop =
-+            Environment.get_variable("XDG_CURRENT_DESKTOP");
-+        if (desktop == "KDE")
-             return true;
-+        /* If ibus-dameon is launched from systemd, XDG_CURRENT_DESKTOP
-+         * environment variable could be set after ibus-dameon would be
-+         * launched and XDG_CURRENT_DESKTOP could be "(null)".
-+         * But XDG_SESSION_DESKTOP can be set with systemd's PAM.
-+         */
-+        if (desktop == null || desktop == "(null)")
-+            desktop = Environment.get_variable("XDG_SESSION_DESKTOP");
-+        if (desktop == "plasma")
-+            return true;
-+        if (desktop == null) {
-+            warning ("XDG_CURRENT_DESKTOP is not exported in your desktop " +
-+                     "session.");
-+        }
-         warning ("If you launch KDE5 on xterm, " +
-                  "export XDG_CURRENT_DESKTOP=KDE before launch KDE5.");
-         return false;
--- 
-2.34.1
-
-From faf9f0bbb6edf6ed71bba9dcb314493f6b0276ea Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Tue, 1 Mar 2022 19:44:17 +0900
-Subject: [PATCH] client/gtk2: Revert CCedilla change for pt-BR
-
-gtk_im_context_simple_add_table() is deprecated in GTK4.
-I decide to delete gtk_im_context_simple_add_table() here because
-the change 03c9e591430c62354bbf26ef7bd4a2e6acfb7c8f is no longer needed
-because IBusEngineSimple has implemented to load pt_br compose key
-by locale
-
-BUG=chromium-os:11421
-BUG=http://codereview.appspot.com/3989060
----
- client/gtk2/ibusimcontext.c | 33 +--------------------------------
- 1 file changed, 1 insertion(+), 32 deletions(-)
-
-diff --git a/client/gtk2/ibusimcontext.c b/client/gtk2/ibusimcontext.c
-index a5e5e792..e314ae98 100644
---- a/client/gtk2/ibusimcontext.c
-+++ b/client/gtk2/ibusimcontext.c
-@@ -2,7 +2,7 @@
- /* vim:set et sts=4: */
- /* ibus - The Input Bus
-  * Copyright (C) 2008-2013 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright (C) 2015-2021 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2015-2022 Takao Fujiwara <takao.fujiwara1@gmail.com>
-  * Copyright (C) 2008-2021 Red Hat, Inc.
-  *
-  * This library is free software; you can redistribute it and/or
-@@ -874,33 +874,6 @@ ibus_im_context_class_fini (IBusIMContextClass *class)
-     g_bus_unwatch_name (_daemon_name_watch_id);
- }
- 
--/* 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[] = {
--#ifdef DEPRECATED_GDK_KEYSYMS
--  GDK_dead_acute,	GDK_C,	0,	0,	0,	0x00C7,	/* LATIN_CAPITAL_LETTER_C_WITH_CEDILLA */
--  GDK_dead_acute,	GDK_c,	0,	0,	0,	0x00E7,	/* LATIN_SMALL_LETTER_C_WITH_CEDILLA */
--  GDK_Multi_key,	GDK_apostrophe,	GDK_C,  0,      0,      0x00C7, /* LATIN_CAPITAL_LETTER_C_WITH_CEDILLA */
--  GDK_Multi_key,	GDK_apostrophe,	GDK_c,  0,      0,      0x00E7, /* LATIN_SMALL_LETTER_C_WITH_CEDILLA */
--  GDK_Multi_key,	GDK_C,  GDK_apostrophe,	0,      0,      0x00C7, /* LATIN_CAPITAL_LETTER_C_WITH_CEDILLA */
--  GDK_Multi_key,	GDK_c,  GDK_apostrophe,	0,      0,      0x00E7, /* LATIN_SMALL_LETTER_C_WITH_CEDILLA */
--#else
--  GDK_KEY_dead_acute,	GDK_KEY_C,	0,	0,	0,	0x00C7,	/* LATIN_CAPITAL_LETTER_C_WITH_CEDILLA */
--  GDK_KEY_dead_acute,	GDK_KEY_c,	0,	0,	0,	0x00E7,	/* LATIN_SMALL_LETTER_C_WITH_CEDILLA */
--  GDK_KEY_Multi_key,	GDK_KEY_apostrophe,	GDK_KEY_C,  0,      0,      0x00C7, /* LATIN_CAPITAL_LETTER_C_WITH_CEDILLA */
--  GDK_KEY_Multi_key,	GDK_KEY_apostrophe,	GDK_KEY_c,  0,      0,      0x00E7, /* LATIN_SMALL_LETTER_C_WITH_CEDILLA */
--  GDK_KEY_Multi_key,	GDK_KEY_C,  GDK_KEY_apostrophe,	0,      0,      0x00C7, /* LATIN_CAPITAL_LETTER_C_WITH_CEDILLA */
--  GDK_KEY_Multi_key,	GDK_KEY_c,  GDK_KEY_apostrophe,	0,      0,      0x00E7, /* LATIN_SMALL_LETTER_C_WITH_CEDILLA */
--#endif
--};
--
- static void
- ibus_im_context_init (GObject *obj)
- {
-@@ -936,10 +909,6 @@ ibus_im_context_init (GObject *obj)
- 
-     // Create slave im context
-     ibusimcontext->slave = gtk_im_context_simple_new ();
--    gtk_im_context_simple_add_table (GTK_IM_CONTEXT_SIMPLE (ibusimcontext->slave),
--                                     cedilla_compose_seqs,
--                                     4,
--                                     G_N_ELEMENTS (cedilla_compose_seqs) / (4 + 2));
- 
-     g_signal_connect (ibusimcontext->slave,
-                       "commit",
--- 
-2.34.1
-

^ permalink raw reply related	[flat|nested] 8+ messages in thread
* [rpms/ibus] autotool: Delete upstreamed ibus-HEAD.patch
@ 2026-05-31  2:07 Takao Fujiwara
  0 siblings, 0 replies; 8+ messages in thread
From: Takao Fujiwara @ 2026-05-31  2:07 UTC (permalink / raw)
  To: git-commits

A new commit has been pushed.

Repo   : rpms/ibus
Branch : autotool
Commit : 1ddc1a0b4155a77a54415a88ed4895f96d3264d6
Author : Takao Fujiwara <tfujiwar@redhat.com>
Date   : 2020-09-29T21:08:31+09:00
Stats  : +0/-2658 in 1 file(s)
URL    : https://src.fedoraproject.org/rpms/ibus/c/1ddc1a0b4155a77a54415a88ed4895f96d3264d6?branch=autotool

Log:
Delete upstreamed ibus-HEAD.patch

---
diff --git a/ibus-HEAD.patch b/ibus-HEAD.patch
deleted file mode 100644
index a0f6e3a..0000000
--- a/ibus-HEAD.patch
+++ /dev/null
@@ -1,2658 +0,0 @@
-From 7b0d091839a4f1315ba216175fb2787e86f7fa31 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Tue, 3 Mar 2020 17:08:30 +0900
-Subject: [PATCH] src/tests: Delete graves in substitution in
- ibus-desktop-testing-runner
-
-Delete the single quotations to enclose grave chracters because
-DASH saves the single quoted '`id -u`' as the raw string in the command
-substitution not to be extracted.
-
-BUG=https://github.com/ibus/ibus/issues/2189
----
- src/tests/ibus-desktop-testing-runner.in | 7 ++++---
- 1 file changed, 4 insertions(+), 3 deletions(-)
-
-diff --git a/src/tests/ibus-desktop-testing-runner.in b/src/tests/ibus-desktop-testing-runner.in
-index 0d9a847c..f9238e69 100755
---- a/src/tests/ibus-desktop-testing-runner.in
-+++ b/src/tests/ibus-desktop-testing-runner.in
-@@ -4,7 +4,7 @@
- #
- # ibus - The Input Bus
- #
--# Copyright (c) 2018-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+# Copyright (c) 2018-2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
- # Copyright (c) 2018 Red Hat, Inc.
- #
- # This program is free software; you can redistribute it and/or modify
-@@ -31,7 +31,8 @@
- # POSIX sh has no 'echo -e'
- : ${ECHO:='/usr/bin/echo'}
- # POSIX sh has $UID
--: ${UID:='`id -u`'}
-+# DASH saves the graves in '``' as characters not to be extracted
-+: ${UID:=`id -u`}
- 
- 
- PROGNAME=`basename $0`
-@@ -170,7 +171,7 @@ _EOF
- run_dbus_daemon()
- {
-     # Use dbus-launch --exit-with-session later instead of --sh-syntax
--    export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$UID/bus
-+    export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$UID/bus"
- }
- 
- run_desktop()
--- 
-2.24.1
-
-From 8ce25208c3f4adfd290a032c6aa739d2b7580eb1 Mon Sep 17 00:00:00 2001
-From: Carlos Garnacho <carlosg@gnome.org>
-Date: Thu, 12 Mar 2020 16:02:16 +0900
-Subject: [PATCH] src: Use WAYLAND_DISPLAY on Wayland sessions to make up
- IBus socket name
-
-In Wayland sessions, GNOME Shell 3.36 is leveraging 2 X11 Display
-connections so one is used to set up all services for a "X11 session"
-before user applications connected to the other display might require it.
-This allows seamlessly starting Xwayland on demand to X11 user applications.
-
-IBus here belongs to the first described connection, it is started
-explicitly on that display by GNOME Shell as it is necessary to set up
-ibus-x11 before any other X11 client might want to use it.
-
-However the use of this "secondary" display results in IBus daemon left
-unable to talk to applications, as the socket name is dependent on the
-DISPLAY envvar and ibus/applications don't agree on its content.
-
-For wayland sessions, make it look for WAYLAND_DISPLAY, as that'll have
-the similar "per session bus" behavior that this seems to look after.
-
-BUG=https://gitlab.gnome.org/GNOME/gnome-shell/issues/2341
----
- src/ibusshare.c | 11 +++++++++--
- 1 file changed, 9 insertions(+), 2 deletions(-)
-
-diff --git a/src/ibusshare.c b/src/ibusshare.c
-index 0d50d3f5..e0ef2ce0 100644
---- a/src/ibusshare.c
-+++ b/src/ibusshare.c
-@@ -100,6 +100,7 @@ ibus_get_socket_path (void)
-         gchar *display;
-         gchar *displaynumber = "0";
-         /* gchar *screennumber = "0"; */
-+        gboolean is_wayland = FALSE;
-         gchar *p;
- 
-         path = g_strdup (g_getenv ("IBUS_ADDRESS_FILE"));
-@@ -108,13 +109,19 @@ ibus_get_socket_path (void)
-         }
- 
-         if (_display == NULL) {
--            display = g_strdup (g_getenv ("DISPLAY"));
-+            display = g_strdup (g_getenv ("WAYLAND_DISPLAY"));
-+            if (display)
-+                is_wayland = TRUE;
-+            else
-+                display = g_strdup (g_getenv ("DISPLAY"));
-         }
-         else {
-             display = g_strdup (_display);
-         }
- 
--        if (display) {
-+        if (is_wayland) {
-+            displaynumber = display;
-+        } else if (display) {
-             p = display;
-             hostname = display;
-             for (; *p != ':' && *p != '\0'; p++);
--- 
-2.24.1
-
-From 5765bfd69fb2ab1174378fbb0d8cac7f2bd2610f Mon Sep 17 00:00:00 2001
-From: Changwoo Ryu <cwryu@debian.org>
-Date: Wed, 15 Apr 2020 17:43:14 +0900
-Subject: [PATCH] client/gtk2: Remove glib_check_version() in gtk immodule
-
-In the gtk2/gtk3 immodule, glib_check_version() is being used to make sure
-that the installed glib version is not older than the glib version which ibus
-is built with.
-
-But there is no reason why glib version is checked in runtime. Library
-compatibility is already being checked more precisely by packaging systems and
-linkers.
-
-This version check can break the ibus gtk immodule when used with an older but
-compatible version of glib, such as glib 2.62.x which is compatible with
-2.64.x.
-
-BUG=https://github.com/ibus/ibus/issues/2200
----
- client/gtk2/ibusim.c | 4 +---
- 1 file changed, 1 insertion(+), 3 deletions(-)
-
-diff --git a/client/gtk2/ibusim.c b/client/gtk2/ibusim.c
-index bfacd0f0..d70800d3 100644
---- a/client/gtk2/ibusim.c
-+++ b/client/gtk2/ibusim.c
-@@ -41,9 +41,7 @@ static const GtkIMContextInfo *info_list[] = {
- G_MODULE_EXPORT const gchar*
- g_module_check_init (GModule *module)
- {
--    return glib_check_version (GLIB_MAJOR_VERSION,
--                               GLIB_MINOR_VERSION,
--                               0);
-+    return null;
- }
- 
- G_MODULE_EXPORT void
--- 
-2.24.1
-
-From 8da016764cee9616cca4658d1fb311d6b3bfc0df Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Wed, 15 Apr 2020 17:55:03 +0900
-Subject: [PATCH] src/tests: Fix to get focus events with su in
- ibus-desktop-testing-runner
-
-GtkWindow haven't received focus events in any test cases since Fedora 31
-whenever Ansible runs ibus-desktop-testing-runner after `su root`.
-Seems su command does not run systemd automatically and now systemd
-requires XDG_RUNTIME_DIR and Ansible requires root access with ssh.
-This fix requires to restart sshd with modified /etc/ssh/sshd_config
-with "PermitRootLogin yes" in order to run with su command.
-
-Ansible with ibus-desktop-testin-runner has worked fine if root console
-login is used without this patch because PAM runs systemd by login.
----
- src/tests/ibus-desktop-testing-runner.in | 36 ++++++++++++++++++++++--
- 1 file changed, 33 insertions(+), 3 deletions(-)
-
-diff --git a/src/tests/ibus-desktop-testing-runner.in b/src/tests/ibus-desktop-testing-runner.in
-index f9238e69..f760fd5b 100755
---- a/src/tests/ibus-desktop-testing-runner.in
-+++ b/src/tests/ibus-desktop-testing-runner.in
-@@ -49,6 +49,7 @@ PID_XORG=0
- PID_GNOME_SESSION=0
- TESTING_RUNNER="default"
- TESTS=""
-+TIMEOUT=300
- GREEN='\033[0;32m'
- RED='\033[0;31m'
- NC='\033[0m'
-@@ -84,6 +85,7 @@ usage()
- "-r, --runner=RUNNER              Run TESTS programs with a test RUNNER.\n"    \
- "                                 RUNNDER = gnome or default.\n"               \
- "                                 default is an embedded runner.\n"            \
-+"-T, --timeout=TIMEOUT            Set timeout (default TIMEOUT is 300 sec).\n" \
- "-o, --output=OUTPUT_FILE         OUtput the log to OUTPUT_FILE\n"             \
- "-O, --result=RESULT_FILE         OUtput the result to RESULT_FILE\n"          \
- ""
-@@ -92,8 +94,8 @@ usage()
- parse_args()
- {
-     # This is GNU getopt. "sudo port getopt" in BSD?
--    ARGS=`getopt -o hvb:s:cd:t:r:o:O: --long \
--          help,version,builddir:,srcdir:,no-graphics,desktop:,tests:,runner:,output:,result:\
-+    ARGS=`getopt -o hvb:s:cd:t:r:T:o:O: --long \
-+          help,version,builddir:,srcdir:,no-graphics,desktop:,tests:,runner:,timeout:,output:,result:\
-         -- "$@"`;
-     eval set -- "$ARGS"
-     while [ 1 ] ; do
-@@ -106,6 +108,7 @@ parse_args()
-         -d | --desktop )     DESKTOP_COMMAND="$2"; shift 2;;
-         -t | --tests )       TESTS="$2"; shift 2;;
-         -r | --runner )      TESTING_RUNNER="$2"; shift 2;;
-+        -T | --timeout )     TIMEOUT="$2"; shift 2;;
-         -o | --output )      TEST_LOG="$2"; shift 2;;
-         -O | --result )      RESULT_LOG="$2"; shift 2;;
-         -- )                 shift; break;;
-@@ -166,11 +169,37 @@ _EOF
-     fi
-     # `su` command does not run loginctl
-     export XDG_SESSION_TYPE='x11'
-+    export XDG_SESSION_CLASS=user
-+    # `su` command does not get focus in events without this variable.
-+    # Need to restart sshd after set "PermitRootLogin yes" in sshd_config
-+    if [ "x$XDG_RUNTIME_DIR" = x ] ; then
-+        export XDG_RUNTIME_DIR=/run/user/$UID
-+        is_root_login=`grep "^PermitRootLogin" /etc/ssh/sshd_config | grep yes`
-+        if [ "x$ANSIBLE" != x ] && [ "x$is_root_login" = x ] ; then
-+            print_log -e "${RED}FAIL${NC}: No permission to get focus-in events in GtkWindow with ansible"
-+            echo "su command does not configure necessary login info "         \
-+                 "with systemd and GtkWindow cannot receive focus-events "     \
-+                 "when ibus-desktop-testing-runner is executed by "            \
-+                 "ansible-playbook." >> $TEST_LOG
-+            echo "Enabling root login via sshd, restarting sshd, set "         \
-+                 "XDG_RUNTIME_DIR can resolve the problem under "              \
-+                 "ansible-playbook." >> $TEST_LOG
-+            exit 255
-+        fi
-+    fi
-+    #  Do we need XDG_SESSION_ID and XDG_SEAT?
-+    #export XDG_CONFIG_DIRS=/etc/xdg
-+    #export XDG_SESSION_ID=10
-+    #export XDG_SESSION_DESKTOP=gnome
-+    #export XDG_SEAT=seat0
- }
- 
- run_dbus_daemon()
- {
-     # Use dbus-launch --exit-with-session later instead of --sh-syntax
-+    # GNOME uses a unix:abstract address and it effects gsettings set values
-+    # in each test case.
-+    # TODO: Should we comment out this line?
-     export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$UID/bus"
- }
- 
-@@ -288,7 +317,8 @@ run_gnome_desktop_testing_runner()
-             fail=1
-             continue
-         fi
--        gnome-desktop-testing-runner $tst 2>>$TEST_LOG 1>>$TEST_LOG
-+        gnome-desktop-testing-runner --timeout=$TIMEOUT $tst \
-+                2>>$TEST_LOG 1>>$TEST_LOG
-         retval=$?
-         read pass fail << EOF
-         `count_case_result $retval $pass $fail`
--- 
-2.24.1
-
-From 0b9d9365988a96a2bc31c48624f9c2b8081601b6 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Wed, 22 Apr 2020 20:17:12 +0900
-Subject: [PATCH] client/gtk2: Fix typo
-
----
- client/gtk2/ibusim.c                     | 4 ++--
- src/tests/ibus-desktop-testing-runner.in | 2 +-
- 2 files changed, 3 insertions(+), 3 deletions(-)
-
-diff --git a/client/gtk2/ibusim.c b/client/gtk2/ibusim.c
-index d70800d3..55609ce7 100644
---- a/client/gtk2/ibusim.c
-+++ b/client/gtk2/ibusim.c
-@@ -2,7 +2,7 @@
- /* vim:set et ts=4: */
- /* ibus - The Input Bus
-  * Copyright (C) 2008-2010 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright (C) 2008-2010 Red Hat, Inc.
-+ * Copyright (C) 2008-2020 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
-@@ -41,7 +41,7 @@ static const GtkIMContextInfo *info_list[] = {
- G_MODULE_EXPORT const gchar*
- g_module_check_init (GModule *module)
- {
--    return null;
-+    return NULL;
- }
- 
- G_MODULE_EXPORT void
-diff --git a/src/tests/ibus-desktop-testing-runner.in b/src/tests/ibus-desktop-testing-runner.in
-index f760fd5b..4232c549 100755
---- a/src/tests/ibus-desktop-testing-runner.in
-+++ b/src/tests/ibus-desktop-testing-runner.in
-@@ -173,7 +173,7 @@ _EOF
-     # `su` command does not get focus in events without this variable.
-     # Need to restart sshd after set "PermitRootLogin yes" in sshd_config
-     if [ "x$XDG_RUNTIME_DIR" = x ] ; then
--        export XDG_RUNTIME_DIR=/run/user/$UID
-+        export XDG_RUNTIME_DIR="/run/user/$UID"
-         is_root_login=`grep "^PermitRootLogin" /etc/ssh/sshd_config | grep yes`
-         if [ "x$ANSIBLE" != x ] && [ "x$is_root_login" = x ] ; then
-             print_log -e "${RED}FAIL${NC}: No permission to get focus-in events in GtkWindow with ansible"
--- 
-2.24.1
-
-From 8c4125bc78ce3502b5aeb053e7029cc2594f83f2 Mon Sep 17 00:00:00 2001
-From: Changwoo Ryu <cwryu@debian.org>
-Date: Sun, 12 Apr 2020 05:28:15 +0900
-Subject: [PATCH] src: Build the Emoji dictionaries in parallel
-
-Instead of building Emoji dictionaries src/dicts/emoji-*.dict in sequence, a
-pattern rule is specified for them. The make -jN option builds the
-dictionaries in parallel.
-
-The GNU make extensions like pattern rule and patsubst function are used for
-it. But src/Makefile.am has had other GNU make extensions for a while, so
-using more extensions should not make portability worse.
-
-BUG=https://github.com/ibus/ibus/pull/2209
----
- src/Makefile.am | 55 ++++++++++++++++++++++++-------------------------
- 1 file changed, 27 insertions(+), 28 deletions(-)
-
-diff --git a/src/Makefile.am b/src/Makefile.am
-index a8e3d07d..99de1ab7 100644
---- a/src/Makefile.am
-+++ b/src/Makefile.am
-@@ -246,42 +246,41 @@ if ENABLE_EMOJI_DICT
- AM_CPPFLAGS += -DENABLE_EMOJI_DICT
- 
- dictdir = $(pkgdatadir)/dicts
--dict_DATA = dicts/emoji-en.dict
- LANG_FILES = $(basename $(notdir $(wildcard $(EMOJI_ANNOTATION_DIR)/*.xml)))
-+EMOJI_DICT_FILES = $(patsubst %,dicts/emoji-%.dict,$(LANG_FILES))
-+dict_DATA = $(EMOJI_DICT_FILES)
- 
- noinst_PROGRAMS += emoji-parser
- 
--dicts/emoji-en.dict: emoji-parser
-+dicts/emoji-%.dict: emoji-parser
- 	$(AM_V_at)if test x"$(LANG_FILES)" = x ; then \
- 	    echo "WARNING: Not found $(EMOJI_ANNOTATION_DIR)/en.xml" 1>&2; \
- 	fi; \
--	for f in $(LANG_FILES) ; do \
--	    if test -f dicts/emoji-$$f.dict; then \
--	        echo "Already exists dicts/emoji-$$f.dict"; \
--	        continue; \
--	    fi; \
--	    if test -f \
--	    "$(EMOJI_ANNOTATION_DIR)/../annotationsDerived/$$f.xml" ; then \
--	        xml_derived_option="--xml-derived $(EMOJI_ANNOTATION_DIR)/../annotationsDerived/$$f.xml"; \
-+	if test -f $@; then \
-+	    echo "Already exists $@"; \
-+	    exit 0; \
-+	fi; \
-+	if test -f \
-+	    "$(EMOJI_ANNOTATION_DIR)/../annotationsDerived/$*.xml" ; then \
-+	        xml_derived_option="--xml-derived $(EMOJI_ANNOTATION_DIR)/../annotationsDerived/$*.xml"; \
- 	        plus_comment="derived"; \
--	    fi; \
--	    if test x"$$f" = xen ; then \
--	        $(builddir)/emoji-parser \
--	            --unicode-emoji-dir $(UNICODE_EMOJI_DIR) \
--	            --xml $(EMOJI_ANNOTATION_DIR)/$$f.xml \
--	            $$xml_derived_option \
--	            --xml-ascii $(top_srcdir)/data/annotations/en_ascii.xml \
--	            --out-category ibusemojigen.h \
--	            --out $@; \
--	    else \
--	        $(builddir)/emoji-parser \
--	            --unicode-emoji-dir $(UNICODE_EMOJI_DIR) \
--	            --xml $(EMOJI_ANNOTATION_DIR)/$$f.xml \
--	            $$xml_derived_option \
--	            --out dicts/emoji-$$f.dict; \
--	    fi; \
--	    echo "Generated $$plus_comment dicts/emoji-$$f.dict"; \
--	done
-+	fi; \
-+	if test x"$*" = xen ; then \
-+	    $(builddir)/emoji-parser \
-+	        --unicode-emoji-dir $(UNICODE_EMOJI_DIR) \
-+	        --xml $(EMOJI_ANNOTATION_DIR)/$*.xml \
-+	        $$xml_derived_option \
-+	        --xml-ascii $(top_srcdir)/data/annotations/en_ascii.xml \
-+	        --out-category ibusemojigen.h \
-+	        --out $@; \
-+	else \
-+	    $(builddir)/emoji-parser \
-+	        --unicode-emoji-dir $(UNICODE_EMOJI_DIR) \
-+	        --xml $(EMOJI_ANNOTATION_DIR)/$*.xml \
-+	        $$xml_derived_option \
-+	        --out $@; \
-+	fi; \
-+	echo "Generated $$plus_comment $@"
- 
- ibusemojigen.h: dicts/emoji-en.dict
- 	$(NULL)
--- 
-2.23.0.rc1
-
-From 02105c4d486283e6b561181d9c934d4d23f2d65e Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Thu, 14 May 2020 15:48:34 +0900
-Subject: [PATCH] bus: Fix SEGV in bus_panel_proxy_focus_in()
-
-SEGV in BUS_IS_PANEL_PROXY() in bus_panel_proxy_focus_in()
-Check if GDBusConnect is closed before bus_panel_proxy_new() is called.
-
-BUG=rhbz#1349148
-BUG=rhbz#1385349
----
- bus/ibusimpl.c | 25 ++++++++++++++++++++-----
- 1 file changed, 20 insertions(+), 5 deletions(-)
-
-diff --git a/bus/ibusimpl.c b/bus/ibusimpl.c
-index 85761d30..e432e849 100644
---- a/bus/ibusimpl.c
-+++ b/bus/ibusimpl.c
-@@ -2,8 +2,8 @@
- /* vim:set et sts=4: */
- /* ibus - The Input Bus
-  * Copyright (C) 2008-2013 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright (C) 2011-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
-- * Copyright (C) 2008-2019 Red Hat, Inc.
-+ * Copyright (C) 2011-2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2008-2020 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
-@@ -464,13 +464,16 @@ _dbus_name_owner_changed_cb (BusDBusImpl   *dbus,
-     else if (!g_strcmp0 (name, IBUS_SERVICE_PANEL_EXTENSION_EMOJI))
-         panel_type = PANEL_TYPE_EXTENSION_EMOJI;
- 
--    if (panel_type != PANEL_TYPE_NONE) {
-+    do {
-+        if (panel_type == PANEL_TYPE_NONE)
-+            break;
-         if (g_strcmp0 (new_name, "") != 0) {
-             /* a Panel process is started. */
-             BusConnection *connection;
-             BusInputContext *context = NULL;
-             BusPanelProxy   **panel = (panel_type == PANEL_TYPE_PANEL) ?
-                                       &ibus->panel : &ibus->emoji_extension;
-+            GDBusConnection *dbus_connection = NULL;
- 
-             if (*panel != NULL) {
-                 ibus_proxy_destroy ((IBusProxy *)(*panel));
-@@ -479,9 +482,21 @@ _dbus_name_owner_changed_cb (BusDBusImpl   *dbus,
-                 g_assert (*panel == NULL);
-             }
- 
--            connection = bus_dbus_impl_get_connection_by_name (BUS_DEFAULT_DBUS, new_name);
-+            connection = bus_dbus_impl_get_connection_by_name (BUS_DEFAULT_DBUS,
-+                                                               new_name);
-             g_return_if_fail (connection != NULL);
- 
-+            dbus_connection = bus_connection_get_dbus_connection (connection);
-+            /* rhbz#1349148 rhbz#1385349
-+             * Avoid SEGV of BUS_IS_PANEL_PROXY (ibus->panel)
-+             * This function is called during destroying the connection
-+             * in this case? */
-+            if (dbus_connection == NULL ||
-+                g_dbus_connection_is_closed (dbus_connection)) {
-+                new_name = "";
-+                break;
-+            }
-+
-             *panel = bus_panel_proxy_new (connection, panel_type);
-             if (panel_type == PANEL_TYPE_EXTENSION_EMOJI)
-                 ibus->enable_emoji_extension = FALSE;
-@@ -535,7 +550,7 @@ _dbus_name_owner_changed_cb (BusDBusImpl   *dbus,
-                 }
-             }
-         }
--    }
-+    } while (0);
- 
-     bus_ibus_impl_component_name_owner_changed (ibus, name, old_name, new_name);
- }
--- 
-2.24.1
-
-From f591381e3c892947ecaffe9131b9039ab9014498 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Thu, 14 May 2020 16:02:00 +0900
-Subject: [PATCH] bus: Fix SEGV in bus_dbus_impl_name_owner_changed()
-
-rhbz#1406699 SEGV in new_owner!=NULL in bus_dbus_impl_name_owner_changed()
-which is called by bus_name_service_remove_owner()
-If bus_connection_get_unique_name()==NULL, set new_owner="" in
-bus_name_service_remove_owner()
-
-rhbz#1432252 SEGV in old_owner!=NULL in bus_dbus_impl_name_owner_changed()
-which is called by bus_name_service_set_primary_owner()
-If bus_connection_get_unique_name()==NULL, set old_owner="" in
-bus_name_service_set_primary_owner()
-
-BUG=rhbz#1406699
-BUG=rhbz#1432252
----
- bus/dbusimpl.c | 27 +++++++++++++++++++++++----
- 1 file changed, 23 insertions(+), 4 deletions(-)
-
-diff --git a/bus/dbusimpl.c b/bus/dbusimpl.c
-index b54ef817..59787a80 100644
---- a/bus/dbusimpl.c
-+++ b/bus/dbusimpl.c
-@@ -2,7 +2,8 @@
- /* vim:set et sts=4: */
- /* ibus - The Input Bus
-  * Copyright (C) 2008-2013 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright (C) 2008-2013 Red Hat, Inc.
-+ * Copyright (C) 2015-2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2008-2020 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
-@@ -344,6 +345,8 @@ bus_name_service_set_primary_owner (BusNameService     *service,
-                                     BusConnectionOwner *owner,
-                                     BusDBusImpl        *dbus)
- {
-+    gboolean has_old_owner = FALSE;
-+
-     g_assert (service != NULL);
-     g_assert (owner != NULL);
-     g_assert (dbus != NULL);
-@@ -351,6 +354,13 @@ bus_name_service_set_primary_owner (BusNameService     *service,
-     BusConnectionOwner *old = service->owners != NULL ?
-             (BusConnectionOwner *)service->owners->data : NULL;
- 
-+    /* rhbz#1432252 If bus_connection_get_unique_name() == NULL,
-+     * "Hello" method is not received yet.
-+     */
-+    if (old != NULL && bus_connection_get_unique_name (old->conn) != NULL) {
-+        has_old_owner = TRUE;
-+    }
-+
-     if (old != NULL) {
-         g_signal_emit (dbus,
-                        dbus_signals[NAME_LOST],
-@@ -370,7 +380,8 @@ bus_name_service_set_primary_owner (BusNameService     *service,
-                    0,
-                    owner->conn,
-                    service->name,
--                   old != NULL ? bus_connection_get_unique_name (old->conn) : "",
-+                   has_old_owner ? bus_connection_get_unique_name (old->conn) :
-+                           "",
-                    bus_connection_get_unique_name (owner->conn));
- 
-     if (old != NULL && old->do_not_queue != 0) {
-@@ -427,6 +438,7 @@ bus_name_service_remove_owner (BusNameService     *service,
-                                BusDBusImpl        *dbus)
- {
-     GSList *owners;
-+    gboolean has_new_owner = FALSE;
- 
-     g_assert (service != NULL);
-     g_assert (owner != NULL);
-@@ -439,6 +451,13 @@ bus_name_service_remove_owner (BusNameService     *service,
-         BusConnectionOwner *_new = NULL;
-         if (owners->next != NULL) {
-             _new = (BusConnectionOwner *)owners->next->data;
-+            /* rhbz#1406699 If bus_connection_get_unique_name() == NULL,
-+             * "Hello" method is not received yet.
-+             */
-+            if (_new != NULL &&
-+                bus_connection_get_unique_name (_new->conn) != NULL) {
-+                has_new_owner = TRUE;
-+            }
-         }
- 
-         if (dbus != NULL) {
-@@ -447,7 +466,7 @@ bus_name_service_remove_owner (BusNameService     *service,
-                            0,
-                            owner->conn,
-                            service->name);
--            if (_new != NULL) {
-+            if (has_new_owner) {
-                 g_signal_emit (dbus,
-                                dbus_signals[NAME_ACQUIRED],
-                                0,
-@@ -460,7 +479,7 @@ bus_name_service_remove_owner (BusNameService     *service,
-                     _new != NULL ? _new->conn : NULL,
-                     service->name,
-                     bus_connection_get_unique_name (owner->conn),
--                    _new != NULL ? bus_connection_get_unique_name (_new->conn) : "");
-+                    has_new_owner ? bus_connection_get_unique_name (_new->conn) : "");
- 
-         }
-     }
--- 
-2.24.1
-
-From 0da3cece88c8b94c0721aa7aca4f2d427aa22069 Mon Sep 17 00:00:00 2001
-From: Neil Shepperd <nshepperd@gmail.com>
-Date: Wed, 22 Jul 2020 15:31:29 +0900
-Subject: [PATCH 1/9] src: Skip parsing of compose sequence with invalid
- keysyms
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Instead of continuing with the keysym defaulted to <Delete>, print a
-warning and skip the broken XCompose rule entirely. Fixes a bug where
-an ~/.XCompose file with a error breaks the delete key.
-
-Tested locally with the example from launchpad bug below:
-
-	   <\> <)> : "☭" # HAMMER AND SICKLE
-
-This is incorrect syntax as neither <\> nor <)> are correct keysym
-names. Before this patch, ibus-daemon -v prints a warning, but
-pressing delete twice produces ☭ instead of its normal function. After
-this patch, ibus-daemon -v prints a slightly better warning, and the
-delete key is unaffected.
-
-BUG=https://github.com/ibus/ibus/issues/2130
-BUG=https://bugs.launchpad.net/ubuntu/+source/ibus/+bug/1849399
----
- src/ibuscomposetable.c | 8 ++++++--
- 1 file changed, 6 insertions(+), 2 deletions(-)
-
-diff --git a/src/ibuscomposetable.c b/src/ibuscomposetable.c
-index 3f439134..c50be2b3 100644
---- a/src/ibuscomposetable.c
-+++ b/src/ibuscomposetable.c
-@@ -216,8 +216,12 @@ parse_compose_sequence (IBusComposeData *compose_data,
-             compose_data->sequence[n] = codepoint;
-         }
- 
--        if (codepoint == IBUS_KEY_VoidSymbol)
--            g_warning ("Could not get code point of keysym %s", match);
-+        if (codepoint == IBUS_KEY_VoidSymbol) {
-+            g_warning ("Could not get code point of keysym %s: %s",
-+                       match, line);
-+            g_free (match);
-+            goto fail;
-+        }
-         g_free (match);
-         n++;
-     }
--- 
-2.24.1
-
-From 0ad5e9a6b6611b53c63e635e89b42e30e43ac701 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Wed, 5 Aug 2020 19:50:02 +0900
-Subject: [PATCH 2/9] setup: Delete autostart setting
-
-BUG=https://github.com/ibus/ibus/pull/2224
----
- setup/main.py  | 38 --------------------------------
- setup/setup.ui | 59 --------------------------------------------------
- 2 files changed, 97 deletions(-)
-
-diff --git a/setup/main.py b/setup/main.py
-index f6adb098..d5e2078c 100644
---- a/setup/main.py
-+++ b/setup/main.py
-@@ -398,13 +398,6 @@ class Setup(object):
-         self.__button_close = self.__builder.get_object("button_close")
-         self.__button_close.connect("clicked", Gtk.main_quit)
- 
--        # auto start ibus
--        self.__checkbutton_auto_start = self.__builder.get_object(
--                "checkbutton_auto_start")
--        self.__checkbutton_auto_start.set_active(self.__is_auto_start())
--        self.__checkbutton_auto_start.connect("toggled",
--                self.__checkbutton_auto_start_toggled_cb)
--
-         self.__init_hotkeys()
-         self.__init_panel()
-         self.__init_general()
-@@ -647,37 +640,6 @@ class Setup(object):
-         # set new value
-         model.set(iter, COLUMN_PRELOAD, data[DATA_PRELOAD])
- 
--    def __is_auto_start(self):
--        link_file = path.join(GLib.get_user_config_dir(),
--                              "autostart/ibus.desktop")
--        ibus_desktop = path.join(os.getenv("IBUS_PREFIX"),
--                                 "share/applications/ibus.desktop")
--
--        if not path.exists(link_file):
--            return False
--        if not path.islink(link_file):
--            return False
--        if path.realpath(link_file) != ibus_desktop:
--            return False
--        return True
--
--    def __checkbutton_auto_start_toggled_cb(self, button):
--        auto_start_dir = path.join(GLib.get_user_config_dir(), "autostart")
--        if not path.isdir(auto_start_dir):
--            os.makedirs(auto_start_dir)
--
--        link_file = path.join(GLib.get_user_config_dir(),
--                              "autostart/ibus.desktop")
--        ibus_desktop = path.join(os.getenv("IBUS_PREFIX"),
--                                 "share/applications/ibus.desktop")
--        # unlink file
--        try:
--            os.unlink(link_file)
--        except:
--            pass
--        if self.__checkbutton_auto_start.get_active():
--            os.symlink(ibus_desktop, link_file)
--
-     def __sigusr1_cb(self, *args):
-         self.__window.present()
- 
-diff --git a/setup/setup.ui b/setup/setup.ui
-index 56453054..250f43a0 100644
---- a/setup/setup.ui
-+++ b/setup/setup.ui
-@@ -1307,65 +1307,6 @@
-                 <property name="orientation">vertical</property>
-                 <property name="can_focus">False</property>
-                 <property name="no_show_all">True</property>
--                <child>
--                  <placeholder/>
--                </child>
--                <child>
--                  <object class="GtkLabel" id="label5">
--                    <property name="visible">True</property>
--                    <property name="can_focus">False</property>
--                    <property name="label" translatable="yes">&lt;big&gt;&lt;b&gt;IBus&lt;/b&gt;&lt;/big&gt;
--&lt;small&gt;The intelligent input bus&lt;/small&gt;
--Homepage: https://github.com/ibus/ibus/wiki
--
--
--
--</property>
--                    <property name="use_markup">True</property>
--                    <property name="justify">center</property>
--                  </object>
--                  <packing>
--                    <property name="expand">True</property>
--                    <property name="fill">True</property>
--                    <property name="position">1</property>
--                  </packing>
--                </child>
--                <child>
--                  <object class="GtkFrame" id="frame1">
--                    <property name="can_focus">False</property>
--                    <property name="no_show_all">True</property>
--                    <property name="label_xalign">0</property>
--                    <property name="shadow_type">none</property>
--                    <child>
--                      <object class="GtkCheckButton" id="checkbutton_auto_start">
--                        <property name="label" translatable="yes">Start ibus on login</property>
--                        <property name="use_action_appearance">False</property>
--                        <property name="visible">True</property>
--                        <property name="can_focus">True</property>
--                        <property name="receives_default">False</property>
--                        <property name="use_action_appearance">False</property>
--                        <property name="use_underline">True</property>
--                        <property name="halign">start</property>
--                        <property name="draw_indicator">True</property>
--                        <property name="margin_top">6</property>
--                        <property name="margin_start">12</property>
--                      </object>
--                    </child>
--                    <child type="label">
--                      <object class="GtkLabel" id="label4">
--                        <property name="visible">True</property>
--                        <property name="can_focus">False</property>
--                        <property name="label" translatable="yes">&lt;b&gt;Startup&lt;/b&gt;</property>
--                        <property name="use_markup">True</property>
--                      </object>
--                    </child>
--                  </object>
--                  <packing>
--                    <property name="expand">False</property>
--                    <property name="fill">False</property>
--                    <property name="position">2</property>
--                  </packing>
--                </child>
-               </object>
-               <packing>
-                 <property name="position">4</property>
--- 
-2.24.1
-
-From 3f098dc51a718f3bd427873607dcd47865523dce Mon Sep 17 00:00:00 2001
-From: Aaron Muir Hamilton <aaron@correspondwith.me>
-Date: Tue, 18 Aug 2020 13:45:32 +0900
-Subject: [PATCH 3/9] ui/gtk3: Tell Pango about the engine language in the
- candidate panel
-
-This helps Pango select the correct font variants for the engine
-language, which is especially important between languages based on han
-characters which have wildly different forms of the same character.
-
-BUG=https://github.com/ibus/ibus/issues/2238
----
- ui/gtk3/candidatearea.vala  | 7 +++++++
- ui/gtk3/candidatepanel.vala | 9 +++++++++
- ui/gtk3/panel.vala          | 2 ++
- 3 files changed, 18 insertions(+)
-
-diff --git a/ui/gtk3/candidatearea.vala b/ui/gtk3/candidatearea.vala
-index b22ab5da..0ab41217 100644
---- a/ui/gtk3/candidatearea.vala
-+++ b/ui/gtk3/candidatearea.vala
-@@ -32,6 +32,8 @@ class CandidateArea : Gtk.Box {
-     private bool m_show_cursor;
-     private ThemedRGBA m_rgba;
- 
-+    private Pango.Attribute m_language_attribute;
-+
-     private const string LABELS[] = {
-         "1.", "2.", "3.", "4.", "5.", "6.", "7.", "8.",
-         "9.", "0.", "a.", "b.", "c.", "d.", "e.", "f."
-@@ -102,6 +104,10 @@ class CandidateArea : Gtk.Box {
-             m_labels[i].set_text(LABELS[i]);
-     }
- 
-+    public void set_language(Pango.Attribute language_attribute) {
-+        m_language_attribute = language_attribute.copy();
-+    }
-+
-     public void set_candidates(IBus.Text[] candidates,
-                                uint focus_candidate = 0,
-                                bool show_cursor = true) {
-@@ -115,6 +121,7 @@ class CandidateArea : Gtk.Box {
-             bool visible = false;
-             if (i < candidates.length) {
-                 Pango.AttrList attrs = get_pango_attr_list_from_ibus_text(candidates[i]);
-+                attrs.change(m_language_attribute.copy());
-                 if (i == focus_candidate && show_cursor) {
-                     Pango.Attribute pango_attr = Pango.attr_foreground_new(
-                             (uint16)(m_rgba.selected_fg.red * uint16.MAX),
-diff --git a/ui/gtk3/candidatepanel.vala b/ui/gtk3/candidatepanel.vala
-index 8994cdb9..57544df3 100644
---- a/ui/gtk3/candidatepanel.vala
-+++ b/ui/gtk3/candidatepanel.vala
-@@ -34,6 +34,8 @@ public class CandidatePanel : Gtk.Box{
- 
-     private Gdk.Rectangle m_cursor_location;
- 
-+    private Pango.Attribute m_language_attribute;
-+
-     public signal void cursor_up();
-     public signal void cursor_down();
-     public signal void page_up();
-@@ -112,8 +114,14 @@ public class CandidatePanel : Gtk.Box{
-         m_candidate_area.set_labels(labels);
-     }
- 
-+    public void set_language(Pango.Attribute language_attribute) {
-+        m_candidate_area.set_language(language_attribute);
-+        m_language_attribute = language_attribute.copy();
-+    }
-+
-     private void set_attributes(Gtk.Label label, IBus.Text text) {
-         Pango.AttrList attrs = get_pango_attr_list_from_ibus_text(text);
-+        attrs.change(m_language_attribute.copy());
- 
-         Gtk.StyleContext context = label.get_style_context();
-         Gdk.RGBA color;
-@@ -154,6 +162,7 @@ public class CandidatePanel : Gtk.Box{
-         if (text != null) {
-             m_aux_label.set_text(text.get_text());
-             Pango.AttrList attrs = get_pango_attr_list_from_ibus_text(text);
-+            attrs.change(m_language_attribute.copy());
-             m_aux_label.set_attributes(attrs);
-             m_aux_label.show();
-         } else {
-diff --git a/ui/gtk3/panel.vala b/ui/gtk3/panel.vala
-index 680c86ed..8d9f5cc0 100644
---- a/ui/gtk3/panel.vala
-+++ b/ui/gtk3/panel.vala
-@@ -822,6 +822,8 @@ class Panel : IBus.PanelService {
-         if (!m_use_system_keyboard_layout)
-             m_xkblayout.set_layout(engine);
- 
-+        m_candidate_panel.set_language(new Pango.AttrLanguage(Pango.Language.from_string(engine.get_language())));
-+
-         engine_contexts_insert(engine);
-     }
- 
--- 
-2.24.1
-
-From 79a09f1e75357a9f1b38e80717a59c19cca1645e Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Tue, 18 Aug 2020 13:45:38 +0900
-Subject: [PATCH 4/9] setup: Add use-glyph-from-engine-lang
-
-The setting can revert the previous setting to choose glpyhs
-with the current locale on lookup window instead of the engine's language.
-
-BUG=https://github.com/ibus/ibus/issues/2238
----
- data/dconf/org.freedesktop.ibus.gschema.xml |  9 ++++
- setup/main.py                               |  7 +++
- setup/setup.ui                              | 49 +++++++++++++++++++++
- ui/gtk3/panel.vala                          | 26 ++++++++++-
- 4 files changed, 89 insertions(+), 2 deletions(-)
-
-diff --git a/data/dconf/org.freedesktop.ibus.gschema.xml b/data/dconf/org.freedesktop.ibus.gschema.xml
-index 7ae8f0f6..11a179a6 100644
---- a/data/dconf/org.freedesktop.ibus.gschema.xml
-+++ b/data/dconf/org.freedesktop.ibus.gschema.xml
-@@ -165,6 +165,15 @@
-       <summary>Custom font</summary>
-       <description>Custom font name for language panel</description>
-     </key>
-+    <key name="use-glyph-from-engine-lang" type="b">
-+      <default>true</default>
-+      <summary>Choose glyphs with input method's language on candidate window</summary>
-+      <description>Some code points have the different glyphs and Pango
-+                   determines the glyphs from the language attribute.
-+                   Pango chooses glyphs from the IBus engine's language
-+                   if the value is true and choose them from the desktop
-+                   locale if the value is false.</description>
-+    </key>
-     <child name="emoji" schema="org.freedesktop.ibus.panel.emoji"/>
-   </schema>
-   <schema id="org.freedesktop.ibus.panel.emoji" path="/desktop/ibus/panel/emoji/">
-diff --git a/setup/main.py b/setup/main.py
-index d5e2078c..8c8d7a47 100644
---- a/setup/main.py
-+++ b/setup/main.py
-@@ -212,6 +212,13 @@ class Setup(object):
-                                    'active',
-                                    Gio.SettingsBindFlags.DEFAULT)
- 
-+        self.__checkbutton_glyph_from_engine_lang = self.__builder.get_object(
-+                "checkbutton_use_glyph_from_engine_lang")
-+        self.__settings_panel.bind('use-glyph-from-engine-lang',
-+                                   self.__checkbutton_glyph_from_engine_lang,
-+                                   'active',
-+                                   Gio.SettingsBindFlags.DEFAULT)
-+
-     def __init_general(self):
-         # embed preedit text
-         self.__checkbutton_embed_preedit_text = self.__builder.get_object(
-diff --git a/setup/setup.ui b/setup/setup.ui
-index 250f43a0..a15b9083 100644
---- a/setup/setup.ui
-+++ b/setup/setup.ui
-@@ -1286,6 +1286,55 @@
-                     <property name="position">1</property>
-                   </packing>
-                 </child>
-+                <child>
-+                  <object class="GtkFrame" id="frame1">
-+                    <property name="visible">True</property>
-+                    <property name="can_focus">False</property>
-+                    <property name="label_xalign">0</property>
-+                    <property name="shadow_type">none</property>
-+                    <child>
-+                      <object class="GtkBox" id="vbox10">
-+                        <property name="orientation">vertical</property>
-+                        <property name="visible">True</property>
-+                        <property name="can_focus">False</property>
-+                        <property name="spacing">6</property>
-+                        <property name="margin_top">6</property>
-+                        <property name="margin_start">24</property>
-+                        <child>
-+                          <object class="GtkCheckButton" id="checkbutton_use_glyph_from_engine_lang">
-+                            <property name="label" translatable="yes">Choose glyphs with input method's language on candidate window</property>
-+                            <property name="use_action_appearance">False</property>
-+                            <property name="visible">True</property>
-+                            <property name="can_focus">True</property>
-+                            <property name="receives_default">False</property>
-+                            <property name="tooltip_text" translatable="yes">Choose glyphs with the input method's language on the candidate window for the duplicated code points</property>
-+                            <property name="use_action_appearance">False</property>
-+                            <property name="halign">start</property>
-+                            <property name="draw_indicator">True</property>
-+                          </object>
-+                          <packing>
-+                            <property name="expand">False</property>
-+                            <property name="fill">False</property>
-+                            <property name="position">0</property>
-+                          </packing>
-+                        </child>
-+                      </object>
-+                    </child>
-+                    <child type="label">
-+                      <object class="GtkLabel" id="label20">
-+                        <property name="visible">True</property>
-+                        <property name="can_focus">False</property>
-+                        <property name="label" translatable="yes">&lt;b&gt;Fonts&lt;/b&gt;</property>
-+                        <property name="use_markup">True</property>
-+                      </object>
-+                    </child>
-+                  </object>
-+                  <packing>
-+                    <property name="expand">False</property>
-+                    <property name="fill">False</property>
-+                    <property name="position">2</property>
-+                  </packing>
-+                </child>
-               </object>
-               <packing>
-                 <property name="position">3</property>
-diff --git a/ui/gtk3/panel.vala b/ui/gtk3/panel.vala
-index 8d9f5cc0..dc98e722 100644
---- a/ui/gtk3/panel.vala
-+++ b/ui/gtk3/panel.vala
-@@ -47,6 +47,7 @@ class Panel : IBus.PanelService {
-     private string m_current_context_path = "";
-     private string m_real_current_context_path = "";
-     private bool m_use_global_engine = true;
-+    private bool m_use_engine_lang = true;
-     private CandidatePanel m_candidate_panel;
-     private Switcher m_switcher;
-     private uint m_switcher_focus_set_engine_id;
-@@ -197,6 +198,15 @@ class Panel : IBus.PanelService {
-                                               ref m_css_provider);
-         });
- 
-+        m_settings_panel.changed["use-glyph-from-engine-lang"].connect((key) =>
-+        {
-+                m_use_engine_lang = m_settings_panel.get_boolean(
-+                        "use-glyph-from-engine-lang");
-+                var engine = m_bus.get_global_engine();
-+                if (engine != null)
-+                    set_language_from_engine(engine);
-+        });
-+
-         m_settings_panel.changed["show-icon-on-systray"].connect((key) => {
-                 set_show_icon_on_systray();
-         });
-@@ -732,6 +742,8 @@ class Panel : IBus.PanelService {
-         set_use_system_keyboard_layout();
-         set_use_global_engine();
-         set_use_xmodmap();
-+        m_use_engine_lang = m_settings_panel.get_boolean(
-+                        "use-glyph-from-engine-lang");
-         update_engines(m_settings_general.get_strv("preload-engines"),
-                        m_settings_general.get_strv("engines-order"));
-         BindingCommon.unbind_switch_shortcut(
-@@ -801,6 +813,17 @@ class Panel : IBus.PanelService {
-         m_engine_contexts.replace(m_current_context_path, engine);
-     }
- 
-+    private void set_language_from_engine(IBus.EngineDesc engine) {
-+        if (m_use_engine_lang) {
-+            m_candidate_panel.set_language(new Pango.AttrLanguage(
-+                    Pango.Language.from_string(engine.get_language())));
-+        } else {
-+            m_candidate_panel.set_language(new Pango.AttrLanguage(
-+                    Pango.Language.from_string(null)));
-+        }
-+
-+    }
-+
-     private void set_engine(IBus.EngineDesc engine) {
-         if (m_property_icon_delay_time_id > 0) {
-             GLib.Source.remove(m_property_icon_delay_time_id);
-@@ -822,8 +845,7 @@ class Panel : IBus.PanelService {
-         if (!m_use_system_keyboard_layout)
-             m_xkblayout.set_layout(engine);
- 
--        m_candidate_panel.set_language(new Pango.AttrLanguage(Pango.Language.from_string(engine.get_language())));
--
-+        set_language_from_engine(engine);
-         engine_contexts_insert(engine);
-     }
- 
--- 
-2.24.1
-
-From 508527daaf90901b6a7fa062372516640f88aa75 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Fri, 21 Aug 2020 09:07:39 +0900
-Subject: [PATCH 6/9] engine: Generate simple.xml with denylist
-
-simple.xml was generated by allowlist (whitelist) and it will be
-done by denylist (blacklist).
-
-BUG=https://github.com/ibus/ibus/issues/2153
----
- engine/Makefile.am  |  20 ++-
- engine/denylist.txt |  27 ++++
- engine/gensimple.py | 367 ++++++++++++++++++++++++++++++++++++++++++++
- 3 files changed, 407 insertions(+), 7 deletions(-)
- create mode 100644 engine/denylist.txt
- create mode 100755 engine/gensimple.py
-
-diff --git a/engine/Makefile.am b/engine/Makefile.am
-index 86f0e2b8..ca405496 100644
---- a/engine/Makefile.am
-+++ b/engine/Makefile.am
-@@ -4,6 +4,7 @@
- #
- # Copyright (c) 2010-2016, Google Inc. All rights reserved.
- # Copyright (c) 2007-2016 Peng Huang <shawn.p.huang@gmail.com>
-+# Copyright (c) 2013-2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
- #
- # This library is free software; you can redistribute it and/or
- # modify it under the terms of the GNU Lesser General Public
-@@ -78,20 +79,25 @@ component_DATA = \
- 
- componentdir = $(pkgdatadir)/component
- 
--CLEANFILES = \
-+MAINTAINERCLEANFILES = \
- 	simple.xml \
- 	$(NULL)
- 
- EXTRA_DIST = \
-+	gensimple.py \
- 	iso639converter.py \
--	simple.xml.in \
-+	simple.xml \
- 	$(NULL)
- 
--simple.xml: simple.xml.in
--	$(AM_V_GEN) sed \
--		-e 's|@VERSION[@]|$(VERSION)|g' \
--		-e 's|@libexecdir[@]|$(libexecdir)|g' $< > $@.tmp && \
--		mv $@.tmp $@
-+simple.xml:
-+	$(srcdir)/gensimple.py \
-+	    --input=$(datarootdir)/X11/xkb/rules/evdev.xml \
-+	    --output=$@ \
-+	    --version=$(VERSION).`date '+%Y%m%d'` \
-+	    --exec-path=$(libexecdir)/ibus-engine-simple \
-+	    --iso-path=$(datarootdir)/xml/iso-codes/iso_639.xml \
-+	    --first-language \
-+	$(NULL)
- 
- $(libibus):
- 	$(MAKE) -C $(top_builddir)/src
-diff --git a/engine/denylist.txt b/engine/denylist.txt
-new file mode 100644
-index 00000000..e4cd0473
---- /dev/null
-+++ b/engine/denylist.txt
-@@ -0,0 +1,27 @@
-+# vim:set fileencoding=utf-8 et sts=4 sw=4:
-+#
-+# ibus - Intelligent Input Bus for Linux / Unix OS
-+#
-+# Copyright © 2020 Takao Fujiwara <takao.fujiwara1@gmail.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.1 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, see <http://www.gnu.org/licenses/>.
-+
-+# This file is a deny list (black list) and used by gensimple.py.
-+# gensimple.py generates the engine list with evdev.xml and if an engine name
-+# is matched with any entries in this file, the engine is excluded from the
-+# engine list.
-+# Asterisk(*) character can be used to match any engines.
-+# E.g. xkb:cn:*:* excludes xkb:cn::zho and xkb:cn:mon_trad:mvf
-+xkb:cn:*:*
-+xkb:nec_vndr/jp:*:*
-diff --git a/engine/gensimple.py b/engine/gensimple.py
-new file mode 100755
-index 00000000..dc4ccf12
---- /dev/null
-+++ b/engine/gensimple.py
-@@ -0,0 +1,367 @@
-+#!/usr/bin/python
-+# vim:set fileencoding=utf-8 et sts=4 sw=4:
-+#
-+# ibus - Intelligent Input Bus for Linux / Unix OS
-+#
-+# Copyright © 2020 Takao Fujiwara <takao.fujiwara1@gmail.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.1 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, see <http://www.gnu.org/licenses/>.
-+
-+
-+# This script generates simple.xml with /usr/share/X11/xkb/rules/evdev.xml,
-+# /usr/share/xml/iso-codes/iso_639.xml and denylist.txt
-+
-+
-+from xml.dom import minidom
-+from xml.sax import make_parser as sax_make_parser
-+from xml.sax.handler import feature_namespaces as sax_feature_namespaces
-+from xml.sax.saxutils import XMLFilterBase, XMLGenerator, escape
-+from xml.sax.xmlreader import AttributesImpl
-+from xml.sax._exceptions import SAXParseException
-+
-+import codecs
-+import getopt
-+import io
-+import os
-+import sys
-+
-+VERSION='0.1'
-+EVDEV_XML = '/usr/share/X11/xkb/rules/evdev.xml'
-+EXEC_PATH='/usr/lib/ibus-engine-simple'
-+ISO_PATH='/usr/share/xml/iso-codes/iso_639.xml'
-+PY3K = sys.version_info >= (3, 0)
-+
-+if PY3K:
-+    from io import StringIO
-+else:
-+    # io.StringIO does not work with XMLGenerator
-+    from cStringIO import StringIO
-+    # iso_639.xml includes UTF-8
-+    reload(sys)
-+    sys.setdefaultencoding('utf-8')
-+
-+def usage(prgname):
-+    print('''\
-+%s Version %s
-+Usage:
-+  %s [OPTION...]
-+
-+Options:
-+  -h, --help                         Show this message
-+  -i, --input=EVDEV_XML              Load EVDEV_XML file (default is:
-+                                         %s)
-+  -o, --output=FILE                  Output FILE (default is stdout)
-+  -V, --version=VERSION              Set IBus VERSION (default is %s)
-+  -e, --exec-path=EXEC_PATH          Set EXEC_PATH file (default is:
-+                                         %s)
-+  -I, --iso-path=ISO_PATH            Load ISO_PATH file (default is:
-+                                         %s)
-+  -1, --first-language               Pull first language only in language list
-+''' % (prgname, VERSION, prgname, EVDEV_XML, VERSION, EXEC_PATH, ISO_PATH))
-+
-+
-+class EvdevXML(XMLFilterBase):
-+    def __init__(self, parser=None, downstream=None, iso639=None,
-+                 denylist=None, author=None, first=False):
-+        XMLFilterBase.__init__(self, parser)
-+        self.__downstream = downstream
-+        self.__iso639 = iso639
-+        self.__denylist = denylist
-+        self.__author = author
-+        self.__first = first
-+        self.__is_layout = False
-+        self.__is_description = False
-+        self.__is_config_item = False
-+        self.__is_variant = False
-+        self.__is_iso639 = False
-+        self.__is_name = False
-+        self.__layout = ''
-+        self.__description = ''
-+        self.__variant = ''
-+        self.__list_iso639 = []
-+    def startDocument(self):
-+        if self.__downstream:
-+            self.__downstream.startDocument()
-+            self.__downstream.startElement('engines', AttributesImpl({}))
-+    def endDocument(self):
-+        if self.__downstream:
-+            self.__downstream.endElement('engines')
-+            self.__downstream.endDocument()
-+    def startElement(self, name, attrs):
-+        if name == 'layout':
-+            self.__is_layout = True
-+        elif name == 'description':
-+            self.__is_description = True
-+        elif name == 'configItem':
-+            self.__is_config_item = True
-+        elif name == 'languageList':
-+            self.__list_iso639 = []
-+        elif name == 'iso639Id':
-+            self.__is_iso639 = True
-+        elif name == 'variant':
-+            self.__is_variant = True
-+        elif name == 'name':
-+            self.__is_name = True
-+    def endElement(self, name):
-+        if name == 'layout':
-+            self.__is_layout = False
-+            self.__layout = ''
-+            self.__description = ''
-+            self.__variant = ''
-+            self.__list_iso639 = []
-+        elif name == 'description':
-+            self.__is_description = False
-+        elif name == 'configItem':
-+            self.save()
-+            self.__is_config_item = False
-+        elif name == 'iso639Id':
-+            self.__is_iso639 = False
-+        elif name == 'variant':
-+            self.__is_variant = False
-+        elif name == 'name':
-+            self.__is_name = False
-+    def characters(self, text):
-+        if self.__is_description:
-+            self.__description = text
-+        elif self.__is_name:
-+            if self.__is_variant and self.__is_config_item:
-+                self.__variant = text
-+            elif self.__is_layout and self.__is_config_item:
-+                self.__layout = text
-+        elif self.__is_iso639:
-+                self.__list_iso639.append(text)
-+    def save(self):
-+        if not self.__downstream:
-+            return
-+        for iso in self.__list_iso639:
-+            do_deny = False
-+            for [xkb, layout, variant, lang] in self.__denylist:
-+                if xkb == 'xkb' \
-+                   and ( layout == self.__layout or layout == '*' ) \
-+                   and ( variant == self.__variant or variant == '*' ) \
-+                   and ( lang == iso or variant == '*' ):
-+                    do_deny = True
-+                    break
-+            if do_deny:
-+                continue
-+            self.__downstream.startElement('engine', AttributesImpl({}))
-+            self.__downstream.startElement('name', AttributesImpl({}))
-+            name = 'xkb:%s:%s:%s' % (
-+                self.__layout,
-+                self.__variant,
-+                iso
-+            )
-+            self.__downstream.characters(name)
-+            self.__downstream.endElement('name')
-+            self.__downstream.startElement('language', AttributesImpl({}))
-+            iso639_1 = self.__iso639.code2to1(iso)
-+            if iso639_1 != None:
-+                iso = iso639_1
-+            self.__downstream.characters(iso)
-+            self.__downstream.endElement('language')
-+            self.__downstream.startElement('license', AttributesImpl({}))
-+            self.__downstream.characters('GPL')
-+            self.__downstream.endElement('license')
-+            if self.__author != None:
-+                self.__downstream.startElement('author', AttributesImpl({}))
-+                self.__downstream.characters(self.__author)
-+                self.__downstream.endElement('author')
-+            self.__downstream.startElement('layout', AttributesImpl({}))
-+            self.__downstream.characters(self.__layout)
-+            self.__downstream.endElement('layout')
-+            self.__downstream.startElement('longname', AttributesImpl({}))
-+            self.__downstream.characters(self.__description)
-+            self.__downstream.endElement('longname')
-+            self.__downstream.startElement('description', AttributesImpl({}))
-+            self.__downstream.characters(self.__description)
-+            self.__downstream.endElement('description')
-+            self.__downstream.startElement('icon', AttributesImpl({}))
-+            self.__downstream.characters('ibus-keyboard')
-+            self.__downstream.endElement('icon')
-+            self.__downstream.startElement('rank', AttributesImpl({}))
-+            if self.__variant == '':
-+                self.__downstream.characters('50')
-+            else:
-+                self.__downstream.characters('1')
-+            self.__downstream.endElement('rank')
-+            self.__downstream.endElement('engine')
-+            if self.__first:
-+                break
-+
-+
-+class GenerateEngineXML():
-+    _NAME = 'org.freedesktop.IBus.Simple'
-+    _DESCRIPTION = 'A table based simple engine'
-+    _AUTHOR = 'Peng Huang <shawn.p.huang@gmail.com>'
-+    _HOMEPAGE = 'https://github.com/ibus/ibus/wiki'
-+    _DOMAIN = 'ibus'
-+    def __init__(self, path, iso639=None, denylist='', version='', exec='',
-+                 first=False):
-+        self.__path = path
-+        self.__iso639 = iso639
-+        self.__denylist = denylist
-+        self.__version = version
-+        self.__exec = exec
-+        self.__first = first
-+        self.__result = StringIO()
-+        downstream = XMLGenerator(self.__result, 'utf-8')
-+        self.__load(downstream)
-+
-+    def __load(self, downstream=None):
-+        parser = sax_make_parser()
-+        parser.setFeature(sax_feature_namespaces, 0)
-+        self.__handler = EvdevXML(parser,
-+                                  downstream,
-+                                  self.__iso639,
-+                                  self.__denylist,
-+                                  self._AUTHOR,
-+                                  self.__first)
-+        parser.setContentHandler(self.__handler)
-+        f = codecs.open(self.__path, 'r', encoding='utf-8')
-+        try:
-+            parser.parse(f)
-+        except SAXParseException:
-+            print('Error: Invalid file format: %s' % path)
-+        finally:
-+            f.close()
-+    def write(self, output=None):
-+        if output != None:
-+            od = codecs.open(output, 'w', encoding='utf-8')
-+        else:
-+            if PY3K:
-+                od = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
-+            else:
-+                od = codecs.getwriter('utf-8')(sys.stdout)
-+        contents = self.__result.getvalue()
-+        index = contents.find('<engines>')
-+        if index >= 0:
-+            author = escape(self._AUTHOR)
-+            contents = '%s<component><name>%s</name>\
-+<description>%s</description><exec>%s</exec><version>%s</version>\
-+<author>%s</author><license>%s</license><homepage>%s</homepage>\
-+<textdomain>%s</textdomain>%s</component>' % (
-+        contents[:index],
-+        self._NAME, self._DESCRIPTION,
-+        self.__exec, self.__version, author, 'GPL',
-+        self._HOMEPAGE, self._DOMAIN, contents[index:] )
-+        parsed = minidom.parseString(contents)
-+        # format with indent and encoding attribute in header
-+        xml = parsed.toprettyxml(indent='    ', encoding='utf-8')
-+        # convert byte to str
-+        od.write(str(xml, 'utf-8'))
-+        #od.write(contents)
-+
-+
-+class ISO639XML(XMLFilterBase):
-+    def __init__(self, parser=None):
-+        self.__code2to1 = {}
-+        self.__codetoname = {}
-+        XMLFilterBase.__init__(self, parser)
-+    def startElement(self, name, attrs):
-+        if name != 'iso_639_entry':
-+            return
-+        n = attrs.get('name')
-+        iso639_1 = attrs.get('iso_639_1_code')
-+        iso639_2b = attrs.get('iso_639_2B_code')
-+        iso639_2t = attrs.get('iso_639_2T_code')
-+        if iso639_1 != None:
-+            self.__codetoname[iso639_1] = n
-+            if iso639_2b != None:
-+                self.__code2to1[iso639_2b] = iso639_1
-+                self.__codetoname[iso639_2b] = n
-+            if iso639_2t != None and iso639_2b != iso639_2t:
-+                self.__code2to1[iso639_2t] = iso639_1
-+                self.__codetoname[iso639_2t] = n
-+    def code2to1(self, iso639_2):
-+        try:
-+            return self.__code2to1[iso639_2]
-+        except KeyError:
-+            return None
-+
-+
-+def parse_iso639(path):
-+    f = codecs.open(path, 'r', encoding='utf-8')
-+    parser = sax_make_parser()
-+    parser.setFeature(sax_feature_namespaces, 0)
-+    handler = ISO639XML(parser)
-+    parser.setContentHandler(handler)
-+    try:
-+        parser.parse(f)
-+    except SAXParseException:
-+        print('Error: Invalid file format: %s' % path)
-+    finally:
-+        f.close()
-+    return handler
-+
-+
-+def parse_denylist(denyfile):
-+    denylist = []
-+    f = codecs.open(denyfile, 'r', encoding='utf-8')
-+    for line in f.readlines():
-+        if line == '\n' or line[0] == '#':
-+            continue
-+        line = line.rstrip()
-+        entry = line.split(':')
-+        if len(entry) != 4:
-+            print('WARNING: format error: \'%s\' against \'%s\'' \
-+                  % (line, 'xkb:layout:variant:lang'))
-+            continue
-+        denylist.append(entry)
-+    f.close()
-+    return denylist
-+
-+
-+if __name__ == '__main__':
-+    prgname = os.path.basename(sys.argv[0])
-+    mydir = os.path.dirname(sys.argv[0])
-+    try:
-+        opts, args = getopt.getopt(sys.argv[1:],
-+                                   'hi:o:V:e:I:1',
-+                                   ['help', 'input=', 'output=', 'version=',
-+                                    'exec-path=', 'iso-path=',
-+                                    'first-language'])
-+    except getopt.GetoptError as err:
-+        print(err)
-+        usage(prgname)
-+        sys.exit(2)
-+    if len(args) > 0:
-+        usage(prgname)
-+        sys.exit(2)
-+    input = EVDEV_XML
-+    output = None
-+    version=VERSION
-+    exec_path=EXEC_PATH
-+    iso_path=ISO_PATH
-+    first=False
-+    for opt, arg in opts:
-+        if opt in ('-h', '--help'):
-+            usage(prgname)
-+            sys.exit()
-+        elif opt in ('-i', '--input'):
-+            input = arg
-+        elif opt in ('-o', '--output'):
-+            output = arg
-+        elif opt in ('-V', '--version'):
-+            version = arg
-+        elif opt in ('-e', '--exec-path'):
-+            exec_path = arg
-+        elif opt in ('-I', '--iso-path'):
-+            iso_path = arg
-+        elif opt in ('-1', '--first-langauge'):
-+            first=True
-+
-+    iso639 = parse_iso639(iso_path)
-+    denylist = parse_denylist('%s/%s' % ( mydir, 'denylist.txt'))
-+    xml = GenerateEngineXML(input, iso639, denylist, version, exec_path, first)
-+    xml.write(output)
--- 
-2.24.1
-
-From 6879879002af47d49d8740ca383a048d2ac8e904 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Fri, 21 Aug 2020 09:15:14 +0900
-Subject: [PATCH 8/9] src/tests: Fix runtest with simple.xml
-
-Now simple.xml.in is replaced with simple.xml and modify runtest
-to copy simple.xml.
-
-BUG=https://github.com/ibus/ibus/issues/2153
----
- src/tests/runtest | 15 ++++++++++++++-
- 1 file changed, 14 insertions(+), 1 deletion(-)
-
-diff --git a/src/tests/runtest b/src/tests/runtest
-index a6e4194b..11bcc6c2 100755
---- a/src/tests/runtest
-+++ b/src/tests/runtest
-@@ -91,6 +91,19 @@ func_copy_component () {
-     fi
- }
- 
-+func_copy_simple_xml () {
-+    file=$1
-+    base=`func_basename $file`
-+    libexecdir=`func_dirname $file`
-+    # top_srcdir != top_builddir in make dist
-+    libexecdir=`echo "$libexecdir" | sed -e "s|$top_srcdir|$top_builddir|"`
-+    if test -f $file; then
-+        mkdir -p components
-+        sed "s|\(<exec>\).*\(/ibus-engine-simple</exec>\)|\1$libexecdir\2|" \
-+                < $file > components/$base
-+    fi
-+}
-+
- trap 'func_cleanup $tstdir' 1 2 3 15
- 
- tst=$1; shift
-@@ -127,7 +140,7 @@ run_test_case()
-             exit -1
-         fi
-         # func_copy_component replaces s/$top_srcdir/%top_builddir/
--        func_copy_component "../$top_srcdir/engine/simple.xml"
-+        func_copy_simple_xml "../$top_srcdir/engine/simple.xml"
-         func_copy_component "../$top_srcdir/conf/memconf/memconf.xml"
- 
-         IBUS_COMPONENT_PATH=$PWD/components
--- 
-2.24.1
-
-From 59b902a809ed628bb4d5bbad2b8bcb79a8a23208 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Fri, 21 Aug 2020 09:46:46 +0900
-Subject: [PATCH 9/9] src: Add file list in registry file
-
-Under Fedora Silverblue, st_mtime in /usr/share/ibus/component is
-1 Jan 1970 even if ibus engines are installed and ibus-daemon
-cannot detect new engines.
-Now IBusObservedPath saves hashed file list besides st_mtime of
-the compnent directory to detect the installed engines newly.
-
-BUG=https://github.com/ibus/ibus/issues/2132
----
- src/ibuscomponent.c    |   9 +-
- src/ibusobservedpath.c | 277 ++++++++++++++++++++++++++++++++++++-----
- src/ibusregistry.c     |   6 +-
- 3 files changed, 254 insertions(+), 38 deletions(-)
-
-diff --git a/src/ibuscomponent.c b/src/ibuscomponent.c
-index 9837f47c..1404ada0 100644
---- a/src/ibuscomponent.c
-+++ b/src/ibuscomponent.c
-@@ -2,7 +2,8 @@
- /* vim:set et sts=4: */
- /* bus - The Input Bus
-  * Copyright (C) 2008-2010 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright (C) 2008-2019 Red Hat, Inc.
-+ * Copyright (C) 2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2008-2020 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
-@@ -499,11 +500,7 @@ ibus_component_output (IBusComponent *component,
- 
-         for (p = component->priv->observed_paths; p != NULL; p = p->next ) {
-             IBusObservedPath *path = (IBusObservedPath *) p->data;
--
--            g_string_append_indent (output, indent + 2);
--            g_string_append_printf (output, "<path mtime=\"%ld\" >%s</path>\n",
--                                    path->mtime,
--                                    path->path);
-+            ibus_observed_path_output (path, output, indent + 2);
-         }
- 
-         g_string_append_indent (output, indent + 1);
-diff --git a/src/ibusobservedpath.c b/src/ibusobservedpath.c
-index 5b79f1fe..42192431 100644
---- a/src/ibusobservedpath.c
-+++ b/src/ibusobservedpath.c
-@@ -2,7 +2,8 @@
- /* vim:set et sts=4: */
- /* ibus - The Input IBus
-  * Copyright (C) 2008-2015 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright (C) 2008-2019 Red Hat, Inc.
-+ * Copyright (C) 2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2008-2020 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
-@@ -30,9 +31,9 @@ enum {
- };
- 
- 
--/* IBusObservedPathPriv */
-+/* IBusObservedPathPrivate */
- struct _IBusObservedPathPrivate {
--    gpointer pad;
-+    guint   *file_hash_list;
- };
- typedef struct _IBusObservedPathPrivate IBusObservedPathPrivate;
- 
-@@ -52,7 +53,9 @@ static gboolean  ibus_observed_path_copy            (IBusObservedPath       *des
- static gboolean  ibus_observed_path_parse_xml_node  (IBusObservedPath       *path,
-                                                      XMLNode                *node);
- 
--G_DEFINE_TYPE (IBusObservedPath, ibus_observed_path, IBUS_TYPE_SERIALIZABLE)
-+G_DEFINE_TYPE_WITH_PRIVATE (IBusObservedPath,
-+                            ibus_observed_path,
-+                            IBUS_TYPE_SERIALIZABLE)
- 
- static void
- ibus_observed_path_class_init (IBusObservedPathClass *class)
-@@ -84,7 +87,9 @@ static gboolean
- ibus_observed_path_serialize (IBusObservedPath *path,
-                               GVariantBuilder  *builder)
- {
-+    IBusObservedPathPrivate *priv = IBUS_OBSERVED_PATH_GET_PRIVATE (path);
-     gboolean retval;
-+    guint i;
- 
-     retval = IBUS_SERIALIZABLE_CLASS (ibus_observed_path_parent_class)->
-             serialize ((IBusSerializable *)path, builder);
-@@ -93,6 +98,15 @@ ibus_observed_path_serialize (IBusObservedPath *path,
-     g_variant_builder_add (builder, "s", path->path);
-     g_variant_builder_add (builder, "x", path->mtime);
- 
-+    if (!priv->file_hash_list) {
-+        g_variant_builder_add (builder, "u", 0);
-+        return TRUE;
-+    }
-+    for (i = 0; priv->file_hash_list[i]; i++);
-+    g_variant_builder_add (builder, "u", i);
-+    for (i = 0; priv->file_hash_list[i]; i++)
-+        g_variant_builder_add (builder, "u", priv->file_hash_list[i]);
-+
-     return TRUE;
- }
- 
-@@ -100,7 +114,9 @@ static gint
- ibus_observed_path_deserialize (IBusObservedPath *path,
-                                 GVariant         *variant)
- {
-+    IBusObservedPathPrivate *priv = IBUS_OBSERVED_PATH_GET_PRIVATE (path);
-     gint retval;
-+    guint i, length = 0;
- 
-     retval = IBUS_SERIALIZABLE_CLASS (ibus_observed_path_parent_class)->
-             deserialize ((IBusSerializable *)path, variant);
-@@ -109,6 +125,15 @@ ibus_observed_path_deserialize (IBusObservedPath *path,
-     ibus_g_variant_get_child_string (variant, retval++, &path->path);
-     g_variant_get_child (variant, retval++, "x", &path->mtime);
- 
-+    if (g_variant_n_children (variant) < retval + 2)
-+        return retval;
-+    g_variant_get_child (variant, retval++, "u", &length);
-+    if (!length)
-+        return retval;
-+    priv->file_hash_list = g_new0 (guint, length + 1);
-+    for (i = 0; i < length; i++)
-+        g_variant_get_child (variant, retval++, "u", &priv->file_hash_list[i]);
-+
-     return retval;
- }
- 
-@@ -116,14 +141,27 @@ static gboolean
- ibus_observed_path_copy (IBusObservedPath       *dest,
-                          const IBusObservedPath *src)
- {
-+    IBusObservedPathPrivate *dest_priv = IBUS_OBSERVED_PATH_GET_PRIVATE (dest);
-+    IBusObservedPathPrivate *src_priv =
-+            IBUS_OBSERVED_PATH_GET_PRIVATE ((IBusObservedPath *)src);
-     gboolean retval;
-+    guint i;
- 
--    retval = IBUS_SERIALIZABLE_CLASS (ibus_observed_path_parent_class)->copy ((IBusSerializable *)dest, (IBusSerializable *)src);
-+    retval = IBUS_SERIALIZABLE_CLASS (ibus_observed_path_parent_class)->
-+            copy ((IBusSerializable *)dest, (IBusSerializable *)src);
-     g_return_val_if_fail (retval, FALSE);
- 
-     dest->path = g_strdup (src->path);
-     dest->mtime = src->mtime;
- 
-+    g_clear_pointer (&dest_priv->file_hash_list, g_free);
-+    if (!src_priv->file_hash_list)
-+        return TRUE;
-+    for (i = 0; src_priv->file_hash_list[i]; i++);
-+    dest_priv->file_hash_list = g_new0 (guint, i + 1);
-+    for (i = 0; src_priv->file_hash_list[i]; i++)
-+        dest_priv->file_hash_list[i] = src_priv->file_hash_list[i];
-+
-     return TRUE;
- }
- 
-@@ -137,23 +175,48 @@ ibus_observed_path_copy (IBusObservedPath       *dest,
- 
- void
- ibus_observed_path_output (IBusObservedPath *path,
--                          GString         *output,
--                          gint             indent)
-+                           GString          *output,
-+                           gint              indent)
- {
-+    IBusObservedPathPrivate *priv = IBUS_OBSERVED_PATH_GET_PRIVATE (path);
-+    guint i;
-+
-     g_assert (IBUS_IS_OBSERVED_PATH (path));
-     g_assert (output);
- 
--    g_string_append_indent (output, indent);
--    g_string_append_printf (output, "<path mtime=\"%ld\" >%s</path>\n",
--                                    path->mtime,
--                                    path->path);
-+    if (!priv->file_hash_list) {
-+        g_string_append_indent (output, indent);
-+        g_string_append_printf (output, "<path mtime=\"%ld\" >%s</path>\n",
-+                                path->mtime,
-+                                path->path);
-+    } else {
-+        g_string_append_indent (output, indent);
-+        g_string_append_printf (
-+                output,
-+                "<path mtime=\"%ld\" type=\"dir\" path=\"%s\">\n",
-+                path->mtime,
-+                path->path);
-+        for (i = 0; priv->file_hash_list[i]; i++) {
-+            g_string_append_indent (output, indent + 1);
-+            g_string_append_printf (output, "<file hash=\"%u\" />\n",
-+                                    priv->file_hash_list[i]);
-+        }
-+        g_string_append_indent (output, indent);
-+        g_string_append_printf (output, "</path>\n");
-+    }
- }
- 
- gboolean
- ibus_observed_path_check_modification (IBusObservedPath *path)
- {
-+    IBusObservedPathPrivate *priv = IBUS_OBSERVED_PATH_GET_PRIVATE (path);
-     gchar *real_path = NULL;
-     struct stat buf;
-+    gboolean retval = FALSE;
-+    GDir *dir = NULL;
-+    const gchar *name;
-+    guint i = 0;
-+    guint file_num = 0;
- 
-     g_assert (IBUS_IS_OBSERVED_PATH (path));
- 
-@@ -169,11 +232,71 @@ ibus_observed_path_check_modification (IBusObservedPath *path)
-         buf.st_mtime = 0;
-     }
- 
--    g_free (real_path);
- 
--    if (path->mtime == buf.st_mtime)
--        return FALSE;
--    return TRUE;
-+    if (path->mtime != buf.st_mtime) {
-+        retval = TRUE;
-+        goto end_check_modification;
-+    }
-+
-+    /* If an ibus engine is installed, normal file system updates
-+     * the directory mtime of "/usr/share/ibus/component" and
-+     * path->mtime of the cache file and buf.st_mtime of the current directory
-+     * could have the different values.
-+     *
-+     * But under a special file system, the buf.st_mtime is not updated
-+     * even if an ibus engine is installed, likes Fedora Silverblue
-+     * and ibus_observed_path_check_modification() could not detect
-+     * the installed ibus engines.
-+     * Now path->priv->file_hash_list reserves the hash list of the files
-+     * in the observed directory and if a new ibus engine is installed,
-+     * the hash of the compose file does not exists in the cache's
-+     * file_hash_list and ibus-daemon regenerate the cache successfully.
-+     */
-+    if (!priv->file_hash_list) {
-+        /* If the cache version is old, ibus_registry_load_cache() returns
-+         * FALSE and ibus_registry_check_modification() and this are not
-+         * called.
-+         * If the cache version is the latest, the cache file includes the
-+         * filled file_hash_list for directories with ibus_observed_path_new()
-+         * when the cache was generated.
-+         * Then if file_hash_list is null, it's a simple file in ibus
-+         * components and return here simply.
-+         */
-+        goto end_check_modification;
-+    }
-+    dir = g_dir_open (real_path, 0, NULL);
-+    g_return_val_if_fail (dir, FALSE);
-+
-+    while ((name = g_dir_read_name (dir)) != NULL) {
-+        guint current_hash;
-+        gboolean has_file = FALSE;
-+
-+        if (!g_str_has_suffix (name, ".xml"))
-+            continue;
-+        current_hash = g_str_hash (name);
-+        for (i = 0; priv->file_hash_list[i]; i++) {
-+            if (current_hash == priv->file_hash_list[i]) {
-+                has_file = TRUE;
-+                break;
-+            }
-+        }
-+        if (!has_file) {
-+            retval = TRUE;
-+            goto end_check_modification;
-+        }
-+        file_num++;
-+    }
-+    if (!retval) {
-+        for (i = 0; priv->file_hash_list[i]; i++);
-+        if (file_num != i)
-+            retval = TRUE;
-+    }
-+
-+end_check_modification:
-+    if (dir)
-+        g_dir_close (dir);
-+    g_free (real_path);
-+    return retval;
- }
- 
- static void
-@@ -224,7 +347,7 @@ ibus_observed_path_traverse (IBusObservedPath *path,
-             paths = g_list_append (paths, sub);
-             paths = g_list_concat (paths,
-                                    ibus_observed_path_traverse (sub, dir_only));
--        } else if (!dir_only) {
-+        } else if (sub->is_exist && !dir_only) {
-             paths = g_list_append (paths, sub);
-         }
-     }
-@@ -233,36 +356,102 @@ ibus_observed_path_traverse (IBusObservedPath *path,
-     return paths;
- }
- 
-+
-+static gboolean
-+ibus_observed_path_parse_file (IBusObservedPath *path,
-+                               XMLNode          *node,
-+                               int              *nth)
-+{
-+    IBusObservedPathPrivate *priv = IBUS_OBSERVED_PATH_GET_PRIVATE (path);
-+    gchar **attr;
-+
-+    for (attr = node->attributes; attr[0]; attr += 2) {
-+        guint hash = 0;
-+
-+        if (g_strcmp0 (*attr, "hash") == 0)
-+            hash = atol (attr[1]);
-+        else if (g_strcmp0 (*attr, "name") == 0)
-+            hash = g_str_hash (attr[1]);
-+        if (hash) {
-+            if (!priv->file_hash_list) {
-+                *nth = 0;
-+                priv->file_hash_list = g_new0 (guint, *nth + 2);
-+            } else {
-+                priv->file_hash_list = g_renew (guint, priv->file_hash_list,
-+                                                *nth + 2);
-+            }
-+            priv->file_hash_list[*nth] = hash;
-+            priv->file_hash_list[*nth + 1] = 0;
-+            *nth += 1;
-+            continue;
-+        }
-+        g_warning ("Unkonwn attribute %s", attr[0]);
-+    }
-+
-+    return TRUE;
-+}
-+
-+
- static gboolean
- ibus_observed_path_parse_xml_node (IBusObservedPath *path,
-                                    XMLNode          *node)
- {
-+    gchar **attr;
-+    const gchar *full_path = node->text;
-+    GList *p;
-+    int i = 0;
-+
-     g_assert (IBUS_IS_OBSERVED_PATH (path));
-     g_assert (node);
- 
--    if (G_UNLIKELY (g_strcmp0 (node->name, "path") != 0)) {
-+    if (G_UNLIKELY (g_strcmp0 (node->name, "path") != 0))
-         return FALSE;
-+
-+    for (attr = node->attributes; attr[0]; attr += 2) {
-+        if (g_strcmp0 (*attr, "mtime") == 0) {
-+            path->mtime = atol (attr[1]);
-+            continue;
-+        }
-+        if (g_strcmp0 (*attr, "path") == 0) {
-+            full_path = attr[1];
-+            continue;
-+        }
-+        if (g_strcmp0 (*attr, "type") == 0) {
-+            if (!g_strcmp0 (attr[1], "dir"))
-+                path->is_dir = TRUE;
-+            else if (!g_strcmp0 (attr[1], "file"))
-+                path->is_dir = FALSE;
-+            else
-+                g_warning ("The type attribute can be \"dir\" or \"file\".");
-+            continue;
-+        }
-+        g_warning ("Unkonwn attribute %s", attr[0]);
-     }
- 
--    if (node->text[0] == '~' && node->text[1] != G_DIR_SEPARATOR) {
--        g_warning ("Invalid path \"%s\"", node->text);
-+    if (full_path[0] == '~' && full_path[1] != G_DIR_SEPARATOR) {
-+        g_warning ("Invalid path \"%s\"", full_path);
-         return FALSE;
-     }
- 
--    path->path = g_strdup (node->text);
-+    path->path = g_strdup (full_path);
- 
--    gchar **attr;
--    for (attr = node->attributes; attr[0]; attr += 2) {
--        if (g_strcmp0 (*attr, "mtime") == 0) {
--            path->mtime = atol (attr[1]);
-+    if (!path->is_dir)
-+        return TRUE;
-+
-+    for (i = 0, p = node->sub_nodes; p != NULL; p = p->next) {
-+        XMLNode *sub_node = (XMLNode *)p->data;
-+
-+        if (G_UNLIKELY (g_strcmp0 (sub_node->name, "file") != 0)) {
-+            g_warning ("Unkonwn tag %s", sub_node->name);
-             continue;
-         }
--        g_warning ("Unkonwn attribute %s", attr[0]);
-+        ibus_observed_path_parse_file (path, sub_node, &i);
-     }
- 
-     return TRUE;
- }
- 
-+
- IBusObservedPath *
- ibus_observed_path_new_from_xml_node (XMLNode *node,
-                                      gboolean fill_stat)
-@@ -288,16 +477,46 @@ IBusObservedPath *
- ibus_observed_path_new (const gchar *path,
-                         gboolean     fill_stat)
- {
--    g_assert (path);
--
-     IBusObservedPath *op;
-+    IBusObservedPathPrivate *priv;
-+    GList *file_list, *l;
-+    guint i = 0;
- 
-+    g_assert (path);
-     op = (IBusObservedPath *) g_object_new (IBUS_TYPE_OBSERVED_PATH, NULL);
-     op->path = g_strdup (path);
- 
--    if (fill_stat) {
--        ibus_observed_path_fill_stat (op);
-+    priv = IBUS_OBSERVED_PATH_GET_PRIVATE (op);
-+    l = file_list = ibus_observed_path_traverse (op, FALSE);
-+    for (; l; l = l->next) {
-+        IBusObservedPath *sub = l->data;
-+        const gchar *file = NULL;
-+
-+        g_return_val_if_fail (sub && sub->path, op);
-+
-+        file = sub->path;
-+        if (!g_str_has_suffix (file, ".xml"))
-+            continue;
-+        if (g_str_has_prefix (file, path)) {
-+            file += strlen (path);
-+            if (*file == '/')
-+                file++;
-+            /* Ignore sub directories */
-+            if (strchr (file, '/'))
-+                continue;
-+        }
-+        if (!i)
-+            priv->file_hash_list = g_new0 (guint, i + 2);
-+        else
-+            priv->file_hash_list = g_renew (guint, priv->file_hash_list, i + 2);
-+        priv->file_hash_list[i] = g_str_hash (file);
-+        priv->file_hash_list[i + 1] = 0;
-+        ++i;
-     }
-+    g_list_free_full (file_list, (GDestroyNotify)ibus_observed_path_destroy);
-+
-+    if (fill_stat)
-+        ibus_observed_path_fill_stat (op);
- 
-     return op;
- }
-diff --git a/src/ibusregistry.c b/src/ibusregistry.c
-index 43990d5f..3386a5d1 100644
---- a/src/ibusregistry.c
-+++ b/src/ibusregistry.c
-@@ -2,8 +2,8 @@
- /* vim:set et sts=4: */
- /* bus - The Input Bus
-  * Copyright (C) 2015 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright (C) 2015-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
-- * Copyright (C) 2015-2019 Red Hat, Inc.
-+ * Copyright (C) 2015-2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2015-2020 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
-@@ -29,7 +29,7 @@
- #include "ibusregistry.h"
- 
- #define IBUS_CACHE_MAGIC 0x49425553 /* "IBUS" */
--#define IBUS_CACHE_VERSION 0x00010512
-+#define IBUS_CACHE_VERSION 0x00010522
- 
- enum {
-     CHANGED,
--- 
-2.24.1
-
-From 568d58dfadefa801b96058c1155daecff3d51605 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Fri, 21 Aug 2020 22:07:31 +0900
-Subject: [PATCH] engine: Add layout_variant in gensimple.py
-
-Missed to handle layout_variant and also add latam layouts to denylist
-
-BUG=https://github.com/ibus/ibus/issues/2153
----
- engine/denylist.txt | 1 +
- engine/gensimple.py | 5 +++++
- 2 files changed, 6 insertions(+)
-
-diff --git a/engine/denylist.txt b/engine/denylist.txt
-index e4cd0473..9cbc7fc3 100644
---- a/engine/denylist.txt
-+++ b/engine/denylist.txt
-@@ -24,4 +24,5 @@
- # Asterisk(*) character can be used to match any engines.
- # E.g. xkb:cn:*:* excludes xkb:cn::zho and xkb:cn:mon_trad:mvf
- xkb:cn:*:*
-+xkb:latam:*:*
- xkb:nec_vndr/jp:*:*
-diff --git a/engine/gensimple.py b/engine/gensimple.py
-index dc4ccf12..18f7dc8c 100755
---- a/engine/gensimple.py
-+++ b/engine/gensimple.py
-@@ -180,6 +180,11 @@ class EvdevXML(XMLFilterBase):
-             self.__downstream.startElement('layout', AttributesImpl({}))
-             self.__downstream.characters(self.__layout)
-             self.__downstream.endElement('layout')
-+            if self.__variant != '':
-+                self.__downstream.startElement('layout_variant',
-+                                               AttributesImpl({}))
-+                self.__downstream.characters(self.__variant)
-+                self.__downstream.endElement('layout_variant')
-             self.__downstream.startElement('longname', AttributesImpl({}))
-             self.__downstream.characters(self.__description)
-             self.__downstream.endElement('longname')
--- 
-2.24.1
-
-From 5959d6f1d40c06f57bd895cd84d2b84deb6b6d8d Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Thu, 27 Aug 2020 10:30:43 +0900
-Subject: [PATCH] data/dconf: Fix rm $TMPDIR in make-dconf-override-db.sh
-
-dbus-launch and gsettings run /usr/lib*/gvfsd-fuse $TMPDIR/cache/gvfs -f
-via systemd since gvfs 1.45.90 in Fedora 33
----
- data/dconf/make-dconf-override-db.sh | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/data/dconf/make-dconf-override-db.sh b/data/dconf/make-dconf-override-db.sh
-index 9c650e97..48dd8fac 100755
---- a/data/dconf/make-dconf-override-db.sh
-+++ b/data/dconf/make-dconf-override-db.sh
-@@ -45,6 +45,10 @@ for schema in $schemas; do
-   done
- done
- 
-+# dbus-launch and gsettings run /usr/lib*/gvfsd-fuse $TMPDIR/cache/gvfs -f
-+# via systemd since gvfs 1.45.90 in Fedora 33
-+# and rm $TMPDIR could be failed until umount would be called.
-+umount $TMPDIR/cache/gvfs
- rm -rf $TMPDIR
- 
- kill $DBUS_SESSION_BUS_PID
--- 
-2.24.1
-
-From e10fc89c5afa1941801429b3a653b3f83b5d3802 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Thu, 27 Aug 2020 10:31:10 +0900
-Subject: [PATCH] src: Update ibusunicodegen.h with unicode-ucd 13.0.0
-
----
- src/ibusunicodegen.h |  32 ++++
- 2 files changed, 262 insertions(+), 170 deletions(-)
-
-diff --git a/src/ibusunicodegen.h b/src/ibusunicodegen.h
-index 6a60a5a9..c891d0e3 100644
---- a/src/ibusunicodegen.h
-+++ b/src/ibusunicodegen.h
-@@ -847,6 +847,10 @@ const static char *unicode_blocks[] = {
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-     N_("Rumi Numeral Symbols"),
-+    /* TRANSLATORS: You might refer the translations from gucharmap with
-+                    the following command:
-+       msgmerge -C gucharmap.po ibus.po ibus.pot */
-+    N_("Yezidi"),
-     /* TRANSLATORS: You might refer the translations from gucharmap with
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-@@ -855,6 +859,10 @@ const static char *unicode_blocks[] = {
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-     N_("Sogdian"),
-+    /* TRANSLATORS: You might refer the translations from gucharmap with
-+                    the following command:
-+       msgmerge -C gucharmap.po ibus.po ibus.pot */
-+    N_("Chorasmian"),
-     /* TRANSLATORS: You might refer the translations from gucharmap with
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-@@ -939,6 +947,10 @@ const static char *unicode_blocks[] = {
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-     N_("Warang Citi"),
-+    /* TRANSLATORS: You might refer the translations from gucharmap with
-+                    the following command:
-+       msgmerge -C gucharmap.po ibus.po ibus.pot */
-+    N_("Dives Akuru"),
-     /* TRANSLATORS: You might refer the translations from gucharmap with
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-@@ -975,6 +987,10 @@ const static char *unicode_blocks[] = {
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-     N_("Makasar"),
-+    /* TRANSLATORS: You might refer the translations from gucharmap with
-+                    the following command:
-+       msgmerge -C gucharmap.po ibus.po ibus.pot */
-+    N_("Lisu Supplement"),
-     /* TRANSLATORS: You might refer the translations from gucharmap with
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-@@ -1039,6 +1055,14 @@ const static char *unicode_blocks[] = {
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-     N_("Tangut Components"),
-+    /* TRANSLATORS: You might refer the translations from gucharmap with
-+                    the following command:
-+       msgmerge -C gucharmap.po ibus.po ibus.pot */
-+    N_("Khitan Small Script"),
-+    /* TRANSLATORS: You might refer the translations from gucharmap with
-+                    the following command:
-+       msgmerge -C gucharmap.po ibus.po ibus.pot */
-+    N_("Tangut Supplement"),
-     /* TRANSLATORS: You might refer the translations from gucharmap with
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-@@ -1187,6 +1211,10 @@ const static char *unicode_blocks[] = {
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-     N_("Symbols and Pictographs Extended-A"),
-+    /* TRANSLATORS: You might refer the translations from gucharmap with
-+                    the following command:
-+       msgmerge -C gucharmap.po ibus.po ibus.pot */
-+    N_("Symbols for Legacy Computing"),
-     /* TRANSLATORS: You might refer the translations from gucharmap with
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-@@ -1211,6 +1239,10 @@ const static char *unicode_blocks[] = {
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-     N_("CJK Compatibility Ideographs Supplement"),
-+    /* TRANSLATORS: You might refer the translations from gucharmap with
-+                    the following command:
-+       msgmerge -C gucharmap.po ibus.po ibus.pot */
-+    N_("CJK Unified Ideographs Extension G"),
-     /* TRANSLATORS: You might refer the translations from gucharmap with
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
--- 
-2.24.1
-
-From 394d9a83962225bff4c39ed3e9ddd5c3019a3936 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Thu, 27 Aug 2020 11:52:16 +0900
-Subject: [PATCH] data/dconf: Fix regression in make-dconf-override-db.sh
-
----
- data/dconf/make-dconf-override-db.sh | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
-diff --git a/data/dconf/make-dconf-override-db.sh b/data/dconf/make-dconf-override-db.sh
-index 48dd8fac..601c1c3f 100755
---- a/data/dconf/make-dconf-override-db.sh
-+++ b/data/dconf/make-dconf-override-db.sh
-@@ -48,7 +48,9 @@ done
- # dbus-launch and gsettings run /usr/lib*/gvfsd-fuse $TMPDIR/cache/gvfs -f
- # via systemd since gvfs 1.45.90 in Fedora 33
- # and rm $TMPDIR could be failed until umount would be called.
--umount $TMPDIR/cache/gvfs
-+if [ -d $TMPDIR/cache/gvfs ] ; then
-+    umount $TMPDIR/cache/gvfs
-+fi
- rm -rf $TMPDIR
- 
- kill $DBUS_SESSION_BUS_PID
--- 
-2.24.1
-
-From e938846b1624a9455128edb64f144b0a1181736c Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Thu, 27 Aug 2020 22:40:23 +0900
-Subject: [PATCH] engine: Genarate simple.xml at build time
-
-The engine path of ibus-engine-simple should be decided in
-build time and simple.xml is renamed to simple.xml.in
-Also Revert 6879879002af47d49d8740ca383a048d2ac8e904
-
-BUG=https://github.com/ibus/ibus/issues/2153
----
- engine/Makefile.am | 15 ++++++++++++---
- src/tests/runtest  | 15 +--------------
- 2 files changed, 13 insertions(+), 17 deletions(-)
-
-diff --git a/engine/Makefile.am b/engine/Makefile.am
-index ca405496..d810704b 100644
---- a/engine/Makefile.am
-+++ b/engine/Makefile.am
-@@ -80,21 +80,30 @@ component_DATA = \
- componentdir = $(pkgdatadir)/component
- 
- MAINTAINERCLEANFILES = \
-+	simple.xml.in \
-+	$(NULL)
-+
-+CLEANFILES = \
- 	simple.xml \
- 	$(NULL)
- 
- EXTRA_DIST = \
- 	gensimple.py \
- 	iso639converter.py \
--	simple.xml \
-+	simple.xml.in \
- 	$(NULL)
- 
--simple.xml:
-+simple.xml: simple.xml.in
-+	$(AM_V_GEN) sed \
-+	    -e 's|@libexecdir[@]|$(libexecdir)|g' $< > $@.tmp && \
-+	    mv $@.tmp $@
-+
-+simple.xml.in:
- 	$(srcdir)/gensimple.py \
- 	    --input=$(datarootdir)/X11/xkb/rules/evdev.xml \
- 	    --output=$@ \
- 	    --version=$(VERSION).`date '+%Y%m%d'` \
--	    --exec-path=$(libexecdir)/ibus-engine-simple \
-+	    --exec-path=@libexecdir\@/ibus-engine-simple \
- 	    --iso-path=$(datarootdir)/xml/iso-codes/iso_639.xml \
- 	    --first-language \
- 	$(NULL)
-diff --git a/src/tests/runtest b/src/tests/runtest
-index 11bcc6c2..a6e4194b 100755
---- a/src/tests/runtest
-+++ b/src/tests/runtest
-@@ -91,19 +91,6 @@ func_copy_component () {
-     fi
- }
- 
--func_copy_simple_xml () {
--    file=$1
--    base=`func_basename $file`
--    libexecdir=`func_dirname $file`
--    # top_srcdir != top_builddir in make dist
--    libexecdir=`echo "$libexecdir" | sed -e "s|$top_srcdir|$top_builddir|"`
--    if test -f $file; then
--        mkdir -p components
--        sed "s|\(<exec>\).*\(/ibus-engine-simple</exec>\)|\1$libexecdir\2|" \
--                < $file > components/$base
--    fi
--}
--
- trap 'func_cleanup $tstdir' 1 2 3 15
- 
- tst=$1; shift
-@@ -140,7 +127,7 @@ run_test_case()
-             exit -1
-         fi
-         # func_copy_component replaces s/$top_srcdir/%top_builddir/
--        func_copy_simple_xml "../$top_srcdir/engine/simple.xml"
-+        func_copy_component "../$top_srcdir/engine/simple.xml"
-         func_copy_component "../$top_srcdir/conf/memconf/memconf.xml"
- 
-         IBUS_COMPONENT_PATH=$PWD/components
--- 
-2.24.1
-
-From 00adea6d16939e2da35ede7f2ecf3fe0a2156fa6 Mon Sep 17 00:00:00 2001
-From: "ntfs.hard" <ntfs.hard@gmail.com>
-Date: Thu, 3 Sep 2020 14:59:35 +0900
-Subject: [PATCH] Fix for several error spotted by static analyzer
-
-- ibuscomposetable.c, ibusxml.c:
-Check size before memory access
-
-- inputcontext.c:
-Use logical operator for bool type variables
-
-- config.c:
-Extra break removed
-
-BUG=https://github.com/ibus/ibus/pull/2242
----
- bus/inputcontext.c     | 6 +++---
- src/ibuscomposetable.c | 2 +-
- src/ibusxml.c          | 2 +-
- 4 files changed, 5 insertions(+), 6 deletions(-)
-
-diff --git a/bus/inputcontext.c b/bus/inputcontext.c
-index ceea4b60..8d84fd05 100644
---- a/bus/inputcontext.c
-+++ b/bus/inputcontext.c
-@@ -2842,11 +2842,11 @@ bus_input_context_update_preedit_text (BusInputContext *context,
-     context->preedit_text = (IBusText *) g_object_ref_sink (text ? text :
-                                                             text_empty);
-     context->preedit_cursor_pos = cursor_pos;
--    if (use_extension)
-+    if (use_extension) {
-         context->preedit_visible = visible;
--    if (use_extension)
-         context->preedit_mode = mode;
--    extension_visible = context->preedit_visible |
-+    }
-+    extension_visible = context->preedit_visible ||
-                         (context->emoji_extension != NULL);
- 
-     if (use_extension && context->emoji_extension) {
-diff --git a/src/ibuscomposetable.c b/src/ibuscomposetable.c
-index c50be2b3..ef20469c 100644
---- a/src/ibuscomposetable.c
-+++ b/src/ibuscomposetable.c
-@@ -382,7 +382,7 @@ ibus_compose_list_check_duplicated (GList *compose_list,
-             
-             if (n_outputs == unichar_length (output_chars)) {
-                 int j = 0;
--                while (compose_data->values[j] && j < n_outputs) {
-+                while (j < n_outputs && compose_data->values[j]) {
-                     if (compose_data->values[j] != output_chars[j])
-                         break;
-                     ++j;
-diff --git a/src/ibusxml.c b/src/ibusxml.c
-index 266a8207..b6d0feb8 100644
---- a/src/ibusxml.c
-+++ b/src/ibusxml.c
-@@ -148,7 +148,7 @@ _is_space (const gchar *text,
- {
-     gsize i = 0;
- 
--    for (i = 0; text[i] != '\0' && i < text_len; i++) {
-+    for (i = 0; i < text_len && text[i] != '\0'; i++) {
-         switch (text[i]) {
-         case '\t':
-         case ' ':
--- 
-2.24.1
-
-From 7caead10d3698ef1ecaa97e6e122e27a720d612e Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Thu, 3 Sep 2020 21:21:31 +0900
-Subject: [PATCH] Fix string formats in translatable strings
-
----
- data/dconf/org.freedesktop.ibus.gschema.xml |  2 +-
- setup/enginetreeview.py                     |  6 +++---
- setup/main.py                               |  6 +++---
- tools/main.vala                             |  4 ++--
- 6 files changed, 16 insertions(+), 16 deletions(-)
-
-diff --git a/data/dconf/org.freedesktop.ibus.gschema.xml b/data/dconf/org.freedesktop.ibus.gschema.xml
-index 11a179a6..a79e9296 100644
---- a/data/dconf/org.freedesktop.ibus.gschema.xml
-+++ b/data/dconf/org.freedesktop.ibus.gschema.xml
-@@ -195,7 +195,7 @@
-     <key name="lang" type="s">
-       <default>'en'</default>
-       <summary>Default language for emoji dictionary</summary>
--      <description>Choose a default language of emoji dictionaries on the emoji dialog. The value $lang is applied to /usr/share/ibus/dicts/emoji-$lang.dict</description>
-+      <description>Choose a default language of emoji dictionaries on the emoji dialog. The value $lang is applied to /usr/share/ibus/dicts/emoji-$lang.dict .</description>
-     </key>
-     <key name="favorites" type="as">
-       <default>[]</default>
-diff --git a/setup/enginetreeview.py b/setup/enginetreeview.py
-index aea84593..8534de5e 100644
---- a/setup/enginetreeview.py
-+++ b/setup/enginetreeview.py
-@@ -3,8 +3,8 @@
- # ibus - The Input Bus
- #
- # Copyright (c) 2007-2015 Peng Huang <shawn.p.huang@gmail.com>
--# Copyright (c) 2014-2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
--# Copyright (c) 2007-2018 Red Hat, Inc.
-+# Copyright (c) 2014-2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+# Copyright (c) 2007-2020 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
-@@ -93,7 +93,7 @@ class EngineTreeView(Gtk.TreeView):
-         renderer.set_property("has-entry", False)
-         renderer.set_property("editable", True)
- 
--        column = Gtk.TreeViewColumn(_("Kbd"))
-+        column = Gtk.TreeViewColumn("Kbd")
-         column.set_expand(False)
-         column.set_fixed_width(32)
-         column.set_sizing(Gtk.TreeViewColumnSizing.FIXED)
-diff --git a/setup/main.py b/setup/main.py
-index 8c8d7a47..673c8cde 100644
---- a/setup/main.py
-+++ b/setup/main.py
-@@ -4,8 +4,8 @@
- # ibus - The Input Bus
- #
- # Copyright (c) 2007-2016 Peng Huang <shawn.p.huang@gmail.com>
--# Copyright (c) 2010-2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
--# Copyright (c) 2007-2016 Red Hat, Inc.
-+# Copyright (c) 2010-2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+# Copyright (c) 2007-2020 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
-@@ -547,7 +547,7 @@ class Setup(object):
-             self.__flush_gtk_events()
-         else:
-             # Translators: %d == 5 currently
--            message = _("IBus daemon could not be started in %d seconds")
-+            message = _("IBus daemon could not be started in %d seconds.")
-             dlg = Gtk.MessageDialog(message_type = Gtk.MessageType.INFO,
-                                     buttons = Gtk.ButtonsType.OK,
-                                     text = message % timeout)
-diff --git a/tools/main.vala b/tools/main.vala
-index bf9c0fc9..26e7fd88 100644
---- a/tools/main.vala
-+++ b/tools/main.vala
-@@ -3,7 +3,7 @@
-  * ibus - The Input Bus
-  *
-  * Copyright(c) 2013 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright(c) 2015-2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright(c) 2015-2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
-  *
-  * This library is free software; you can redistribute it and/or
-  * modify it under the terms of the GNU Lesser General Public
-@@ -453,7 +453,7 @@ const CommandEntry commands[]  = {
-     { "read-config", N_("Show the configuration values"), read_config },
-     { "reset-config", N_("Reset the configuration values"), reset_config },
- #if EMOJI_DICT
--    { "emoji", N_("Save emoji on dialog to clipboard "), emoji_dialog },
-+    { "emoji", N_("Save emoji on dialog to clipboard"), emoji_dialog },
- #endif
-     { "help", N_("Show this information"), print_help }
- };
--- 
-2.24.1
-
-From a440942a62c46578377a8679c48146f597e338a4 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Wed, 9 Sep 2020 18:36:18 +0900
-Subject: [PATCH] ui/gtk3: Accept xdigits only for Unicode typing
-
-Ctrl-Shift-u behavior now follows GTK's one.
-
-BUG=https://github.com/ibus/ibus/issues/2249
----
- ui/gtk3/panelbinding.vala | 8 +++++---
- 1 file changed, 5 insertions(+), 3 deletions(-)
-
-diff --git a/ui/gtk3/panelbinding.vala b/ui/gtk3/panelbinding.vala
-index 01c43b0d..861255b1 100644
---- a/ui/gtk3/panelbinding.vala
-+++ b/ui/gtk3/panelbinding.vala
-@@ -3,7 +3,7 @@
-  * ibus - The Input Bus
-  *
-  * Copyright(c) 2018 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright(c) 2018 Takao Fujwiara <takao.fujiwara1@gmail.com>
-+ * Copyright(c) 2018-2020 Takao Fujwiara <takao.fujiwara1@gmail.com>
-  *
-  * This library is free software; you can redistribute it and/or
-  * modify it under the terms of the GNU Lesser General Public
-@@ -190,7 +190,7 @@ class Preedit : Gtk.Window {
- 
-     public IBus.Text get_commit_text() {
-         string extension_text = m_extension_preedit_emoji.get_text();
--        if (extension_text.length == 0)
-+        if (extension_text.length == 0 && m_prefix != "u")
-             extension_text = m_extension_preedit_text.get_text();
-         return new IBus.Text.from_string(extension_text);
-     }
-@@ -556,8 +556,10 @@ class PanelBinding : IBus.PanelService {
- 
-     private bool key_press_keyval(uint keyval) {
-         unichar ch = IBus.keyval_to_unicode(keyval);
-+        if (m_extension_name == "unicode" && !ch.isxdigit())
-+            return false;
-         if (ch.iscntrl())
--                return false;
-+            return false;
-         string str = ch.to_string();
-         m_preedit.append_text(str);
-         string annotation = m_preedit.get_text();
--- 
-2.24.1
-
-From 3aa670e9f8319fe064ce7c45ce56304ca5af94dc Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Wed, 9 Sep 2020 18:42:10 +0900
-Subject: [PATCH] engine: Fix to pull the correct language with no iso639
- variants
-
-Some variants have iso639 but others do not in evdev.xml and
-gensimple.py have to fallback to the layout iso639.
-
-BUG=rhbz#1876877
----
- engine/gensimple.py | 19 +++++++++++++++++--
- 1 file changed, 17 insertions(+), 2 deletions(-)
-
-diff --git a/engine/gensimple.py b/engine/gensimple.py
-index 18f7dc8c..de6d7ff5 100755
---- a/engine/gensimple.py
-+++ b/engine/gensimple.py
-@@ -90,6 +90,7 @@ class EvdevXML(XMLFilterBase):
-         self.__description = ''
-         self.__variant = ''
-         self.__list_iso639 = []
-+        self.__list_iso639_for_variant = []
-     def startDocument(self):
-         if self.__downstream:
-             self.__downstream.startDocument()
-@@ -106,7 +107,10 @@ class EvdevXML(XMLFilterBase):
-         elif name == 'configItem':
-             self.__is_config_item = True
-         elif name == 'languageList':
--            self.__list_iso639 = []
-+            if self.__is_variant and self.__is_config_item:
-+                self.__list_iso639_for_variant = []
-+            elif self.__is_layout and self.__is_config_item:
-+                self.__list_iso639 = []
-         elif name == 'iso639Id':
-             self.__is_iso639 = True
-         elif name == 'variant':
-@@ -129,6 +133,7 @@ class EvdevXML(XMLFilterBase):
-             self.__is_iso639 = False
-         elif name == 'variant':
-             self.__is_variant = False
-+            self.__list_iso639_for_variant = []
-         elif name == 'name':
-             self.__is_name = False
-     def characters(self, text):
-@@ -140,11 +145,21 @@ class EvdevXML(XMLFilterBase):
-             elif self.__is_layout and self.__is_config_item:
-                 self.__layout = text
-         elif self.__is_iso639:
-+            if self.__is_variant and self.__is_config_item:
-+                self.__list_iso639_for_variant.append(text)
-+            elif self.__is_layout and self.__is_config_item:
-                 self.__list_iso639.append(text)
-     def save(self):
-         if not self.__downstream:
-             return
--        for iso in self.__list_iso639:
-+        list_iso639 = []
-+        if self.__is_variant and self.__is_config_item:
-+            list_iso639 = self.__list_iso639_for_variant
-+            if len(list_iso639) == 0:
-+                list_iso639 = self.__list_iso639
-+        elif self.__is_layout and self.__is_config_item:
-+            list_iso639 = self.__list_iso639
-+        for iso in list_iso639:
-             do_deny = False
-             for [xkb, layout, variant, lang] in self.__denylist:
-                 if xkb == 'xkb' \
--- 
-2.24.1
-

^ permalink raw reply related	[flat|nested] 8+ messages in thread
* [rpms/ibus] autotool: Delete upstreamed ibus-HEAD.patch
@ 2026-05-31  2:07 Takao Fujiwara
  0 siblings, 0 replies; 8+ messages in thread
From: Takao Fujiwara @ 2026-05-31  2:07 UTC (permalink / raw)
  To: git-commits

A new commit has been pushed.

Repo   : rpms/ibus
Branch : autotool
Commit : f1eb5c5acd31cb925b78f50a629e2b1eb8ec8ff2
Author : Takao Fujiwara <tfujiwar@redhat.com>
Date   : 2019-08-23T19:58:27+09:00
Stats  : +0/-15310 in 1 file(s)
URL    : https://src.fedoraproject.org/rpms/ibus/c/f1eb5c5acd31cb925b78f50a629e2b1eb8ec8ff2?branch=autotool

Log:
Delete upstreamed ibus-HEAD.patch

---
diff --git a/ibus-HEAD.patch b/ibus-HEAD.patch
deleted file mode 100644
index ec88af6..0000000
--- a/ibus-HEAD.patch
+++ /dev/null
@@ -1,15310 +0,0 @@
-From 026b19ef169dd9612d8a4a1ee34f7c42e7215c9a Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Wed, 13 Mar 2019 19:16:17 +0900
-Subject: [PATCH 01/27] setup: Enable to run ibus-setup with a different python
-
-BUG=https://github.com/ibus/ibus/issues/2086
----
- setup/ibus-setup.in | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/setup/ibus-setup.in b/setup/ibus-setup.in
-index bb5c85cf..4a6830af 100644
---- a/setup/ibus-setup.in
-+++ b/setup/ibus-setup.in
-@@ -3,7 +3,7 @@
- # ibus - The Input Bus
- #
- # Copyright (c) 2007-2010 Peng Huang <shawn.p.huang@gmail.com>
--# Copyright (c) 2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+# Copyright (c) 2018-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
- # Copyright (c) 2007-2018 Red Hat, Inc.
- #
- # This library is free software; you can redistribute it and/or
-@@ -27,5 +27,5 @@ export IBUS_PREFIX=@prefix@
- export IBUS_DATAROOTDIR=@datarootdir@
- export IBUS_LOCALEDIR=@localedir@
- export IBUS_LIBEXECDIR=${libexecdir}
--exec @PYTHON@ @prefix@/share/ibus/setup/main.py $@
-+exec ${PYTHON:-@PYTHON@} @prefix@/share/ibus/setup/main.py $@
- 
--- 
-2.21.0
-
-From 2825bfc13618d382444aa1f87be22cd86e9bba29 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Wed, 13 Mar 2019 19:35:19 +0900
-Subject: [PATCH 02/27] src: Update ibusunicodegen.h for Unicode UCD 12.0
-
----
- src/ibusunicodegen.h | 36 ++++++++++++++++++++++++++++++++++++
- 1 file changed, 36 insertions(+)
-
-diff --git a/src/ibusunicodegen.h b/src/ibusunicodegen.h
-index 9952fe0a..6a60a5a9 100644
---- a/src/ibusunicodegen.h
-+++ b/src/ibusunicodegen.h
-@@ -855,6 +855,10 @@ const static char *unicode_blocks[] = {
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-     N_("Sogdian"),
-+    /* TRANSLATORS: You might refer the translations from gucharmap with
-+                    the following command:
-+       msgmerge -C gucharmap.po ibus.po ibus.pot */
-+    N_("Elymaic"),
-     /* TRANSLATORS: You might refer the translations from gucharmap with
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-@@ -935,6 +939,10 @@ const static char *unicode_blocks[] = {
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-     N_("Warang Citi"),
-+    /* TRANSLATORS: You might refer the translations from gucharmap with
-+                    the following command:
-+       msgmerge -C gucharmap.po ibus.po ibus.pot */
-+    N_("Nandinagari"),
-     /* TRANSLATORS: You might refer the translations from gucharmap with
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-@@ -967,6 +975,10 @@ const static char *unicode_blocks[] = {
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-     N_("Makasar"),
-+    /* TRANSLATORS: You might refer the translations from gucharmap with
-+                    the following command:
-+       msgmerge -C gucharmap.po ibus.po ibus.pot */
-+    N_("Tamil Supplement"),
-     /* TRANSLATORS: You might refer the translations from gucharmap with
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-@@ -983,6 +995,10 @@ const static char *unicode_blocks[] = {
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-     N_("Egyptian Hieroglyphs"),
-+    /* TRANSLATORS: You might refer the translations from gucharmap with
-+                    the following command:
-+       msgmerge -C gucharmap.po ibus.po ibus.pot */
-+    N_("Egyptian Hieroglyph Format Controls"),
-     /* TRANSLATORS: You might refer the translations from gucharmap with
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-@@ -1031,6 +1047,10 @@ const static char *unicode_blocks[] = {
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-     N_("Kana Extended-A"),
-+    /* TRANSLATORS: You might refer the translations from gucharmap with
-+                    the following command:
-+       msgmerge -C gucharmap.po ibus.po ibus.pot */
-+    N_("Small Kana Extension"),
-     /* TRANSLATORS: You might refer the translations from gucharmap with
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-@@ -1079,6 +1099,14 @@ const static char *unicode_blocks[] = {
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-     N_("Glagolitic Supplement"),
-+    /* TRANSLATORS: You might refer the translations from gucharmap with
-+                    the following command:
-+       msgmerge -C gucharmap.po ibus.po ibus.pot */
-+    N_("Nyiakeng Puachue Hmong"),
-+    /* TRANSLATORS: You might refer the translations from gucharmap with
-+                    the following command:
-+       msgmerge -C gucharmap.po ibus.po ibus.pot */
-+    N_("Wancho"),
-     /* TRANSLATORS: You might refer the translations from gucharmap with
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-@@ -1091,6 +1119,10 @@ const static char *unicode_blocks[] = {
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-     N_("Indic Siyaq Numbers"),
-+    /* TRANSLATORS: You might refer the translations from gucharmap with
-+                    the following command:
-+       msgmerge -C gucharmap.po ibus.po ibus.pot */
-+    N_("Ottoman Siyaq Numbers"),
-     /* TRANSLATORS: You might refer the translations from gucharmap with
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-@@ -1151,6 +1183,10 @@ const static char *unicode_blocks[] = {
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-     N_("Chess Symbols"),
-+    /* TRANSLATORS: You might refer the translations from gucharmap with
-+                    the following command:
-+       msgmerge -C gucharmap.po ibus.po ibus.pot */
-+    N_("Symbols and Pictographs Extended-A"),
-     /* TRANSLATORS: You might refer the translations from gucharmap with
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
--- 
-2.21.0
-
-From 6099a45f2e734458202383fdf157aea95b1f35a5 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Wed, 13 Mar 2019 19:36:05 +0900
-Subject: [PATCH 03/27] build: Delete built sources with MAINTAINERCLEANFILES
-
-BUG=https://github.com/ibus/ibus/issues/2082
----
- src/Makefile.am     | 9 ++++++++-
- ui/gtk3/Makefile.am | 6 ++++++
- 2 files changed, 14 insertions(+), 1 deletion(-)
-
-diff --git a/src/Makefile.am b/src/Makefile.am
-index 6a62e0f0..a8e3d07d 100644
---- a/src/Makefile.am
-+++ b/src/Makefile.am
-@@ -3,7 +3,7 @@
- # ibus - The Input Bus
- #
- # Copyright (c) 2007-2015 Peng Huang <shawn.p.huang@gmail.com>
--# Copyright (c) 2015-2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+# Copyright (c) 2015-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
- # Copyright (c) 2007-2017 Red Hat, Inc.
- #
- # This library is free software; you can redistribute it and/or
-@@ -256,6 +256,10 @@ dicts/emoji-en.dict: emoji-parser
- 	    echo "WARNING: Not found $(EMOJI_ANNOTATION_DIR)/en.xml" 1>&2; \
- 	fi; \
- 	for f in $(LANG_FILES) ; do \
-+	    if test -f dicts/emoji-$$f.dict; then \
-+	        echo "Already exists dicts/emoji-$$f.dict"; \
-+	        continue; \
-+	    fi; \
- 	    if test -f \
- 	    "$(EMOJI_ANNOTATION_DIR)/../annotationsDerived/$$f.xml" ; then \
- 	        xml_derived_option="--xml-derived $(EMOJI_ANNOTATION_DIR)/../annotationsDerived/$$f.xml"; \
-@@ -279,6 +283,9 @@ dicts/emoji-en.dict: emoji-parser
- 	    echo "Generated $$plus_comment dicts/emoji-$$f.dict"; \
- 	done
- 
-+ibusemojigen.h: dicts/emoji-en.dict
-+	$(NULL)
-+
- install-data-hook: $(dict_DATA)
- 	@$(NORMAL_INSTALL)
- 	$(AM_V_at)list='$(wildcard dicts/*.dict)'; \
-diff --git a/ui/gtk3/Makefile.am b/ui/gtk3/Makefile.am
-index 60205aa5..667d51c6 100644
---- a/ui/gtk3/Makefile.am
-+++ b/ui/gtk3/Makefile.am
-@@ -130,6 +130,8 @@ CLEANFILES =            \
-     gtkpanel.xml        \
-     $(NULL)
- 
-+MAINTAINERCLEANFILES =
-+
- emoji_headers =         \
-     ibusemojidialog.h   \
-     $(NULL)
-@@ -192,6 +194,8 @@ emojierapp.o: $(srcdir)/emojierapp.c
- 	$(AM_V_CC_no)$(COMPILE) -c -o $@ $<
- 	$(NULL)
- 
-+MAINTAINERCLEANFILES += emojierapp.c
-+
- component_DATA += gtkextension.xml
- CLEANFILES += gtkextension.xml
- libexec_PROGRAMS += ibus-extension-gtk3
-@@ -240,6 +244,8 @@ panelbinding.o: $(srcdir)/panelbinding.c
- 	$(AM_V_CC_no)$(COMPILE) -c -o $@ $<
- 	$(NULL)
- 
-+MAINTAINERCLEANFILES += extension.c panelbinding.c
-+
- man_seven_files = $(man_seven_in_files:.7.in=.7)
- man_seven_DATA =$(man_seven_files:.7=.7.gz)
- man_sevendir = $(mandir)/man7
--- 
-2.21.0
-
-From b497de5bc6525769e03b65c73fc991d4aa006223 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Wed, 20 Mar 2019 17:44:26 +0900
-Subject: [PATCH 04/27] test: Set GTK_IM_MODULE in test-console.sh
-
----
- src/tests/Makefile.am |  4 ++--
- 1 files changed, 14 insertions(+), 2 deletions(-)
-
-diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am
-index e337a59b..e2ff5ea7 100644
---- a/src/tests/Makefile.am
-+++ b/src/tests/Makefile.am
-@@ -3,7 +3,7 @@
- # ibus - The Input Bus
- #
- # Copyright (c) 2007-2015 Peng Huang <shawn.p.huang@gmail.com>
--# Copyright (c) 2015-2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+# Copyright (c) 2015-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
- # Copyright (c) 2007-2018 Red Hat, Inc.
- #
- # This library is free software; you can redistribute it and/or
-@@ -78,7 +78,7 @@ TESTS_ENVIRONMENT = \
- 
- LOG_COMPILER = $(srcdir)/runtest
- 
--EXTRA_DIST = runtest
-+EXTRA_DIST = runtest ibus-compose.env
- 
- ibus_bus_SOURCES = ibus-bus.c
- ibus_bus_LDADD = $(prog_ldadd)
--- 
-2.21.0
-
-From 1cb5032e85d85f496e349236d1b74f17fb8db966 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Tue, 23 Apr 2019 15:40:45 +0900
-Subject: [PATCH 05/27] configure: Move ibus-setup from configure.ac to
- Makefile.am
-
-@localedir@ can be extracted to ${datarootdir}/locale and
-it needs datarootdir=/usr/share in case configure.ac is used
-and deleting the datarootdir line caused a regression.
-All variables can be extracted in Makefile.am with sed.
----
- configure.ac      |  1 -
- setup/Makefile.am | 13 +++++++++++--
- 2 files changed, 11 insertions(+), 3 deletions(-)
-
-diff --git a/configure.ac b/configure.ac
-index 9518e808..7503f3e8 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -724,7 +724,6 @@ ibus/interface/Makefile
- ui/Makefile
- ui/gtk3/Makefile
- setup/Makefile
--setup/ibus-setup
- bindings/Makefile
- bindings/pygobject/Makefile
- bindings/vala/Makefile
-diff --git a/setup/Makefile.am b/setup/Makefile.am
-index cb4dd8d1..34c8f136 100644
---- a/setup/Makefile.am
-+++ b/setup/Makefile.am
-@@ -3,8 +3,8 @@
- # ibus - The Input Bus
- #
- # Copyright (c) 2007-2014 Peng Huang <shawn.p.huang@gmail.com>
--# Copyright (c) 2015-2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
--# Copyright (c) 2007-2018 Red Hat, Inc.
-+# Copyright (c) 2015-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+# Copyright (c) 2007-2019 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
-@@ -40,6 +40,15 @@ ibussetup_DATA = \
- bin_SCRIPTS = ibus-setup
- ibussetupdir = $(pkgdatadir)/setup
- 
-+ibus-setup: ibus-setup.in
-+	$(AM_V_GEN) sed -e "s|\@datarootdir\@|$(datarootdir)|g" \
-+	                -e "s|\@localedir\@|$(localedir)|g" \
-+	                -e "s|\@libexecdir\@|$(libexecdir)|g" \
-+	                -e "s|\@prefix\@|$(prefix)|g" \
-+	                -e "s|\@PYTHON\@|$(PYTHON)|g" \
-+	$< > $@.tmp && \
-+	mv $@.tmp $@
-+
- desktop_notrans_files = ibus-setup.desktop
- desktop_DATA = org.freedesktop.IBus.Setup.desktop
- desktopdir = $(datadir)/applications
--- 
-2.21.0
-
-From cc849c20d4dff31f6f88f93789790759bf087b77 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Tue, 23 Apr 2019 17:56:20 +0900
-Subject: [PATCH 06/27] NEWS: Add shortlog
-
-Update Makefile.am to insert shortlog in NEWS
-Update po/Makevars to add multiple COPYRIGHT_HOLDER
----
- Makefile.am | 7 +++++--
- po/Makevars | 3 ++-
- 2 files changed, 7 insertions(+), 3 deletions(-)
-
-diff --git a/Makefile.am b/Makefile.am
-index cf7460d6..9ff786dc 100644
---- a/Makefile.am
-+++ b/Makefile.am
-@@ -3,8 +3,8 @@
- # ibus - The Input Bus
- #
- # Copyright (c) 2007-2016 Peng Huang <shawn.p.huang@gmail.com>
--# Copyright (c) 2015-2017 Takao Fujiwara <takao.fujiwara1@gmail.com>
--# Copyright (c) 2007-2017 Red Hat, Inc.
-+# Copyright (c) 2015-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+# Copyright (c) 2007-2019 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
-@@ -103,6 +103,9 @@ dist-hook:
- "$(IBUS_MAJOR_VERSION).$(IBUS_MINOR_VERSION).$$IBUS_PREV_MICRO_VERSION"; \
- 		echo "Changes in IBus $(IBUS_VERSION)" > $(distdir)/NEWS; \
- 		echo "" >> $(distdir)/NEWS; \
-+		git shortlog $$IBUS_PREV_VERSION...$(IBUS_VERSION) \
-+		        >> $(distdir)/NEWS; \
-+		echo "" >> $(distdir)/NEWS; \
- 		git log $$IBUS_PREV_VERSION...$(IBUS_VERSION) --reverse \
- 		        --pretty=format:'%s (%an) %h' >> $(distdir)/NEWS; \
- 	fi
-diff --git a/po/Makevars b/po/Makevars
-index d3fbeab2..1d16cc98 100644
---- a/po/Makevars
-+++ b/po/Makevars
-@@ -20,7 +20,8 @@ XGETTEXT_OPTIONS = --from-code=UTF-8 --keyword=_ --keyword=N_ --keyword=C_:1c,2
- # or entity, or to disclaim their copyright.  The empty string stands for
- # the public domain; in this case the translators are expected to disclaim
- # their copyright.
--COPYRIGHT_HOLDER = Peng Huang <shawn.p.huang@gmail.com>
-+COPYRIGHT_HOLDER = Peng Huang <shawn.p.huang@gmail.com> \
-+Takao Fujiwara <takao.fujiwara1@gmail.com>
- 
- # This is the email address or URL to which the translators shall report
- # bugs in the untranslated strings:
--- 
-2.21.0
-
-From 1c54fea645b2ec3a385d492e4ca30a70dbb87c3a Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Tue, 23 Apr 2019 18:44:45 +0900
-Subject: [PATCH 07/27] data/its: Add ibus.its for IME's component files
-
-IBusEngineDesc has translatable strings in longname and
-description tags and they needs to be extracted by xgettext.
-
-After you install the ibus.[its|loc] to /usr/share/gettext/its,
-each engine's component file needs to renamed with
-'.inputMethod.xml' in the source directory suffix. E.g.
-Rename 'anthy.xml' to 'anthy.inputMethod.xml' and write the file
-path to the engine's POTFILES.in
----
- configure.ac         |  1 +
- data/Makefile.am     |  3 ++-
- data/its/Makefile.am | 29 +++++++++++++++++++++++++++++
- data/its/ibus.its    | 14 ++++++++++++++
- data/its/ibus.loc    |  7 +++++++
- 5 files changed, 53 insertions(+), 1 deletion(-)
- create mode 100644 data/its/Makefile.am
- create mode 100644 data/its/ibus.its
- create mode 100644 data/its/ibus.loc
-
-diff --git a/configure.ac b/configure.ac
-index 7503f3e8..b5a87b56 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -711,6 +711,7 @@ util/IMdkit/Makefile
- data/Makefile
- data/annotations/Makefile
- data/icons/Makefile
-+data/its/Makefile
- data/keymaps/Makefile
- data/dconf/Makefile
- docs/Makefile
-diff --git a/data/Makefile.am b/data/Makefile.am
-index 2533f444..aa3ee466 100644
---- a/data/Makefile.am
-+++ b/data/Makefile.am
-@@ -3,7 +3,7 @@
- # ibus - The Input Bus
- #
- # Copyright (c) 2007-2016 Peng Huang <shawn.p.huang@gmail.com>
--# Copyright (c) 2007-2018 Red Hat, Inc.
-+# Copyright (c) 2007-2019 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
-@@ -23,6 +23,7 @@
- SUBDIRS = \
- 	annotations \
- 	icons \
-+	its \
- 	keymaps \
- 	$(NULL)
- 
-diff --git a/data/its/Makefile.am b/data/its/Makefile.am
-new file mode 100644
-index 00000000..07c8a96d
---- /dev/null
-+++ b/data/its/Makefile.am
-@@ -0,0 +1,29 @@
-+# vim:set noet ts=4:
-+#
-+# ibus - The Input Bus
-+#
-+# Copyright (c) 2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+# Copyright (c) 2019 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.1 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
-+# USA
-+
-+itsdir = $(datadir)/gettext/its
-+its_DATA = \
-+    ibus.its \
-+    ibus.loc \
-+    $(NULL)
-+
-+-include $(top_srcdir)/git.mk
-diff --git a/data/its/ibus.its b/data/its/ibus.its
-new file mode 100644
-index 00000000..30d8d4e2
---- /dev/null
-+++ b/data/its/ibus.its
-@@ -0,0 +1,14 @@
-+<?xml version="1.0"?>
-+<its:rules xmlns:its="http://www.w3.org/2005/11/its"
-+           version="2.0">
-+  <its:translateRule selector="/component" translate="no"/>
-+  <its:translateRule selector="/engines" translate="no"/>
-+  <its:translateRule selector="//engine" translate="no"/>
-+  <its:translateRule selector="//longname |
-+                               //description"
-+                     translate="yes"/>
-+  <its:translateRule selector="//longname[@translatable = 'no']"
-+                     translate="no"/>
-+  <its:translateRule selector="//description[@translatable = 'no']"
-+                     translate="no"/>
-+</its:rules>
-diff --git a/data/its/ibus.loc b/data/its/ibus.loc
-new file mode 100644
-index 00000000..5a73798b
---- /dev/null
-+++ b/data/its/ibus.loc
-@@ -0,0 +1,7 @@
-+<?xml version="1.0"?>
-+<locatingRules>
-+  <locatingRule name="IBusEngineDesc" pattern="*.inputMethod.xml">
-+    <documentRule localName="engines" target="ibus.its"/>
-+    <documentRule localName="component" target="ibus.its"/>
-+  </locatingRule>
-+</locatingRules>
--- 
-2.21.0
-
-From 91a256163427f04eb7763196b4ffe553911d2e01 Mon Sep 17 00:00:00 2001
-From: Gunnar Hjalmarsson <gunnarhj@users.noreply.github.com>
-Date: Tue, 7 May 2019 19:42:28 +0900
-Subject: [PATCH 08/27] bus: Indistinguishable address of ibus-daemon
-
-BUG=https://github.com/ibus/ibus/issues/2095
----
- bus/global.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/bus/global.c b/bus/global.c
-index f147cd6f..2ba8b2a7 100644
---- a/bus/global.c
-+++ b/bus/global.c
-@@ -24,7 +24,7 @@
- #include "global.h"
- 
- gchar **g_argv = NULL;
--gchar *g_address = "unix:tmpdir=/tmp";
-+gchar *g_address = "unix:tmpdir=/tmp/ibus";
- gchar *g_cache = "auto";
- gboolean g_mempro = FALSE;
- gboolean g_verbose = FALSE;
--- 
-2.21.0
-
-From 05a10950d635602fb3fcf4ed0021aa0b15dbd698 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Thu, 9 May 2019 15:49:09 +0900
-Subject: [PATCH 09/27] src: Make ISO 639 language names with title
-
-Danish translations are small in iso-codes-iso-639-2-da.po for the
-genral usage but the users ask the title format on UI.
-Now ibus_get_language_name() and ibus_get_untranslated_language_name()
-return the dynamic allocation instead of the static characters
-to make the capital character.
-
-BUG=https://github.com/ibus/ibus/issues/2079
----
- src/ibusutil.c | 63 ++++++++++++++++++++++++++++++++++++++++++--------
- src/ibusutil.h |  8 +++----
- 2 files changed, 58 insertions(+), 13 deletions(-)
-
-diff --git a/src/ibusutil.c b/src/ibusutil.c
-index fd1da006..9d003e2e 100644
---- a/src/ibusutil.c
-+++ b/src/ibusutil.c
-@@ -2,7 +2,7 @@
- /* vim:set et sts=4: */
- /* bus - The Input Bus
-  * Copyright (C) 2008-2015 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright (C) 2010-2017 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2010-2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
-  * Copyright (C) 2008-2016 Red Hat, Inc.
-  *
-  * This library is free software; you can redistribute it and/or
-@@ -125,8 +125,8 @@ _load_lang()
-     ibus_xml_free (node);
- }
- 
--const gchar *
--ibus_get_untranslated_language_name (const gchar *_locale)
-+const static gchar *
-+ibus_get_untranslated_raw_language_name (const gchar *_locale)
- {
-     const gchar *retval;
-     gchar *p = NULL;
-@@ -148,19 +148,64 @@ ibus_get_untranslated_language_name (const gchar *_locale)
-         return "Other";
- }
- 
--const gchar *
-+static char *
-+get_first_item_in_semicolon_list (const char *list)
-+{
-+        char **items;
-+        char  *item;
-+
-+        items = g_strsplit (list, "; ", 2);
-+
-+        item = g_strdup (items[0]);
-+        g_strfreev (items);
-+
-+        return item;
-+}
-+
-+static char *
-+capitalize_utf8_string (const char *str)
-+{
-+    char first[8] = { 0 };
-+
-+    if (!str)
-+        return NULL;
-+
-+    g_unichar_to_utf8 (g_unichar_totitle (g_utf8_get_char (str)), first);
-+
-+    return g_strconcat (first, g_utf8_offset_to_pointer (str, 1), NULL);
-+}
-+
-+gchar *
-+ibus_get_untranslated_language_name (const gchar *_locale)
-+{
-+    const gchar *raw = ibus_get_untranslated_raw_language_name (_locale);
-+    gchar *tmp = get_first_item_in_semicolon_list (raw);
-+    gchar *retval = capitalize_utf8_string (tmp);
-+    g_free (tmp);
-+    return retval;
-+}
-+
-+gchar *
- ibus_get_language_name (const gchar *_locale)
- {
--    const gchar *retval = ibus_get_untranslated_language_name (_locale);
-+    const gchar *raw = ibus_get_untranslated_raw_language_name (_locale);
-+    const gchar *translation = NULL;
-+    gchar *tmp;
-+    gchar *retval;
- 
- #ifdef ENABLE_NLS
--    if (g_strcmp0 (retval, "Other") == 0)
--        return dgettext (GETTEXT_PACKAGE, N_("Other"));
-+    if (g_strcmp0 (raw, "Other") == 0)
-+        return g_strdup (dgettext (GETTEXT_PACKAGE, N_("Other")));
-     else
--        return dgettext ("iso_639-3", retval);
-+        translation = dgettext ("iso_639-3", raw);
- #else
--    return retval;
-+    translation = raw;
- #endif
-+
-+    tmp = get_first_item_in_semicolon_list (translation);
-+    retval = capitalize_utf8_string (tmp);
-+    g_free (tmp);
-+    return retval;
- }
- 
- void
-diff --git a/src/ibusutil.h b/src/ibusutil.h
-index 226dd7a8..795365f6 100644
---- a/src/ibusutil.h
-+++ b/src/ibusutil.h
-@@ -2,8 +2,8 @@
- /* vim:set et sts=4: */
- /* bus - The Input Bus
-  * Copyright (C) 2008-2015 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright (C) 2010-2017 Takao Fujiwara <takao.fujiwara1@gmail.com>
-- * Copyright (C) 2008-2016 Red Hat, Inc.
-+ * Copyright (C) 2010-2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2008-2018 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
-@@ -42,7 +42,7 @@
-  *
-  * Returns: untranslated language name
-  */
--const gchar *    ibus_get_untranslated_language_name
-+gchar *          ibus_get_untranslated_language_name
-                                                 (const gchar    *_locale);
- 
- /**
-@@ -51,6 +51,6 @@ const gchar *    ibus_get_untranslated_language_name
-  *
-  * Returns: translated language name
-  */
--const gchar *    ibus_get_language_name         (const gchar    *_locale);
-+gchar *          ibus_get_language_name         (const gchar    *_locale);
- 
- #endif
--- 
-2.21.0
-
-From cebe7a9553de69943b955ec99285f74961c9ee4e Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Thu, 9 May 2019 15:49:21 +0900
-Subject: [PATCH 10/27] client/gtk2: Keep preedit cursor_pos and visible in
- clearing preedit text
-
-Clear the preedit_string but keep the preedit_cursor_pos and
-preedit_visible because a time lag could happen, firefox commit
-the preedit text before the preedit text is cleared and it cause
-a double commits of the Hangul preedit in firefox if the preedit
-would be located on the URL bar and click on anywhere of firefox
-out of the URL bar.
----
- client/gtk2/ibusimcontext.c | 12 ++++++++++--
- 1 file changed, 10 insertions(+), 2 deletions(-)
-
-diff --git a/client/gtk2/ibusimcontext.c b/client/gtk2/ibusimcontext.c
-index 264a747a..5e3457ba 100644
---- a/client/gtk2/ibusimcontext.c
-+++ b/client/gtk2/ibusimcontext.c
-@@ -881,10 +881,18 @@ ibus_im_context_clear_preedit_text (IBusIMContext *ibusimcontext)
-         ibusimcontext->preedit_mode == IBUS_ENGINE_PREEDIT_COMMIT) {
-         preedit_string = g_strdup (ibusimcontext->preedit_string);
-     }
-+
-+    /* Clear the preedit_string but keep the preedit_cursor_pos and
-+     * preedit_visible because a time lag could happen, firefox commit
-+     * the preedit text before the preedit text is cleared and it cause
-+     * a double commits of the Hangul preedit in firefox if the preedit
-+     * would be located on the URL bar and click on anywhere of firefox
-+     * out of the URL bar.
-+     */
-     _ibus_context_update_preedit_text_cb (ibusimcontext->ibuscontext,
-                                           ibus_text_new_from_string (""),
--                                          0,
--                                          FALSE,
-+                                          ibusimcontext->preedit_cursor_pos,
-+                                          ibusimcontext->preedit_visible,
-                                           IBUS_ENGINE_PREEDIT_CLEAR,
-                                           ibusimcontext);
-     if (preedit_string) {
--- 
-2.21.0
-
-From b59f7f823b7b2051e4ca31834f9299a72f01b339 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Thu, 9 May 2019 17:02:21 +0900
-Subject: [PATCH 14/27] src: Support 32bit and multiple compose outputs
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Compose file in en_US.UTF-8 now includes wide codepoints more than
-U+FFFF likes '<Multi_key> <F> <U> : "🖕"  U1F595' but the current
-gtk_compose_seqs_compact[] is a guint16 array.
-To support 32bit and multiple compose outputs, the array is now
-separated to 16bit and 32bit arrays and 32bit array is also
-separated to gtk_compose_seqs_compact_32bit_first[] for 16bit
-key sequences and gtk_compose_seqs_compact_32bit_second[] for
-32bit output values.
-
-BUG=https://github.com/ibus/ibus/issues/2074
----
- src/gtkimcontextsimpleseqs.h  | 9912 +++++++++++++++++----------------
- src/ibuscomposetable.h        |   13 +-
- src/ibusenginesimple.c        |  166 +-
- src/ibusenginesimpleprivate.h |    8 +-
- 4 files changed, 5380 insertions(+), 4719 deletions(-)
-
-diff --git a/src/gtkimcontextsimpleseqs.h b/src/gtkimcontextsimpleseqs.h
-index 632391a1..ffa5f125 100644
---- a/src/gtkimcontextsimpleseqs.h
-+++ b/src/gtkimcontextsimpleseqs.h
-@@ -94,4680 +94,5244 @@ IBUS_KEY_dead_belowdiaeresis, 3705, 3705, 3708, 3708, 3708,
- IBUS_KEY_dead_belowcomma, 3708, 3722, 3722, 3722, 3722, 
- IBUS_KEY_dead_currency, 3722, 3820, 3826, 3826, 3826, 
- IBUS_KEY_dead_greek, 3826, 3928, 3952, 3952, 3952, 
--IBUS_KEY_Multi_key, 3952, 3952, 10348, 14044, 15919, 
--IBUS_KEY_Greek_iota, 0x0390, 
--IBUS_KEY_Greek_upsilon, 0x03B0, 
--IBUS_KEY_space, 0x0060, 
--IBUS_KEY_V, 0x01DB, 
--IBUS_KEY_v, 0x01DC, 
--IBUS_KEY_nobreakspace, 0x0300, 
--IBUS_KEY_Abreve, 0x1EB0, 
--IBUS_KEY_abreve, 0x1EB1, 
--IBUS_KEY_Emacron, 0x1E14, 
--IBUS_KEY_emacron, 0x1E15, 
--IBUS_KEY_Omacron, 0x1E50, 
--IBUS_KEY_omacron, 0x1E51, 
--IBUS_KEY_Cyrillic_ie, 0x0450, 
--IBUS_KEY_Cyrillic_i, 0x045D, 
--IBUS_KEY_Cyrillic_IE, 0x0400, 
--IBUS_KEY_Cyrillic_I, 0x040D, 
--IBUS_KEY_Greek_iotadieresis, 0x1FD2, 
--IBUS_KEY_Greek_upsilondieresis, 0x1FE2, 
--IBUS_KEY_Greek_ALPHA, 0x1FBA, 
--IBUS_KEY_Greek_EPSILON, 0x1FC8, 
--IBUS_KEY_Greek_ETA, 0x1FCA, 
--IBUS_KEY_Greek_IOTA, 0x1FDA, 
--IBUS_KEY_Greek_OMICRON, 0x1FF8, 
--IBUS_KEY_Greek_UPSILON, 0x1FEA, 
--IBUS_KEY_Greek_OMEGA, 0x1FFA, 
--IBUS_KEY_Greek_alpha, 0x1F70, 
--IBUS_KEY_Greek_epsilon, 0x1F72, 
--IBUS_KEY_Greek_eta, 0x1F74, 
--IBUS_KEY_Greek_iota, 0x1F76, 
--IBUS_KEY_Greek_omicron, 0x1F78, 
--IBUS_KEY_Greek_upsilon, 0x1F7A, 
--IBUS_KEY_Greek_omega, 0x1F7C, 
--IBUS_KEY_dead_grave, 0x0060, 
--IBUS_KEY_dead_diaeresis, IBUS_KEY_Greek_iota, 0x1FD2, 
--IBUS_KEY_dead_diaeresis, IBUS_KEY_Greek_upsilon, 0x1FE2, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA, 0x1F0A, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_EPSILON, 0x1F1A, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA, 0x1F2A, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_IOTA, 0x1F3A, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMICRON, 0x1F4A, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA, 0x1F6A, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha, 0x1F02, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_epsilon, 0x1F12, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta, 0x1F22, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_iota, 0x1F32, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_omicron, 0x1F42, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_upsilon, 0x1F52, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega, 0x1F62, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA, 0x1F0B, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_EPSILON, 0x1F1B, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA, 0x1F2B, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_IOTA, 0x1F3B, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMICRON, 0x1F4B, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_UPSILON, 0x1F5B, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA, 0x1F6B, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha, 0x1F03, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_epsilon, 0x1F13, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta, 0x1F23, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_iota, 0x1F33, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omicron, 0x1F43, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_upsilon, 0x1F53, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega, 0x1F63, 
--IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_U, 0x01DB, 
--IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_u, 0x01DC, 
--IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_Greek_iota, 0x1FD2, 
--IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_Greek_upsilon, 0x1FE2, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA, 0x1F0B, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_EPSILON, 0x1F1B, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA, 0x1F2B, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_IOTA, 0x1F3B, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMICRON, 0x1F4B, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_UPSILON, 0x1F5B, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA, 0x1F6B, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha, 0x1F03, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_epsilon, 0x1F13, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta, 0x1F23, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_iota, 0x1F33, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_omicron, 0x1F43, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_upsilon, 0x1F53, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega, 0x1F63, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA, 0x1F0A, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_EPSILON, 0x1F1A, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA, 0x1F2A, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_IOTA, 0x1F3A, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_OMICRON, 0x1F4A, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA, 0x1F6A, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha, 0x1F02, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_epsilon, 0x1F12, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_eta, 0x1F22, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_iota, 0x1F32, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_omicron, 0x1F42, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_upsilon, 0x1F52, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_omega, 0x1F62, 
--IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_O, 0x1EDC, 
--IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_U, 0x1EEA, 
--IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_o, 0x1EDD, 
--IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_u, 0x1EEB, 
--IBUS_KEY_Multi_key, IBUS_KEY_U, IBUS_KEY_A, 0x1EB0, 
--IBUS_KEY_Multi_key, IBUS_KEY_U, IBUS_KEY_a, 0x1EB1, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_A, 0x1EA6, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_E, 0x1EC0, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_O, 0x1ED2, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_a, 0x1EA7, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_e, 0x1EC1, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_o, 0x1ED3, 
--IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_E, 0x1E14, 
--IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_O, 0x1E50, 
--IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_e, 0x1E15, 
--IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_o, 0x1E51, 
--IBUS_KEY_Multi_key, IBUS_KEY_b, IBUS_KEY_A, 0x1EB0, 
--IBUS_KEY_Multi_key, IBUS_KEY_b, IBUS_KEY_a, 0x1EB1, 
--IBUS_KEY_Multi_key, IBUS_KEY_macron, IBUS_KEY_E, 0x1E14, 
--IBUS_KEY_Multi_key, IBUS_KEY_macron, IBUS_KEY_O, 0x1E50, 
--IBUS_KEY_Multi_key, IBUS_KEY_macron, IBUS_KEY_e, 0x1E15, 
--IBUS_KEY_Multi_key, IBUS_KEY_macron, IBUS_KEY_o, 0x1E51, 
--IBUS_KEY_space, 0x0027, 
--IBUS_KEY_V, 0x01D7, 
--IBUS_KEY_v, 0x01D8, 
--IBUS_KEY_nobreakspace, 0x0301, 
--IBUS_KEY_Abreve, 0x1EAE, 
--IBUS_KEY_abreve, 0x1EAF, 
--IBUS_KEY_Emacron, 0x1E16, 
--IBUS_KEY_emacron, 0x1E17, 
--IBUS_KEY_Utilde, 0x1E78, 
--IBUS_KEY_omacron, 0x1E53, 
--IBUS_KEY_utilde, 0x1E79, 
--IBUS_KEY_Cyrillic_ghe, 0x0453, 
--IBUS_KEY_Cyrillic_ka, 0x045C, 
--IBUS_KEY_Cyrillic_GHE, 0x0403, 
--IBUS_KEY_Cyrillic_KA, 0x040C, 
--IBUS_KEY_Greek_iotadieresis, 0x0390, 
--IBUS_KEY_Greek_upsilondieresis, 0x03B0, 
--IBUS_KEY_Greek_ALPHA, 0x0386, 
--IBUS_KEY_Greek_EPSILON, 0x0388, 
--IBUS_KEY_Greek_ETA, 0x0389, 
--IBUS_KEY_Greek_IOTA, 0x038A, 
--IBUS_KEY_Greek_OMICRON, 0x038C, 
--IBUS_KEY_Greek_UPSILON, 0x038E, 
--IBUS_KEY_Greek_OMEGA, 0x038F, 
--IBUS_KEY_Greek_alpha, 0x03AC, 
--IBUS_KEY_Greek_epsilon, 0x03AD, 
--IBUS_KEY_Greek_eta, 0x03AE, 
--IBUS_KEY_Greek_iota, 0x03AF, 
--IBUS_KEY_Greek_omicron, 0x03CC, 
--IBUS_KEY_Greek_upsilon, 0x03CD, 
--IBUS_KEY_Greek_omega, 0x03CE, 
--IBUS_KEY_dead_acute, 0x00B4, 
--IBUS_KEY_dead_diaeresis, IBUS_KEY_space, 0x0385, 
--IBUS_KEY_dead_diaeresis, IBUS_KEY_Greek_iota, 0x0390, 
--IBUS_KEY_dead_diaeresis, IBUS_KEY_Greek_upsilon, 0x03B0, 
--IBUS_KEY_dead_stroke, IBUS_KEY_O, 0x01FE, 
--IBUS_KEY_dead_stroke, IBUS_KEY_o, 0x01FF, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA, 0x1F0C, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_EPSILON, 0x1F1C, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA, 0x1F2C, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_IOTA, 0x1F3C, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMICRON, 0x1F4C, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA, 0x1F6C, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha, 0x1F04, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_epsilon, 0x1F14, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta, 0x1F24, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_iota, 0x1F34, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_omicron, 0x1F44, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_upsilon, 0x1F54, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega, 0x1F64, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA, 0x1F0D, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_EPSILON, 0x1F1D, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA, 0x1F2D, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_IOTA, 0x1F3D, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMICRON, 0x1F4D, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_UPSILON, 0x1F5D, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA, 0x1F6D, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha, 0x1F05, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_epsilon, 0x1F15, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta, 0x1F25, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_iota, 0x1F35, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omicron, 0x1F45, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_upsilon, 0x1F55, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega, 0x1F65, 
--IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_I, 0x1E2E, 
--IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_U, 0x01D7, 
--IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_i, 0x1E2F, 
--IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_u, 0x01D8, 
--IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_Greek_iota, 0x0390, 
--IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_Greek_upsilon, 0x03B0, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA, 0x1F0D, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_EPSILON, 0x1F1D, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA, 0x1F2D, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_IOTA, 0x1F3D, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMICRON, 0x1F4D, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_UPSILON, 0x1F5D, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA, 0x1F6D, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha, 0x1F05, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_epsilon, 0x1F15, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta, 0x1F25, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_iota, 0x1F35, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_omicron, 0x1F45, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_upsilon, 0x1F55, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega, 0x1F65, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA, 0x1F0C, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_EPSILON, 0x1F1C, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA, 0x1F2C, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_IOTA, 0x1F3C, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_OMICRON, 0x1F4C, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA, 0x1F6C, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha, 0x1F04, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_epsilon, 0x1F14, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_eta, 0x1F24, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_iota, 0x1F34, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_omicron, 0x1F44, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_upsilon, 0x1F54, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_omega, 0x1F64, 
--IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_O, 0x1EDA, 
--IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_U, 0x1EE8, 
--IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_o, 0x1EDB, 
--IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_u, 0x1EE9, 
--IBUS_KEY_Multi_key, IBUS_KEY_comma, IBUS_KEY_C, 0x1E08, 
--IBUS_KEY_Multi_key, IBUS_KEY_comma, IBUS_KEY_c, 0x1E09, 
--IBUS_KEY_Multi_key, IBUS_KEY_slash, IBUS_KEY_O, 0x01FE, 
--IBUS_KEY_Multi_key, IBUS_KEY_slash, IBUS_KEY_o, 0x01FF, 
--IBUS_KEY_Multi_key, IBUS_KEY_U, IBUS_KEY_A, 0x1EAE, 
--IBUS_KEY_Multi_key, IBUS_KEY_U, IBUS_KEY_a, 0x1EAF, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_A, 0x1EA4, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_E, 0x1EBE, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_O, 0x1ED0, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_a, 0x1EA5, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_e, 0x1EBF, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_o, 0x1ED1, 
--IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_E, 0x1E16, 
--IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_O, 0x1E52, 
--IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_e, 0x1E17, 
--IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_o, 0x1E53, 
--IBUS_KEY_Multi_key, IBUS_KEY_b, IBUS_KEY_A, 0x1EAE, 
--IBUS_KEY_Multi_key, IBUS_KEY_b, IBUS_KEY_a, 0x1EAF, 
--IBUS_KEY_Multi_key, IBUS_KEY_o, IBUS_KEY_A, 0x01FA, 
--IBUS_KEY_Multi_key, IBUS_KEY_o, IBUS_KEY_a, 0x01FB, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_O, 0x1E4C, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_U, 0x1E78, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_o, 0x1E4D, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_u, 0x1E79, 
--IBUS_KEY_Multi_key, IBUS_KEY_macron, IBUS_KEY_E, 0x1E16, 
--IBUS_KEY_Multi_key, IBUS_KEY_macron, IBUS_KEY_O, 0x1E52, 
--IBUS_KEY_Multi_key, IBUS_KEY_macron, IBUS_KEY_e, 0x1E17, 
--IBUS_KEY_Multi_key, IBUS_KEY_macron, IBUS_KEY_o, 0x1E53, 
--IBUS_KEY_Multi_key, IBUS_KEY_cedilla, IBUS_KEY_C, 0x1E08, 
--IBUS_KEY_Multi_key, IBUS_KEY_cedilla, IBUS_KEY_c, 0x1E09, 
--IBUS_KEY_Multi_key, IBUS_KEY_KP_Divide, IBUS_KEY_O, 0x01FE, 
--IBUS_KEY_Multi_key, IBUS_KEY_KP_Divide, IBUS_KEY_o, 0x01FF, 
--IBUS_KEY_space, 0x005E, 
--IBUS_KEY_parenleft, 0x207D, 
--IBUS_KEY_parenright, 0x207E, 
--IBUS_KEY_plus, 0x207A, 
--IBUS_KEY_minus, 0x207B, 
--IBUS_KEY_0, 0x2070, 
--IBUS_KEY_1, 0x00B9, 
--IBUS_KEY_2, 0x00B2, 
--IBUS_KEY_3, 0x00B3, 
--IBUS_KEY_4, 0x2074, 
--IBUS_KEY_5, 0x2075, 
--IBUS_KEY_6, 0x2076, 
--IBUS_KEY_7, 0x2077, 
--IBUS_KEY_8, 0x2078, 
--IBUS_KEY_9, 0x2079, 
--IBUS_KEY_equal, 0x207C, 
--IBUS_KEY_nobreakspace, 0x0302, 
--IBUS_KEY_Agrave, 0x1EA6, 
--IBUS_KEY_Aacute, 0x1EA4, 
--IBUS_KEY_Atilde, 0x1EAA, 
--IBUS_KEY_Egrave, 0x1EC0, 
--IBUS_KEY_Eacute, 0x1EBE, 
--IBUS_KEY_Ograve, 0x1ED2, 
--IBUS_KEY_Oacute, 0x1ED0, 
--IBUS_KEY_Otilde, 0x1ED6, 
--IBUS_KEY_agrave, 0x1EA7, 
--IBUS_KEY_aacute, 0x1EA5, 
--IBUS_KEY_atilde, 0x1EAB, 
--IBUS_KEY_egrave, 0x1EC1, 
--IBUS_KEY_eacute, 0x1EBF, 
--IBUS_KEY_ograve, 0x1ED3, 
--IBUS_KEY_oacute, 0x1ED1, 
--IBUS_KEY_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_KEY_dead_circumflex, 0x005E, 
--IBUS_KEY_KP_Space, 0x00B2, 
--IBUS_KEY_KP_Add, 0x207A, 
--IBUS_KEY_KP_0, 0x2070, 
--IBUS_KEY_KP_1, 0x00B9, 
--IBUS_KEY_KP_2, 0x00B2, 
--IBUS_KEY_KP_3, 0x00B3, 
--IBUS_KEY_KP_4, 0x2074, 
--IBUS_KEY_KP_5, 0x2075, 
--IBUS_KEY_KP_6, 0x2076, 
--IBUS_KEY_KP_7, 0x2077, 
--IBUS_KEY_KP_8, 0x2078, 
--IBUS_KEY_KP_9, 0x2079, 
--IBUS_KEY_KP_Equal, 0x207C, 
--IBUS_KEY_Multi_key, IBUS_KEY_exclam, IBUS_KEY_A, 0x1EAC, 
--IBUS_KEY_Multi_key, IBUS_KEY_exclam, IBUS_KEY_E, 0x1EC6, 
--IBUS_KEY_Multi_key, IBUS_KEY_exclam, IBUS_KEY_O, 0x1ED8, 
--IBUS_KEY_Multi_key, IBUS_KEY_exclam, IBUS_KEY_a, 0x1EAD, 
--IBUS_KEY_Multi_key, IBUS_KEY_exclam, IBUS_KEY_e, 0x1EC7, 
--IBUS_KEY_Multi_key, IBUS_KEY_exclam, IBUS_KEY_o, 0x1ED9, 
--IBUS_KEY_Multi_key, IBUS_KEY_S, IBUS_KEY_M, 0x2120, 
--IBUS_KEY_Multi_key, IBUS_KEY_S, IBUS_KEY_m, 0x2120, 
--IBUS_KEY_Multi_key, IBUS_KEY_T, IBUS_KEY_M, 0x2122, 
--IBUS_KEY_Multi_key, IBUS_KEY_T, IBUS_KEY_m, 0x2122, 
--IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_a, 0x00AA, 
--IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_h, 0x02B0, 
--IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_i, 0x2071, 
--IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_j, 0x02B2, 
--IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_l, 0x02E1, 
--IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_n, 0x207F, 
--IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_o, 0x00BA, 
--IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_r, 0x02B3, 
--IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_s, 0x02E2, 
--IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_w, 0x02B7, 
--IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_x, 0x02E3, 
--IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_y, 0x02B8, 
--IBUS_KEY_Multi_key, IBUS_KEY_underscore, 0x0263, 0x02E0, 
--IBUS_KEY_Multi_key, IBUS_KEY_underscore, 0x0266, 0x02B1, 
--IBUS_KEY_Multi_key, IBUS_KEY_underscore, 0x0279, 0x02B4, 
--IBUS_KEY_Multi_key, IBUS_KEY_underscore, 0x027B, 0x02B5, 
--IBUS_KEY_Multi_key, IBUS_KEY_underscore, 0x0281, 0x02B6, 
--IBUS_KEY_Multi_key, IBUS_KEY_underscore, 0x0295, 0x02E4, 
--IBUS_KEY_Multi_key, IBUS_KEY_s, IBUS_KEY_M, 0x2120, 
--IBUS_KEY_Multi_key, IBUS_KEY_s, IBUS_KEY_m, 0x2120, 
--IBUS_KEY_Multi_key, IBUS_KEY_t, IBUS_KEY_M, 0x2122, 
--IBUS_KEY_Multi_key, IBUS_KEY_t, IBUS_KEY_m, 0x2122, 
--IBUS_KEY_Multi_key, IBUS_KEY_underbar, IBUS_KEY_a, 0x00AA, 
--IBUS_KEY_Multi_key, IBUS_KEY_underbar, IBUS_KEY_h, 0x02B0, 
--IBUS_KEY_Multi_key, IBUS_KEY_underbar, IBUS_KEY_i, 0x2071, 
--IBUS_KEY_Multi_key, IBUS_KEY_underbar, IBUS_KEY_j, 0x02B2, 
--IBUS_KEY_Multi_key, IBUS_KEY_underbar, IBUS_KEY_l, 0x02E1, 
--IBUS_KEY_Multi_key, IBUS_KEY_underbar, IBUS_KEY_n, 0x207F, 
--IBUS_KEY_Multi_key, IBUS_KEY_underbar, IBUS_KEY_o, 0x00BA, 
--IBUS_KEY_Multi_key, IBUS_KEY_underbar, IBUS_KEY_r, 0x02B3, 
--IBUS_KEY_Multi_key, IBUS_KEY_underbar, IBUS_KEY_s, 0x02E2, 
--IBUS_KEY_Multi_key, IBUS_KEY_underbar, IBUS_KEY_w, 0x02B7, 
--IBUS_KEY_Multi_key, IBUS_KEY_underbar, IBUS_KEY_x, 0x02E3, 
--IBUS_KEY_Multi_key, IBUS_KEY_underbar, IBUS_KEY_y, 0x02B8, 
--IBUS_KEY_Multi_key, IBUS_KEY_underbar, 0x0263, 0x02E0, 
--IBUS_KEY_Multi_key, IBUS_KEY_underbar, 0x0266, 0x02B1, 
--IBUS_KEY_Multi_key, IBUS_KEY_underbar, 0x0279, 0x02B4, 
--IBUS_KEY_Multi_key, IBUS_KEY_underbar, 0x027B, 0x02B5, 
--IBUS_KEY_Multi_key, IBUS_KEY_underbar, 0x0281, 0x02B6, 
--IBUS_KEY_Multi_key, IBUS_KEY_underbar, 0x0295, 0x02E4, 
--IBUS_KEY_space, 0x007E, 
--IBUS_KEY_less, 0x2272, 
--IBUS_KEY_equal, 0x2243, 
--IBUS_KEY_greater, 0x2273, 
--IBUS_KEY_nobreakspace, 0x0303, 
--IBUS_KEY_Oacute, 0x1E4C, 
--IBUS_KEY_Odiaeresis, 0x1E4E, 
--IBUS_KEY_Uacute, 0x1E78, 
--IBUS_KEY_oacute, 0x1E4D, 
--IBUS_KEY_odiaeresis, 0x1E4F, 
--IBUS_KEY_uacute, 0x1E79, 
--IBUS_KEY_Abreve, 0x1EB4, 
--IBUS_KEY_abreve, 0x1EB5, 
--IBUS_KEY_Omacron, 0x022C, 
--IBUS_KEY_omacron, 0x022D, 
--IBUS_KEY_Greek_iotadieresis, 0x1FD7, 
--IBUS_KEY_Greek_upsilondieresis, 0x1FE7, 
--IBUS_KEY_Greek_alpha, 0x1FB6, 
--IBUS_KEY_Greek_eta, 0x1FC6, 
--IBUS_KEY_Greek_iota, 0x1FD6, 
--IBUS_KEY_Greek_upsilon, 0x1FE6, 
--IBUS_KEY_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_KEY_dead_tilde, 0x007E, 
--IBUS_KEY_dead_diaeresis, IBUS_KEY_Greek_iota, 0x1FD7, 
--IBUS_KEY_dead_diaeresis, IBUS_KEY_Greek_upsilon, 0x1FE7, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA, 0x1F0E, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA, 0x1F2E, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_IOTA, 0x1F3E, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA, 0x1F6E, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha, 0x1F06, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta, 0x1F26, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_iota, 0x1F36, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_upsilon, 0x1F56, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega, 0x1F66, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA, 0x1F0F, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA, 0x1F2F, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_IOTA, 0x1F3F, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_UPSILON, 0x1F5F, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA, 0x1F6F, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha, 0x1F07, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta, 0x1F27, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_iota, 0x1F37, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_upsilon, 0x1F57, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega, 0x1F67, 
--IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_Greek_iota, 0x1FD7, 
--IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_Greek_upsilon, 0x1FE7, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA, 0x1F0F, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA, 0x1F2F, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_IOTA, 0x1F3F, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_UPSILON, 0x1F5F, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA, 0x1F6F, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha, 0x1F07, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta, 0x1F27, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_iota, 0x1F37, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_upsilon, 0x1F57, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega, 0x1F67, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA, 0x1F0E, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA, 0x1F2E, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_IOTA, 0x1F3E, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA, 0x1F6E, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha, 0x1F06, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_eta, 0x1F26, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_iota, 0x1F36, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_upsilon, 0x1F56, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_omega, 0x1F66, 
--IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_O, 0x1EE0, 
--IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_U, 0x1EEE, 
--IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_o, 0x1EE1, 
--IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_u, 0x1EEF, 
--IBUS_KEY_Multi_key, IBUS_KEY_U, IBUS_KEY_A, 0x1EB4, 
--IBUS_KEY_Multi_key, IBUS_KEY_U, IBUS_KEY_a, 0x1EB5, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_A, 0x1EAA, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_E, 0x1EC4, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_O, 0x1ED6, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_a, 0x1EAB, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_e, 0x1EC5, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_o, 0x1ED7, 
--IBUS_KEY_Multi_key, IBUS_KEY_b, IBUS_KEY_A, 0x1EB4, 
--IBUS_KEY_Multi_key, IBUS_KEY_b, IBUS_KEY_a, 0x1EB5, 
--IBUS_KEY_space, 0x00AF, 
--IBUS_KEY_V, 0x01D5, 
--IBUS_KEY_v, 0x01D6, 
--IBUS_KEY_nobreakspace, 0x0304, 
--IBUS_KEY_Egrave, 0x1E14, 
--IBUS_KEY_Eacute, 0x1E16, 
--IBUS_KEY_Ograve, 0x1E50, 
--IBUS_KEY_Oacute, 0x1E52, 
--IBUS_KEY_egrave, 0x1E15, 
--IBUS_KEY_eacute, 0x1E17, 
--IBUS_KEY_ograve, 0x1E51, 
--IBUS_KEY_oacute, 0x1E53, 
--IBUS_KEY_Cyrillic_i, 0x04E3, 
--IBUS_KEY_Cyrillic_u, 0x04EF, 
--IBUS_KEY_Cyrillic_I, 0x04E2, 
--IBUS_KEY_Cyrillic_U, 0x04EE, 
--IBUS_KEY_Greek_ALPHA, 0x1FB9, 
--IBUS_KEY_Greek_IOTA, 0x1FD9, 
--IBUS_KEY_Greek_UPSILON, 0x1FE9, 
--IBUS_KEY_Greek_alpha, 0x1FB1, 
--IBUS_KEY_Greek_iota, 0x1FD1, 
--IBUS_KEY_Greek_upsilon, 0x1FE1, 
--IBUS_KEY_dead_macron, 0x00AF, 
--IBUS_KEY_dead_greek, IBUS_KEY_A, 0x1FB9, 
--IBUS_KEY_dead_greek, IBUS_KEY_I, 0x1FD9, 
--IBUS_KEY_dead_greek, IBUS_KEY_U, 0x1FE9, 
--IBUS_KEY_dead_greek, IBUS_KEY_a, 0x1FB1, 
--IBUS_KEY_dead_greek, IBUS_KEY_i, 0x1FD1, 
--IBUS_KEY_dead_greek, IBUS_KEY_u, 0x1FE1, 
--IBUS_KEY_Multi_key, IBUS_KEY_exclam, IBUS_KEY_L, 0x1E38, 
--IBUS_KEY_Multi_key, IBUS_KEY_exclam, IBUS_KEY_R, 0x1E5C, 
--IBUS_KEY_Multi_key, IBUS_KEY_exclam, IBUS_KEY_l, 0x1E39, 
--IBUS_KEY_Multi_key, IBUS_KEY_exclam, IBUS_KEY_r, 0x1E5D, 
--IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_A, 0x01DE, 
--IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_O, 0x022A, 
--IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_U, 0x01D5, 
--IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_a, 0x01DF, 
--IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_o, 0x022B, 
--IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_u, 0x01D6, 
--IBUS_KEY_Multi_key, IBUS_KEY_period, IBUS_KEY_A, 0x01E0, 
--IBUS_KEY_Multi_key, IBUS_KEY_period, IBUS_KEY_O, 0x0230, 
--IBUS_KEY_Multi_key, IBUS_KEY_period, IBUS_KEY_a, 0x01E1, 
--IBUS_KEY_Multi_key, IBUS_KEY_period, IBUS_KEY_o, 0x0231, 
--IBUS_KEY_Multi_key, IBUS_KEY_semicolon, IBUS_KEY_O, 0x01EC, 
--IBUS_KEY_Multi_key, IBUS_KEY_semicolon, IBUS_KEY_o, 0x01ED, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_O, 0x022C, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_o, 0x022D, 
--IBUS_KEY_space, 0x02D8, 
--IBUS_KEY_nobreakspace, 0x0306, 
--IBUS_KEY_Agrave, 0x1EB0, 
--IBUS_KEY_Aacute, 0x1EAE, 
--IBUS_KEY_Atilde, 0x1EB4, 
--IBUS_KEY_agrave, 0x1EB1, 
--IBUS_KEY_aacute, 0x1EAF, 
--IBUS_KEY_atilde, 0x1EB5, 
--IBUS_KEY_Cyrillic_a, 0x04D1, 
--IBUS_KEY_Cyrillic_ie, 0x04D7, 
--IBUS_KEY_Cyrillic_i, 0x0439, 
--IBUS_KEY_Cyrillic_u, 0x045E, 
--IBUS_KEY_Cyrillic_zhe, 0x04C2, 
--IBUS_KEY_Cyrillic_A, 0x04D0, 
--IBUS_KEY_Cyrillic_IE, 0x04D6, 
--IBUS_KEY_Cyrillic_I, 0x0419, 
--IBUS_KEY_Cyrillic_U, 0x040E, 
--IBUS_KEY_Cyrillic_ZHE, 0x04C1, 
--IBUS_KEY_Greek_ALPHA, 0x1FB8, 
--IBUS_KEY_Greek_IOTA, 0x1FD8, 
--IBUS_KEY_Greek_UPSILON, 0x1FE8, 
--IBUS_KEY_Greek_alpha, 0x1FB0, 
--IBUS_KEY_Greek_iota, 0x1FD0, 
--IBUS_KEY_Greek_upsilon, 0x1FE0, 
--IBUS_KEY_dead_breve, 0x02D8, 
--IBUS_KEY_Multi_key, IBUS_KEY_exclam, IBUS_KEY_A, 0x1EB6, 
--IBUS_KEY_Multi_key, IBUS_KEY_exclam, IBUS_KEY_a, 0x1EB7, 
--IBUS_KEY_Multi_key, IBUS_KEY_comma, IBUS_KEY_E, 0x1E1C, 
--IBUS_KEY_Multi_key, IBUS_KEY_comma, IBUS_KEY_e, 0x1E1D, 
--IBUS_KEY_Multi_key, IBUS_KEY_cedilla, IBUS_KEY_E, 0x1E1C, 
--IBUS_KEY_Multi_key, IBUS_KEY_cedilla, IBUS_KEY_e, 0x1E1D, 
--IBUS_KEY_space, 0x02D9, 
--IBUS_KEY_L, 0x013F, 
--IBUS_KEY_i, 0x0131, 
--IBUS_KEY_j, 0x0237, 
--IBUS_KEY_l, 0x0140, 
--IBUS_KEY_nobreakspace, 0x0307, 
--IBUS_KEY_Sacute, 0x1E64, 
--IBUS_KEY_Scaron, 0x1E66, 
--IBUS_KEY_sacute, 0x1E65, 
--IBUS_KEY_scaron, 0x1E67, 
--IBUS_KEY_Amacron, 0x01E0, 
--IBUS_KEY_Omacron, 0x0230, 
--IBUS_KEY_amacron, 0x01E1, 
--IBUS_KEY_omacron, 0x0231, 
--IBUS_KEY_dead_abovedot, 0x02D9, 
--IBUS_KEY_dead_stroke, IBUS_KEY_j, 0x025F, 
--IBUS_KEY_Multi_key, IBUS_KEY_exclam, IBUS_KEY_S, 0x1E68, 
--IBUS_KEY_Multi_key, IBUS_KEY_exclam, IBUS_KEY_s, 0x1E69, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_S, 0x1E64, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_s, 0x1E65, 
--IBUS_KEY_Multi_key, IBUS_KEY_c, IBUS_KEY_S, 0x1E66, 
--IBUS_KEY_Multi_key, IBUS_KEY_c, IBUS_KEY_s, 0x1E67, 
--IBUS_KEY_Multi_key, IBUS_KEY_f, IBUS_KEY_s, 0x1E9B, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_S, 0x1E64, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_s, 0x1E65, 
--IBUS_KEY_space, 0x0022, 
--IBUS_KEY_apostrophe, 0x0344, 
--IBUS_KEY_nobreakspace, 0x0308, 
--IBUS_KEY_acute, 0x0344, 
--IBUS_KEY_Iacute, 0x1E2E, 
--IBUS_KEY_Ugrave, 0x01DB, 
--IBUS_KEY_Uacute, 0x01D7, 
--IBUS_KEY_iacute, 0x1E2F, 
--IBUS_KEY_ugrave, 0x01DC, 
--IBUS_KEY_uacute, 0x01D8, 
--0x01D3, 0x01D9, 
--0x01D4, 0x01DA, 
--IBUS_KEY_Amacron, 0x01DE, 
--IBUS_KEY_Umacron, 0x1E7A, 
--IBUS_KEY_amacron, 0x01DF, 
--IBUS_KEY_omacron, 0x022B, 
--IBUS_KEY_umacron, 0x1E7B, 
--IBUS_KEY_Ukrainian_i, 0x0457, 
--IBUS_KEY_Ukrainian_I, 0x0407, 
--IBUS_KEY_Cyrillic_a, 0x04D3, 
--IBUS_KEY_Cyrillic_ie, 0x0451, 
--IBUS_KEY_Cyrillic_i, 0x04E5, 
--IBUS_KEY_Cyrillic_o, 0x04E7, 
--IBUS_KEY_Cyrillic_u, 0x04F1, 
--IBUS_KEY_Cyrillic_zhe, 0x04DD, 
--IBUS_KEY_Cyrillic_yeru, 0x04F9, 
--IBUS_KEY_Cyrillic_ze, 0x04DF, 
--IBUS_KEY_Cyrillic_e, 0x04ED, 
--IBUS_KEY_Cyrillic_che, 0x04F5, 
--IBUS_KEY_Cyrillic_A, 0x04D2, 
--IBUS_KEY_Cyrillic_IE, 0x0401, 
--IBUS_KEY_Cyrillic_I, 0x04E4, 
--IBUS_KEY_Cyrillic_O, 0x04E6, 
--IBUS_KEY_Cyrillic_U, 0x04F0, 
--IBUS_KEY_Cyrillic_ZHE, 0x04DC, 
--IBUS_KEY_Cyrillic_YERU, 0x04F8, 
--IBUS_KEY_Cyrillic_ZE, 0x04DE, 
--IBUS_KEY_Cyrillic_E, 0x04EC, 
--IBUS_KEY_Cyrillic_CHE, 0x04F4, 
--IBUS_KEY_Greek_IOTA, 0x03AA, 
--IBUS_KEY_Greek_UPSILON, 0x03AB, 
--IBUS_KEY_Greek_iota, 0x03CA, 
--IBUS_KEY_Greek_upsilon, 0x03CB, 
--IBUS_KEY_dead_diaeresis, 0x00A8, 
--IBUS_KEY_dead_acute, IBUS_KEY_space, 0x0385, 
--IBUS_KEY_dead_acute, IBUS_KEY_Greek_iota, 0x0390, 
--IBUS_KEY_dead_acute, IBUS_KEY_Greek_upsilon, 0x03B0, 
--IBUS_KEY_dead_belowdiaeresis, IBUS_KEY_equal, 0x2A77, 
--IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_U, 0x1E7A, 
--IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_u, 0x1E7B, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_O, 0x1E4E, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_o, 0x1E4F, 
--IBUS_KEY_Multi_key, IBUS_KEY_macron, IBUS_KEY_U, 0x1E7A, 
--IBUS_KEY_Multi_key, IBUS_KEY_macron, IBUS_KEY_u, 0x1E7B, 
--IBUS_KEY_space, 0x00B0, 
--IBUS_KEY_nobreakspace, 0x030A, 
--IBUS_KEY_Aacute, 0x01FA, 
--IBUS_KEY_aacute, 0x01FB, 
--IBUS_KEY_dead_abovering, 0x00B0, 
--IBUS_KEY_space, 0x02DD, 
--IBUS_KEY_nobreakspace, 0x030B, 
--IBUS_KEY_Cyrillic_u, 0x04F3, 
--IBUS_KEY_Cyrillic_U, 0x04F2, 
--IBUS_KEY_dead_doubleacute, 0x02DD, 
--IBUS_KEY_space, 0x02C7, 
--IBUS_KEY_parenleft, 0x208D, 
--IBUS_KEY_parenright, 0x208E, 
--IBUS_KEY_plus, 0x208A, 
--IBUS_KEY_minus, 0x208B, 
--IBUS_KEY_0, 0x2080, 
--IBUS_KEY_1, 0x2081, 
--IBUS_KEY_2, 0x2082, 
--IBUS_KEY_3, 0x2083, 
--IBUS_KEY_4, 0x2084, 
--IBUS_KEY_5, 0x2085, 
--IBUS_KEY_6, 0x2086, 
--IBUS_KEY_7, 0x2087, 
--IBUS_KEY_8, 0x2088, 
--IBUS_KEY_9, 0x2089, 
--IBUS_KEY_equal, 0x208C, 
--IBUS_KEY_V, 0x01D9, 
--IBUS_KEY_v, 0x01DA, 
--IBUS_KEY_nobreakspace, 0x030C, 
--0x01F2, 0x01C5, 
--IBUS_KEY_dead_caron, 0x02C7, 
--IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_U, 0x01D9, 
--IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_u, 0x01DA, 
--IBUS_KEY_space, 0x00B8, 
--IBUS_KEY_nobreakspace, 0x0327, 
--IBUS_KEY_cent, 0x20B5, 
--IBUS_KEY_Cacute, 0x1E08, 
--IBUS_KEY_cacute, 0x1E09, 
--IBUS_KEY_dead_cedilla, 0x00B8, 
--IBUS_KEY_dead_currency, IBUS_KEY_C, 0x20B5, 
--IBUS_KEY_dead_currency, IBUS_KEY_c, 0x20B5, 
--IBUS_KEY_space, 0x02DB, 
--IBUS_KEY_nobreakspace, 0x0328, 
--IBUS_KEY_Omacron, 0x01EC, 
--IBUS_KEY_omacron, 0x01ED, 
--IBUS_KEY_dead_ogonek, 0x02DB, 
--IBUS_KEY_space, 0x037A, 
--IBUS_KEY_Greek_alphaaccent, 0x1FB4, 
--IBUS_KEY_Greek_etaaccent, 0x1FC4, 
--IBUS_KEY_Greek_omegaaccent, 0x1FF4, 
--IBUS_KEY_Greek_ALPHA, 0x1FBC, 
--IBUS_KEY_Greek_ETA, 0x1FCC, 
--IBUS_KEY_Greek_OMEGA, 0x1FFC, 
--IBUS_KEY_Greek_alpha, 0x1FB3, 
--IBUS_KEY_Greek_eta, 0x1FC3, 
--IBUS_KEY_Greek_omega, 0x1FF3, 
--IBUS_KEY_dead_iota, 0x037A, 
--IBUS_KEY_dead_grave, IBUS_KEY_Greek_alpha, 0x1FB2, 
--IBUS_KEY_dead_grave, IBUS_KEY_Greek_eta, 0x1FC2, 
--IBUS_KEY_dead_grave, IBUS_KEY_Greek_omega, 0x1FF2, 
--IBUS_KEY_dead_acute, IBUS_KEY_Greek_alpha, 0x1FB4, 
--IBUS_KEY_dead_acute, IBUS_KEY_Greek_eta, 0x1FC4, 
--IBUS_KEY_dead_acute, IBUS_KEY_Greek_omega, 0x1FF4, 
--IBUS_KEY_dead_tilde, IBUS_KEY_Greek_alpha, 0x1FB7, 
--IBUS_KEY_dead_tilde, IBUS_KEY_Greek_eta, 0x1FC7, 
--IBUS_KEY_dead_tilde, IBUS_KEY_Greek_omega, 0x1FF7, 
--IBUS_KEY_dead_tilde, 0x1F00, 0x1F86, 
--IBUS_KEY_dead_tilde, 0x1F01, 0x1F87, 
--IBUS_KEY_dead_tilde, 0x1F08, 0x1F8E, 
--IBUS_KEY_dead_tilde, 0x1F09, 0x1F8F, 
--IBUS_KEY_dead_tilde, 0x1F20, 0x1F96, 
--IBUS_KEY_dead_tilde, 0x1F21, 0x1F97, 
--IBUS_KEY_dead_tilde, 0x1F28, 0x1F9E, 
--IBUS_KEY_dead_tilde, 0x1F29, 0x1F9F, 
--IBUS_KEY_dead_tilde, 0x1F60, 0x1FA6, 
--IBUS_KEY_dead_tilde, 0x1F61, 0x1FA7, 
--IBUS_KEY_dead_tilde, 0x1F68, 0x1FAE, 
--IBUS_KEY_dead_tilde, 0x1F69, 0x1FAF, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA, 0x1F88, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA, 0x1F98, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA, 0x1FA8, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha, 0x1F80, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta, 0x1F90, 
--IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega, 0x1FA0, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA, 0x1F89, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA, 0x1F99, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA, 0x1FA9, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha, 0x1F81, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta, 0x1F91, 
--IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega, 0x1FA1, 
--IBUS_KEY_dead_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA, 0x1F8A, 
--IBUS_KEY_dead_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA, 0x1F9A, 
--IBUS_KEY_dead_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA, 0x1FAA, 
--IBUS_KEY_dead_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha, 0x1F82, 
--IBUS_KEY_dead_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta, 0x1F92, 
--IBUS_KEY_dead_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega, 0x1FA2, 
--IBUS_KEY_dead_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA, 0x1F8B, 
--IBUS_KEY_dead_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA, 0x1F9B, 
--IBUS_KEY_dead_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA, 0x1FAB, 
--IBUS_KEY_dead_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha, 0x1F83, 
--IBUS_KEY_dead_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta, 0x1F93, 
--IBUS_KEY_dead_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega, 0x1FA3, 
--IBUS_KEY_dead_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA, 0x1F8C, 
--IBUS_KEY_dead_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA, 0x1F9C, 
--IBUS_KEY_dead_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA, 0x1FAC, 
--IBUS_KEY_dead_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha, 0x1F84, 
--IBUS_KEY_dead_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta, 0x1F94, 
--IBUS_KEY_dead_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega, 0x1FA4, 
--IBUS_KEY_dead_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA, 0x1F8D, 
--IBUS_KEY_dead_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA, 0x1F9D, 
--IBUS_KEY_dead_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA, 0x1FAD, 
--IBUS_KEY_dead_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha, 0x1F85, 
--IBUS_KEY_dead_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta, 0x1F95, 
--IBUS_KEY_dead_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega, 0x1FA5, 
--IBUS_KEY_dead_tilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA, 0x1F8E, 
--IBUS_KEY_dead_tilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA, 0x1F9E, 
--IBUS_KEY_dead_tilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA, 0x1FAE, 
--IBUS_KEY_dead_tilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha, 0x1F86, 
--IBUS_KEY_dead_tilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta, 0x1F96, 
--IBUS_KEY_dead_tilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega, 0x1FA6, 
--IBUS_KEY_dead_tilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA, 0x1F8F, 
--IBUS_KEY_dead_tilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA, 0x1F9F, 
--IBUS_KEY_dead_tilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA, 0x1FAF, 
--IBUS_KEY_dead_tilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha, 0x1F87, 
--IBUS_KEY_dead_tilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta, 0x1F97, 
--IBUS_KEY_dead_tilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega, 0x1FA7, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_Greek_alpha, 0x1FB4, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_Greek_eta, 0x1FC4, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_Greek_omega, 0x1FF4, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, 0x1F00, 0x1F84, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, 0x1F01, 0x1F85, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, 0x1F08, 0x1F8C, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, 0x1F09, 0x1F8D, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, 0x1F20, 0x1F94, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, 0x1F21, 0x1F95, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, 0x1F28, 0x1F9C, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, 0x1F29, 0x1F9D, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, 0x1F60, 0x1FA4, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, 0x1F61, 0x1FA5, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, 0x1F68, 0x1FAC, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, 0x1F69, 0x1FAD, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA, 0x1F89, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA, 0x1F99, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA, 0x1FA9, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha, 0x1F81, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta, 0x1F91, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega, 0x1FA1, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA, 0x1F88, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA, 0x1F98, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA, 0x1FA8, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha, 0x1F80, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_eta, 0x1F90, 
--IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_omega, 0x1FA0, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_Greek_alpha, 0x1FB2, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_Greek_eta, 0x1FC2, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_Greek_omega, 0x1FF2, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, 0x1F00, 0x1F82, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, 0x1F01, 0x1F83, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, 0x1F08, 0x1F8A, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, 0x1F09, 0x1F8B, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, 0x1F20, 0x1F92, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, 0x1F21, 0x1F93, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, 0x1F28, 0x1F9A, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, 0x1F29, 0x1F9B, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, 0x1F60, 0x1FA2, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, 0x1F61, 0x1FA3, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, 0x1F68, 0x1FAA, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, 0x1F69, 0x1FAB, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_Greek_alpha, 0x1FB7, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_Greek_eta, 0x1FC7, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_Greek_omega, 0x1FF7, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, 0x1F00, 0x1F86, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, 0x1F01, 0x1F87, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, 0x1F08, 0x1F8E, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, 0x1F09, 0x1F8F, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, 0x1F20, 0x1F96, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, 0x1F21, 0x1F97, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, 0x1F28, 0x1F9E, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, 0x1F29, 0x1F9F, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, 0x1F60, 0x1FA6, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, 0x1F61, 0x1FA7, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, 0x1F68, 0x1FAE, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, 0x1F69, 0x1FAF, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_Greek_alpha, 0x1FB4, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_Greek_eta, 0x1FC4, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_Greek_omega, 0x1FF4, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, 0x1F00, 0x1F84, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, 0x1F01, 0x1F85, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, 0x1F08, 0x1F8C, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, 0x1F09, 0x1F8D, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, 0x1F20, 0x1F94, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, 0x1F21, 0x1F95, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, 0x1F28, 0x1F9C, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, 0x1F29, 0x1F9D, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, 0x1F60, 0x1FA4, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, 0x1F61, 0x1FA5, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, 0x1F68, 0x1FAC, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, 0x1F69, 0x1FAD, 
--IBUS_KEY_dead_grave, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA, 0x1F8B, 
--IBUS_KEY_dead_grave, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA, 0x1F9B, 
--IBUS_KEY_dead_grave, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA, 0x1FAB, 
--IBUS_KEY_dead_grave, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha, 0x1F83, 
--IBUS_KEY_dead_grave, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta, 0x1F93, 
--IBUS_KEY_dead_grave, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega, 0x1FA3, 
--IBUS_KEY_dead_grave, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA, 0x1F8A, 
--IBUS_KEY_dead_grave, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA, 0x1F9A, 
--IBUS_KEY_dead_grave, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA, 0x1FAA, 
--IBUS_KEY_dead_grave, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha, 0x1F82, 
--IBUS_KEY_dead_grave, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_eta, 0x1F92, 
--IBUS_KEY_dead_grave, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_omega, 0x1FA2, 
--IBUS_KEY_dead_acute, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA, 0x1F8D, 
--IBUS_KEY_dead_acute, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA, 0x1F9D, 
--IBUS_KEY_dead_acute, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA, 0x1FAD, 
--IBUS_KEY_dead_acute, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha, 0x1F85, 
--IBUS_KEY_dead_acute, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta, 0x1F95, 
--IBUS_KEY_dead_acute, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega, 0x1FA5, 
--IBUS_KEY_dead_acute, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA, 0x1F8C, 
--IBUS_KEY_dead_acute, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA, 0x1F9C, 
--IBUS_KEY_dead_acute, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA, 0x1FAC, 
--IBUS_KEY_dead_acute, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha, 0x1F84, 
--IBUS_KEY_dead_acute, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_eta, 0x1F94, 
--IBUS_KEY_dead_acute, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_omega, 0x1FA4, 
--IBUS_KEY_dead_tilde, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA, 0x1F8F, 
--IBUS_KEY_dead_tilde, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA, 0x1F9F, 
--IBUS_KEY_dead_tilde, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA, 0x1FAF, 
--IBUS_KEY_dead_tilde, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha, 0x1F87, 
--IBUS_KEY_dead_tilde, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta, 0x1F97, 
--IBUS_KEY_dead_tilde, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega, 0x1FA7, 
--IBUS_KEY_dead_tilde, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA, 0x1F8E, 
--IBUS_KEY_dead_tilde, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA, 0x1F9E, 
--IBUS_KEY_dead_tilde, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA, 0x1FAE, 
--IBUS_KEY_dead_tilde, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha, 0x1F86, 
--IBUS_KEY_dead_tilde, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_eta, 0x1F96, 
--IBUS_KEY_dead_tilde, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_omega, 0x1FA6, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA, 0x1F8D, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA, 0x1F9D, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA, 0x1FAD, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha, 0x1F85, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta, 0x1F95, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega, 0x1FA5, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA, 0x1F8C, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA, 0x1F9C, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA, 0x1FAC, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha, 0x1F84, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_eta, 0x1F94, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_omega, 0x1FA4, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA, 0x1F8C, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA, 0x1F9C, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA, 0x1FAC, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha, 0x1F84, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta, 0x1F94, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega, 0x1FA4, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA, 0x1F8D, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA, 0x1F9D, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA, 0x1FAD, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha, 0x1F85, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta, 0x1F95, 
--IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega, 0x1FA5, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA, 0x1F8B, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA, 0x1F9B, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA, 0x1FAB, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha, 0x1F83, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta, 0x1F93, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega, 0x1FA3, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA, 0x1F8A, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA, 0x1F9A, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA, 0x1FAA, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha, 0x1F82, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_eta, 0x1F92, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_omega, 0x1FA2, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA, 0x1F8A, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA, 0x1F9A, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA, 0x1FAA, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha, 0x1F82, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta, 0x1F92, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega, 0x1FA2, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA, 0x1F8B, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA, 0x1F9B, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA, 0x1FAB, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha, 0x1F83, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta, 0x1F93, 
--IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega, 0x1FA3, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA, 0x1F8F, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA, 0x1F9F, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA, 0x1FAF, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha, 0x1F87, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta, 0x1F97, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega, 0x1FA7, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA, 0x1F8E, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA, 0x1F9E, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA, 0x1FAE, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha, 0x1F86, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_eta, 0x1F96, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_omega, 0x1FA6, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA, 0x1F8E, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA, 0x1F9E, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA, 0x1FAE, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha, 0x1F86, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta, 0x1F96, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega, 0x1FA6, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA, 0x1F8F, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA, 0x1F9F, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA, 0x1FAF, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha, 0x1F87, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta, 0x1F97, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega, 0x1FA7, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA, 0x1F8D, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA, 0x1F9D, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA, 0x1FAD, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha, 0x1F85, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta, 0x1F95, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega, 0x1FA5, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA, 0x1F8C, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA, 0x1F9C, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA, 0x1FAC, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha, 0x1F84, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_eta, 0x1F94, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_omega, 0x1FA4, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA, 0x1F8C, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA, 0x1F9C, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA, 0x1FAC, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha, 0x1F84, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta, 0x1F94, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega, 0x1FA4, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA, 0x1F8D, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA, 0x1F9D, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA, 0x1FAD, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha, 0x1F85, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta, 0x1F95, 
--IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega, 0x1FA5, 
--IBUS_KEY_kana_WO, 0x30FA, 
--IBUS_KEY_kana_U, 0x30F4, 
--IBUS_KEY_kana_KA, 0x30AC, 
--IBUS_KEY_kana_KI, 0x30AE, 
--IBUS_KEY_kana_KU, 0x30B0, 
--IBUS_KEY_kana_KE, 0x30B2, 
--IBUS_KEY_kana_KO, 0x30B4, 
--IBUS_KEY_kana_SA, 0x30B6, 
--IBUS_KEY_kana_SHI, 0x30B8, 
--IBUS_KEY_kana_SU, 0x30BA, 
--IBUS_KEY_kana_SE, 0x30BC, 
--IBUS_KEY_kana_SO, 0x30BE, 
--IBUS_KEY_kana_TA, 0x30C0, 
--IBUS_KEY_kana_CHI, 0x30C2, 
--IBUS_KEY_kana_TSU, 0x30C5, 
--IBUS_KEY_kana_TE, 0x30C7, 
--IBUS_KEY_kana_TO, 0x30C9, 
--IBUS_KEY_kana_HA, 0x30D0, 
--IBUS_KEY_kana_HI, 0x30D3, 
--IBUS_KEY_kana_FU, 0x30D6, 
--IBUS_KEY_kana_HE, 0x30D9, 
--IBUS_KEY_kana_HO, 0x30DC, 
--IBUS_KEY_kana_WA, 0x30F7, 
--IBUS_KEY_kana_HA, 0x30D1, 
--IBUS_KEY_kana_HI, 0x30D4, 
--IBUS_KEY_kana_FU, 0x30D7, 
--IBUS_KEY_kana_HE, 0x30DA, 
--IBUS_KEY_kana_HO, 0x30DD, 
--IBUS_KEY_space, 0x0323, 
--IBUS_KEY_plus, 0x2A25, 
--IBUS_KEY_minus, 0x2A2A, 
--IBUS_KEY_equal, 0x2A66, 
--IBUS_KEY_nobreakspace, 0x0323, 
--IBUS_KEY_Abreve, 0x1EB6, 
--IBUS_KEY_abreve, 0x1EB7, 
--IBUS_KEY_dead_belowdot, 0x0323, 
--IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_O, 0x1EE2, 
--IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_U, 0x1EF0, 
--IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_o, 0x1EE3, 
--IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_u, 0x1EF1, 
--IBUS_KEY_space, 0x0309, 
--IBUS_KEY_B, 0x0181, 
--IBUS_KEY_C, 0x0187, 
--IBUS_KEY_D, 0x018A, 
--IBUS_KEY_F, 0x0191, 
--IBUS_KEY_G, 0x0193, 
--IBUS_KEY_K, 0x0198, 
--IBUS_KEY_M, 0x2C6E, 
--IBUS_KEY_N, 0x019D, 
--IBUS_KEY_P, 0x01A4, 
--IBUS_KEY_T, 0x01AC, 
--IBUS_KEY_V, 0x01B2, 
--IBUS_KEY_W, 0x2C72, 
--IBUS_KEY_Z, 0x0224, 
--IBUS_KEY_b, 0x0253, 
--IBUS_KEY_c, 0x0188, 
--IBUS_KEY_d, 0x0257, 
--IBUS_KEY_f, 0x0192, 
--IBUS_KEY_g, 0x0260, 
--IBUS_KEY_h, 0x0266, 
--IBUS_KEY_k, 0x0199, 
--IBUS_KEY_m, 0x0271, 
--IBUS_KEY_n, 0x0272, 
--IBUS_KEY_p, 0x01A5, 
--IBUS_KEY_q, 0x02A0, 
--IBUS_KEY_r, 0x027C, 
--IBUS_KEY_s, 0x0282, 
--IBUS_KEY_t, 0x01AD, 
--IBUS_KEY_v, 0x028B, 
--IBUS_KEY_w, 0x2C73, 
--IBUS_KEY_z, 0x0225, 
--IBUS_KEY_nobreakspace, 0x0309, 
--IBUS_KEY_Abreve, 0x1EB2, 
--IBUS_KEY_abreve, 0x1EB3, 
--0x0256, 0x1D91, 
--0x025C, 0x025D, 
--0x025F, 0x0284, 
--0x0279, 0x027B, 
--IBUS_KEY_dead_hook, 0x0309, 
--IBUS_KEY_dead_greek, IBUS_KEY_U, 0x03D2, 
--IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_O, 0x1EDE, 
--IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_U, 0x1EEC, 
--IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_o, 0x1EDF, 
--IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_u, 0x1EED, 
--IBUS_KEY_Multi_key, IBUS_KEY_U, IBUS_KEY_A, 0x1EB2, 
--IBUS_KEY_Multi_key, IBUS_KEY_U, IBUS_KEY_a, 0x1EB3, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_A, 0x1EA8, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_E, 0x1EC2, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_O, 0x1ED4, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_a, 0x1EA9, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_e, 0x1EC3, 
--IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_o, 0x1ED5, 
--IBUS_KEY_Multi_key, IBUS_KEY_b, IBUS_KEY_A, 0x1EB2, 
--IBUS_KEY_Multi_key, IBUS_KEY_b, IBUS_KEY_a, 0x1EB3, 
--IBUS_KEY_space, 0x031B, 
--IBUS_KEY_nobreakspace, 0x031B, 
--IBUS_KEY_Utilde, 0x1EEE, 
--IBUS_KEY_utilde, 0x1EEF, 
--IBUS_KEY_dead_horn, 0x031B, 
--IBUS_KEY_space, 0x002F, 
--IBUS_KEY_2, 0x01BB, 
--IBUS_KEY_A, 0x023A, 
--IBUS_KEY_B, 0x0243, 
--IBUS_KEY_C, 0x023B, 
--IBUS_KEY_D, 0x0110, 
--IBUS_KEY_E, 0x0246, 
--IBUS_KEY_G, 0x01E4, 
--IBUS_KEY_H, 0x0126, 
--IBUS_KEY_I, 0x0197, 
--IBUS_KEY_J, 0x0248, 
--IBUS_KEY_L, 0x0141, 
--IBUS_KEY_O, 0x00D8, 
--IBUS_KEY_P, 0x2C63, 
--IBUS_KEY_R, 0x024C, 
--IBUS_KEY_T, 0x0166, 
--IBUS_KEY_U, 0x0244, 
--IBUS_KEY_Y, 0x024E, 
--IBUS_KEY_Z, 0x01B5, 
--IBUS_KEY_a, 0x2C65, 
--IBUS_KEY_b, 0x0180, 
--IBUS_KEY_c, 0x023C, 
--IBUS_KEY_d, 0x0111, 
--IBUS_KEY_e, 0x0247, 
--IBUS_KEY_g, 0x01E5, 
--IBUS_KEY_h, 0x0127, 
--IBUS_KEY_i, 0x0268, 
--IBUS_KEY_j, 0x0249, 
--IBUS_KEY_l, 0x0142, 
--IBUS_KEY_o, 0x00F8, 
--IBUS_KEY_p, 0x1D7D, 
--IBUS_KEY_r, 0x024D, 
--IBUS_KEY_t, 0x0167, 
--IBUS_KEY_u, 0x0289, 
--IBUS_KEY_y, 0x024F, 
--IBUS_KEY_z, 0x01B6, 
--IBUS_KEY_nobreakspace, 0x0338, 
--IBUS_KEY_Oacute, 0x01FE, 
--IBUS_KEY_oacute, 0x01FF, 
--0x0237, 0x025F, 
--0x0269, 0x1D7C, 
--IBUS_KEY_lessthanequal, 0x2270, 
--IBUS_KEY_greaterthanequal, 0x2271, 
--IBUS_KEY_dead_stroke, 0x002F, 
--IBUS_KEY_dead_acute, IBUS_KEY_O, 0x01FE, 
--IBUS_KEY_dead_acute, IBUS_KEY_o, 0x01FF, 
--IBUS_KEY_dead_abovedot, IBUS_KEY_j, 0x025F, 
--IBUS_KEY_dead_greek, IBUS_KEY_r, 0x03FC, 
--IBUS_KEY_Greek_ALPHA, 0x1F08, 
--IBUS_KEY_Greek_EPSILON, 0x1F18, 
--IBUS_KEY_Greek_ETA, 0x1F28, 
--IBUS_KEY_Greek_IOTA, 0x1F38, 
--IBUS_KEY_Greek_OMICRON, 0x1F48, 
--IBUS_KEY_Greek_OMEGA, 0x1F68, 
--IBUS_KEY_Greek_alpha, 0x1F00, 
--IBUS_KEY_Greek_epsilon, 0x1F10, 
--IBUS_KEY_Greek_eta, 0x1F20, 
--IBUS_KEY_Greek_iota, 0x1F30, 
--IBUS_KEY_Greek_omicron, 0x1F40, 
--IBUS_KEY_Greek_rho, 0x1FE4, 
--IBUS_KEY_Greek_upsilon, 0x1F50, 
--IBUS_KEY_Greek_omega, 0x1F60, 
--IBUS_KEY_Greek_ALPHA, 0x1F09, 
--IBUS_KEY_Greek_EPSILON, 0x1F19, 
--IBUS_KEY_Greek_ETA, 0x1F29, 
--IBUS_KEY_Greek_IOTA, 0x1F39, 
--IBUS_KEY_Greek_OMICRON, 0x1F49, 
--IBUS_KEY_Greek_RHO, 0x1FEC, 
--IBUS_KEY_Greek_UPSILON, 0x1F59, 
--IBUS_KEY_Greek_OMEGA, 0x1F69, 
--IBUS_KEY_Greek_alpha, 0x1F01, 
--IBUS_KEY_Greek_epsilon, 0x1F11, 
--IBUS_KEY_Greek_eta, 0x1F21, 
--IBUS_KEY_Greek_iota, 0x1F31, 
--IBUS_KEY_Greek_omicron, 0x1F41, 
--IBUS_KEY_Greek_rho, 0x1FE5, 
--IBUS_KEY_Greek_upsilon, 0x1F51, 
--IBUS_KEY_Greek_omega, 0x1F61, 
--IBUS_KEY_bar, 0x2AF0, 
--IBUS_KEY_plus, 0x2A26, 
--IBUS_KEY_dead_diaeresis, IBUS_KEY_equal, 0x2A77, 
--IBUS_KEY_space, 0x002C, 
--IBUS_KEY_S, 0x0218, 
--IBUS_KEY_T, 0x021A, 
--IBUS_KEY_s, 0x0219, 
--IBUS_KEY_t, 0x021B, 
--IBUS_KEY_nobreakspace, 0x0326, 
--IBUS_KEY_dead_belowcomma, 0x002C, 
--IBUS_KEY_space, 0x00A4, 
--IBUS_KEY_A, 0x20B3, 
--IBUS_KEY_B, 0x20B1, 
--IBUS_KEY_C, 0x20A1, 
--IBUS_KEY_D, 0x20AF, 
--IBUS_KEY_E, 0x20A0, 
--IBUS_KEY_F, 0x20A3, 
--IBUS_KEY_G, 0x20B2, 
--IBUS_KEY_H, 0x20B4, 
--IBUS_KEY_I, 0x17DB, 
--IBUS_KEY_K, 0x20AD, 
--IBUS_KEY_L, 0x20A4, 
--IBUS_KEY_M, 0x2133, 
--IBUS_KEY_N, 0x20A6, 
--IBUS_KEY_O, 0x0AF1, 
--IBUS_KEY_P, 0x20A7, 
--IBUS_KEY_R, 0x20A8, 
--IBUS_KEY_S, 0x0024, 
--IBUS_KEY_T, 0x20AE, 
--IBUS_KEY_U, 0x5713, 
--IBUS_KEY_W, 0x20A9, 
--IBUS_KEY_Y, 0x5186, 
--IBUS_KEY_a, 0x060B, 
--IBUS_KEY_b, 0x0E3F, 
--IBUS_KEY_c, 0x00A2, 
--IBUS_KEY_d, 0x20AB, 
--IBUS_KEY_e, 0x20AC, 
--IBUS_KEY_f, 0x0192, 
--IBUS_KEY_g, 0x20B2, 
--IBUS_KEY_h, 0x20B4, 
--IBUS_KEY_i, 0xFDFC, 
--IBUS_KEY_k, 0x20AD, 
--IBUS_KEY_l, 0x00A3, 
--IBUS_KEY_m, 0x20A5, 
--IBUS_KEY_n, 0x20A6, 
--IBUS_KEY_o, 0x0BF9, 
--IBUS_KEY_p, 0x20B0, 
--IBUS_KEY_r, 0x20A2, 
--IBUS_KEY_s, 0x20AA, 
--IBUS_KEY_t, 0x09F3, 
--IBUS_KEY_u, 0x5143, 
--IBUS_KEY_w, 0x20A9, 
--IBUS_KEY_y, 0x00A5, 
--IBUS_KEY_nobreakspace, 0x00A4, 
--IBUS_KEY_Ccedilla, 0x20B5, 
--IBUS_KEY_THORN, 0x09F2, 
--IBUS_KEY_ccedilla, 0x20B5, 
--IBUS_KEY_thorn, 0x09F2, 
--IBUS_KEY_dead_currency, 0x00A4, 
--IBUS_KEY_dead_cedilla, IBUS_KEY_C, 0x20B5, 
--IBUS_KEY_dead_cedilla, IBUS_KEY_c, 0x20B5, 
--IBUS_KEY_space, 0x00B5, 
--IBUS_KEY_A, 0x0391, 
--IBUS_KEY_B, 0x0392, 
--IBUS_KEY_D, 0x0394, 
--IBUS_KEY_E, 0x0395, 
--IBUS_KEY_F, 0x03A6, 
--IBUS_KEY_G, 0x0393, 
--IBUS_KEY_H, 0x0397, 
--IBUS_KEY_I, 0x0399, 
--IBUS_KEY_J, 0x0398, 
--IBUS_KEY_K, 0x039A, 
--IBUS_KEY_L, 0x039B, 
--IBUS_KEY_M, 0x039C, 
--IBUS_KEY_N, 0x039D, 
--IBUS_KEY_O, 0x039F, 
--IBUS_KEY_P, 0x03A0, 
--IBUS_KEY_Q, 0x03A7, 
--IBUS_KEY_R, 0x03A1, 
--IBUS_KEY_S, 0x03A3, 
--IBUS_KEY_T, 0x03A4, 
--IBUS_KEY_U, 0x03A5, 
--IBUS_KEY_W, 0x03A9, 
--IBUS_KEY_X, 0x039E, 
--IBUS_KEY_Y, 0x03A8, 
--IBUS_KEY_Z, 0x0396, 
--IBUS_KEY_a, 0x03B1, 
--IBUS_KEY_b, 0x03B2, 
--IBUS_KEY_d, 0x03B4, 
--IBUS_KEY_e, 0x03B5, 
--IBUS_KEY_f, 0x03C6, 
--IBUS_KEY_g, 0x03B3, 
--IBUS_KEY_h, 0x03B7, 
--IBUS_KEY_i, 0x03B9, 
--IBUS_KEY_j, 0x03B8, 
--IBUS_KEY_k, 0x03BA, 
--IBUS_KEY_l, 0x03BB, 
--IBUS_KEY_m, 0x03BC, 
--IBUS_KEY_n, 0x03BD, 
--IBUS_KEY_o, 0x03BF, 
--IBUS_KEY_p, 0x03C0, 
--IBUS_KEY_q, 0x03C7, 
--IBUS_KEY_r, 0x03C1, 
--IBUS_KEY_s, 0x03C3, 
--IBUS_KEY_t, 0x03C4, 
--IBUS_KEY_u, 0x03C5, 
--IBUS_KEY_w, 0x03C9, 
--IBUS_KEY_x, 0x03BE, 
--IBUS_KEY_y, 0x03C8, 
--IBUS_KEY_z, 0x03B6, 
--IBUS_KEY_nobreakspace, 0x00B5, 
--IBUS_KEY_dead_greek, 0x00B5, 
--IBUS_KEY_dead_macron, IBUS_KEY_A, 0x1FB9, 
--IBUS_KEY_dead_macron, IBUS_KEY_I, 0x1FD9, 
--IBUS_KEY_dead_macron, IBUS_KEY_U, 0x1FE9, 
--IBUS_KEY_dead_macron, IBUS_KEY_a, 0x1FB1, 
--IBUS_KEY_dead_macron, IBUS_KEY_i, 0x1FD1, 
--IBUS_KEY_dead_macron, IBUS_KEY_u, 0x1FE1, 
--IBUS_KEY_dead_hook, IBUS_KEY_U, 0x03D2, 
--IBUS_KEY_dead_stroke, IBUS_KEY_r, 0x03FC, 
--IBUS_KEY_space, IBUS_KEY_space, 0x00A0, 
--IBUS_KEY_space, IBUS_KEY_apostrophe, 0x0027, 
--IBUS_KEY_space, IBUS_KEY_parenleft, 0x02D8, 
--IBUS_KEY_space, IBUS_KEY_comma, 0x00B8, 
--IBUS_KEY_space, IBUS_KEY_minus, 0x007E, 
--IBUS_KEY_space, IBUS_KEY_period, 0x2008, 
--IBUS_KEY_space, IBUS_KEY_less, 0x02C7, 
--IBUS_KEY_space, IBUS_KEY_greater, 0x005E, 
--IBUS_KEY_space, IBUS_KEY_asciicircum, 0x005E, 
--IBUS_KEY_space, IBUS_KEY_grave, 0x0060, 
--IBUS_KEY_space, IBUS_KEY_asciitilde, 0x007E, 
--IBUS_KEY_exclam, IBUS_KEY_exclam, 0x00A1, 
--IBUS_KEY_exclam, IBUS_KEY_question, 0x203D, 
--IBUS_KEY_exclam, IBUS_KEY_A, 0x1EA0, 
--IBUS_KEY_exclam, IBUS_KEY_B, 0x1E04, 
--IBUS_KEY_exclam, IBUS_KEY_D, 0x1E0C, 
--IBUS_KEY_exclam, IBUS_KEY_E, 0x1EB8, 
--IBUS_KEY_exclam, IBUS_KEY_H, 0x1E24, 
--IBUS_KEY_exclam, IBUS_KEY_I, 0x1ECA, 
--IBUS_KEY_exclam, IBUS_KEY_K, 0x1E32, 
--IBUS_KEY_exclam, IBUS_KEY_L, 0x1E36, 
--IBUS_KEY_exclam, IBUS_KEY_M, 0x1E42, 
--IBUS_KEY_exclam, IBUS_KEY_N, 0x1E46, 
--IBUS_KEY_exclam, IBUS_KEY_O, 0x1ECC, 
--IBUS_KEY_exclam, IBUS_KEY_R, 0x1E5A, 
--IBUS_KEY_exclam, IBUS_KEY_S, 0x1E62, 
--IBUS_KEY_exclam, IBUS_KEY_T, 0x1E6C, 
--IBUS_KEY_exclam, IBUS_KEY_U, 0x1EE4, 
--IBUS_KEY_exclam, IBUS_KEY_V, 0x1E7E, 
--IBUS_KEY_exclam, IBUS_KEY_W, 0x1E88, 
--IBUS_KEY_exclam, IBUS_KEY_Y, 0x1EF4, 
--IBUS_KEY_exclam, IBUS_KEY_Z, 0x1E92, 
--IBUS_KEY_exclam, IBUS_KEY_asciicircum, 0x00A6, 
--IBUS_KEY_exclam, IBUS_KEY_a, 0x1EA1, 
--IBUS_KEY_exclam, IBUS_KEY_b, 0x1E05, 
--IBUS_KEY_exclam, IBUS_KEY_d, 0x1E0D, 
--IBUS_KEY_exclam, IBUS_KEY_e, 0x1EB9, 
--IBUS_KEY_exclam, IBUS_KEY_h, 0x1E25, 
--IBUS_KEY_exclam, IBUS_KEY_i, 0x1ECB, 
--IBUS_KEY_exclam, IBUS_KEY_k, 0x1E33, 
--IBUS_KEY_exclam, IBUS_KEY_l, 0x1E37, 
--IBUS_KEY_exclam, IBUS_KEY_m, 0x1E43, 
--IBUS_KEY_exclam, IBUS_KEY_n, 0x1E47, 
--IBUS_KEY_exclam, IBUS_KEY_o, 0x1ECD, 
--IBUS_KEY_exclam, IBUS_KEY_r, 0x1E5B, 
--IBUS_KEY_exclam, IBUS_KEY_s, 0x1E63, 
--IBUS_KEY_exclam, IBUS_KEY_t, 0x1E6D, 
--IBUS_KEY_exclam, IBUS_KEY_u, 0x1EE5, 
--IBUS_KEY_exclam, IBUS_KEY_v, 0x1E7F, 
--IBUS_KEY_exclam, IBUS_KEY_w, 0x1E89, 
--IBUS_KEY_exclam, IBUS_KEY_y, 0x1EF5, 
--IBUS_KEY_exclam, IBUS_KEY_z, 0x1E93, 
--IBUS_KEY_quotedbl, IBUS_KEY_quotedbl, 0x00A8, 
--IBUS_KEY_quotedbl, IBUS_KEY_apostrophe, 0x0344, 
--IBUS_KEY_quotedbl, IBUS_KEY_comma, 0x201E, 
--IBUS_KEY_quotedbl, IBUS_KEY_less, 0x201C, 
--IBUS_KEY_quotedbl, IBUS_KEY_greater, 0x201D, 
--IBUS_KEY_quotedbl, IBUS_KEY_A, 0x00C4, 
--IBUS_KEY_quotedbl, IBUS_KEY_E, 0x00CB, 
--IBUS_KEY_quotedbl, IBUS_KEY_H, 0x1E26, 
--IBUS_KEY_quotedbl, IBUS_KEY_I, 0x00CF, 
--IBUS_KEY_quotedbl, IBUS_KEY_O, 0x00D6, 
--IBUS_KEY_quotedbl, IBUS_KEY_U, 0x00DC, 
--IBUS_KEY_quotedbl, IBUS_KEY_W, 0x1E84, 
--IBUS_KEY_quotedbl, IBUS_KEY_X, 0x1E8C, 
--IBUS_KEY_quotedbl, IBUS_KEY_Y, 0x0178, 
--IBUS_KEY_quotedbl, IBUS_KEY_a, 0x00E4, 
--IBUS_KEY_quotedbl, IBUS_KEY_e, 0x00EB, 
--IBUS_KEY_quotedbl, IBUS_KEY_h, 0x1E27, 
--IBUS_KEY_quotedbl, IBUS_KEY_i, 0x00EF, 
--IBUS_KEY_quotedbl, IBUS_KEY_o, 0x00F6, 
--IBUS_KEY_quotedbl, IBUS_KEY_t, 0x1E97, 
--IBUS_KEY_quotedbl, IBUS_KEY_u, 0x00FC, 
--IBUS_KEY_quotedbl, IBUS_KEY_w, 0x1E85, 
--IBUS_KEY_quotedbl, IBUS_KEY_x, 0x1E8D, 
--IBUS_KEY_quotedbl, IBUS_KEY_y, 0x00FF, 
--IBUS_KEY_quotedbl, IBUS_KEY_acute, 0x0344, 
--IBUS_KEY_quotedbl, IBUS_KEY_Otilde, 0x1E4E, 
--IBUS_KEY_quotedbl, IBUS_KEY_otilde, 0x1E4F, 
--IBUS_KEY_quotedbl, 0x03D2, 0x03D4, 
--IBUS_KEY_quotedbl, IBUS_KEY_Umacron, 0x1E7A, 
--IBUS_KEY_quotedbl, IBUS_KEY_umacron, 0x1E7B, 
--IBUS_KEY_quotedbl, 0x04D8, 0x04DA, 
--IBUS_KEY_quotedbl, 0x04D9, 0x04DB, 
--IBUS_KEY_quotedbl, 0x04E8, 0x04EA, 
--IBUS_KEY_quotedbl, 0x04E9, 0x04EB, 
--IBUS_KEY_quotedbl, IBUS_KEY_Ukrainian_i, 0x0457, 
--IBUS_KEY_quotedbl, IBUS_KEY_Ukrainian_I, 0x0407, 
--IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_a, 0x04D3, 
--IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_ie, 0x0451, 
--IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_i, 0x04E5, 
--IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_o, 0x04E7, 
--IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_u, 0x04F1, 
--IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_zhe, 0x04DD, 
--IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_yeru, 0x04F9, 
--IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_ze, 0x04DF, 
--IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_e, 0x04ED, 
--IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_che, 0x04F5, 
--IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_A, 0x04D2, 
--IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_IE, 0x0401, 
--IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_I, 0x04E4, 
--IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_O, 0x04E6, 
--IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_U, 0x04F0, 
--IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_ZHE, 0x04DC, 
--IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_YERU, 0x04F8, 
--IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_ZE, 0x04DE, 
--IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_E, 0x04EC, 
--IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_CHE, 0x04F4, 
--IBUS_KEY_quotedbl, IBUS_KEY_Greek_IOTA, 0x03AA, 
--IBUS_KEY_quotedbl, IBUS_KEY_Greek_UPSILON, 0x03AB, 
--IBUS_KEY_quotedbl, IBUS_KEY_Greek_iota, 0x03CA, 
--IBUS_KEY_quotedbl, IBUS_KEY_Greek_upsilon, 0x03CB, 
--IBUS_KEY_quotedbl, IBUS_KEY_dead_acute, 0x0344, 
--IBUS_KEY_numbersign, IBUS_KEY_numbersign, 0x266F, 
--IBUS_KEY_numbersign, IBUS_KEY_E, 0x266B, 
--IBUS_KEY_numbersign, IBUS_KEY_S, 0x266C, 
--IBUS_KEY_numbersign, IBUS_KEY_b, 0x266D, 
--IBUS_KEY_numbersign, IBUS_KEY_e, 0x266A, 
--IBUS_KEY_numbersign, IBUS_KEY_f, 0x266E, 
--IBUS_KEY_numbersign, IBUS_KEY_q, 0x2669, 
--IBUS_KEY_percent, IBUS_KEY_o, 0x2030, 
--IBUS_KEY_apostrophe, IBUS_KEY_space, 0x0027, 
--IBUS_KEY_apostrophe, IBUS_KEY_apostrophe, 0x00B4, 
--IBUS_KEY_apostrophe, IBUS_KEY_comma, 0x201A, 
--IBUS_KEY_apostrophe, IBUS_KEY_less, 0x2018, 
--IBUS_KEY_apostrophe, IBUS_KEY_greater, 0x2019, 
--IBUS_KEY_apostrophe, IBUS_KEY_A, 0x00C1, 
--IBUS_KEY_apostrophe, IBUS_KEY_C, 0x0106, 
--IBUS_KEY_apostrophe, IBUS_KEY_E, 0x00C9, 
--IBUS_KEY_apostrophe, IBUS_KEY_G, 0x01F4, 
--IBUS_KEY_apostrophe, IBUS_KEY_I, 0x00CD, 
--IBUS_KEY_apostrophe, IBUS_KEY_K, 0x1E30, 
--IBUS_KEY_apostrophe, IBUS_KEY_L, 0x0139, 
--IBUS_KEY_apostrophe, IBUS_KEY_M, 0x1E3E, 
--IBUS_KEY_apostrophe, IBUS_KEY_N, 0x0143, 
--IBUS_KEY_apostrophe, IBUS_KEY_O, 0x00D3, 
--IBUS_KEY_apostrophe, IBUS_KEY_P, 0x1E54, 
--IBUS_KEY_apostrophe, IBUS_KEY_R, 0x0154, 
--IBUS_KEY_apostrophe, IBUS_KEY_S, 0x015A, 
--IBUS_KEY_apostrophe, IBUS_KEY_U, 0x00DA, 
--IBUS_KEY_apostrophe, IBUS_KEY_W, 0x1E82, 
--IBUS_KEY_apostrophe, IBUS_KEY_Y, 0x00DD, 
--IBUS_KEY_apostrophe, IBUS_KEY_Z, 0x0179, 
--IBUS_KEY_apostrophe, IBUS_KEY_a, 0x00E1, 
--IBUS_KEY_apostrophe, IBUS_KEY_c, 0x0107, 
--IBUS_KEY_apostrophe, IBUS_KEY_e, 0x00E9, 
--IBUS_KEY_apostrophe, IBUS_KEY_g, 0x01F5, 
--IBUS_KEY_apostrophe, IBUS_KEY_i, 0x00ED, 
--IBUS_KEY_apostrophe, IBUS_KEY_k, 0x1E31, 
--IBUS_KEY_apostrophe, IBUS_KEY_l, 0x013A, 
--IBUS_KEY_apostrophe, IBUS_KEY_m, 0x1E3F, 
--IBUS_KEY_apostrophe, IBUS_KEY_n, 0x0144, 
--IBUS_KEY_apostrophe, IBUS_KEY_o, 0x00F3, 
--IBUS_KEY_apostrophe, IBUS_KEY_p, 0x1E55, 
--IBUS_KEY_apostrophe, IBUS_KEY_r, 0x0155, 
--IBUS_KEY_apostrophe, IBUS_KEY_s, 0x015B, 
--IBUS_KEY_apostrophe, IBUS_KEY_u, 0x00FA, 
--IBUS_KEY_apostrophe, IBUS_KEY_w, 0x1E83, 
--IBUS_KEY_apostrophe, IBUS_KEY_y, 0x00FD, 
--IBUS_KEY_apostrophe, IBUS_KEY_z, 0x017A, 
--IBUS_KEY_apostrophe, IBUS_KEY_Acircumflex, 0x1EA4, 
--IBUS_KEY_apostrophe, IBUS_KEY_Aring, 0x01FA, 
--IBUS_KEY_apostrophe, IBUS_KEY_AE, 0x01FC, 
--IBUS_KEY_apostrophe, IBUS_KEY_Ccedilla, 0x1E08, 
--IBUS_KEY_apostrophe, IBUS_KEY_Ecircumflex, 0x1EBE, 
--IBUS_KEY_apostrophe, IBUS_KEY_Idiaeresis, 0x1E2E, 
--IBUS_KEY_apostrophe, IBUS_KEY_Ocircumflex, 0x1ED0, 
--IBUS_KEY_apostrophe, IBUS_KEY_Otilde, 0x1E4C, 
--IBUS_KEY_apostrophe, IBUS_KEY_Ooblique, 0x01FE, 
--IBUS_KEY_apostrophe, IBUS_KEY_Udiaeresis, 0x01D7, 
--IBUS_KEY_apostrophe, IBUS_KEY_acircumflex, 0x1EA5, 
--IBUS_KEY_apostrophe, IBUS_KEY_aring, 0x01FB, 
--IBUS_KEY_apostrophe, IBUS_KEY_ae, 0x01FD, 
--IBUS_KEY_apostrophe, IBUS_KEY_ccedilla, 0x1E09, 
--IBUS_KEY_apostrophe, IBUS_KEY_ecircumflex, 0x1EBF, 
--IBUS_KEY_apostrophe, IBUS_KEY_idiaeresis, 0x1E2F, 
--IBUS_KEY_apostrophe, IBUS_KEY_ocircumflex, 0x1ED1, 
--IBUS_KEY_apostrophe, IBUS_KEY_otilde, 0x1E4D, 
--IBUS_KEY_apostrophe, IBUS_KEY_oslash, 0x01FF, 
--IBUS_KEY_apostrophe, IBUS_KEY_udiaeresis, 0x01D8, 
--IBUS_KEY_apostrophe, IBUS_KEY_Abreve, 0x1EAE, 
--IBUS_KEY_apostrophe, IBUS_KEY_abreve, 0x1EAF, 
--IBUS_KEY_apostrophe, IBUS_KEY_Emacron, 0x1E16, 
--IBUS_KEY_apostrophe, IBUS_KEY_emacron, 0x1E17, 
--IBUS_KEY_apostrophe, IBUS_KEY_Omacron, 0x1E52, 
--IBUS_KEY_apostrophe, IBUS_KEY_Utilde, 0x1E78, 
--IBUS_KEY_apostrophe, IBUS_KEY_omacron, 0x1E53, 
--IBUS_KEY_apostrophe, IBUS_KEY_utilde, 0x1E79, 
--IBUS_KEY_apostrophe, IBUS_KEY_Cyrillic_ghe, 0x0453, 
--IBUS_KEY_apostrophe, IBUS_KEY_Cyrillic_ka, 0x045C, 
--IBUS_KEY_apostrophe, IBUS_KEY_Cyrillic_GHE, 0x0403, 
--IBUS_KEY_apostrophe, IBUS_KEY_Cyrillic_KA, 0x040C, 
--IBUS_KEY_apostrophe, IBUS_KEY_Greek_iotadieresis, 0x0390, 
--IBUS_KEY_apostrophe, IBUS_KEY_Greek_upsilondieresis, 0x03B0, 
--IBUS_KEY_apostrophe, IBUS_KEY_Greek_ALPHA, 0x0386, 
--IBUS_KEY_apostrophe, IBUS_KEY_Greek_EPSILON, 0x0388, 
--IBUS_KEY_apostrophe, IBUS_KEY_Greek_ETA, 0x0389, 
--IBUS_KEY_apostrophe, IBUS_KEY_Greek_IOTA, 0x038A, 
--IBUS_KEY_apostrophe, IBUS_KEY_Greek_OMICRON, 0x038C, 
--IBUS_KEY_apostrophe, IBUS_KEY_Greek_UPSILON, 0x038E, 
--IBUS_KEY_apostrophe, IBUS_KEY_Greek_OMEGA, 0x038F, 
--IBUS_KEY_apostrophe, IBUS_KEY_Greek_alpha, 0x03AC, 
--IBUS_KEY_apostrophe, IBUS_KEY_Greek_epsilon, 0x03AD, 
--IBUS_KEY_apostrophe, IBUS_KEY_Greek_eta, 0x03AE, 
--IBUS_KEY_apostrophe, IBUS_KEY_Greek_iota, 0x03AF, 
--IBUS_KEY_apostrophe, IBUS_KEY_Greek_omicron, 0x03CC, 
--IBUS_KEY_apostrophe, IBUS_KEY_Greek_upsilon, 0x03CD, 
--IBUS_KEY_apostrophe, IBUS_KEY_Greek_omega, 0x03CE, 
--IBUS_KEY_apostrophe, 0x1F00, 0x1F04, 
--IBUS_KEY_apostrophe, 0x1F01, 0x1F05, 
--IBUS_KEY_apostrophe, 0x1F08, 0x1F0C, 
--IBUS_KEY_apostrophe, 0x1F09, 0x1F0D, 
--IBUS_KEY_apostrophe, 0x1F10, 0x1F14, 
--IBUS_KEY_apostrophe, 0x1F11, 0x1F15, 
--IBUS_KEY_apostrophe, 0x1F18, 0x1F1C, 
--IBUS_KEY_apostrophe, 0x1F19, 0x1F1D, 
--IBUS_KEY_apostrophe, 0x1F20, 0x1F24, 
--IBUS_KEY_apostrophe, 0x1F21, 0x1F25, 
--IBUS_KEY_apostrophe, 0x1F28, 0x1F2C, 
--IBUS_KEY_apostrophe, 0x1F29, 0x1F2D, 
--IBUS_KEY_apostrophe, 0x1F30, 0x1F34, 
--IBUS_KEY_apostrophe, 0x1F31, 0x1F35, 
--IBUS_KEY_apostrophe, 0x1F38, 0x1F3C, 
--IBUS_KEY_apostrophe, 0x1F39, 0x1F3D, 
--IBUS_KEY_apostrophe, 0x1F40, 0x1F44, 
--IBUS_KEY_apostrophe, 0x1F41, 0x1F45, 
--IBUS_KEY_apostrophe, 0x1F48, 0x1F4C, 
--IBUS_KEY_apostrophe, 0x1F49, 0x1F4D, 
--IBUS_KEY_apostrophe, 0x1F50, 0x1F54, 
--IBUS_KEY_apostrophe, 0x1F51, 0x1F55, 
--IBUS_KEY_apostrophe, 0x1F59, 0x1F5D, 
--IBUS_KEY_apostrophe, 0x1F60, 0x1F64, 
--IBUS_KEY_apostrophe, 0x1F61, 0x1F65, 
--IBUS_KEY_apostrophe, 0x1F68, 0x1F6C, 
--IBUS_KEY_apostrophe, 0x1F69, 0x1F6D, 
--IBUS_KEY_apostrophe, 0x2395, 0x235E, 
--IBUS_KEY_parenleft, IBUS_KEY_space, 0x02D8, 
--IBUS_KEY_parenleft, IBUS_KEY_parenleft, 0x005B, 
--IBUS_KEY_parenleft, IBUS_KEY_minus, 0x007B, 
--IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA, 0x1F09, 
--IBUS_KEY_parenleft, IBUS_KEY_Greek_EPSILON, 0x1F19, 
--IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA, 0x1F29, 
--IBUS_KEY_parenleft, IBUS_KEY_Greek_IOTA, 0x1F39, 
--IBUS_KEY_parenleft, IBUS_KEY_Greek_OMICRON, 0x1F49, 
--IBUS_KEY_parenleft, IBUS_KEY_Greek_RHO, 0x1FEC, 
--IBUS_KEY_parenleft, IBUS_KEY_Greek_UPSILON, 0x1F59, 
--IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA, 0x1F69, 
--IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha, 0x1F01, 
--IBUS_KEY_parenleft, IBUS_KEY_Greek_epsilon, 0x1F11, 
--IBUS_KEY_parenleft, IBUS_KEY_Greek_eta, 0x1F21, 
--IBUS_KEY_parenleft, IBUS_KEY_Greek_iota, 0x1F31, 
--IBUS_KEY_parenleft, IBUS_KEY_Greek_omicron, 0x1F41, 
--IBUS_KEY_parenleft, IBUS_KEY_Greek_rho, 0x1FE5, 
--IBUS_KEY_parenleft, IBUS_KEY_Greek_upsilon, 0x1F51, 
--IBUS_KEY_parenleft, IBUS_KEY_Greek_omega, 0x1F61, 
--IBUS_KEY_parenright, IBUS_KEY_parenright, 0x005D, 
--IBUS_KEY_parenright, IBUS_KEY_minus, 0x007D, 
--IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA, 0x1F08, 
--IBUS_KEY_parenright, IBUS_KEY_Greek_EPSILON, 0x1F18, 
--IBUS_KEY_parenright, IBUS_KEY_Greek_ETA, 0x1F28, 
--IBUS_KEY_parenright, IBUS_KEY_Greek_IOTA, 0x1F38, 
--IBUS_KEY_parenright, IBUS_KEY_Greek_OMICRON, 0x1F48, 
--IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA, 0x1F68, 
--IBUS_KEY_parenright, IBUS_KEY_Greek_alpha, 0x1F00, 
--IBUS_KEY_parenright, IBUS_KEY_Greek_epsilon, 0x1F10, 
--IBUS_KEY_parenright, IBUS_KEY_Greek_eta, 0x1F20, 
--IBUS_KEY_parenright, IBUS_KEY_Greek_iota, 0x1F30, 
--IBUS_KEY_parenright, IBUS_KEY_Greek_omicron, 0x1F40, 
--IBUS_KEY_parenright, IBUS_KEY_Greek_rho, 0x1FE4, 
--IBUS_KEY_parenright, IBUS_KEY_Greek_upsilon, 0x1F50, 
--IBUS_KEY_parenright, IBUS_KEY_Greek_omega, 0x1F60, 
--IBUS_KEY_asterisk, IBUS_KEY_0, 0x00B0, 
--IBUS_KEY_asterisk, IBUS_KEY_A, 0x00C5, 
--IBUS_KEY_asterisk, IBUS_KEY_U, 0x016E, 
--IBUS_KEY_asterisk, IBUS_KEY_a, 0x00E5, 
--IBUS_KEY_asterisk, IBUS_KEY_u, 0x016F, 
--IBUS_KEY_asterisk, IBUS_KEY_diaeresis, 0x2363, 
--IBUS_KEY_asterisk, IBUS_KEY_emopencircle, 0x235F, 
--IBUS_KEY_plus, IBUS_KEY_plus, 0x0023, 
--IBUS_KEY_plus, IBUS_KEY_minus, 0x00B1, 
--IBUS_KEY_plus, IBUS_KEY_O, 0x01A0, 
--IBUS_KEY_plus, IBUS_KEY_U, 0x01AF, 
--IBUS_KEY_plus, IBUS_KEY_o, 0x01A1, 
--IBUS_KEY_plus, IBUS_KEY_u, 0x01B0, 
--IBUS_KEY_comma, IBUS_KEY_space, 0x00B8, 
--IBUS_KEY_comma, IBUS_KEY_quotedbl, 0x201E, 
--IBUS_KEY_comma, IBUS_KEY_apostrophe, 0x201A, 
--IBUS_KEY_comma, IBUS_KEY_comma, 0x00B8, 
--IBUS_KEY_comma, IBUS_KEY_minus, 0x00AC, 
--IBUS_KEY_comma, IBUS_KEY_A, 0x0104, 
--IBUS_KEY_comma, IBUS_KEY_C, 0x00C7, 
--IBUS_KEY_comma, IBUS_KEY_D, 0x1E10, 
--IBUS_KEY_comma, IBUS_KEY_E, 0x0118, 
--IBUS_KEY_comma, IBUS_KEY_G, 0x0122, 
--IBUS_KEY_comma, IBUS_KEY_H, 0x1E28, 
--IBUS_KEY_comma, IBUS_KEY_I, 0x012E, 
--IBUS_KEY_comma, IBUS_KEY_K, 0x0136, 
--IBUS_KEY_comma, IBUS_KEY_L, 0x013B, 
--IBUS_KEY_comma, IBUS_KEY_N, 0x0145, 
--IBUS_KEY_comma, IBUS_KEY_O, 0x01EA, 
--IBUS_KEY_comma, IBUS_KEY_R, 0x0156, 
--IBUS_KEY_comma, IBUS_KEY_S, 0x015E, 
--IBUS_KEY_comma, IBUS_KEY_T, 0x0162, 
--IBUS_KEY_comma, IBUS_KEY_U, 0x0172, 
--IBUS_KEY_comma, IBUS_KEY_a, 0x0105, 
--IBUS_KEY_comma, IBUS_KEY_c, 0x00E7, 
--IBUS_KEY_comma, IBUS_KEY_d, 0x1E11, 
--IBUS_KEY_comma, IBUS_KEY_e, 0x0119, 
--IBUS_KEY_comma, IBUS_KEY_g, 0x0123, 
--IBUS_KEY_comma, IBUS_KEY_h, 0x1E29, 
--IBUS_KEY_comma, IBUS_KEY_i, 0x012F, 
--IBUS_KEY_comma, IBUS_KEY_k, 0x0137, 
--IBUS_KEY_comma, IBUS_KEY_l, 0x013C, 
--IBUS_KEY_comma, IBUS_KEY_n, 0x0146, 
--IBUS_KEY_comma, IBUS_KEY_o, 0x01EB, 
--IBUS_KEY_comma, IBUS_KEY_r, 0x0157, 
--IBUS_KEY_comma, IBUS_KEY_s, 0x015F, 
--IBUS_KEY_comma, IBUS_KEY_t, 0x0163, 
--IBUS_KEY_comma, IBUS_KEY_u, 0x0173, 
--IBUS_KEY_minus, IBUS_KEY_space, 0x007E, 
--IBUS_KEY_minus, IBUS_KEY_parenleft, 0x007B, 
--IBUS_KEY_minus, IBUS_KEY_parenright, 0x007D, 
--IBUS_KEY_minus, IBUS_KEY_plus, 0x00B1, 
--IBUS_KEY_minus, IBUS_KEY_comma, 0x00AC, 
--IBUS_KEY_minus, IBUS_KEY_slash, 0x233F, 
--IBUS_KEY_minus, IBUS_KEY_colon, 0x00F7, 
--IBUS_KEY_minus, IBUS_KEY_greater, 0x2192, 
--IBUS_KEY_minus, IBUS_KEY_A, 0x0100, 
--IBUS_KEY_minus, IBUS_KEY_D, 0x0110, 
--IBUS_KEY_minus, IBUS_KEY_E, 0x0112, 
--IBUS_KEY_minus, IBUS_KEY_I, 0x012A, 
--IBUS_KEY_minus, IBUS_KEY_L, 0x00A3, 
--IBUS_KEY_minus, IBUS_KEY_O, 0x014C, 
--IBUS_KEY_minus, IBUS_KEY_U, 0x016A, 
--IBUS_KEY_minus, IBUS_KEY_Y, 0x00A5, 
--IBUS_KEY_minus, IBUS_KEY_backslash, 0x2340, 
--IBUS_KEY_minus, IBUS_KEY_asciicircum, 0x00AF, 
--IBUS_KEY_minus, IBUS_KEY_a, 0x0101, 
--IBUS_KEY_minus, IBUS_KEY_d, 0x0111, 
--IBUS_KEY_minus, IBUS_KEY_e, 0x0113, 
--IBUS_KEY_minus, IBUS_KEY_i, 0x012B, 
--IBUS_KEY_minus, IBUS_KEY_l, 0x00A3, 
--IBUS_KEY_minus, IBUS_KEY_o, 0x014D, 
--IBUS_KEY_minus, IBUS_KEY_u, 0x016B, 
--IBUS_KEY_minus, IBUS_KEY_y, 0x00A5, 
--IBUS_KEY_minus, 0x2191, 0x234F, 
--IBUS_KEY_minus, 0x2193, 0x2356, 
--IBUS_KEY_minus, IBUS_KEY_emopencircle, 0x2296, 
--IBUS_KEY_period, IBUS_KEY_minus, 0x00B7, 
--IBUS_KEY_period, IBUS_KEY_period, 0x2026, 
--IBUS_KEY_period, IBUS_KEY_colon, 0x2235, 
--IBUS_KEY_period, IBUS_KEY_less, 0x2039, 
--IBUS_KEY_period, IBUS_KEY_equal, 0x2022, 
--IBUS_KEY_period, IBUS_KEY_greater, 0x203A, 
--IBUS_KEY_period, IBUS_KEY_A, 0x0226, 
--IBUS_KEY_period, IBUS_KEY_B, 0x1E02, 
--IBUS_KEY_period, IBUS_KEY_C, 0x010A, 
--IBUS_KEY_period, IBUS_KEY_D, 0x1E0A, 
--IBUS_KEY_period, IBUS_KEY_E, 0x0116, 
--IBUS_KEY_period, IBUS_KEY_F, 0x1E1E, 
--IBUS_KEY_period, IBUS_KEY_G, 0x0120, 
--IBUS_KEY_period, IBUS_KEY_H, 0x1E22, 
--IBUS_KEY_period, IBUS_KEY_I, 0x0130, 
--IBUS_KEY_period, IBUS_KEY_M, 0x1E40, 
--IBUS_KEY_period, IBUS_KEY_N, 0x1E44, 
--IBUS_KEY_period, IBUS_KEY_O, 0x022E, 
--IBUS_KEY_period, IBUS_KEY_P, 0x1E56, 
--IBUS_KEY_period, IBUS_KEY_R, 0x1E58, 
--IBUS_KEY_period, IBUS_KEY_S, 0x1E60, 
--IBUS_KEY_period, IBUS_KEY_T, 0x1E6A, 
--IBUS_KEY_period, IBUS_KEY_W, 0x1E86, 
--IBUS_KEY_period, IBUS_KEY_X, 0x1E8A, 
--IBUS_KEY_period, IBUS_KEY_Y, 0x1E8E, 
--IBUS_KEY_period, IBUS_KEY_Z, 0x017B, 
--IBUS_KEY_period, IBUS_KEY_asciicircum, 0x00B7, 
--IBUS_KEY_period, IBUS_KEY_a, 0x0227, 
--IBUS_KEY_period, IBUS_KEY_b, 0x1E03, 
--IBUS_KEY_period, IBUS_KEY_c, 0x010B, 
--IBUS_KEY_period, IBUS_KEY_d, 0x1E0B, 
--IBUS_KEY_period, IBUS_KEY_e, 0x0117, 
--IBUS_KEY_period, IBUS_KEY_f, 0x1E1F, 
--IBUS_KEY_period, IBUS_KEY_g, 0x0121, 
--IBUS_KEY_period, IBUS_KEY_h, 0x1E23, 
--IBUS_KEY_period, IBUS_KEY_i, 0x0131, 
--IBUS_KEY_period, IBUS_KEY_m, 0x1E41, 
--IBUS_KEY_period, IBUS_KEY_n, 0x1E45, 
--IBUS_KEY_period, IBUS_KEY_o, 0x022F, 
--IBUS_KEY_period, IBUS_KEY_p, 0x1E57, 
--IBUS_KEY_period, IBUS_KEY_r, 0x1E59, 
--IBUS_KEY_period, IBUS_KEY_s, 0x1E61, 
--IBUS_KEY_period, IBUS_KEY_t, 0x1E6B, 
--IBUS_KEY_period, IBUS_KEY_w, 0x1E87, 
--IBUS_KEY_period, IBUS_KEY_x, 0x1E8B, 
--IBUS_KEY_period, IBUS_KEY_y, 0x1E8F, 
--IBUS_KEY_period, IBUS_KEY_z, 0x017C, 
--IBUS_KEY_period, 0x017F, 0x1E9B, 
--IBUS_KEY_period, IBUS_KEY_Sacute, 0x1E64, 
--IBUS_KEY_period, IBUS_KEY_Scaron, 0x1E66, 
--IBUS_KEY_period, IBUS_KEY_sacute, 0x1E65, 
--IBUS_KEY_period, IBUS_KEY_scaron, 0x1E67, 
--IBUS_KEY_period, 0x1E62, 0x1E68, 
--IBUS_KEY_period, 0x1E63, 0x1E69, 
--IBUS_KEY_period, IBUS_KEY_emopencircle, 0x2299, 
--IBUS_KEY_slash, IBUS_KEY_minus, 0x233F, 
--IBUS_KEY_slash, IBUS_KEY_slash, 0x005C, 
--IBUS_KEY_slash, IBUS_KEY_less, 0x005C, 
--IBUS_KEY_slash, IBUS_KEY_equal, 0x2260, 
--IBUS_KEY_slash, IBUS_KEY_C, 0x20A1, 
--IBUS_KEY_slash, IBUS_KEY_D, 0x0110, 
--IBUS_KEY_slash, IBUS_KEY_G, 0x01E4, 
--IBUS_KEY_slash, IBUS_KEY_H, 0x0126, 
--IBUS_KEY_slash, IBUS_KEY_I, 0x0197, 
--IBUS_KEY_slash, IBUS_KEY_L, 0x0141, 
--IBUS_KEY_slash, IBUS_KEY_O, 0x00D8, 
--IBUS_KEY_slash, IBUS_KEY_T, 0x0166, 
--IBUS_KEY_slash, IBUS_KEY_Z, 0x01B5, 
--IBUS_KEY_slash, IBUS_KEY_asciicircum, 0x007C, 
--IBUS_KEY_slash, IBUS_KEY_b, 0x0180, 
--IBUS_KEY_slash, IBUS_KEY_c, 0x00A2, 
--IBUS_KEY_slash, IBUS_KEY_d, 0x0111, 
--IBUS_KEY_slash, IBUS_KEY_g, 0x01E5, 
--IBUS_KEY_slash, IBUS_KEY_h, 0x0127, 
--IBUS_KEY_slash, IBUS_KEY_i, 0x0268, 
--IBUS_KEY_slash, IBUS_KEY_l, 0x0142, 
--IBUS_KEY_slash, IBUS_KEY_m, 0x20A5, 
--IBUS_KEY_slash, IBUS_KEY_o, 0x00F8, 
--IBUS_KEY_slash, IBUS_KEY_t, 0x0167, 
--IBUS_KEY_slash, IBUS_KEY_u, 0x00B5, 
--IBUS_KEY_slash, IBUS_KEY_v, 0x221A, 
--IBUS_KEY_slash, IBUS_KEY_z, 0x01B6, 
--IBUS_KEY_slash, 0x0294, 0x02A1, 
--IBUS_KEY_slash, 0x04AE, 0x04B0, 
--IBUS_KEY_slash, 0x04AF, 0x04B1, 
--IBUS_KEY_slash, IBUS_KEY_Cyrillic_ghe, 0x0493, 
--IBUS_KEY_slash, IBUS_KEY_Cyrillic_ka, 0x049F, 
--IBUS_KEY_slash, IBUS_KEY_Cyrillic_GHE, 0x0492, 
--IBUS_KEY_slash, IBUS_KEY_Cyrillic_KA, 0x049E, 
--IBUS_KEY_slash, IBUS_KEY_leftarrow, 0x219A, 
--IBUS_KEY_slash, IBUS_KEY_rightarrow, 0x219B, 
--IBUS_KEY_slash, 0x2194, 0x21AE, 
--IBUS_KEY_slash, 0x2395, 0x2341, 
--IBUS_KEY_0, IBUS_KEY_asterisk, 0x00B0, 
--IBUS_KEY_0, IBUS_KEY_3, 0x2189, 
--IBUS_KEY_0, IBUS_KEY_asciitilde, 0x236C, 
--IBUS_KEY_1, IBUS_KEY_2, 0x00BD, 
--IBUS_KEY_1, IBUS_KEY_3, 0x2153, 
--IBUS_KEY_1, IBUS_KEY_4, 0x00BC, 
--IBUS_KEY_1, IBUS_KEY_5, 0x2155, 
--IBUS_KEY_1, IBUS_KEY_6, 0x2159, 
--IBUS_KEY_1, IBUS_KEY_7, 0x2150, 
--IBUS_KEY_1, IBUS_KEY_8, 0x215B, 
--IBUS_KEY_1, IBUS_KEY_9, 0x2151, 
--IBUS_KEY_1, IBUS_KEY_asciicircum, 0x00B9, 
--IBUS_KEY_2, IBUS_KEY_3, 0x2154, 
--IBUS_KEY_2, IBUS_KEY_5, 0x2156, 
--IBUS_KEY_2, IBUS_KEY_asciicircum, 0x00B2, 
--IBUS_KEY_3, IBUS_KEY_4, 0x00BE, 
--IBUS_KEY_3, IBUS_KEY_5, 0x2157, 
--IBUS_KEY_3, IBUS_KEY_8, 0x215C, 
--IBUS_KEY_3, IBUS_KEY_asciicircum, 0x00B3, 
--IBUS_KEY_4, IBUS_KEY_5, 0x2158, 
--IBUS_KEY_5, IBUS_KEY_6, 0x215A, 
--IBUS_KEY_5, IBUS_KEY_8, 0x215D, 
--IBUS_KEY_7, IBUS_KEY_8, 0x215E, 
--IBUS_KEY_8, IBUS_KEY_8, 0x221E, 
--IBUS_KEY_colon, IBUS_KEY_parenleft, 0x2639, 
--IBUS_KEY_colon, IBUS_KEY_parenright, 0x263A, 
--IBUS_KEY_colon, IBUS_KEY_minus, 0x00F7, 
--IBUS_KEY_colon, IBUS_KEY_period, 0x2234, 
--IBUS_KEY_colon, 0x2395, 0x2360, 
--IBUS_KEY_semicolon, IBUS_KEY_A, 0x0104, 
--IBUS_KEY_semicolon, IBUS_KEY_E, 0x0118, 
--IBUS_KEY_semicolon, IBUS_KEY_I, 0x012E, 
--IBUS_KEY_semicolon, IBUS_KEY_O, 0x01EA, 
--IBUS_KEY_semicolon, IBUS_KEY_S, 0x0218, 
--IBUS_KEY_semicolon, IBUS_KEY_T, 0x021A, 
--IBUS_KEY_semicolon, IBUS_KEY_U, 0x0172, 
--IBUS_KEY_semicolon, IBUS_KEY_underscore, 0x236E, 
--IBUS_KEY_semicolon, IBUS_KEY_a, 0x0105, 
--IBUS_KEY_semicolon, IBUS_KEY_e, 0x0119, 
--IBUS_KEY_semicolon, IBUS_KEY_i, 0x012F, 
--IBUS_KEY_semicolon, IBUS_KEY_o, 0x01EB, 
--IBUS_KEY_semicolon, IBUS_KEY_s, 0x0219, 
--IBUS_KEY_semicolon, IBUS_KEY_t, 0x021B, 
--IBUS_KEY_semicolon, IBUS_KEY_u, 0x0173, 
--IBUS_KEY_less, IBUS_KEY_space, 0x02C7, 
--IBUS_KEY_less, IBUS_KEY_quotedbl, 0x201C, 
--IBUS_KEY_less, IBUS_KEY_apostrophe, 0x2018, 
--IBUS_KEY_less, IBUS_KEY_minus, 0x2190, 
--IBUS_KEY_less, IBUS_KEY_slash, 0x005C, 
--IBUS_KEY_less, IBUS_KEY_3, 0x2665, 
--IBUS_KEY_less, IBUS_KEY_less, 0x00AB, 
--IBUS_KEY_less, IBUS_KEY_equal, 0x2264, 
--IBUS_KEY_less, IBUS_KEY_greater, 0x22C4, 
--IBUS_KEY_less, IBUS_KEY_C, 0x010C, 
--IBUS_KEY_less, IBUS_KEY_D, 0x010E, 
--IBUS_KEY_less, IBUS_KEY_E, 0x011A, 
--IBUS_KEY_less, IBUS_KEY_L, 0x013D, 
--IBUS_KEY_less, IBUS_KEY_N, 0x0147, 
--IBUS_KEY_less, IBUS_KEY_R, 0x0158, 
--IBUS_KEY_less, IBUS_KEY_S, 0x0160, 
--IBUS_KEY_less, IBUS_KEY_T, 0x0164, 
--IBUS_KEY_less, IBUS_KEY_Z, 0x017D, 
--IBUS_KEY_less, IBUS_KEY_underscore, 0x2264, 
--IBUS_KEY_less, IBUS_KEY_c, 0x010D, 
--IBUS_KEY_less, IBUS_KEY_d, 0x010F, 
--IBUS_KEY_less, IBUS_KEY_e, 0x011B, 
--IBUS_KEY_less, IBUS_KEY_l, 0x013E, 
--IBUS_KEY_less, IBUS_KEY_n, 0x0148, 
--IBUS_KEY_less, IBUS_KEY_r, 0x0159, 
--IBUS_KEY_less, IBUS_KEY_s, 0x0161, 
--IBUS_KEY_less, IBUS_KEY_t, 0x0165, 
--IBUS_KEY_less, IBUS_KEY_z, 0x017E, 
--IBUS_KEY_less, 0x0338, 0x226E, 
--IBUS_KEY_less, 0x2395, 0x2343, 
--IBUS_KEY_equal, IBUS_KEY_slash, 0x2260, 
--IBUS_KEY_equal, IBUS_KEY_greater, 0x21D2, 
--IBUS_KEY_equal, IBUS_KEY_C, 0x20AC, 
--IBUS_KEY_equal, IBUS_KEY_E, 0x20AC, 
--IBUS_KEY_equal, IBUS_KEY_L, 0x20A4, 
--IBUS_KEY_equal, IBUS_KEY_N, 0x20A6, 
--IBUS_KEY_equal, IBUS_KEY_O, 0x0150, 
--IBUS_KEY_equal, IBUS_KEY_U, 0x0170, 
--IBUS_KEY_equal, IBUS_KEY_W, 0x20A9, 
--IBUS_KEY_equal, IBUS_KEY_Y, 0x00A5, 
--IBUS_KEY_equal, IBUS_KEY_underscore, 0x2261, 
--IBUS_KEY_equal, IBUS_KEY_c, 0x20AC, 
--IBUS_KEY_equal, IBUS_KEY_d, 0x20AB, 
--IBUS_KEY_equal, IBUS_KEY_e, 0x20AC, 
--IBUS_KEY_equal, IBUS_KEY_o, 0x0151, 
--IBUS_KEY_equal, IBUS_KEY_u, 0x0171, 
--IBUS_KEY_equal, IBUS_KEY_y, 0x00A5, 
--IBUS_KEY_equal, 0x0338, 0x2260, 
--IBUS_KEY_equal, IBUS_KEY_Cyrillic_u, 0x04F3, 
--IBUS_KEY_equal, IBUS_KEY_Cyrillic_IE, 0x20AC, 
--IBUS_KEY_equal, IBUS_KEY_Cyrillic_ES, 0x20AC, 
--IBUS_KEY_equal, IBUS_KEY_Cyrillic_U, 0x04F2, 
--IBUS_KEY_equal, 0x2395, 0x2338, 
--IBUS_KEY_greater, IBUS_KEY_space, 0x005E, 
--IBUS_KEY_greater, IBUS_KEY_quotedbl, 0x201D, 
--IBUS_KEY_greater, IBUS_KEY_apostrophe, 0x2019, 
--IBUS_KEY_greater, IBUS_KEY_less, 0x22C4, 
--IBUS_KEY_greater, IBUS_KEY_equal, 0x2265, 
--IBUS_KEY_greater, IBUS_KEY_greater, 0x00BB, 
--IBUS_KEY_greater, IBUS_KEY_A, 0x00C2, 
--IBUS_KEY_greater, IBUS_KEY_E, 0x00CA, 
--IBUS_KEY_greater, IBUS_KEY_I, 0x00CE, 
--IBUS_KEY_greater, IBUS_KEY_O, 0x00D4, 
--IBUS_KEY_greater, IBUS_KEY_U, 0x00DB, 
--IBUS_KEY_greater, IBUS_KEY_underscore, 0x2265, 
--IBUS_KEY_greater, IBUS_KEY_a, 0x00E2, 
--IBUS_KEY_greater, IBUS_KEY_e, 0x00EA, 
--IBUS_KEY_greater, IBUS_KEY_i, 0x00EE, 
--IBUS_KEY_greater, IBUS_KEY_o, 0x00F4, 
--IBUS_KEY_greater, IBUS_KEY_u, 0x00FB, 
--IBUS_KEY_greater, IBUS_KEY_diaeresis, 0x2369, 
--IBUS_KEY_greater, 0x0338, 0x226F, 
--IBUS_KEY_greater, 0x2395, 0x2344, 
--IBUS_KEY_question, IBUS_KEY_exclam, 0x2E18, 
--IBUS_KEY_question, IBUS_KEY_question, 0x00BF, 
--IBUS_KEY_question, IBUS_KEY_A, 0x1EA2, 
--IBUS_KEY_question, IBUS_KEY_E, 0x1EBA, 
--IBUS_KEY_question, IBUS_KEY_I, 0x1EC8, 
--IBUS_KEY_question, IBUS_KEY_O, 0x1ECE, 
--IBUS_KEY_question, IBUS_KEY_U, 0x1EE6, 
--IBUS_KEY_question, IBUS_KEY_Y, 0x1EF6, 
--IBUS_KEY_question, IBUS_KEY_a, 0x1EA3, 
--IBUS_KEY_question, IBUS_KEY_e, 0x1EBB, 
--IBUS_KEY_question, IBUS_KEY_i, 0x1EC9, 
--IBUS_KEY_question, IBUS_KEY_o, 0x1ECF, 
--IBUS_KEY_question, IBUS_KEY_u, 0x1EE7, 
--IBUS_KEY_question, IBUS_KEY_y, 0x1EF7, 
--IBUS_KEY_question, IBUS_KEY_Acircumflex, 0x1EA8, 
--IBUS_KEY_question, IBUS_KEY_Ecircumflex, 0x1EC2, 
--IBUS_KEY_question, IBUS_KEY_Ocircumflex, 0x1ED4, 
--IBUS_KEY_question, IBUS_KEY_acircumflex, 0x1EA9, 
--IBUS_KEY_question, IBUS_KEY_ecircumflex, 0x1EC3, 
--IBUS_KEY_question, IBUS_KEY_ocircumflex, 0x1ED5, 
--IBUS_KEY_question, IBUS_KEY_Abreve, 0x1EB2, 
--IBUS_KEY_question, IBUS_KEY_abreve, 0x1EB3, 
--IBUS_KEY_question, 0x2395, 0x2370, 
--IBUS_KEY_A, IBUS_KEY_quotedbl, 0x00C4, 
--IBUS_KEY_A, IBUS_KEY_apostrophe, 0x00C1, 
--IBUS_KEY_A, IBUS_KEY_parenleft, 0x0102, 
--IBUS_KEY_A, IBUS_KEY_asterisk, 0x00C5, 
--IBUS_KEY_A, IBUS_KEY_comma, 0x0104, 
--IBUS_KEY_A, IBUS_KEY_minus, 0x0100, 
--IBUS_KEY_A, IBUS_KEY_semicolon, 0x0104, 
--IBUS_KEY_A, IBUS_KEY_greater, 0x00C2, 
--IBUS_KEY_A, IBUS_KEY_A, 0x00C5, 
--IBUS_KEY_A, IBUS_KEY_E, 0x00C6, 
--IBUS_KEY_A, IBUS_KEY_T, 0x0040, 
--IBUS_KEY_A, IBUS_KEY_asciicircum, 0x00C2, 
--IBUS_KEY_A, IBUS_KEY_underscore, 0x0100, 
--IBUS_KEY_A, IBUS_KEY_grave, 0x00C0, 
--IBUS_KEY_A, IBUS_KEY_asciitilde, 0x00C3, 
--IBUS_KEY_A, IBUS_KEY_diaeresis, 0x00C4, 
--IBUS_KEY_A, IBUS_KEY_acute, 0x00C1, 
--IBUS_KEY_B, IBUS_KEY_period, 0x1E02, 
--IBUS_KEY_C, IBUS_KEY_apostrophe, 0x0106, 
--IBUS_KEY_C, IBUS_KEY_comma, 0x00C7, 
--IBUS_KEY_C, IBUS_KEY_period, 0x010A, 
--IBUS_KEY_C, IBUS_KEY_slash, 0x20A1, 
--IBUS_KEY_C, IBUS_KEY_less, 0x010C, 
--IBUS_KEY_C, IBUS_KEY_equal, 0x20AC, 
--IBUS_KEY_C, IBUS_KEY_E, 0x20A0, 
--IBUS_KEY_C, IBUS_KEY_O, 0x00A9, 
--IBUS_KEY_C, IBUS_KEY_o, 0x00A9, 
--IBUS_KEY_C, IBUS_KEY_r, 0x20A2, 
--IBUS_KEY_C, IBUS_KEY_bar, 0x00A2, 
--IBUS_KEY_D, IBUS_KEY_comma, 0x1E10, 
--IBUS_KEY_D, IBUS_KEY_minus, 0x0110, 
--IBUS_KEY_D, IBUS_KEY_period, 0x1E0A, 
--IBUS_KEY_D, IBUS_KEY_less, 0x010E, 
--IBUS_KEY_D, IBUS_KEY_H, 0x00D0, 
--IBUS_KEY_E, IBUS_KEY_quotedbl, 0x00CB, 
--IBUS_KEY_E, IBUS_KEY_apostrophe, 0x00C9, 
--IBUS_KEY_E, IBUS_KEY_comma, 0x0118, 
--IBUS_KEY_E, IBUS_KEY_minus, 0x0112, 
--IBUS_KEY_E, IBUS_KEY_period, 0x0116, 
--IBUS_KEY_E, IBUS_KEY_semicolon, 0x0118, 
--IBUS_KEY_E, IBUS_KEY_less, 0x011A, 
--IBUS_KEY_E, IBUS_KEY_equal, 0x20AC, 
--IBUS_KEY_E, IBUS_KEY_greater, 0x00CA, 
--IBUS_KEY_E, IBUS_KEY_asciicircum, 0x00CA, 
--IBUS_KEY_E, IBUS_KEY_underscore, 0x0112, 
--IBUS_KEY_E, IBUS_KEY_grave, 0x00C8, 
--IBUS_KEY_E, IBUS_KEY_diaeresis, 0x00CB, 
--IBUS_KEY_E, IBUS_KEY_acute, 0x00C9, 
--IBUS_KEY_F, IBUS_KEY_period, 0x1E1E, 
--IBUS_KEY_F, IBUS_KEY_i, 0xFB03, 
--IBUS_KEY_F, IBUS_KEY_l, 0xFB04, 
--IBUS_KEY_F, IBUS_KEY_r, 0x20A3, 
--IBUS_KEY_G, IBUS_KEY_parenleft, 0x011E, 
--IBUS_KEY_G, IBUS_KEY_comma, 0x0122, 
--IBUS_KEY_G, IBUS_KEY_period, 0x0120, 
--IBUS_KEY_G, IBUS_KEY_U, 0x011E, 
--IBUS_KEY_G, IBUS_KEY_breve, 0x011E, 
--IBUS_KEY_H, IBUS_KEY_comma, 0x1E28, 
--IBUS_KEY_I, IBUS_KEY_quotedbl, 0x00CF, 
--IBUS_KEY_I, IBUS_KEY_apostrophe, 0x00CD, 
--IBUS_KEY_I, IBUS_KEY_comma, 0x012E, 
--IBUS_KEY_I, IBUS_KEY_minus, 0x012A, 
--IBUS_KEY_I, IBUS_KEY_period, 0x0130, 
--IBUS_KEY_I, IBUS_KEY_semicolon, 0x012E, 
--IBUS_KEY_I, IBUS_KEY_greater, 0x00CE, 
--IBUS_KEY_I, IBUS_KEY_J, 0x0132, 
--IBUS_KEY_I, IBUS_KEY_asciicircum, 0x00CE, 
--IBUS_KEY_I, IBUS_KEY_underscore, 0x012A, 
--IBUS_KEY_I, IBUS_KEY_grave, 0x00CC, 
--IBUS_KEY_I, IBUS_KEY_j, 0x0132, 
--IBUS_KEY_I, IBUS_KEY_asciitilde, 0x0128, 
--IBUS_KEY_I, IBUS_KEY_diaeresis, 0x00CF, 
--IBUS_KEY_I, IBUS_KEY_acute, 0x00CD, 
--IBUS_KEY_K, IBUS_KEY_comma, 0x0136, 
--IBUS_KEY_L, IBUS_KEY_apostrophe, 0x0139, 
--IBUS_KEY_L, IBUS_KEY_comma, 0x013B, 
--IBUS_KEY_L, IBUS_KEY_minus, 0x00A3, 
--IBUS_KEY_L, IBUS_KEY_slash, 0x0141, 
--IBUS_KEY_L, IBUS_KEY_less, 0x013D, 
--IBUS_KEY_L, IBUS_KEY_equal, 0x20A4, 
--IBUS_KEY_L, IBUS_KEY_V, 0x007C, 
--IBUS_KEY_M, IBUS_KEY_period, 0x1E40, 
--IBUS_KEY_N, IBUS_KEY_apostrophe, 0x0143, 
--IBUS_KEY_N, IBUS_KEY_comma, 0x0145, 
--IBUS_KEY_N, IBUS_KEY_less, 0x0147, 
--IBUS_KEY_N, IBUS_KEY_equal, 0x20A6, 
--IBUS_KEY_N, IBUS_KEY_G, 0x014A, 
--IBUS_KEY_N, IBUS_KEY_O, 0x2116, 
--IBUS_KEY_N, IBUS_KEY_o, 0x2116, 
--IBUS_KEY_N, IBUS_KEY_asciitilde, 0x00D1, 
--IBUS_KEY_O, IBUS_KEY_quotedbl, 0x00D6, 
--IBUS_KEY_O, IBUS_KEY_apostrophe, 0x00D3, 
--IBUS_KEY_O, IBUS_KEY_comma, 0x01EA, 
--IBUS_KEY_O, IBUS_KEY_minus, 0x014C, 
--IBUS_KEY_O, IBUS_KEY_slash, 0x00D8, 
--IBUS_KEY_O, IBUS_KEY_semicolon, 0x01EA, 
--IBUS_KEY_O, IBUS_KEY_greater, 0x00D4, 
--IBUS_KEY_O, IBUS_KEY_A, 0x24B6, 
--IBUS_KEY_O, IBUS_KEY_C, 0x00A9, 
--IBUS_KEY_O, IBUS_KEY_E, 0x0152, 
--IBUS_KEY_O, IBUS_KEY_R, 0x00AE, 
--IBUS_KEY_O, IBUS_KEY_S, 0x00A7, 
--IBUS_KEY_O, IBUS_KEY_X, 0x00A4, 
--IBUS_KEY_O, IBUS_KEY_asciicircum, 0x00D4, 
--IBUS_KEY_O, IBUS_KEY_underscore, 0x014C, 
--IBUS_KEY_O, IBUS_KEY_grave, 0x00D2, 
--IBUS_KEY_O, IBUS_KEY_c, 0x00A9, 
--IBUS_KEY_O, IBUS_KEY_r, 0x00AE, 
--IBUS_KEY_O, IBUS_KEY_x, 0x00A4, 
--IBUS_KEY_O, IBUS_KEY_asciitilde, 0x00D5, 
--IBUS_KEY_O, IBUS_KEY_diaeresis, 0x00D6, 
--IBUS_KEY_O, IBUS_KEY_acute, 0x00D3, 
--IBUS_KEY_P, IBUS_KEY_exclam, 0x00B6, 
--IBUS_KEY_P, IBUS_KEY_period, 0x1E56, 
--IBUS_KEY_P, IBUS_KEY_P, 0x00B6, 
--IBUS_KEY_P, IBUS_KEY_t, 0x20A7, 
--IBUS_KEY_R, IBUS_KEY_apostrophe, 0x0154, 
--IBUS_KEY_R, IBUS_KEY_comma, 0x0156, 
--IBUS_KEY_R, IBUS_KEY_less, 0x0158, 
--IBUS_KEY_R, IBUS_KEY_O, 0x00AE, 
--IBUS_KEY_R, IBUS_KEY_s, 0x20A8, 
--IBUS_KEY_S, IBUS_KEY_exclam, 0x00A7, 
--IBUS_KEY_S, IBUS_KEY_apostrophe, 0x015A, 
--IBUS_KEY_S, IBUS_KEY_comma, 0x015E, 
--IBUS_KEY_S, IBUS_KEY_period, 0x1E60, 
--IBUS_KEY_S, IBUS_KEY_semicolon, 0x0218, 
--IBUS_KEY_S, IBUS_KEY_less, 0x0160, 
--IBUS_KEY_S, IBUS_KEY_M, 0x2120, 
--IBUS_KEY_S, IBUS_KEY_O, 0x00A7, 
--IBUS_KEY_S, IBUS_KEY_S, 0x1E9E, 
--IBUS_KEY_S, IBUS_KEY_m, 0x2120, 
--IBUS_KEY_T, IBUS_KEY_comma, 0x0162, 
--IBUS_KEY_T, IBUS_KEY_minus, 0x0166, 
--IBUS_KEY_T, IBUS_KEY_period, 0x1E6A, 
--IBUS_KEY_T, IBUS_KEY_slash, 0x0166, 
--IBUS_KEY_T, IBUS_KEY_semicolon, 0x021A, 
--IBUS_KEY_T, IBUS_KEY_less, 0x0164, 
--IBUS_KEY_T, IBUS_KEY_H, 0x00DE, 
--IBUS_KEY_T, IBUS_KEY_M, 0x2122, 
--IBUS_KEY_T, IBUS_KEY_m, 0x2122, 
--IBUS_KEY_U, IBUS_KEY_quotedbl, 0x00DC, 
--IBUS_KEY_U, IBUS_KEY_apostrophe, 0x00DA, 
--IBUS_KEY_U, IBUS_KEY_asterisk, 0x016E, 
--IBUS_KEY_U, IBUS_KEY_comma, 0x0172, 
--IBUS_KEY_U, IBUS_KEY_minus, 0x016A, 
--IBUS_KEY_U, IBUS_KEY_semicolon, 0x0172, 
--IBUS_KEY_U, IBUS_KEY_greater, 0x00DB, 
--IBUS_KEY_U, IBUS_KEY_A, 0x0102, 
--IBUS_KEY_U, IBUS_KEY_E, 0x0114, 
--IBUS_KEY_U, IBUS_KEY_G, 0x011E, 
--IBUS_KEY_U, IBUS_KEY_I, 0x012C, 
--IBUS_KEY_U, IBUS_KEY_O, 0x014E, 
--IBUS_KEY_U, IBUS_KEY_U, 0x016C, 
--IBUS_KEY_U, IBUS_KEY_asciicircum, 0x00DB, 
--IBUS_KEY_U, IBUS_KEY_underscore, 0x016A, 
--IBUS_KEY_U, IBUS_KEY_grave, 0x00D9, 
--IBUS_KEY_U, IBUS_KEY_a, 0x0103, 
--IBUS_KEY_U, IBUS_KEY_e, 0x0115, 
--IBUS_KEY_U, IBUS_KEY_g, 0x011F, 
--IBUS_KEY_U, IBUS_KEY_i, 0x012D, 
--IBUS_KEY_U, IBUS_KEY_o, 0x014F, 
--IBUS_KEY_U, IBUS_KEY_u, 0x016D, 
--IBUS_KEY_U, IBUS_KEY_asciitilde, 0x0168, 
--IBUS_KEY_U, IBUS_KEY_diaeresis, 0x00DC, 
--IBUS_KEY_U, IBUS_KEY_acute, 0x00DA, 
--IBUS_KEY_U, 0x0228, 0x1E1C, 
--IBUS_KEY_U, 0x0229, 0x1E1D, 
--IBUS_KEY_U, IBUS_KEY_Cyrillic_a, 0x04D1, 
--IBUS_KEY_U, IBUS_KEY_Cyrillic_ie, 0x04D7, 
--IBUS_KEY_U, IBUS_KEY_Cyrillic_i, 0x0439, 
--IBUS_KEY_U, IBUS_KEY_Cyrillic_u, 0x045E, 
--IBUS_KEY_U, IBUS_KEY_Cyrillic_zhe, 0x04C2, 
--IBUS_KEY_U, IBUS_KEY_Cyrillic_A, 0x04D0, 
--IBUS_KEY_U, IBUS_KEY_Cyrillic_IE, 0x04D6, 
--IBUS_KEY_U, IBUS_KEY_Cyrillic_I, 0x0419, 
--IBUS_KEY_U, IBUS_KEY_Cyrillic_U, 0x040E, 
--IBUS_KEY_U, IBUS_KEY_Cyrillic_ZHE, 0x04C1, 
--IBUS_KEY_U, IBUS_KEY_Greek_ALPHA, 0x1FB8, 
--IBUS_KEY_U, IBUS_KEY_Greek_IOTA, 0x1FD8, 
--IBUS_KEY_U, IBUS_KEY_Greek_UPSILON, 0x1FE8, 
--IBUS_KEY_U, IBUS_KEY_Greek_alpha, 0x1FB0, 
--IBUS_KEY_U, IBUS_KEY_Greek_iota, 0x1FD0, 
--IBUS_KEY_U, IBUS_KEY_Greek_upsilon, 0x1FE0, 
--IBUS_KEY_U, 0x1EA0, 0x1EB6, 
--IBUS_KEY_U, 0x1EA1, 0x1EB7, 
--IBUS_KEY_V, IBUS_KEY_L, 0x007C, 
--IBUS_KEY_W, IBUS_KEY_equal, 0x20A9, 
--IBUS_KEY_W, IBUS_KEY_asciicircum, 0x0174, 
--IBUS_KEY_X, IBUS_KEY_O, 0x00A4, 
--IBUS_KEY_X, IBUS_KEY_o, 0x00A4, 
--IBUS_KEY_Y, IBUS_KEY_quotedbl, 0x0178, 
--IBUS_KEY_Y, IBUS_KEY_apostrophe, 0x00DD, 
--IBUS_KEY_Y, IBUS_KEY_minus, 0x00A5, 
--IBUS_KEY_Y, IBUS_KEY_equal, 0x00A5, 
--IBUS_KEY_Y, IBUS_KEY_asciicircum, 0x0176, 
--IBUS_KEY_Y, IBUS_KEY_diaeresis, 0x0178, 
--IBUS_KEY_Y, IBUS_KEY_acute, 0x00DD, 
--IBUS_KEY_Z, IBUS_KEY_apostrophe, 0x0179, 
--IBUS_KEY_Z, IBUS_KEY_period, 0x017B, 
--IBUS_KEY_Z, IBUS_KEY_less, 0x017D, 
--IBUS_KEY_bracketleft, IBUS_KEY_bracketright, 0x2337, 
--IBUS_KEY_backslash, IBUS_KEY_minus, 0x2340, 
--IBUS_KEY_backslash, 0x2395, 0x2342, 
--IBUS_KEY_backslash, IBUS_KEY_emopencircle, 0x2349, 
--IBUS_KEY_bracketright, IBUS_KEY_bracketleft, 0x2337, 
--IBUS_KEY_asciicircum, IBUS_KEY_space, 0x005E, 
--IBUS_KEY_asciicircum, IBUS_KEY_parenleft, 0x207D, 
--IBUS_KEY_asciicircum, IBUS_KEY_parenright, 0x207E, 
--IBUS_KEY_asciicircum, IBUS_KEY_plus, 0x207A, 
--IBUS_KEY_asciicircum, IBUS_KEY_minus, 0x00AF, 
--IBUS_KEY_asciicircum, IBUS_KEY_period, 0x00B7, 
--IBUS_KEY_asciicircum, IBUS_KEY_slash, 0x007C, 
--IBUS_KEY_asciicircum, IBUS_KEY_0, 0x2070, 
--IBUS_KEY_asciicircum, IBUS_KEY_1, 0x00B9, 
--IBUS_KEY_asciicircum, IBUS_KEY_2, 0x00B2, 
--IBUS_KEY_asciicircum, IBUS_KEY_3, 0x00B3, 
--IBUS_KEY_asciicircum, IBUS_KEY_4, 0x2074, 
--IBUS_KEY_asciicircum, IBUS_KEY_5, 0x2075, 
--IBUS_KEY_asciicircum, IBUS_KEY_6, 0x2076, 
--IBUS_KEY_asciicircum, IBUS_KEY_7, 0x2077, 
--IBUS_KEY_asciicircum, IBUS_KEY_8, 0x2078, 
--IBUS_KEY_asciicircum, IBUS_KEY_9, 0x2079, 
--IBUS_KEY_asciicircum, IBUS_KEY_equal, 0x207C, 
--IBUS_KEY_asciicircum, IBUS_KEY_A, 0x00C2, 
--IBUS_KEY_asciicircum, IBUS_KEY_C, 0x0108, 
--IBUS_KEY_asciicircum, IBUS_KEY_E, 0x00CA, 
--IBUS_KEY_asciicircum, IBUS_KEY_G, 0x011C, 
--IBUS_KEY_asciicircum, IBUS_KEY_H, 0x0124, 
--IBUS_KEY_asciicircum, IBUS_KEY_I, 0x00CE, 
--IBUS_KEY_asciicircum, IBUS_KEY_J, 0x0134, 
--IBUS_KEY_asciicircum, IBUS_KEY_O, 0x00D4, 
--IBUS_KEY_asciicircum, IBUS_KEY_S, 0x015C, 
--IBUS_KEY_asciicircum, IBUS_KEY_U, 0x00DB, 
--IBUS_KEY_asciicircum, IBUS_KEY_W, 0x0174, 
--IBUS_KEY_asciicircum, IBUS_KEY_Y, 0x0176, 
--IBUS_KEY_asciicircum, IBUS_KEY_Z, 0x1E90, 
--IBUS_KEY_asciicircum, IBUS_KEY_a, 0x00E2, 
--IBUS_KEY_asciicircum, IBUS_KEY_c, 0x0109, 
--IBUS_KEY_asciicircum, IBUS_KEY_e, 0x00EA, 
--IBUS_KEY_asciicircum, IBUS_KEY_g, 0x011D, 
--IBUS_KEY_asciicircum, IBUS_KEY_h, 0x0125, 
--IBUS_KEY_asciicircum, IBUS_KEY_i, 0x00EE, 
--IBUS_KEY_asciicircum, IBUS_KEY_j, 0x0135, 
--IBUS_KEY_asciicircum, IBUS_KEY_o, 0x00F4, 
--IBUS_KEY_asciicircum, IBUS_KEY_s, 0x015D, 
--IBUS_KEY_asciicircum, IBUS_KEY_u, 0x00FB, 
--IBUS_KEY_asciicircum, IBUS_KEY_w, 0x0175, 
--IBUS_KEY_asciicircum, IBUS_KEY_y, 0x0177, 
--IBUS_KEY_asciicircum, IBUS_KEY_z, 0x1E91, 
--IBUS_KEY_asciicircum, 0x1EA0, 0x1EAC, 
--IBUS_KEY_asciicircum, 0x1EA1, 0x1EAD, 
--IBUS_KEY_asciicircum, 0x1EB8, 0x1EC6, 
--IBUS_KEY_asciicircum, 0x1EB9, 0x1EC7, 
--IBUS_KEY_asciicircum, 0x1ECC, 0x1ED8, 
--IBUS_KEY_asciicircum, 0x1ECD, 0x1ED9, 
--IBUS_KEY_asciicircum, 0x2212, 0x207B, 
--IBUS_KEY_asciicircum, 0x4E00, 0x3192, 
--IBUS_KEY_asciicircum, 0x4E01, 0x319C, 
--IBUS_KEY_asciicircum, 0x4E09, 0x3194, 
--IBUS_KEY_asciicircum, 0x4E0A, 0x3196, 
--IBUS_KEY_asciicircum, 0x4E0B, 0x3198, 
--IBUS_KEY_asciicircum, 0x4E19, 0x319B, 
--IBUS_KEY_asciicircum, 0x4E2D, 0x3197, 
--IBUS_KEY_asciicircum, 0x4E59, 0x319A, 
--IBUS_KEY_asciicircum, 0x4E8C, 0x3193, 
--IBUS_KEY_asciicircum, 0x4EBA, 0x319F, 
--IBUS_KEY_asciicircum, 0x56DB, 0x3195, 
--IBUS_KEY_asciicircum, 0x5730, 0x319E, 
--IBUS_KEY_asciicircum, 0x5929, 0x319D, 
--IBUS_KEY_asciicircum, 0x7532, 0x3199, 
--IBUS_KEY_asciicircum, IBUS_KEY_KP_Space, 0x00B2, 
--IBUS_KEY_asciicircum, IBUS_KEY_KP_Add, 0x207A, 
--IBUS_KEY_asciicircum, IBUS_KEY_KP_0, 0x2070, 
--IBUS_KEY_asciicircum, IBUS_KEY_KP_1, 0x00B9, 
--IBUS_KEY_asciicircum, IBUS_KEY_KP_2, 0x00B2, 
--IBUS_KEY_asciicircum, IBUS_KEY_KP_3, 0x00B3, 
--IBUS_KEY_asciicircum, IBUS_KEY_KP_4, 0x2074, 
--IBUS_KEY_asciicircum, IBUS_KEY_KP_5, 0x2075, 
--IBUS_KEY_asciicircum, IBUS_KEY_KP_6, 0x2076, 
--IBUS_KEY_asciicircum, IBUS_KEY_KP_7, 0x2077, 
--IBUS_KEY_asciicircum, IBUS_KEY_KP_8, 0x2078, 
--IBUS_KEY_asciicircum, IBUS_KEY_KP_9, 0x2079, 
--IBUS_KEY_asciicircum, IBUS_KEY_KP_Equal, 0x207C, 
--IBUS_KEY_underscore, IBUS_KEY_apostrophe, 0x2358, 
--IBUS_KEY_underscore, IBUS_KEY_parenleft, 0x208D, 
--IBUS_KEY_underscore, IBUS_KEY_parenright, 0x208E, 
--IBUS_KEY_underscore, IBUS_KEY_plus, 0x208A, 
--IBUS_KEY_underscore, IBUS_KEY_0, 0x2080, 
--IBUS_KEY_underscore, IBUS_KEY_1, 0x2081, 
--IBUS_KEY_underscore, IBUS_KEY_2, 0x2082, 
--IBUS_KEY_underscore, IBUS_KEY_3, 0x2083, 
--IBUS_KEY_underscore, IBUS_KEY_4, 0x2084, 
--IBUS_KEY_underscore, IBUS_KEY_5, 0x2085, 
--IBUS_KEY_underscore, IBUS_KEY_6, 0x2086, 
--IBUS_KEY_underscore, IBUS_KEY_7, 0x2087, 
--IBUS_KEY_underscore, IBUS_KEY_8, 0x2088, 
--IBUS_KEY_underscore, IBUS_KEY_9, 0x2089, 
--IBUS_KEY_underscore, IBUS_KEY_less, 0x2264, 
--IBUS_KEY_underscore, IBUS_KEY_equal, 0x208C, 
--IBUS_KEY_underscore, IBUS_KEY_greater, 0x2265, 
--IBUS_KEY_underscore, IBUS_KEY_A, 0x0100, 
--IBUS_KEY_underscore, IBUS_KEY_E, 0x0112, 
--IBUS_KEY_underscore, IBUS_KEY_G, 0x1E20, 
--IBUS_KEY_underscore, IBUS_KEY_I, 0x012A, 
--IBUS_KEY_underscore, IBUS_KEY_O, 0x014C, 
--IBUS_KEY_underscore, IBUS_KEY_U, 0x016A, 
--IBUS_KEY_underscore, IBUS_KEY_Y, 0x0232, 
--IBUS_KEY_underscore, IBUS_KEY_asciicircum, 0x00AF, 
--IBUS_KEY_underscore, IBUS_KEY_underscore, 0x00AF, 
--IBUS_KEY_underscore, IBUS_KEY_a, 0x0101, 
--IBUS_KEY_underscore, IBUS_KEY_e, 0x0113, 
--IBUS_KEY_underscore, IBUS_KEY_g, 0x1E21, 
--IBUS_KEY_underscore, IBUS_KEY_i, 0x012B, 
--IBUS_KEY_underscore, IBUS_KEY_o, 0x014D, 
--IBUS_KEY_underscore, IBUS_KEY_u, 0x016B, 
--IBUS_KEY_underscore, IBUS_KEY_y, 0x0233, 
--IBUS_KEY_underscore, IBUS_KEY_Adiaeresis, 0x01DE, 
--IBUS_KEY_underscore, IBUS_KEY_AE, 0x01E2, 
--IBUS_KEY_underscore, IBUS_KEY_Otilde, 0x022C, 
--IBUS_KEY_underscore, IBUS_KEY_Odiaeresis, 0x022A, 
--IBUS_KEY_underscore, IBUS_KEY_Udiaeresis, 0x01D5, 
--IBUS_KEY_underscore, IBUS_KEY_adiaeresis, 0x01DF, 
--IBUS_KEY_underscore, IBUS_KEY_ae, 0x01E3, 
--IBUS_KEY_underscore, IBUS_KEY_otilde, 0x022D, 
--IBUS_KEY_underscore, IBUS_KEY_odiaeresis, 0x022B, 
--IBUS_KEY_underscore, IBUS_KEY_udiaeresis, 0x01D6, 
--IBUS_KEY_underscore, 0x01EA, 0x01EC, 
--IBUS_KEY_underscore, 0x01EB, 0x01ED, 
--IBUS_KEY_underscore, 0x0226, 0x01E0, 
--IBUS_KEY_underscore, 0x0227, 0x01E1, 
--IBUS_KEY_underscore, 0x022E, 0x0230, 
--IBUS_KEY_underscore, 0x022F, 0x0231, 
--IBUS_KEY_underscore, IBUS_KEY_Cyrillic_i, 0x04E3, 
--IBUS_KEY_underscore, IBUS_KEY_Cyrillic_u, 0x04EF, 
--IBUS_KEY_underscore, IBUS_KEY_Cyrillic_I, 0x04E2, 
--IBUS_KEY_underscore, IBUS_KEY_Cyrillic_U, 0x04EE, 
--IBUS_KEY_underscore, IBUS_KEY_Greek_ALPHA, 0x1FB9, 
--IBUS_KEY_underscore, IBUS_KEY_Greek_IOTA, 0x1FD9, 
--IBUS_KEY_underscore, IBUS_KEY_Greek_UPSILON, 0x1FE9, 
--IBUS_KEY_underscore, IBUS_KEY_Greek_alpha, 0x1FB1, 
--IBUS_KEY_underscore, IBUS_KEY_Greek_iota, 0x1FD1, 
--IBUS_KEY_underscore, IBUS_KEY_Greek_upsilon, 0x1FE1, 
--IBUS_KEY_underscore, 0x1E36, 0x1E38, 
--IBUS_KEY_underscore, 0x1E37, 0x1E39, 
--IBUS_KEY_underscore, 0x1E5A, 0x1E5C, 
--IBUS_KEY_underscore, 0x1E5B, 0x1E5D, 
--IBUS_KEY_underscore, 0x2206, 0x2359, 
--IBUS_KEY_underscore, 0x220A, 0x2377, 
--IBUS_KEY_underscore, 0x2212, 0x208B, 
--IBUS_KEY_underscore, 0x2218, 0x235B, 
--IBUS_KEY_underscore, 0x2260, 0x2262, 
--IBUS_KEY_underscore, 0x2282, 0x2286, 
--IBUS_KEY_underscore, 0x2283, 0x2287, 
--IBUS_KEY_underscore, IBUS_KEY_downtack, 0x234A, 
--IBUS_KEY_underscore, 0x22C4, 0x235A, 
--IBUS_KEY_underscore, 0x2373, 0x2378, 
--IBUS_KEY_underscore, 0x2375, 0x2379, 
--IBUS_KEY_underscore, 0x237A, 0x2376, 
--IBUS_KEY_underscore, IBUS_KEY_emopencircle, 0x235C, 
--IBUS_KEY_underscore, IBUS_KEY_KP_Space, 0x2082, 
--IBUS_KEY_underscore, IBUS_KEY_KP_Add, 0x208A, 
--IBUS_KEY_underscore, IBUS_KEY_KP_0, 0x2080, 
--IBUS_KEY_underscore, IBUS_KEY_KP_1, 0x2081, 
--IBUS_KEY_underscore, IBUS_KEY_KP_2, 0x2082, 
--IBUS_KEY_underscore, IBUS_KEY_KP_3, 0x2083, 
--IBUS_KEY_underscore, IBUS_KEY_KP_4, 0x2084, 
--IBUS_KEY_underscore, IBUS_KEY_KP_5, 0x2085, 
--IBUS_KEY_underscore, IBUS_KEY_KP_6, 0x2086, 
--IBUS_KEY_underscore, IBUS_KEY_KP_7, 0x2087, 
--IBUS_KEY_underscore, IBUS_KEY_KP_8, 0x2088, 
--IBUS_KEY_underscore, IBUS_KEY_KP_9, 0x2089, 
--IBUS_KEY_underscore, IBUS_KEY_KP_Equal, 0x208C, 
--IBUS_KEY_grave, IBUS_KEY_space, 0x0060, 
--IBUS_KEY_grave, IBUS_KEY_A, 0x00C0, 
--IBUS_KEY_grave, IBUS_KEY_E, 0x00C8, 
--IBUS_KEY_grave, IBUS_KEY_I, 0x00CC, 
--IBUS_KEY_grave, IBUS_KEY_N, 0x01F8, 
--IBUS_KEY_grave, IBUS_KEY_O, 0x00D2, 
--IBUS_KEY_grave, IBUS_KEY_U, 0x00D9, 
--IBUS_KEY_grave, IBUS_KEY_W, 0x1E80, 
--IBUS_KEY_grave, IBUS_KEY_Y, 0x1EF2, 
--IBUS_KEY_grave, IBUS_KEY_a, 0x00E0, 
--IBUS_KEY_grave, IBUS_KEY_e, 0x00E8, 
--IBUS_KEY_grave, IBUS_KEY_i, 0x00EC, 
--IBUS_KEY_grave, IBUS_KEY_n, 0x01F9, 
--IBUS_KEY_grave, IBUS_KEY_o, 0x00F2, 
--IBUS_KEY_grave, IBUS_KEY_u, 0x00F9, 
--IBUS_KEY_grave, IBUS_KEY_w, 0x1E81, 
--IBUS_KEY_grave, IBUS_KEY_y, 0x1EF3, 
--IBUS_KEY_grave, IBUS_KEY_Acircumflex, 0x1EA6, 
--IBUS_KEY_grave, IBUS_KEY_Ecircumflex, 0x1EC0, 
--IBUS_KEY_grave, IBUS_KEY_Ocircumflex, 0x1ED2, 
--IBUS_KEY_grave, IBUS_KEY_Udiaeresis, 0x01DB, 
--IBUS_KEY_grave, IBUS_KEY_acircumflex, 0x1EA7, 
--IBUS_KEY_grave, IBUS_KEY_ecircumflex, 0x1EC1, 
--IBUS_KEY_grave, IBUS_KEY_ocircumflex, 0x1ED3, 
--IBUS_KEY_grave, IBUS_KEY_udiaeresis, 0x01DC, 
--IBUS_KEY_grave, IBUS_KEY_Abreve, 0x1EB0, 
--IBUS_KEY_grave, IBUS_KEY_abreve, 0x1EB1, 
--IBUS_KEY_grave, IBUS_KEY_Emacron, 0x1E14, 
--IBUS_KEY_grave, IBUS_KEY_emacron, 0x1E15, 
--IBUS_KEY_grave, IBUS_KEY_Omacron, 0x1E50, 
--IBUS_KEY_grave, IBUS_KEY_omacron, 0x1E51, 
--IBUS_KEY_grave, IBUS_KEY_Cyrillic_ie, 0x0450, 
--IBUS_KEY_grave, IBUS_KEY_Cyrillic_i, 0x045D, 
--IBUS_KEY_grave, IBUS_KEY_Cyrillic_IE, 0x0400, 
--IBUS_KEY_grave, IBUS_KEY_Cyrillic_I, 0x040D, 
--IBUS_KEY_grave, IBUS_KEY_Greek_iotadieresis, 0x1FD2, 
--IBUS_KEY_grave, IBUS_KEY_Greek_upsilondieresis, 0x1FE2, 
--IBUS_KEY_grave, IBUS_KEY_Greek_ALPHA, 0x1FBA, 
--IBUS_KEY_grave, IBUS_KEY_Greek_EPSILON, 0x1FC8, 
--IBUS_KEY_grave, IBUS_KEY_Greek_ETA, 0x1FCA, 
--IBUS_KEY_grave, IBUS_KEY_Greek_IOTA, 0x1FDA, 
--IBUS_KEY_grave, IBUS_KEY_Greek_OMICRON, 0x1FF8, 
--IBUS_KEY_grave, IBUS_KEY_Greek_UPSILON, 0x1FEA, 
--IBUS_KEY_grave, IBUS_KEY_Greek_OMEGA, 0x1FFA, 
--IBUS_KEY_grave, IBUS_KEY_Greek_alpha, 0x1F70, 
--IBUS_KEY_grave, IBUS_KEY_Greek_epsilon, 0x1F72, 
--IBUS_KEY_grave, IBUS_KEY_Greek_eta, 0x1F74, 
--IBUS_KEY_grave, IBUS_KEY_Greek_iota, 0x1F76, 
--IBUS_KEY_grave, IBUS_KEY_Greek_omicron, 0x1F78, 
--IBUS_KEY_grave, IBUS_KEY_Greek_upsilon, 0x1F7A, 
--IBUS_KEY_grave, IBUS_KEY_Greek_omega, 0x1F7C, 
--IBUS_KEY_grave, 0x1F00, 0x1F02, 
--IBUS_KEY_grave, 0x1F01, 0x1F03, 
--IBUS_KEY_grave, 0x1F08, 0x1F0A, 
--IBUS_KEY_grave, 0x1F09, 0x1F0B, 
--IBUS_KEY_grave, 0x1F10, 0x1F12, 
--IBUS_KEY_grave, 0x1F11, 0x1F13, 
--IBUS_KEY_grave, 0x1F18, 0x1F1A, 
--IBUS_KEY_grave, 0x1F19, 0x1F1B, 
--IBUS_KEY_grave, 0x1F20, 0x1F22, 
--IBUS_KEY_grave, 0x1F21, 0x1F23, 
--IBUS_KEY_grave, 0x1F28, 0x1F2A, 
--IBUS_KEY_grave, 0x1F29, 0x1F2B, 
--IBUS_KEY_grave, 0x1F30, 0x1F32, 
--IBUS_KEY_grave, 0x1F31, 0x1F33, 
--IBUS_KEY_grave, 0x1F38, 0x1F3A, 
--IBUS_KEY_grave, 0x1F39, 0x1F3B, 
--IBUS_KEY_grave, 0x1F40, 0x1F42, 
--IBUS_KEY_grave, 0x1F41, 0x1F43, 
--IBUS_KEY_grave, 0x1F48, 0x1F4A, 
--IBUS_KEY_grave, 0x1F49, 0x1F4B, 
--IBUS_KEY_grave, 0x1F50, 0x1F52, 
--IBUS_KEY_grave, 0x1F51, 0x1F53, 
--IBUS_KEY_grave, 0x1F59, 0x1F5B, 
--IBUS_KEY_grave, 0x1F60, 0x1F62, 
--IBUS_KEY_grave, 0x1F61, 0x1F63, 
--IBUS_KEY_grave, 0x1F68, 0x1F6A, 
--IBUS_KEY_grave, 0x1F69, 0x1F6B, 
--IBUS_KEY_a, IBUS_KEY_quotedbl, 0x00E4, 
--IBUS_KEY_a, IBUS_KEY_apostrophe, 0x00E1, 
--IBUS_KEY_a, IBUS_KEY_parenleft, 0x0103, 
--IBUS_KEY_a, IBUS_KEY_asterisk, 0x00E5, 
--IBUS_KEY_a, IBUS_KEY_comma, 0x0105, 
--IBUS_KEY_a, IBUS_KEY_minus, 0x0101, 
--IBUS_KEY_a, IBUS_KEY_semicolon, 0x0105, 
--IBUS_KEY_a, IBUS_KEY_greater, 0x00E2, 
--IBUS_KEY_a, IBUS_KEY_asciicircum, 0x00E2, 
--IBUS_KEY_a, IBUS_KEY_underscore, 0x0101, 
--IBUS_KEY_a, IBUS_KEY_grave, 0x00E0, 
--IBUS_KEY_a, IBUS_KEY_a, 0x00E5, 
--IBUS_KEY_a, IBUS_KEY_e, 0x00E6, 
--IBUS_KEY_a, IBUS_KEY_asciitilde, 0x00E3, 
--IBUS_KEY_a, IBUS_KEY_diaeresis, 0x00E4, 
--IBUS_KEY_a, IBUS_KEY_acute, 0x00E1, 
--IBUS_KEY_b, IBUS_KEY_period, 0x1E03, 
--IBUS_KEY_b, IBUS_KEY_A, 0x0102, 
--IBUS_KEY_b, IBUS_KEY_E, 0x0114, 
--IBUS_KEY_b, IBUS_KEY_G, 0x011E, 
--IBUS_KEY_b, IBUS_KEY_I, 0x012C, 
--IBUS_KEY_b, IBUS_KEY_O, 0x014E, 
--IBUS_KEY_b, IBUS_KEY_U, 0x016C, 
--IBUS_KEY_b, IBUS_KEY_a, 0x0103, 
--IBUS_KEY_b, IBUS_KEY_e, 0x0115, 
--IBUS_KEY_b, IBUS_KEY_g, 0x011F, 
--IBUS_KEY_b, IBUS_KEY_i, 0x012D, 
--IBUS_KEY_b, IBUS_KEY_o, 0x014F, 
--IBUS_KEY_b, IBUS_KEY_u, 0x016D, 
--IBUS_KEY_b, 0x0228, 0x1E1C, 
--IBUS_KEY_b, 0x0229, 0x1E1D, 
--IBUS_KEY_b, IBUS_KEY_Cyrillic_a, 0x04D1, 
--IBUS_KEY_b, IBUS_KEY_Cyrillic_ie, 0x04D7, 
--IBUS_KEY_b, IBUS_KEY_Cyrillic_i, 0x0439, 
--IBUS_KEY_b, IBUS_KEY_Cyrillic_u, 0x045E, 
--IBUS_KEY_b, IBUS_KEY_Cyrillic_zhe, 0x04C2, 
--IBUS_KEY_b, IBUS_KEY_Cyrillic_A, 0x04D0, 
--IBUS_KEY_b, IBUS_KEY_Cyrillic_IE, 0x04D6, 
--IBUS_KEY_b, IBUS_KEY_Cyrillic_I, 0x0419, 
--IBUS_KEY_b, IBUS_KEY_Cyrillic_U, 0x040E, 
--IBUS_KEY_b, IBUS_KEY_Cyrillic_ZHE, 0x04C1, 
--IBUS_KEY_b, IBUS_KEY_Greek_ALPHA, 0x1FB8, 
--IBUS_KEY_b, IBUS_KEY_Greek_IOTA, 0x1FD8, 
--IBUS_KEY_b, IBUS_KEY_Greek_UPSILON, 0x1FE8, 
--IBUS_KEY_b, IBUS_KEY_Greek_alpha, 0x1FB0, 
--IBUS_KEY_b, IBUS_KEY_Greek_iota, 0x1FD0, 
--IBUS_KEY_b, IBUS_KEY_Greek_upsilon, 0x1FE0, 
--IBUS_KEY_b, 0x1EA0, 0x1EB6, 
--IBUS_KEY_b, 0x1EA1, 0x1EB7, 
--IBUS_KEY_c, IBUS_KEY_apostrophe, 0x0107, 
--IBUS_KEY_c, IBUS_KEY_comma, 0x00E7, 
--IBUS_KEY_c, IBUS_KEY_period, 0x010B, 
--IBUS_KEY_c, IBUS_KEY_slash, 0x00A2, 
--IBUS_KEY_c, IBUS_KEY_less, 0x010D, 
--IBUS_KEY_c, IBUS_KEY_equal, 0x20AC, 
--IBUS_KEY_c, IBUS_KEY_A, 0x01CD, 
--IBUS_KEY_c, IBUS_KEY_C, 0x010C, 
--IBUS_KEY_c, IBUS_KEY_D, 0x010E, 
--IBUS_KEY_c, IBUS_KEY_E, 0x011A, 
--IBUS_KEY_c, IBUS_KEY_G, 0x01E6, 
--IBUS_KEY_c, IBUS_KEY_H, 0x021E, 
--IBUS_KEY_c, IBUS_KEY_I, 0x01CF, 
--IBUS_KEY_c, IBUS_KEY_K, 0x01E8, 
--IBUS_KEY_c, IBUS_KEY_L, 0x013D, 
--IBUS_KEY_c, IBUS_KEY_N, 0x0147, 
--IBUS_KEY_c, IBUS_KEY_O, 0x01D1, 
--IBUS_KEY_c, IBUS_KEY_R, 0x0158, 
--IBUS_KEY_c, IBUS_KEY_S, 0x0160, 
--IBUS_KEY_c, IBUS_KEY_T, 0x0164, 
--IBUS_KEY_c, IBUS_KEY_U, 0x01D3, 
--IBUS_KEY_c, IBUS_KEY_Z, 0x017D, 
--IBUS_KEY_c, IBUS_KEY_a, 0x01CE, 
--IBUS_KEY_c, IBUS_KEY_c, 0x010D, 
--IBUS_KEY_c, IBUS_KEY_d, 0x010F, 
--IBUS_KEY_c, IBUS_KEY_e, 0x011B, 
--IBUS_KEY_c, IBUS_KEY_g, 0x01E7, 
--IBUS_KEY_c, IBUS_KEY_h, 0x021F, 
--IBUS_KEY_c, IBUS_KEY_i, 0x01D0, 
--IBUS_KEY_c, IBUS_KEY_j, 0x01F0, 
--IBUS_KEY_c, IBUS_KEY_k, 0x01E9, 
--IBUS_KEY_c, IBUS_KEY_l, 0x013E, 
--IBUS_KEY_c, IBUS_KEY_n, 0x0148, 
--IBUS_KEY_c, IBUS_KEY_o, 0x01D2, 
--IBUS_KEY_c, IBUS_KEY_r, 0x0159, 
--IBUS_KEY_c, IBUS_KEY_s, 0x0161, 
--IBUS_KEY_c, IBUS_KEY_t, 0x0165, 
--IBUS_KEY_c, IBUS_KEY_u, 0x01D4, 
--IBUS_KEY_c, IBUS_KEY_z, 0x017E, 
--IBUS_KEY_c, IBUS_KEY_bar, 0x00A2, 
--IBUS_KEY_c, IBUS_KEY_Udiaeresis, 0x01D9, 
--IBUS_KEY_c, IBUS_KEY_udiaeresis, 0x01DA, 
--IBUS_KEY_d, IBUS_KEY_comma, 0x1E11, 
--IBUS_KEY_d, IBUS_KEY_minus, 0x0111, 
--IBUS_KEY_d, IBUS_KEY_period, 0x1E0B, 
--IBUS_KEY_d, IBUS_KEY_less, 0x010F, 
--IBUS_KEY_d, IBUS_KEY_equal, 0x20AB, 
--IBUS_KEY_d, IBUS_KEY_h, 0x00F0, 
--IBUS_KEY_d, IBUS_KEY_i, 0x2300, 
--IBUS_KEY_e, IBUS_KEY_quotedbl, 0x00EB, 
--IBUS_KEY_e, IBUS_KEY_apostrophe, 0x00E9, 
--IBUS_KEY_e, IBUS_KEY_comma, 0x0119, 
--IBUS_KEY_e, IBUS_KEY_minus, 0x0113, 
--IBUS_KEY_e, IBUS_KEY_period, 0x0117, 
--IBUS_KEY_e, IBUS_KEY_semicolon, 0x0119, 
--IBUS_KEY_e, IBUS_KEY_less, 0x011B, 
--IBUS_KEY_e, IBUS_KEY_equal, 0x20AC, 
--IBUS_KEY_e, IBUS_KEY_greater, 0x00EA, 
--IBUS_KEY_e, IBUS_KEY_asciicircum, 0x00EA, 
--IBUS_KEY_e, IBUS_KEY_underscore, 0x0113, 
--IBUS_KEY_e, IBUS_KEY_grave, 0x00E8, 
--IBUS_KEY_e, IBUS_KEY_e, 0x0259, 
--IBUS_KEY_e, IBUS_KEY_diaeresis, 0x00EB, 
--IBUS_KEY_e, IBUS_KEY_acute, 0x00E9, 
--IBUS_KEY_f, IBUS_KEY_period, 0x1E1F, 
--IBUS_KEY_f, IBUS_KEY_S, 0x017F, 
--IBUS_KEY_f, IBUS_KEY_f, 0xFB00, 
--IBUS_KEY_f, IBUS_KEY_i, 0xFB01, 
--IBUS_KEY_f, IBUS_KEY_l, 0xFB02, 
--IBUS_KEY_f, IBUS_KEY_s, 0x017F, 
--IBUS_KEY_g, IBUS_KEY_parenleft, 0x011F, 
--IBUS_KEY_g, IBUS_KEY_comma, 0x0123, 
--IBUS_KEY_g, IBUS_KEY_period, 0x0121, 
--IBUS_KEY_g, IBUS_KEY_U, 0x011F, 
--IBUS_KEY_g, IBUS_KEY_breve, 0x011F, 
--IBUS_KEY_h, IBUS_KEY_comma, 0x1E29, 
--IBUS_KEY_i, IBUS_KEY_quotedbl, 0x00EF, 
--IBUS_KEY_i, IBUS_KEY_apostrophe, 0x00ED, 
--IBUS_KEY_i, IBUS_KEY_comma, 0x012F, 
--IBUS_KEY_i, IBUS_KEY_minus, 0x012B, 
--IBUS_KEY_i, IBUS_KEY_period, 0x0131, 
--IBUS_KEY_i, IBUS_KEY_semicolon, 0x012F, 
--IBUS_KEY_i, IBUS_KEY_greater, 0x00EE, 
--IBUS_KEY_i, IBUS_KEY_asciicircum, 0x00EE, 
--IBUS_KEY_i, IBUS_KEY_underscore, 0x012B, 
--IBUS_KEY_i, IBUS_KEY_grave, 0x00EC, 
--IBUS_KEY_i, IBUS_KEY_j, 0x0133, 
--IBUS_KEY_i, IBUS_KEY_asciitilde, 0x0129, 
--IBUS_KEY_i, IBUS_KEY_diaeresis, 0x00EF, 
--IBUS_KEY_i, IBUS_KEY_acute, 0x00ED, 
--IBUS_KEY_k, IBUS_KEY_comma, 0x0137, 
--IBUS_KEY_k, IBUS_KEY_k, 0x0138, 
--IBUS_KEY_l, IBUS_KEY_apostrophe, 0x013A, 
--IBUS_KEY_l, IBUS_KEY_comma, 0x013C, 
--IBUS_KEY_l, IBUS_KEY_minus, 0x00A3, 
--IBUS_KEY_l, IBUS_KEY_slash, 0x0142, 
--IBUS_KEY_l, IBUS_KEY_less, 0x013E, 
--IBUS_KEY_l, IBUS_KEY_v, 0x007C, 
--IBUS_KEY_m, IBUS_KEY_period, 0x1E41, 
--IBUS_KEY_m, IBUS_KEY_slash, 0x20A5, 
--IBUS_KEY_m, IBUS_KEY_u, 0x00B5, 
--IBUS_KEY_n, IBUS_KEY_apostrophe, 0x0144, 
--IBUS_KEY_n, IBUS_KEY_comma, 0x0146, 
--IBUS_KEY_n, IBUS_KEY_less, 0x0148, 
--IBUS_KEY_n, IBUS_KEY_g, 0x014B, 
--IBUS_KEY_n, IBUS_KEY_asciitilde, 0x00F1, 
--IBUS_KEY_o, IBUS_KEY_quotedbl, 0x00F6, 
--IBUS_KEY_o, IBUS_KEY_apostrophe, 0x00F3, 
--IBUS_KEY_o, IBUS_KEY_comma, 0x01EB, 
--IBUS_KEY_o, IBUS_KEY_minus, 0x014D, 
--IBUS_KEY_o, IBUS_KEY_slash, 0x00F8, 
--IBUS_KEY_o, IBUS_KEY_semicolon, 0x01EB, 
--IBUS_KEY_o, IBUS_KEY_greater, 0x00F4, 
--IBUS_KEY_o, IBUS_KEY_A, 0x00C5, 
--IBUS_KEY_o, IBUS_KEY_C, 0x00A9, 
--IBUS_KEY_o, IBUS_KEY_R, 0x00AE, 
--IBUS_KEY_o, IBUS_KEY_U, 0x016E, 
--IBUS_KEY_o, IBUS_KEY_X, 0x00A4, 
--IBUS_KEY_o, IBUS_KEY_asciicircum, 0x00F4, 
--IBUS_KEY_o, IBUS_KEY_underscore, 0x014D, 
--IBUS_KEY_o, IBUS_KEY_grave, 0x00F2, 
--IBUS_KEY_o, IBUS_KEY_a, 0x00E5, 
--IBUS_KEY_o, IBUS_KEY_c, 0x00A9, 
--IBUS_KEY_o, IBUS_KEY_e, 0x0153, 
--IBUS_KEY_o, IBUS_KEY_o, 0x00B0, 
--IBUS_KEY_o, IBUS_KEY_r, 0x00AE, 
--IBUS_KEY_o, IBUS_KEY_s, 0x00A7, 
--IBUS_KEY_o, IBUS_KEY_u, 0x016F, 
--IBUS_KEY_o, IBUS_KEY_w, 0x1E98, 
--IBUS_KEY_o, IBUS_KEY_x, 0x00A4, 
--IBUS_KEY_o, IBUS_KEY_y, 0x1E99, 
--IBUS_KEY_o, IBUS_KEY_asciitilde, 0x00F5, 
--IBUS_KEY_o, IBUS_KEY_diaeresis, 0x00F6, 
--IBUS_KEY_o, IBUS_KEY_acute, 0x00F3, 
--IBUS_KEY_p, IBUS_KEY_exclam, 0x00B6, 
--IBUS_KEY_p, IBUS_KEY_period, 0x1E57, 
--IBUS_KEY_r, IBUS_KEY_apostrophe, 0x0155, 
--IBUS_KEY_r, IBUS_KEY_comma, 0x0157, 
--IBUS_KEY_r, IBUS_KEY_less, 0x0159, 
--IBUS_KEY_s, IBUS_KEY_exclam, 0x00A7, 
--IBUS_KEY_s, IBUS_KEY_apostrophe, 0x015B, 
--IBUS_KEY_s, IBUS_KEY_comma, 0x015F, 
--IBUS_KEY_s, IBUS_KEY_period, 0x1E61, 
--IBUS_KEY_s, IBUS_KEY_semicolon, 0x0219, 
--IBUS_KEY_s, IBUS_KEY_less, 0x0161, 
--IBUS_KEY_s, IBUS_KEY_M, 0x2120, 
--IBUS_KEY_s, IBUS_KEY_m, 0x2120, 
--IBUS_KEY_s, IBUS_KEY_o, 0x00A7, 
--IBUS_KEY_s, IBUS_KEY_s, 0x00DF, 
--IBUS_KEY_s, IBUS_KEY_cedilla, 0x015F, 
--IBUS_KEY_t, IBUS_KEY_comma, 0x0163, 
--IBUS_KEY_t, IBUS_KEY_minus, 0x0167, 
--IBUS_KEY_t, IBUS_KEY_period, 0x1E6B, 
--IBUS_KEY_t, IBUS_KEY_slash, 0x0167, 
--IBUS_KEY_t, IBUS_KEY_semicolon, 0x021B, 
--IBUS_KEY_t, IBUS_KEY_less, 0x0165, 
--IBUS_KEY_t, IBUS_KEY_M, 0x2122, 
--IBUS_KEY_t, IBUS_KEY_h, 0x00FE, 
--IBUS_KEY_t, IBUS_KEY_m, 0x2122, 
--IBUS_KEY_u, IBUS_KEY_quotedbl, 0x00FC, 
--IBUS_KEY_u, IBUS_KEY_apostrophe, 0x00FA, 
--IBUS_KEY_u, IBUS_KEY_asterisk, 0x016F, 
--IBUS_KEY_u, IBUS_KEY_comma, 0x0173, 
--IBUS_KEY_u, IBUS_KEY_minus, 0x016B, 
--IBUS_KEY_u, IBUS_KEY_slash, 0x00B5, 
--IBUS_KEY_u, IBUS_KEY_semicolon, 0x0173, 
--IBUS_KEY_u, IBUS_KEY_greater, 0x00FB, 
--IBUS_KEY_u, IBUS_KEY_A, 0x0102, 
--IBUS_KEY_u, IBUS_KEY_U, 0x016C, 
--IBUS_KEY_u, IBUS_KEY_asciicircum, 0x00FB, 
--IBUS_KEY_u, IBUS_KEY_underscore, 0x016B, 
--IBUS_KEY_u, IBUS_KEY_grave, 0x00F9, 
--IBUS_KEY_u, IBUS_KEY_a, 0x0103, 
--IBUS_KEY_u, IBUS_KEY_u, 0x016D, 
--IBUS_KEY_u, IBUS_KEY_asciitilde, 0x0169, 
--IBUS_KEY_u, IBUS_KEY_diaeresis, 0x00FC, 
--IBUS_KEY_u, IBUS_KEY_acute, 0x00FA, 
--IBUS_KEY_v, IBUS_KEY_slash, 0x221A, 
--IBUS_KEY_v, IBUS_KEY_Z, 0x017D, 
--IBUS_KEY_v, IBUS_KEY_l, 0x007C, 
--IBUS_KEY_v, IBUS_KEY_z, 0x017E, 
--IBUS_KEY_w, IBUS_KEY_asciicircum, 0x0175, 
--IBUS_KEY_x, IBUS_KEY_O, 0x00A4, 
--IBUS_KEY_x, IBUS_KEY_o, 0x00A4, 
--IBUS_KEY_x, IBUS_KEY_x, 0x00D7, 
--IBUS_KEY_y, IBUS_KEY_quotedbl, 0x00FF, 
--IBUS_KEY_y, IBUS_KEY_apostrophe, 0x00FD, 
--IBUS_KEY_y, IBUS_KEY_minus, 0x00A5, 
--IBUS_KEY_y, IBUS_KEY_equal, 0x00A5, 
--IBUS_KEY_y, IBUS_KEY_asciicircum, 0x0177, 
--IBUS_KEY_y, IBUS_KEY_diaeresis, 0x00FF, 
--IBUS_KEY_y, IBUS_KEY_acute, 0x00FD, 
--IBUS_KEY_z, IBUS_KEY_apostrophe, 0x017A, 
--IBUS_KEY_z, IBUS_KEY_period, 0x017C, 
--IBUS_KEY_z, IBUS_KEY_less, 0x017E, 
--IBUS_KEY_braceleft, IBUS_KEY_braceright, 0x2205, 
--IBUS_KEY_bar, IBUS_KEY_C, 0x00A2, 
--IBUS_KEY_bar, IBUS_KEY_c, 0x00A2, 
--IBUS_KEY_bar, IBUS_KEY_asciitilde, 0x236D, 
--IBUS_KEY_bar, 0x2190, 0x2345, 
--IBUS_KEY_bar, 0x2192, 0x2346, 
--IBUS_KEY_bar, 0x2206, 0x234B, 
--IBUS_KEY_bar, 0x2207, 0x2352, 
--IBUS_KEY_bar, IBUS_KEY_union, 0x2366, 
--IBUS_KEY_bar, 0x2282, 0x2367, 
--IBUS_KEY_bar, IBUS_KEY_emopencircle, 0x233D, 
--IBUS_KEY_asciitilde, IBUS_KEY_space, 0x007E, 
--IBUS_KEY_asciitilde, IBUS_KEY_0, 0x236C, 
--IBUS_KEY_asciitilde, IBUS_KEY_A, 0x00C3, 
--IBUS_KEY_asciitilde, IBUS_KEY_E, 0x1EBC, 
--IBUS_KEY_asciitilde, IBUS_KEY_I, 0x0128, 
--IBUS_KEY_asciitilde, IBUS_KEY_N, 0x00D1, 
--IBUS_KEY_asciitilde, IBUS_KEY_O, 0x00D5, 
--IBUS_KEY_asciitilde, IBUS_KEY_U, 0x0168, 
--IBUS_KEY_asciitilde, IBUS_KEY_V, 0x1E7C, 
--IBUS_KEY_asciitilde, IBUS_KEY_Y, 0x1EF8, 
--IBUS_KEY_asciitilde, IBUS_KEY_a, 0x00E3, 
--IBUS_KEY_asciitilde, IBUS_KEY_e, 0x1EBD, 
--IBUS_KEY_asciitilde, IBUS_KEY_i, 0x0129, 
--IBUS_KEY_asciitilde, IBUS_KEY_n, 0x00F1, 
--IBUS_KEY_asciitilde, IBUS_KEY_o, 0x00F5, 
--IBUS_KEY_asciitilde, IBUS_KEY_u, 0x0169, 
--IBUS_KEY_asciitilde, IBUS_KEY_v, 0x1E7D, 
--IBUS_KEY_asciitilde, IBUS_KEY_y, 0x1EF9, 
--IBUS_KEY_asciitilde, IBUS_KEY_bar, 0x236D, 
--IBUS_KEY_asciitilde, IBUS_KEY_diaeresis, 0x2368, 
--IBUS_KEY_asciitilde, IBUS_KEY_Acircumflex, 0x1EAA, 
--IBUS_KEY_asciitilde, IBUS_KEY_Ecircumflex, 0x1EC4, 
--IBUS_KEY_asciitilde, IBUS_KEY_Ocircumflex, 0x1ED6, 
--IBUS_KEY_asciitilde, IBUS_KEY_acircumflex, 0x1EAB, 
--IBUS_KEY_asciitilde, IBUS_KEY_ecircumflex, 0x1EC5, 
--IBUS_KEY_asciitilde, IBUS_KEY_ocircumflex, 0x1ED7, 
--IBUS_KEY_asciitilde, IBUS_KEY_Abreve, 0x1EB4, 
--IBUS_KEY_asciitilde, IBUS_KEY_abreve, 0x1EB5, 
--IBUS_KEY_asciitilde, IBUS_KEY_Greek_iotadieresis, 0x1FD7, 
--IBUS_KEY_asciitilde, IBUS_KEY_Greek_upsilondieresis, 0x1FE7, 
--IBUS_KEY_asciitilde, IBUS_KEY_Greek_alpha, 0x1FB6, 
--IBUS_KEY_asciitilde, IBUS_KEY_Greek_eta, 0x1FC6, 
--IBUS_KEY_asciitilde, IBUS_KEY_Greek_iota, 0x1FD6, 
--IBUS_KEY_asciitilde, IBUS_KEY_Greek_upsilon, 0x1FE6, 
--IBUS_KEY_asciitilde, IBUS_KEY_Greek_omega, 0x1FF6, 
--IBUS_KEY_asciitilde, 0x1F00, 0x1F06, 
--IBUS_KEY_asciitilde, 0x1F01, 0x1F07, 
--IBUS_KEY_asciitilde, 0x1F08, 0x1F0E, 
--IBUS_KEY_asciitilde, 0x1F09, 0x1F0F, 
--IBUS_KEY_asciitilde, 0x1F20, 0x1F26, 
--IBUS_KEY_asciitilde, 0x1F21, 0x1F27, 
--IBUS_KEY_asciitilde, 0x1F28, 0x1F2E, 
--IBUS_KEY_asciitilde, 0x1F29, 0x1F2F, 
--IBUS_KEY_asciitilde, 0x1F30, 0x1F36, 
--IBUS_KEY_asciitilde, 0x1F31, 0x1F37, 
--IBUS_KEY_asciitilde, 0x1F38, 0x1F3E, 
--IBUS_KEY_asciitilde, 0x1F39, 0x1F3F, 
--IBUS_KEY_asciitilde, 0x1F50, 0x1F56, 
--IBUS_KEY_asciitilde, 0x1F51, 0x1F57, 
--IBUS_KEY_asciitilde, 0x1F59, 0x1F5F, 
--IBUS_KEY_asciitilde, 0x1F60, 0x1F66, 
--IBUS_KEY_asciitilde, 0x1F61, 0x1F67, 
--IBUS_KEY_asciitilde, 0x1F68, 0x1F6E, 
--IBUS_KEY_asciitilde, 0x1F69, 0x1F6F, 
--IBUS_KEY_asciitilde, 0x2207, 0x236B, 
--IBUS_KEY_asciitilde, 0x2227, 0x2372, 
--IBUS_KEY_asciitilde, 0x2228, 0x2371, 
--IBUS_KEY_diaeresis, IBUS_KEY_apostrophe, 0x0385, 
--IBUS_KEY_diaeresis, IBUS_KEY_asterisk, 0x2363, 
--IBUS_KEY_diaeresis, IBUS_KEY_greater, 0x2369, 
--IBUS_KEY_diaeresis, IBUS_KEY_A, 0x00C4, 
--IBUS_KEY_diaeresis, IBUS_KEY_E, 0x00CB, 
--IBUS_KEY_diaeresis, IBUS_KEY_I, 0x00CF, 
--IBUS_KEY_diaeresis, IBUS_KEY_O, 0x00D6, 
--IBUS_KEY_diaeresis, IBUS_KEY_U, 0x00DC, 
--IBUS_KEY_diaeresis, IBUS_KEY_Y, 0x0178, 
--IBUS_KEY_diaeresis, IBUS_KEY_grave, 0x1FED, 
--IBUS_KEY_diaeresis, IBUS_KEY_a, 0x00E4, 
--IBUS_KEY_diaeresis, IBUS_KEY_e, 0x00EB, 
--IBUS_KEY_diaeresis, IBUS_KEY_i, 0x00EF, 
--IBUS_KEY_diaeresis, IBUS_KEY_o, 0x00F6, 
--IBUS_KEY_diaeresis, IBUS_KEY_u, 0x00FC, 
--IBUS_KEY_diaeresis, IBUS_KEY_y, 0x00FF, 
--IBUS_KEY_diaeresis, IBUS_KEY_asciitilde, 0x1FC1, 
--IBUS_KEY_diaeresis, IBUS_KEY_acute, 0x0385, 
--IBUS_KEY_diaeresis, 0x2207, 0x2362, 
--IBUS_KEY_diaeresis, 0x2218, 0x2364, 
--IBUS_KEY_diaeresis, IBUS_KEY_uptack, 0x2361, 
--IBUS_KEY_diaeresis, IBUS_KEY_emopencircle, 0x2365, 
--IBUS_KEY_diaeresis, IBUS_KEY_dead_grave, 0x1FED, 
--IBUS_KEY_diaeresis, IBUS_KEY_dead_acute, 0x0385, 
--IBUS_KEY_diaeresis, IBUS_KEY_dead_tilde, 0x1FC1, 
--IBUS_KEY_macron, IBUS_KEY_A, 0x0100, 
--IBUS_KEY_macron, IBUS_KEY_E, 0x0112, 
--IBUS_KEY_macron, IBUS_KEY_G, 0x1E20, 
--IBUS_KEY_macron, IBUS_KEY_I, 0x012A, 
--IBUS_KEY_macron, IBUS_KEY_O, 0x014C, 
--IBUS_KEY_macron, IBUS_KEY_U, 0x016A, 
--IBUS_KEY_macron, IBUS_KEY_Y, 0x0232, 
--IBUS_KEY_macron, IBUS_KEY_a, 0x0101, 
--IBUS_KEY_macron, IBUS_KEY_e, 0x0113, 
--IBUS_KEY_macron, IBUS_KEY_g, 0x1E21, 
--IBUS_KEY_macron, IBUS_KEY_i, 0x012B, 
--IBUS_KEY_macron, IBUS_KEY_o, 0x014D, 
--IBUS_KEY_macron, IBUS_KEY_u, 0x016B, 
--IBUS_KEY_macron, IBUS_KEY_y, 0x0233, 
--IBUS_KEY_macron, IBUS_KEY_Adiaeresis, 0x01DE, 
--IBUS_KEY_macron, IBUS_KEY_AE, 0x01E2, 
--IBUS_KEY_macron, IBUS_KEY_Otilde, 0x022C, 
--IBUS_KEY_macron, IBUS_KEY_Odiaeresis, 0x022A, 
--IBUS_KEY_macron, IBUS_KEY_Udiaeresis, 0x01D5, 
--IBUS_KEY_macron, IBUS_KEY_adiaeresis, 0x01DF, 
--IBUS_KEY_macron, IBUS_KEY_ae, 0x01E3, 
--IBUS_KEY_macron, IBUS_KEY_otilde, 0x022D, 
--IBUS_KEY_macron, IBUS_KEY_odiaeresis, 0x022B, 
--IBUS_KEY_macron, IBUS_KEY_udiaeresis, 0x01D6, 
--IBUS_KEY_macron, 0x01EA, 0x01EC, 
--IBUS_KEY_macron, 0x01EB, 0x01ED, 
--IBUS_KEY_macron, 0x0226, 0x01E0, 
--IBUS_KEY_macron, 0x0227, 0x01E1, 
--IBUS_KEY_macron, 0x022E, 0x0230, 
--IBUS_KEY_macron, 0x022F, 0x0231, 
--IBUS_KEY_macron, IBUS_KEY_Cyrillic_i, 0x04E3, 
--IBUS_KEY_macron, IBUS_KEY_Cyrillic_u, 0x04EF, 
--IBUS_KEY_macron, IBUS_KEY_Cyrillic_I, 0x04E2, 
--IBUS_KEY_macron, IBUS_KEY_Cyrillic_U, 0x04EE, 
--IBUS_KEY_macron, IBUS_KEY_Greek_ALPHA, 0x1FB9, 
--IBUS_KEY_macron, IBUS_KEY_Greek_IOTA, 0x1FD9, 
--IBUS_KEY_macron, IBUS_KEY_Greek_UPSILON, 0x1FE9, 
--IBUS_KEY_macron, IBUS_KEY_Greek_alpha, 0x1FB1, 
--IBUS_KEY_macron, IBUS_KEY_Greek_iota, 0x1FD1, 
--IBUS_KEY_macron, IBUS_KEY_Greek_upsilon, 0x1FE1, 
--IBUS_KEY_macron, 0x1E36, 0x1E38, 
--IBUS_KEY_macron, 0x1E37, 0x1E39, 
--IBUS_KEY_macron, 0x1E5A, 0x1E5C, 
--IBUS_KEY_macron, 0x1E5B, 0x1E5D, 
--IBUS_KEY_macron, IBUS_KEY_uptack, 0x2351, 
--IBUS_KEY_acute, IBUS_KEY_A, 0x00C1, 
--IBUS_KEY_acute, IBUS_KEY_C, 0x0106, 
--IBUS_KEY_acute, IBUS_KEY_E, 0x00C9, 
--IBUS_KEY_acute, IBUS_KEY_G, 0x01F4, 
--IBUS_KEY_acute, IBUS_KEY_I, 0x00CD, 
--IBUS_KEY_acute, IBUS_KEY_K, 0x1E30, 
--IBUS_KEY_acute, IBUS_KEY_L, 0x0139, 
--IBUS_KEY_acute, IBUS_KEY_M, 0x1E3E, 
--IBUS_KEY_acute, IBUS_KEY_N, 0x0143, 
--IBUS_KEY_acute, IBUS_KEY_O, 0x00D3, 
--IBUS_KEY_acute, IBUS_KEY_P, 0x1E54, 
--IBUS_KEY_acute, IBUS_KEY_R, 0x0154, 
--IBUS_KEY_acute, IBUS_KEY_S, 0x015A, 
--IBUS_KEY_acute, IBUS_KEY_U, 0x00DA, 
--IBUS_KEY_acute, IBUS_KEY_W, 0x1E82, 
--IBUS_KEY_acute, IBUS_KEY_Y, 0x00DD, 
--IBUS_KEY_acute, IBUS_KEY_Z, 0x0179, 
--IBUS_KEY_acute, IBUS_KEY_a, 0x00E1, 
--IBUS_KEY_acute, IBUS_KEY_c, 0x0107, 
--IBUS_KEY_acute, IBUS_KEY_e, 0x00E9, 
--IBUS_KEY_acute, IBUS_KEY_g, 0x01F5, 
--IBUS_KEY_acute, IBUS_KEY_i, 0x00ED, 
--IBUS_KEY_acute, IBUS_KEY_k, 0x1E31, 
--IBUS_KEY_acute, IBUS_KEY_l, 0x013A, 
--IBUS_KEY_acute, IBUS_KEY_m, 0x1E3F, 
--IBUS_KEY_acute, IBUS_KEY_n, 0x0144, 
--IBUS_KEY_acute, IBUS_KEY_o, 0x00F3, 
--IBUS_KEY_acute, IBUS_KEY_p, 0x1E55, 
--IBUS_KEY_acute, IBUS_KEY_r, 0x0155, 
--IBUS_KEY_acute, IBUS_KEY_s, 0x015B, 
--IBUS_KEY_acute, IBUS_KEY_u, 0x00FA, 
--IBUS_KEY_acute, IBUS_KEY_w, 0x1E83, 
--IBUS_KEY_acute, IBUS_KEY_y, 0x00FD, 
--IBUS_KEY_acute, IBUS_KEY_z, 0x017A, 
--IBUS_KEY_acute, IBUS_KEY_Acircumflex, 0x1EA4, 
--IBUS_KEY_acute, IBUS_KEY_Aring, 0x01FA, 
--IBUS_KEY_acute, IBUS_KEY_AE, 0x01FC, 
--IBUS_KEY_acute, IBUS_KEY_Ccedilla, 0x1E08, 
--IBUS_KEY_acute, IBUS_KEY_Ecircumflex, 0x1EBE, 
--IBUS_KEY_acute, IBUS_KEY_Idiaeresis, 0x1E2E, 
--IBUS_KEY_acute, IBUS_KEY_Ocircumflex, 0x1ED0, 
--IBUS_KEY_acute, IBUS_KEY_Otilde, 0x1E4C, 
--IBUS_KEY_acute, IBUS_KEY_Ooblique, 0x01FE, 
--IBUS_KEY_acute, IBUS_KEY_Udiaeresis, 0x01D7, 
--IBUS_KEY_acute, IBUS_KEY_acircumflex, 0x1EA5, 
--IBUS_KEY_acute, IBUS_KEY_aring, 0x01FB, 
--IBUS_KEY_acute, IBUS_KEY_ae, 0x01FD, 
--IBUS_KEY_acute, IBUS_KEY_ccedilla, 0x1E09, 
--IBUS_KEY_acute, IBUS_KEY_ecircumflex, 0x1EBF, 
--IBUS_KEY_acute, IBUS_KEY_idiaeresis, 0x1E2F, 
--IBUS_KEY_acute, IBUS_KEY_ocircumflex, 0x1ED1, 
--IBUS_KEY_acute, IBUS_KEY_otilde, 0x1E4D, 
--IBUS_KEY_acute, IBUS_KEY_oslash, 0x01FF, 
--IBUS_KEY_acute, IBUS_KEY_udiaeresis, 0x01D8, 
--IBUS_KEY_acute, IBUS_KEY_Abreve, 0x1EAE, 
--IBUS_KEY_acute, IBUS_KEY_abreve, 0x1EAF, 
--IBUS_KEY_acute, IBUS_KEY_Emacron, 0x1E16, 
--IBUS_KEY_acute, IBUS_KEY_emacron, 0x1E17, 
--IBUS_KEY_acute, IBUS_KEY_Omacron, 0x1E52, 
--IBUS_KEY_acute, IBUS_KEY_Utilde, 0x1E78, 
--IBUS_KEY_acute, IBUS_KEY_omacron, 0x1E53, 
--IBUS_KEY_acute, IBUS_KEY_utilde, 0x1E79, 
--IBUS_KEY_acute, IBUS_KEY_Cyrillic_ghe, 0x0453, 
--IBUS_KEY_acute, IBUS_KEY_Cyrillic_ka, 0x045C, 
--IBUS_KEY_acute, IBUS_KEY_Cyrillic_GHE, 0x0403, 
--IBUS_KEY_acute, IBUS_KEY_Cyrillic_KA, 0x040C, 
--IBUS_KEY_acute, IBUS_KEY_Greek_iotadieresis, 0x0390, 
--IBUS_KEY_acute, IBUS_KEY_Greek_upsilondieresis, 0x03B0, 
--IBUS_KEY_acute, IBUS_KEY_Greek_ALPHA, 0x0386, 
--IBUS_KEY_acute, IBUS_KEY_Greek_EPSILON, 0x0388, 
--IBUS_KEY_acute, IBUS_KEY_Greek_ETA, 0x0389, 
--IBUS_KEY_acute, IBUS_KEY_Greek_IOTA, 0x038A, 
--IBUS_KEY_acute, IBUS_KEY_Greek_OMICRON, 0x038C, 
--IBUS_KEY_acute, IBUS_KEY_Greek_UPSILON, 0x038E, 
--IBUS_KEY_acute, IBUS_KEY_Greek_OMEGA, 0x038F, 
--IBUS_KEY_acute, IBUS_KEY_Greek_alpha, 0x03AC, 
--IBUS_KEY_acute, IBUS_KEY_Greek_epsilon, 0x03AD, 
--IBUS_KEY_acute, IBUS_KEY_Greek_eta, 0x03AE, 
--IBUS_KEY_acute, IBUS_KEY_Greek_iota, 0x03AF, 
--IBUS_KEY_acute, IBUS_KEY_Greek_omicron, 0x03CC, 
--IBUS_KEY_acute, IBUS_KEY_Greek_upsilon, 0x03CD, 
--IBUS_KEY_acute, IBUS_KEY_Greek_omega, 0x03CE, 
--IBUS_KEY_acute, 0x1F00, 0x1F04, 
--IBUS_KEY_acute, 0x1F01, 0x1F05, 
--IBUS_KEY_acute, 0x1F08, 0x1F0C, 
--IBUS_KEY_acute, 0x1F09, 0x1F0D, 
--IBUS_KEY_acute, 0x1F10, 0x1F14, 
--IBUS_KEY_acute, 0x1F11, 0x1F15, 
--IBUS_KEY_acute, 0x1F18, 0x1F1C, 
--IBUS_KEY_acute, 0x1F19, 0x1F1D, 
--IBUS_KEY_acute, 0x1F20, 0x1F24, 
--IBUS_KEY_acute, 0x1F21, 0x1F25, 
--IBUS_KEY_acute, 0x1F28, 0x1F2C, 
--IBUS_KEY_acute, 0x1F29, 0x1F2D, 
--IBUS_KEY_acute, 0x1F30, 0x1F34, 
--IBUS_KEY_acute, 0x1F31, 0x1F35, 
--IBUS_KEY_acute, 0x1F38, 0x1F3C, 
--IBUS_KEY_acute, 0x1F39, 0x1F3D, 
--IBUS_KEY_acute, 0x1F40, 0x1F44, 
--IBUS_KEY_acute, 0x1F41, 0x1F45, 
--IBUS_KEY_acute, 0x1F48, 0x1F4C, 
--IBUS_KEY_acute, 0x1F49, 0x1F4D, 
--IBUS_KEY_acute, 0x1F50, 0x1F54, 
--IBUS_KEY_acute, 0x1F51, 0x1F55, 
--IBUS_KEY_acute, 0x1F59, 0x1F5D, 
--IBUS_KEY_acute, 0x1F60, 0x1F64, 
--IBUS_KEY_acute, 0x1F61, 0x1F65, 
--IBUS_KEY_acute, 0x1F68, 0x1F6C, 
--IBUS_KEY_acute, 0x1F69, 0x1F6D, 
--IBUS_KEY_cedilla, IBUS_KEY_C, 0x00C7, 
--IBUS_KEY_cedilla, IBUS_KEY_D, 0x1E10, 
--IBUS_KEY_cedilla, IBUS_KEY_E, 0x0228, 
--IBUS_KEY_cedilla, IBUS_KEY_G, 0x0122, 
--IBUS_KEY_cedilla, IBUS_KEY_H, 0x1E28, 
--IBUS_KEY_cedilla, IBUS_KEY_K, 0x0136, 
--IBUS_KEY_cedilla, IBUS_KEY_L, 0x013B, 
--IBUS_KEY_cedilla, IBUS_KEY_N, 0x0145, 
--IBUS_KEY_cedilla, IBUS_KEY_R, 0x0156, 
--IBUS_KEY_cedilla, IBUS_KEY_S, 0x015E, 
--IBUS_KEY_cedilla, IBUS_KEY_T, 0x0162, 
--IBUS_KEY_cedilla, IBUS_KEY_c, 0x00E7, 
--IBUS_KEY_cedilla, IBUS_KEY_d, 0x1E11, 
--IBUS_KEY_cedilla, IBUS_KEY_e, 0x0229, 
--IBUS_KEY_cedilla, IBUS_KEY_g, 0x0123, 
--IBUS_KEY_cedilla, IBUS_KEY_h, 0x1E29, 
--IBUS_KEY_cedilla, IBUS_KEY_k, 0x0137, 
--IBUS_KEY_cedilla, IBUS_KEY_l, 0x013C, 
--IBUS_KEY_cedilla, IBUS_KEY_n, 0x0146, 
--IBUS_KEY_cedilla, IBUS_KEY_r, 0x0157, 
--IBUS_KEY_cedilla, IBUS_KEY_s, 0x015F, 
--IBUS_KEY_cedilla, IBUS_KEY_t, 0x0163, 
--IBUS_KEY_division, 0x2395, 0x2339, 
--IBUS_KEY_breve, IBUS_KEY_G, 0x011E, 
--IBUS_KEY_breve, IBUS_KEY_g, 0x011F, 
--0x05B4, IBUS_KEY_hebrew_yod, 0xFB1D, 
--0x05B7, 0x05F2, 0xFB1F, 
--0x05B7, IBUS_KEY_hebrew_aleph, 0xFB2E, 
--0x05B8, IBUS_KEY_hebrew_aleph, 0xFB2F, 
--0x05B9, IBUS_KEY_hebrew_waw, 0xFB4B, 
--0x05BC, IBUS_KEY_hebrew_aleph, 0xFB30, 
--0x05BC, IBUS_KEY_hebrew_beth, 0xFB31, 
--0x05BC, IBUS_KEY_hebrew_gimmel, 0xFB32, 
--0x05BC, IBUS_KEY_hebrew_daleth, 0xFB33, 
--0x05BC, IBUS_KEY_hebrew_he, 0xFB34, 
--0x05BC, IBUS_KEY_hebrew_waw, 0xFB35, 
--0x05BC, IBUS_KEY_hebrew_zayin, 0xFB36, 
--0x05BC, IBUS_KEY_hebrew_teth, 0xFB38, 
--0x05BC, IBUS_KEY_hebrew_yod, 0xFB39, 
--0x05BC, IBUS_KEY_hebrew_finalkaph, 0xFB3A, 
--0x05BC, IBUS_KEY_hebrew_kaph, 0xFB3B, 
--0x05BC, IBUS_KEY_hebrew_lamed, 0xFB3C, 
--0x05BC, IBUS_KEY_hebrew_mem, 0xFB3E, 
--0x05BC, IBUS_KEY_hebrew_nun, 0xFB40, 
--0x05BC, IBUS_KEY_hebrew_samekh, 0xFB41, 
--0x05BC, IBUS_KEY_hebrew_finalpe, 0xFB43, 
--0x05BC, IBUS_KEY_hebrew_pe, 0xFB44, 
--0x05BC, IBUS_KEY_hebrew_zadi, 0xFB46, 
--0x05BC, IBUS_KEY_hebrew_qoph, 0xFB47, 
--0x05BC, IBUS_KEY_hebrew_resh, 0xFB48, 
--0x05BC, IBUS_KEY_hebrew_shin, 0xFB49, 
--0x05BC, IBUS_KEY_hebrew_taw, 0xFB4A, 
--0x05BF, IBUS_KEY_hebrew_beth, 0xFB4C, 
--0x05BF, IBUS_KEY_hebrew_kaph, 0xFB4D, 
--0x05BF, IBUS_KEY_hebrew_pe, 0xFB4E, 
--0x05C1, IBUS_KEY_hebrew_shin, 0xFB2A, 
--0x05C1, 0xFB49, 0xFB2C, 
--0x05C2, IBUS_KEY_hebrew_shin, 0xFB2B, 
--0x05C2, 0xFB49, 0xFB2D, 
--0x0653, IBUS_KEY_Arabic_alef, 0x0622, 
--0x0654, IBUS_KEY_Arabic_alef, 0x0623, 
--0x0654, IBUS_KEY_Arabic_waw, 0x0624, 
--0x0654, IBUS_KEY_Arabic_yeh, 0x0626, 
--0x0654, 0x06C1, 0x06C2, 
--0x0654, 0x06D2, 0x06D3, 
--0x0654, 0x06D5, 0x06C0, 
--0x0655, IBUS_KEY_Arabic_alef, 0x0625, 
--IBUS_KEY_Cyrillic_pe, IBUS_KEY_Cyrillic_a, 0x00A7, 
--IBUS_KEY_Cyrillic_IE, IBUS_KEY_equal, 0x20AC, 
--IBUS_KEY_Cyrillic_EN, IBUS_KEY_Cyrillic_o, 0x2116, 
--IBUS_KEY_Cyrillic_EN, IBUS_KEY_Cyrillic_O, 0x2116, 
--IBUS_KEY_Cyrillic_ES, IBUS_KEY_equal, 0x20AC, 
--IBUS_KEY_Greek_ALPHA, IBUS_KEY_apostrophe, 0x0386, 
--IBUS_KEY_Greek_EPSILON, IBUS_KEY_apostrophe, 0x0388, 
--IBUS_KEY_Greek_ETA, IBUS_KEY_apostrophe, 0x0389, 
--IBUS_KEY_Greek_IOTA, IBUS_KEY_quotedbl, 0x03AA, 
--IBUS_KEY_Greek_IOTA, IBUS_KEY_apostrophe, 0x038A, 
--IBUS_KEY_Greek_OMICRON, IBUS_KEY_apostrophe, 0x038C, 
--IBUS_KEY_Greek_UPSILON, IBUS_KEY_quotedbl, 0x03AB, 
--IBUS_KEY_Greek_UPSILON, IBUS_KEY_apostrophe, 0x038E, 
--IBUS_KEY_Greek_OMEGA, IBUS_KEY_apostrophe, 0x038F, 
--IBUS_KEY_Greek_alpha, IBUS_KEY_apostrophe, 0x03AC, 
--IBUS_KEY_Greek_epsilon, IBUS_KEY_apostrophe, 0x03AD, 
--IBUS_KEY_Greek_eta, IBUS_KEY_apostrophe, 0x03AE, 
--IBUS_KEY_Greek_iota, IBUS_KEY_quotedbl, 0x03CA, 
--IBUS_KEY_Greek_iota, IBUS_KEY_Greek_alphaaccent, 0x1FB4, 
--IBUS_KEY_Greek_iota, IBUS_KEY_Greek_etaaccent, 0x1FC4, 
--IBUS_KEY_Greek_iota, IBUS_KEY_Greek_omegaaccent, 0x1FF4, 
--IBUS_KEY_Greek_iota, IBUS_KEY_Greek_ALPHA, 0x1FBC, 
--IBUS_KEY_Greek_iota, IBUS_KEY_Greek_ETA, 0x1FCC, 
--IBUS_KEY_Greek_iota, IBUS_KEY_Greek_OMEGA, 0x1FFC, 
--IBUS_KEY_Greek_iota, IBUS_KEY_Greek_alpha, 0x1FB3, 
--IBUS_KEY_Greek_iota, IBUS_KEY_Greek_eta, 0x1FC3, 
--IBUS_KEY_Greek_iota, IBUS_KEY_Greek_omega, 0x1FF3, 
--IBUS_KEY_Greek_iota, 0x1F00, 0x1F80, 
--IBUS_KEY_Greek_iota, 0x1F01, 0x1F81, 
--IBUS_KEY_Greek_iota, 0x1F02, 0x1F82, 
--IBUS_KEY_Greek_iota, 0x1F03, 0x1F83, 
--IBUS_KEY_Greek_iota, 0x1F04, 0x1F84, 
--IBUS_KEY_Greek_iota, 0x1F05, 0x1F85, 
--IBUS_KEY_Greek_iota, 0x1F06, 0x1F86, 
--IBUS_KEY_Greek_iota, 0x1F07, 0x1F87, 
--IBUS_KEY_Greek_iota, 0x1F08, 0x1F88, 
--IBUS_KEY_Greek_iota, 0x1F09, 0x1F89, 
--IBUS_KEY_Greek_iota, 0x1F0A, 0x1F8A, 
--IBUS_KEY_Greek_iota, 0x1F0B, 0x1F8B, 
--IBUS_KEY_Greek_iota, 0x1F0C, 0x1F8C, 
--IBUS_KEY_Greek_iota, 0x1F0D, 0x1F8D, 
--IBUS_KEY_Greek_iota, 0x1F0E, 0x1F8E, 
--IBUS_KEY_Greek_iota, 0x1F0F, 0x1F8F, 
--IBUS_KEY_Greek_iota, 0x1F20, 0x1F90, 
--IBUS_KEY_Greek_iota, 0x1F21, 0x1F91, 
--IBUS_KEY_Greek_iota, 0x1F22, 0x1F92, 
--IBUS_KEY_Greek_iota, 0x1F23, 0x1F93, 
--IBUS_KEY_Greek_iota, 0x1F24, 0x1F94, 
--IBUS_KEY_Greek_iota, 0x1F25, 0x1F95, 
--IBUS_KEY_Greek_iota, 0x1F26, 0x1F96, 
--IBUS_KEY_Greek_iota, 0x1F27, 0x1F97, 
--IBUS_KEY_Greek_iota, 0x1F28, 0x1F98, 
--IBUS_KEY_Greek_iota, 0x1F29, 0x1F99, 
--IBUS_KEY_Greek_iota, 0x1F2A, 0x1F9A, 
--IBUS_KEY_Greek_iota, 0x1F2B, 0x1F9B, 
--IBUS_KEY_Greek_iota, 0x1F2C, 0x1F9C, 
--IBUS_KEY_Greek_iota, 0x1F2D, 0x1F9D, 
--IBUS_KEY_Greek_iota, 0x1F2E, 0x1F9E, 
--IBUS_KEY_Greek_iota, 0x1F2F, 0x1F9F, 
--IBUS_KEY_Greek_iota, 0x1F60, 0x1FA0, 
--IBUS_KEY_Greek_iota, 0x1F61, 0x1FA1, 
--IBUS_KEY_Greek_iota, 0x1F62, 0x1FA2, 
--IBUS_KEY_Greek_iota, 0x1F63, 0x1FA3, 
--IBUS_KEY_Greek_iota, 0x1F64, 0x1FA4, 
--IBUS_KEY_Greek_iota, 0x1F65, 0x1FA5, 
--IBUS_KEY_Greek_iota, 0x1F66, 0x1FA6, 
--IBUS_KEY_Greek_iota, 0x1F67, 0x1FA7, 
--IBUS_KEY_Greek_iota, 0x1F68, 0x1FA8, 
--IBUS_KEY_Greek_iota, 0x1F69, 0x1FA9, 
--IBUS_KEY_Greek_iota, 0x1F6A, 0x1FAA, 
--IBUS_KEY_Greek_iota, 0x1F6B, 0x1FAB, 
--IBUS_KEY_Greek_iota, 0x1F6C, 0x1FAC, 
--IBUS_KEY_Greek_iota, 0x1F6D, 0x1FAD, 
--IBUS_KEY_Greek_iota, 0x1F6E, 0x1FAE, 
--IBUS_KEY_Greek_iota, 0x1F6F, 0x1FAF, 
--IBUS_KEY_Greek_iota, 0x1F70, 0x1FB2, 
--IBUS_KEY_Greek_iota, 0x1F74, 0x1FC2, 
--IBUS_KEY_Greek_iota, 0x1F7C, 0x1FF2, 
--IBUS_KEY_Greek_iota, 0x1FB6, 0x1FB7, 
--IBUS_KEY_Greek_iota, 0x1FC6, 0x1FC7, 
--IBUS_KEY_Greek_iota, 0x1FF6, 0x1FF7, 
--IBUS_KEY_Greek_omicron, IBUS_KEY_apostrophe, 0x03CC, 
--IBUS_KEY_Greek_upsilon, IBUS_KEY_quotedbl, 0x03CB, 
--IBUS_KEY_Greek_upsilon, IBUS_KEY_apostrophe, 0x03CD, 
--IBUS_KEY_Greek_omega, IBUS_KEY_apostrophe, 0x03CE, 
--IBUS_KEY_lessthanequal, 0x0338, 0x2270, 
--IBUS_KEY_greaterthanequal, 0x0338, 0x2271, 
--IBUS_KEY_approximate, 0x0338, 0x2247, 
--IBUS_KEY_identical, 0x0338, 0x2262, 
--IBUS_KEY_includedin, 0x0338, 0x2284, 
--IBUS_KEY_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_KEY_leftcaret, 0x0338, 0x226E, 
--IBUS_KEY_rightcaret, 0x0338, 0x226F, 
--IBUS_KEY_underbar, IBUS_KEY_parenleft, 0x208D, 
--IBUS_KEY_underbar, IBUS_KEY_parenright, 0x208E, 
--IBUS_KEY_underbar, IBUS_KEY_plus, 0x208A, 
--IBUS_KEY_underbar, IBUS_KEY_0, 0x2080, 
--IBUS_KEY_underbar, IBUS_KEY_1, 0x2081, 
--IBUS_KEY_underbar, IBUS_KEY_2, 0x2082, 
--IBUS_KEY_underbar, IBUS_KEY_3, 0x2083, 
--IBUS_KEY_underbar, IBUS_KEY_4, 0x2084, 
--IBUS_KEY_underbar, IBUS_KEY_5, 0x2085, 
--IBUS_KEY_underbar, IBUS_KEY_6, 0x2086, 
--IBUS_KEY_underbar, IBUS_KEY_7, 0x2087, 
--IBUS_KEY_underbar, IBUS_KEY_8, 0x2088, 
--IBUS_KEY_underbar, IBUS_KEY_9, 0x2089, 
--IBUS_KEY_underbar, IBUS_KEY_equal, 0x208C, 
--0x0BC6, 0x0BBE, 0x0BCA, 
--0x0BC6, 0x0BD7, 0x0BCC, 
--IBUS_KEY_underbar, 0x2212, 0x208B, 
--IBUS_KEY_underbar, IBUS_KEY_KP_Space, 0x2082, 
--IBUS_KEY_underbar, IBUS_KEY_KP_Add, 0x208A, 
--IBUS_KEY_underbar, IBUS_KEY_KP_0, 0x2080, 
--IBUS_KEY_underbar, IBUS_KEY_KP_1, 0x2081, 
--IBUS_KEY_underbar, IBUS_KEY_KP_2, 0x2082, 
--IBUS_KEY_underbar, IBUS_KEY_KP_3, 0x2083, 
--IBUS_KEY_underbar, IBUS_KEY_KP_4, 0x2084, 
--IBUS_KEY_underbar, IBUS_KEY_KP_5, 0x2085, 
--IBUS_KEY_underbar, IBUS_KEY_KP_6, 0x2086, 
--IBUS_KEY_underbar, IBUS_KEY_KP_7, 0x2087, 
--IBUS_KEY_underbar, IBUS_KEY_KP_8, 0x2088, 
--IBUS_KEY_underbar, IBUS_KEY_KP_9, 0x2089, 
--IBUS_KEY_underbar, IBUS_KEY_KP_Equal, 0x208C, 
--0x0BC7, 0x0BBE, 0x0BCB, 
--0x0BD7, 0x0B92, 0x0B94, 
--IBUS_KEY_rightshoe, 0x0338, 0x2285, 
--IBUS_KEY_leftshoe, 0x0338, 0x2284, 
--IBUS_KEY_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_KEY_apostrophe, 0x1FCE, 
--0x1FBF, IBUS_KEY_grave, 0x1FCD, 
--0x1FBF, IBUS_KEY_asciitilde, 0x1FCF, 
--0x1FBF, IBUS_KEY_acute, 0x1FCE, 
--0x1FBF, IBUS_KEY_dead_grave, 0x1FCD, 
--0x1FBF, IBUS_KEY_dead_acute, 0x1FCE, 
--0x1FBF, IBUS_KEY_dead_tilde, 0x1FCF, 
--0x1FFE, IBUS_KEY_apostrophe, 0x1FDE, 
--0x1FFE, IBUS_KEY_grave, 0x1FDD, 
--0x1FFE, IBUS_KEY_asciitilde, 0x1FDF, 
--0x1FFE, IBUS_KEY_acute, 0x1FDE, 
--0x1FFE, IBUS_KEY_dead_grave, 0x1FDD, 
--0x1FFE, IBUS_KEY_dead_acute, 0x1FDE, 
--0x1FFE, IBUS_KEY_dead_tilde, 0x1FDF, 
--0x2190, IBUS_KEY_bar, 0x2345, 
--0x2190, 0x2395, 0x2347, 
--0x2191, IBUS_KEY_minus, 0x234F, 
--0x2191, 0x2395, 0x2350, 
--0x2192, IBUS_KEY_bar, 0x2346, 
--0x2192, 0x2395, 0x2348, 
--0x2193, IBUS_KEY_minus, 0x2356, 
--0x2193, 0x2395, 0x2357, 
--0x2203, 0x0338, 0x2204, 
--0x2206, IBUS_KEY_underscore, 0x2359, 
--0x2206, IBUS_KEY_bar, 0x234B, 
--0x2206, 0x2395, 0x234D, 
--0x2207, IBUS_KEY_bar, 0x2352, 
--0x2207, IBUS_KEY_asciitilde, 0x236B, 
--0x2207, IBUS_KEY_diaeresis, 0x2362, 
--0x2207, 0x2395, 0x2354, 
--0x2208, 0x0338, 0x2209, 
--0x220A, IBUS_KEY_underscore, 0x2377, 
--0x220B, 0x0338, 0x220C, 
--0x2218, IBUS_KEY_underscore, 0x235B, 
--0x2218, IBUS_KEY_diaeresis, 0x2364, 
--0x2218, 0x2229, 0x235D, 
--0x2218, IBUS_KEY_uptack, 0x2355, 
--0x2218, IBUS_KEY_downtack, 0x234E, 
--0x2218, 0x2395, 0x233B, 
--0x2218, IBUS_KEY_emopencircle, 0x233E, 
--0x2223, 0x0338, 0x2224, 
--0x2225, 0x0338, 0x2226, 
--0x2227, IBUS_KEY_asciitilde, 0x2372, 
--0x2227, 0x2228, 0x22C4, 
--0x2227, 0x2395, 0x2353, 
--0x2228, IBUS_KEY_asciitilde, 0x2371, 
--0x2228, 0x2227, 0x22C4, 
--0x2228, 0x2395, 0x234C, 
--0x2229, 0x2218, 0x235D, 
--IBUS_KEY_union, IBUS_KEY_bar, 0x2366, 
--0x223C, 0x0338, 0x2241, 
--0x2243, 0x0338, 0x2244, 
--0x2248, 0x0338, 0x2249, 
--0x224D, 0x0338, 0x226D, 
--0x2260, IBUS_KEY_underscore, 0x2262, 
--0x2260, 0x2395, 0x236F, 
--0x2272, 0x0338, 0x2274, 
--0x2273, 0x0338, 0x2275, 
--0x2276, 0x0338, 0x2278, 
--0x2277, 0x0338, 0x2279, 
--0x227A, 0x0338, 0x2280, 
--0x227B, 0x0338, 0x2281, 
--0x227C, 0x0338, 0x22E0, 
--0x227D, 0x0338, 0x22E1, 
--0x2282, IBUS_KEY_underscore, 0x2286, 
--0x2282, IBUS_KEY_bar, 0x2367, 
--0x2283, IBUS_KEY_underscore, 0x2287, 
--0x2286, 0x0338, 0x2288, 
--0x2287, 0x0338, 0x2289, 
--0x2291, 0x0338, 0x22E2, 
--0x2292, 0x0338, 0x22E3, 
--IBUS_KEY_uptack, IBUS_KEY_diaeresis, 0x2361, 
--IBUS_KEY_uptack, IBUS_KEY_macron, 0x2351, 
--IBUS_KEY_uptack, 0x2218, 0x2355, 
--IBUS_KEY_uptack, IBUS_KEY_downtack, 0x2336, 
--IBUS_KEY_downtack, IBUS_KEY_underscore, 0x234A, 
--IBUS_KEY_downtack, 0x2218, 0x234E, 
--IBUS_KEY_downtack, IBUS_KEY_uptack, 0x2336, 
--0x22A8, 0x0338, 0x22AD, 
--0x22A9, 0x0338, 0x22AE, 
--0x22AB, 0x0338, 0x22AF, 
--0x22B2, 0x0338, 0x22EA, 
--0x22B3, 0x0338, 0x22EB, 
--0x22B4, 0x0338, 0x22EC, 
--0x22B5, 0x0338, 0x22ED, 
--0x22C4, IBUS_KEY_underscore, 0x235A, 
--0x22C4, 0x2395, 0x233A, 
--0x2373, IBUS_KEY_underscore, 0x2378, 
--0x2375, IBUS_KEY_underscore, 0x2379, 
--0x237A, IBUS_KEY_underscore, 0x2376, 
--0x2395, IBUS_KEY_apostrophe, 0x235E, 
--0x2395, IBUS_KEY_slash, 0x2341, 
--0x2395, IBUS_KEY_colon, 0x2360, 
--0x2395, IBUS_KEY_less, 0x2343, 
--0x2395, IBUS_KEY_equal, 0x2338, 
--0x2395, IBUS_KEY_greater, 0x2344, 
--0x2395, IBUS_KEY_question, 0x2370, 
--0x2395, IBUS_KEY_backslash, 0x2342, 
--0x2395, IBUS_KEY_division, 0x2339, 
--0x2395, 0x2190, 0x2347, 
--0x2395, 0x2191, 0x2350, 
--0x2395, 0x2192, 0x2348, 
--0x2395, 0x2193, 0x2357, 
--0x2395, 0x2206, 0x234D, 
--0x2395, 0x2207, 0x2354, 
--0x2395, 0x2218, 0x233B, 
--0x2395, 0x2227, 0x2353, 
--0x2395, 0x2228, 0x234C, 
--0x2395, 0x2260, 0x236F, 
--0x2395, 0x22C4, 0x233A, 
--0x2395, IBUS_KEY_emopencircle, 0x233C, 
--IBUS_KEY_emopencircle, IBUS_KEY_asterisk, 0x235F, 
--IBUS_KEY_emopencircle, IBUS_KEY_minus, 0x2296, 
--IBUS_KEY_emopencircle, IBUS_KEY_period, 0x2299, 
--IBUS_KEY_emopencircle, IBUS_KEY_backslash, 0x2349, 
--IBUS_KEY_emopencircle, IBUS_KEY_underscore, 0x235C, 
--IBUS_KEY_emopencircle, IBUS_KEY_bar, 0x233D, 
--IBUS_KEY_emopencircle, IBUS_KEY_diaeresis, 0x2365, 
--IBUS_KEY_emopencircle, 0x2218, 0x233E, 
--IBUS_KEY_emopencircle, 0x2395, 0x233C, 
--0x2ADD, 0x0338, 0x2ADC, 
--IBUS_KEY_KP_Divide, IBUS_KEY_D, 0x0110, 
--IBUS_KEY_KP_Divide, IBUS_KEY_G, 0x01E4, 
--IBUS_KEY_KP_Divide, IBUS_KEY_H, 0x0126, 
--IBUS_KEY_KP_Divide, IBUS_KEY_I, 0x0197, 
--IBUS_KEY_KP_Divide, IBUS_KEY_L, 0x0141, 
--IBUS_KEY_KP_Divide, IBUS_KEY_O, 0x00D8, 
--IBUS_KEY_KP_Divide, IBUS_KEY_T, 0x0166, 
--IBUS_KEY_KP_Divide, IBUS_KEY_Z, 0x01B5, 
--IBUS_KEY_KP_Divide, IBUS_KEY_b, 0x0180, 
--IBUS_KEY_KP_Divide, IBUS_KEY_d, 0x0111, 
--IBUS_KEY_KP_Divide, IBUS_KEY_g, 0x01E5, 
--IBUS_KEY_KP_Divide, IBUS_KEY_h, 0x0127, 
--IBUS_KEY_KP_Divide, IBUS_KEY_i, 0x0268, 
--IBUS_KEY_KP_Divide, IBUS_KEY_l, 0x0142, 
--IBUS_KEY_KP_Divide, IBUS_KEY_o, 0x00F8, 
--IBUS_KEY_KP_Divide, IBUS_KEY_t, 0x0167, 
--IBUS_KEY_KP_Divide, IBUS_KEY_z, 0x01B6, 
--IBUS_KEY_KP_Divide, 0x0294, 0x02A1, 
--IBUS_KEY_KP_Divide, 0x04AE, 0x04B0, 
--IBUS_KEY_KP_Divide, 0x04AF, 0x04B1, 
--IBUS_KEY_KP_Divide, IBUS_KEY_Cyrillic_ghe, 0x0493, 
--IBUS_KEY_KP_Divide, IBUS_KEY_Cyrillic_ka, 0x049F, 
--IBUS_KEY_KP_Divide, IBUS_KEY_Cyrillic_GHE, 0x0492, 
--IBUS_KEY_KP_Divide, IBUS_KEY_Cyrillic_KA, 0x049E, 
--IBUS_KEY_KP_Divide, IBUS_KEY_leftarrow, 0x219A, 
--IBUS_KEY_KP_Divide, IBUS_KEY_rightarrow, 0x219B, 
--IBUS_KEY_KP_Divide, 0x2194, 0x21AE, 
--IBUS_KEY_KP_Equal, 0x0338, 0x2260, 
--IBUS_KEY_exclam, IBUS_KEY_plus, IBUS_KEY_O, 0x1EE2, 
--IBUS_KEY_exclam, IBUS_KEY_plus, IBUS_KEY_U, 0x1EF0, 
--IBUS_KEY_exclam, IBUS_KEY_plus, IBUS_KEY_o, 0x1EE3, 
--IBUS_KEY_exclam, IBUS_KEY_plus, IBUS_KEY_u, 0x1EF1, 
--IBUS_KEY_exclam, IBUS_KEY_dead_horn, IBUS_KEY_O, 0x1EE2, 
--IBUS_KEY_exclam, IBUS_KEY_dead_horn, IBUS_KEY_U, 0x1EF0, 
--IBUS_KEY_exclam, IBUS_KEY_dead_horn, IBUS_KEY_o, 0x1EE3, 
--IBUS_KEY_exclam, IBUS_KEY_dead_horn, IBUS_KEY_u, 0x1EF1, 
--IBUS_KEY_quotedbl, IBUS_KEY_underscore, IBUS_KEY_U, 0x1E7A, 
--IBUS_KEY_quotedbl, IBUS_KEY_underscore, IBUS_KEY_u, 0x1E7B, 
--IBUS_KEY_quotedbl, IBUS_KEY_asciitilde, IBUS_KEY_O, 0x1E4E, 
--IBUS_KEY_quotedbl, IBUS_KEY_asciitilde, IBUS_KEY_o, 0x1E4F, 
--IBUS_KEY_quotedbl, IBUS_KEY_macron, IBUS_KEY_U, 0x1E7A, 
--IBUS_KEY_quotedbl, IBUS_KEY_macron, IBUS_KEY_u, 0x1E7B, 
--IBUS_KEY_quotedbl, IBUS_KEY_dead_tilde, IBUS_KEY_O, 0x1E4E, 
--IBUS_KEY_quotedbl, IBUS_KEY_dead_tilde, IBUS_KEY_o, 0x1E4F, 
--IBUS_KEY_quotedbl, IBUS_KEY_dead_macron, IBUS_KEY_U, 0x1E7A, 
--IBUS_KEY_quotedbl, IBUS_KEY_dead_macron, IBUS_KEY_u, 0x1E7B, 
--IBUS_KEY_apostrophe, IBUS_KEY_quotedbl, IBUS_KEY_space, 0x0385, 
--IBUS_KEY_apostrophe, IBUS_KEY_quotedbl, IBUS_KEY_I, 0x1E2E, 
--IBUS_KEY_apostrophe, IBUS_KEY_quotedbl, IBUS_KEY_U, 0x01D7, 
--IBUS_KEY_apostrophe, IBUS_KEY_quotedbl, IBUS_KEY_i, 0x1E2F, 
--IBUS_KEY_apostrophe, IBUS_KEY_quotedbl, IBUS_KEY_u, 0x01D8, 
--IBUS_KEY_apostrophe, IBUS_KEY_quotedbl, IBUS_KEY_Greek_iota, 0x0390, 
--IBUS_KEY_apostrophe, IBUS_KEY_quotedbl, IBUS_KEY_Greek_upsilon, 0x03B0, 
--IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA, 0x1F0D, 
--IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_EPSILON, 0x1F1D, 
--IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA, 0x1F2D, 
--IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_IOTA, 0x1F3D, 
--IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMICRON, 0x1F4D, 
--IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_UPSILON, 0x1F5D, 
--IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA, 0x1F6D, 
--IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha, 0x1F05, 
--IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_epsilon, 0x1F15, 
--IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta, 0x1F25, 
--IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_iota, 0x1F35, 
--IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_omicron, 0x1F45, 
--IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_upsilon, 0x1F55, 
--IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega, 0x1F65, 
--IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA, 0x1F0C, 
--IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_EPSILON, 0x1F1C, 
--IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA, 0x1F2C, 
--IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_IOTA, 0x1F3C, 
--IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_OMICRON, 0x1F4C, 
--IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA, 0x1F6C, 
--IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha, 0x1F04, 
--IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_epsilon, 0x1F14, 
--IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_eta, 0x1F24, 
--IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_iota, 0x1F34, 
--IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_omicron, 0x1F44, 
--IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_upsilon, 0x1F54, 
--IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_omega, 0x1F64, 
--IBUS_KEY_apostrophe, IBUS_KEY_plus, IBUS_KEY_O, 0x1EDA, 
--IBUS_KEY_apostrophe, IBUS_KEY_plus, IBUS_KEY_U, 0x1EE8, 
--IBUS_KEY_apostrophe, IBUS_KEY_plus, IBUS_KEY_o, 0x1EDB, 
--IBUS_KEY_apostrophe, IBUS_KEY_plus, IBUS_KEY_u, 0x1EE9, 
--IBUS_KEY_apostrophe, IBUS_KEY_slash, IBUS_KEY_O, 0x01FE, 
--IBUS_KEY_apostrophe, IBUS_KEY_slash, IBUS_KEY_o, 0x01FF, 
--IBUS_KEY_apostrophe, IBUS_KEY_asciicircum, IBUS_KEY_A, 0x1EA4, 
--IBUS_KEY_apostrophe, IBUS_KEY_asciicircum, IBUS_KEY_E, 0x1EBE, 
--IBUS_KEY_apostrophe, IBUS_KEY_asciicircum, IBUS_KEY_O, 0x1ED0, 
--IBUS_KEY_apostrophe, IBUS_KEY_asciicircum, IBUS_KEY_a, 0x1EA5, 
--IBUS_KEY_apostrophe, IBUS_KEY_asciicircum, IBUS_KEY_e, 0x1EBF, 
--IBUS_KEY_apostrophe, IBUS_KEY_asciicircum, IBUS_KEY_o, 0x1ED1, 
--IBUS_KEY_apostrophe, IBUS_KEY_underscore, IBUS_KEY_E, 0x1E16, 
--IBUS_KEY_apostrophe, IBUS_KEY_underscore, IBUS_KEY_O, 0x1E52, 
--IBUS_KEY_apostrophe, IBUS_KEY_underscore, IBUS_KEY_e, 0x1E17, 
--IBUS_KEY_apostrophe, IBUS_KEY_underscore, IBUS_KEY_o, 0x1E53, 
--IBUS_KEY_apostrophe, IBUS_KEY_b, IBUS_KEY_A, 0x1EAE, 
--IBUS_KEY_apostrophe, IBUS_KEY_b, IBUS_KEY_a, 0x1EAF, 
--IBUS_KEY_apostrophe, IBUS_KEY_asciitilde, IBUS_KEY_O, 0x1E4C, 
--IBUS_KEY_apostrophe, IBUS_KEY_asciitilde, IBUS_KEY_U, 0x1E78, 
--IBUS_KEY_apostrophe, IBUS_KEY_asciitilde, IBUS_KEY_o, 0x1E4D, 
--IBUS_KEY_apostrophe, IBUS_KEY_asciitilde, IBUS_KEY_u, 0x1E79, 
--IBUS_KEY_apostrophe, IBUS_KEY_macron, IBUS_KEY_E, 0x1E16, 
--IBUS_KEY_apostrophe, IBUS_KEY_macron, IBUS_KEY_O, 0x1E52, 
--IBUS_KEY_apostrophe, IBUS_KEY_macron, IBUS_KEY_e, 0x1E17, 
--IBUS_KEY_apostrophe, IBUS_KEY_macron, IBUS_KEY_o, 0x1E53, 
--IBUS_KEY_apostrophe, IBUS_KEY_cedilla, IBUS_KEY_C, 0x1E08, 
--IBUS_KEY_apostrophe, IBUS_KEY_cedilla, IBUS_KEY_c, 0x1E09, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_circumflex, IBUS_KEY_A, 0x1EA4, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_circumflex, IBUS_KEY_E, 0x1EBE, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_circumflex, IBUS_KEY_O, 0x1ED0, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_circumflex, IBUS_KEY_a, 0x1EA5, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_circumflex, IBUS_KEY_e, 0x1EBF, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_circumflex, IBUS_KEY_o, 0x1ED1, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_tilde, IBUS_KEY_O, 0x1E4C, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_tilde, IBUS_KEY_U, 0x1E78, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_tilde, IBUS_KEY_o, 0x1E4D, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_tilde, IBUS_KEY_u, 0x1E79, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_macron, IBUS_KEY_E, 0x1E16, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_macron, IBUS_KEY_O, 0x1E52, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_macron, IBUS_KEY_e, 0x1E17, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_macron, IBUS_KEY_o, 0x1E53, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_breve, IBUS_KEY_A, 0x1EAE, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_breve, IBUS_KEY_a, 0x1EAF, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_diaeresis, IBUS_KEY_I, 0x1E2E, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_diaeresis, IBUS_KEY_U, 0x01D7, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_diaeresis, IBUS_KEY_i, 0x1E2F, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_diaeresis, IBUS_KEY_u, 0x01D8, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_diaeresis, IBUS_KEY_Greek_iota, 0x0390, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_diaeresis, IBUS_KEY_Greek_upsilon, 0x03B0, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_abovering, IBUS_KEY_A, 0x01FA, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_abovering, IBUS_KEY_a, 0x01FB, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_cedilla, IBUS_KEY_C, 0x1E08, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_cedilla, IBUS_KEY_c, 0x1E09, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_horn, IBUS_KEY_O, 0x1EDA, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_horn, IBUS_KEY_U, 0x1EE8, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_horn, IBUS_KEY_o, 0x1EDB, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_horn, IBUS_KEY_u, 0x1EE9, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA, 0x1F0C, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_EPSILON, 0x1F1C, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA, 0x1F2C, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_IOTA, 0x1F3C, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMICRON, 0x1F4C, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA, 0x1F6C, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha, 0x1F04, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_epsilon, 0x1F14, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta, 0x1F24, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_iota, 0x1F34, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omicron, 0x1F44, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_upsilon, 0x1F54, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega, 0x1F64, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA, 0x1F0D, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_EPSILON, 0x1F1D, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA, 0x1F2D, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_IOTA, 0x1F3D, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMICRON, 0x1F4D, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_UPSILON, 0x1F5D, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA, 0x1F6D, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha, 0x1F05, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_epsilon, 0x1F15, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta, 0x1F25, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_iota, 0x1F35, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omicron, 0x1F45, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_upsilon, 0x1F55, 
--IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega, 0x1F65, 
--IBUS_KEY_apostrophe, IBUS_KEY_KP_Divide, IBUS_KEY_O, 0x01FE, 
--IBUS_KEY_apostrophe, IBUS_KEY_KP_Divide, IBUS_KEY_o, 0x01FF, 
--IBUS_KEY_parenleft, IBUS_KEY_0, IBUS_KEY_parenright, 0x24EA, 
--IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_parenright, 0x2460, 
--IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_parenright, 0x2461, 
--IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_parenright, 0x2462, 
--IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_parenright, 0x2463, 
--IBUS_KEY_parenleft, IBUS_KEY_5, IBUS_KEY_parenright, 0x2464, 
--IBUS_KEY_parenleft, IBUS_KEY_6, IBUS_KEY_parenright, 0x2465, 
--IBUS_KEY_parenleft, IBUS_KEY_7, IBUS_KEY_parenright, 0x2466, 
--IBUS_KEY_parenleft, IBUS_KEY_8, IBUS_KEY_parenright, 0x2467, 
--IBUS_KEY_parenleft, IBUS_KEY_9, IBUS_KEY_parenright, 0x2468, 
--IBUS_KEY_parenleft, IBUS_KEY_A, IBUS_KEY_parenright, 0x24B6, 
--IBUS_KEY_parenleft, IBUS_KEY_B, IBUS_KEY_parenright, 0x24B7, 
--IBUS_KEY_parenleft, IBUS_KEY_C, IBUS_KEY_parenright, 0x24B8, 
--IBUS_KEY_parenleft, IBUS_KEY_D, IBUS_KEY_parenright, 0x24B9, 
--IBUS_KEY_parenleft, IBUS_KEY_E, IBUS_KEY_parenright, 0x24BA, 
--IBUS_KEY_parenleft, IBUS_KEY_F, IBUS_KEY_parenright, 0x24BB, 
--IBUS_KEY_parenleft, IBUS_KEY_G, IBUS_KEY_parenright, 0x24BC, 
--IBUS_KEY_parenleft, IBUS_KEY_H, IBUS_KEY_parenright, 0x24BD, 
--IBUS_KEY_parenleft, IBUS_KEY_I, IBUS_KEY_parenright, 0x24BE, 
--IBUS_KEY_parenleft, IBUS_KEY_J, IBUS_KEY_parenright, 0x24BF, 
--IBUS_KEY_parenleft, IBUS_KEY_K, IBUS_KEY_parenright, 0x24C0, 
--IBUS_KEY_parenleft, IBUS_KEY_L, IBUS_KEY_parenright, 0x24C1, 
--IBUS_KEY_parenleft, IBUS_KEY_M, IBUS_KEY_parenright, 0x24C2, 
--IBUS_KEY_parenleft, IBUS_KEY_N, IBUS_KEY_parenright, 0x24C3, 
--IBUS_KEY_parenleft, IBUS_KEY_O, IBUS_KEY_parenright, 0x24C4, 
--IBUS_KEY_parenleft, IBUS_KEY_P, IBUS_KEY_parenright, 0x24C5, 
--IBUS_KEY_parenleft, IBUS_KEY_Q, IBUS_KEY_parenright, 0x24C6, 
--IBUS_KEY_parenleft, IBUS_KEY_R, IBUS_KEY_parenright, 0x24C7, 
--IBUS_KEY_parenleft, IBUS_KEY_S, IBUS_KEY_parenright, 0x24C8, 
--IBUS_KEY_parenleft, IBUS_KEY_T, IBUS_KEY_parenright, 0x24C9, 
--IBUS_KEY_parenleft, IBUS_KEY_U, IBUS_KEY_parenright, 0x24CA, 
--IBUS_KEY_parenleft, IBUS_KEY_V, IBUS_KEY_parenright, 0x24CB, 
--IBUS_KEY_parenleft, IBUS_KEY_W, IBUS_KEY_parenright, 0x24CC, 
--IBUS_KEY_parenleft, IBUS_KEY_X, IBUS_KEY_parenright, 0x24CD, 
--IBUS_KEY_parenleft, IBUS_KEY_Y, IBUS_KEY_parenright, 0x24CE, 
--IBUS_KEY_parenleft, IBUS_KEY_Z, IBUS_KEY_parenright, 0x24CF, 
--IBUS_KEY_parenleft, IBUS_KEY_a, IBUS_KEY_parenright, 0x24D0, 
--IBUS_KEY_parenleft, IBUS_KEY_b, IBUS_KEY_parenright, 0x24D1, 
--IBUS_KEY_parenleft, IBUS_KEY_c, IBUS_KEY_parenright, 0x24D2, 
--IBUS_KEY_parenleft, IBUS_KEY_d, IBUS_KEY_parenright, 0x24D3, 
--IBUS_KEY_parenleft, IBUS_KEY_e, IBUS_KEY_parenright, 0x24D4, 
--IBUS_KEY_parenleft, IBUS_KEY_f, IBUS_KEY_parenright, 0x24D5, 
--IBUS_KEY_parenleft, IBUS_KEY_g, IBUS_KEY_parenright, 0x24D6, 
--IBUS_KEY_parenleft, IBUS_KEY_h, IBUS_KEY_parenright, 0x24D7, 
--IBUS_KEY_parenleft, IBUS_KEY_i, IBUS_KEY_parenright, 0x24D8, 
--IBUS_KEY_parenleft, IBUS_KEY_j, IBUS_KEY_parenright, 0x24D9, 
--IBUS_KEY_parenleft, IBUS_KEY_k, IBUS_KEY_parenright, 0x24DA, 
--IBUS_KEY_parenleft, IBUS_KEY_l, IBUS_KEY_parenright, 0x24DB, 
--IBUS_KEY_parenleft, IBUS_KEY_m, IBUS_KEY_parenright, 0x24DC, 
--IBUS_KEY_parenleft, IBUS_KEY_n, IBUS_KEY_parenright, 0x24DD, 
--IBUS_KEY_parenleft, IBUS_KEY_o, IBUS_KEY_parenright, 0x24DE, 
--IBUS_KEY_parenleft, IBUS_KEY_p, IBUS_KEY_parenright, 0x24DF, 
--IBUS_KEY_parenleft, IBUS_KEY_q, IBUS_KEY_parenright, 0x24E0, 
--IBUS_KEY_parenleft, IBUS_KEY_r, IBUS_KEY_parenright, 0x24E1, 
--IBUS_KEY_parenleft, IBUS_KEY_s, IBUS_KEY_parenright, 0x24E2, 
--IBUS_KEY_parenleft, IBUS_KEY_t, IBUS_KEY_parenright, 0x24E3, 
--IBUS_KEY_parenleft, IBUS_KEY_u, IBUS_KEY_parenright, 0x24E4, 
--IBUS_KEY_parenleft, IBUS_KEY_v, IBUS_KEY_parenright, 0x24E5, 
--IBUS_KEY_parenleft, IBUS_KEY_w, IBUS_KEY_parenright, 0x24E6, 
--IBUS_KEY_parenleft, IBUS_KEY_x, IBUS_KEY_parenright, 0x24E7, 
--IBUS_KEY_parenleft, IBUS_KEY_y, IBUS_KEY_parenright, 0x24E8, 
--IBUS_KEY_parenleft, IBUS_KEY_z, IBUS_KEY_parenright, 0x24E9, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_WO, IBUS_KEY_parenright, 0x32FE, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_A, IBUS_KEY_parenright, 0x32D0, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_I, IBUS_KEY_parenright, 0x32D1, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_U, IBUS_KEY_parenright, 0x32D2, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_E, IBUS_KEY_parenright, 0x32D3, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_O, IBUS_KEY_parenright, 0x32D4, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_KA, IBUS_KEY_parenright, 0x32D5, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_KI, IBUS_KEY_parenright, 0x32D6, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_KU, IBUS_KEY_parenright, 0x32D7, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_KE, IBUS_KEY_parenright, 0x32D8, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_KO, IBUS_KEY_parenright, 0x32D9, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_SA, IBUS_KEY_parenright, 0x32DA, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_SHI, IBUS_KEY_parenright, 0x32DB, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_SU, IBUS_KEY_parenright, 0x32DC, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_SE, IBUS_KEY_parenright, 0x32DD, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_SO, IBUS_KEY_parenright, 0x32DE, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_TA, IBUS_KEY_parenright, 0x32DF, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_CHI, IBUS_KEY_parenright, 0x32E0, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_TSU, IBUS_KEY_parenright, 0x32E1, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_TE, IBUS_KEY_parenright, 0x32E2, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_TO, IBUS_KEY_parenright, 0x32E3, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_NA, IBUS_KEY_parenright, 0x32E4, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_NI, IBUS_KEY_parenright, 0x32E5, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_NU, IBUS_KEY_parenright, 0x32E6, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_NE, IBUS_KEY_parenright, 0x32E7, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_NO, IBUS_KEY_parenright, 0x32E8, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_HA, IBUS_KEY_parenright, 0x32E9, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_HI, IBUS_KEY_parenright, 0x32EA, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_FU, IBUS_KEY_parenright, 0x32EB, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_HE, IBUS_KEY_parenright, 0x32EC, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_HO, IBUS_KEY_parenright, 0x32ED, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_MA, IBUS_KEY_parenright, 0x32EE, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_MI, IBUS_KEY_parenright, 0x32EF, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_MU, IBUS_KEY_parenright, 0x32F0, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_ME, IBUS_KEY_parenright, 0x32F1, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_MO, IBUS_KEY_parenright, 0x32F2, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_YA, IBUS_KEY_parenright, 0x32F3, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_YU, IBUS_KEY_parenright, 0x32F4, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_YO, IBUS_KEY_parenright, 0x32F5, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_RA, IBUS_KEY_parenright, 0x32F6, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_RI, IBUS_KEY_parenright, 0x32F7, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_RU, IBUS_KEY_parenright, 0x32F8, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_RE, IBUS_KEY_parenright, 0x32F9, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_RO, IBUS_KEY_parenright, 0x32FA, 
--IBUS_KEY_parenleft, IBUS_KEY_kana_WA, IBUS_KEY_parenright, 0x32FB, 
--IBUS_KEY_parenleft, 0x1100, IBUS_KEY_parenright, 0x3260, 
--IBUS_KEY_parenleft, 0x1102, IBUS_KEY_parenright, 0x3261, 
--IBUS_KEY_parenleft, 0x1103, IBUS_KEY_parenright, 0x3262, 
--IBUS_KEY_parenleft, 0x1105, IBUS_KEY_parenright, 0x3263, 
--IBUS_KEY_parenleft, 0x1106, IBUS_KEY_parenright, 0x3264, 
--IBUS_KEY_parenleft, 0x1107, IBUS_KEY_parenright, 0x3265, 
--IBUS_KEY_parenleft, 0x1109, IBUS_KEY_parenright, 0x3266, 
--IBUS_KEY_parenleft, 0x110B, IBUS_KEY_parenright, 0x3267, 
--IBUS_KEY_parenleft, 0x110C, IBUS_KEY_parenright, 0x3268, 
--IBUS_KEY_parenleft, 0x110E, IBUS_KEY_parenright, 0x3269, 
--IBUS_KEY_parenleft, 0x110F, IBUS_KEY_parenright, 0x326A, 
--IBUS_KEY_parenleft, 0x1110, IBUS_KEY_parenright, 0x326B, 
--IBUS_KEY_parenleft, 0x1111, IBUS_KEY_parenright, 0x326C, 
--IBUS_KEY_parenleft, 0x1112, IBUS_KEY_parenright, 0x326D, 
--IBUS_KEY_parenleft, 0x30F0, IBUS_KEY_parenright, 0x32FC, 
--IBUS_KEY_parenleft, 0x30F1, IBUS_KEY_parenright, 0x32FD, 
--IBUS_KEY_parenleft, 0x4E00, IBUS_KEY_parenright, 0x3280, 
--IBUS_KEY_parenleft, 0x4E03, IBUS_KEY_parenright, 0x3286, 
--IBUS_KEY_parenleft, 0x4E09, IBUS_KEY_parenright, 0x3282, 
--IBUS_KEY_parenleft, 0x4E0A, IBUS_KEY_parenright, 0x32A4, 
--IBUS_KEY_parenleft, 0x4E0B, IBUS_KEY_parenright, 0x32A6, 
--IBUS_KEY_parenleft, 0x4E2D, IBUS_KEY_parenright, 0x32A5, 
--IBUS_KEY_parenleft, 0x4E5D, IBUS_KEY_parenright, 0x3288, 
--IBUS_KEY_parenleft, 0x4E8C, IBUS_KEY_parenright, 0x3281, 
--IBUS_KEY_parenleft, 0x4E94, IBUS_KEY_parenright, 0x3284, 
--IBUS_KEY_parenleft, 0x4F01, IBUS_KEY_parenright, 0x32AD, 
--IBUS_KEY_parenleft, 0x4F11, IBUS_KEY_parenright, 0x32A1, 
--IBUS_KEY_parenleft, 0x512A, IBUS_KEY_parenright, 0x329D, 
--IBUS_KEY_parenleft, 0x516B, IBUS_KEY_parenright, 0x3287, 
--IBUS_KEY_parenleft, 0x516D, IBUS_KEY_parenright, 0x3285, 
--IBUS_KEY_parenleft, 0x5199, IBUS_KEY_parenright, 0x32A2, 
--IBUS_KEY_parenleft, 0x52B4, IBUS_KEY_parenright, 0x3298, 
--IBUS_KEY_parenleft, 0x533B, IBUS_KEY_parenright, 0x32A9, 
--IBUS_KEY_parenleft, 0x5341, IBUS_KEY_parenright, 0x3289, 
--IBUS_KEY_parenleft, 0x5354, IBUS_KEY_parenright, 0x32AF, 
--IBUS_KEY_parenleft, 0x5370, IBUS_KEY_parenright, 0x329E, 
--IBUS_KEY_parenleft, 0x53F3, IBUS_KEY_parenright, 0x32A8, 
--IBUS_KEY_parenleft, 0x540D, IBUS_KEY_parenright, 0x3294, 
--IBUS_KEY_parenleft, 0x56DB, IBUS_KEY_parenright, 0x3283, 
--IBUS_KEY_parenleft, 0x571F, IBUS_KEY_parenright, 0x328F, 
--IBUS_KEY_parenleft, 0x591C, IBUS_KEY_parenright, 0x32B0, 
--IBUS_KEY_parenleft, 0x5973, IBUS_KEY_parenright, 0x329B, 
--IBUS_KEY_parenleft, 0x5B66, IBUS_KEY_parenright, 0x32AB, 
--IBUS_KEY_parenleft, 0x5B97, IBUS_KEY_parenright, 0x32AA, 
--IBUS_KEY_parenleft, 0x5DE6, IBUS_KEY_parenright, 0x32A7, 
--IBUS_KEY_parenleft, 0x65E5, IBUS_KEY_parenright, 0x3290, 
--IBUS_KEY_parenleft, 0x6708, IBUS_KEY_parenright, 0x328A, 
--IBUS_KEY_parenleft, 0x6709, IBUS_KEY_parenright, 0x3292, 
--IBUS_KEY_parenleft, 0x6728, IBUS_KEY_parenright, 0x328D, 
--IBUS_KEY_parenleft, 0x682A, IBUS_KEY_parenright, 0x3291, 
--IBUS_KEY_parenleft, 0x6B63, IBUS_KEY_parenright, 0x32A3, 
--IBUS_KEY_parenleft, 0x6C34, IBUS_KEY_parenright, 0x328C, 
--IBUS_KEY_parenleft, 0x6CE8, IBUS_KEY_parenright, 0x329F, 
--IBUS_KEY_parenleft, 0x706B, IBUS_KEY_parenright, 0x328B, 
--IBUS_KEY_parenleft, 0x7279, IBUS_KEY_parenright, 0x3295, 
--IBUS_KEY_parenleft, 0x7537, IBUS_KEY_parenright, 0x329A, 
--IBUS_KEY_parenleft, 0x76E3, IBUS_KEY_parenright, 0x32AC, 
--IBUS_KEY_parenleft, 0x793E, IBUS_KEY_parenright, 0x3293, 
--IBUS_KEY_parenleft, 0x795D, IBUS_KEY_parenright, 0x3297, 
--IBUS_KEY_parenleft, 0x79D8, IBUS_KEY_parenright, 0x3299, 
--IBUS_KEY_parenleft, 0x8CA1, IBUS_KEY_parenright, 0x3296, 
--IBUS_KEY_parenleft, 0x8CC7, IBUS_KEY_parenright, 0x32AE, 
--IBUS_KEY_parenleft, 0x9069, IBUS_KEY_parenright, 0x329C, 
--IBUS_KEY_parenleft, 0x91D1, IBUS_KEY_parenright, 0x328E, 
--IBUS_KEY_parenleft, 0x9805, IBUS_KEY_parenright, 0x32A0, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_parenright, 0x2461, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_0, IBUS_KEY_parenright, 0x24EA, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_parenright, 0x2460, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_parenright, 0x2461, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_parenright, 0x2462, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_parenright, 0x2463, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_5, IBUS_KEY_parenright, 0x2464, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_6, IBUS_KEY_parenright, 0x2465, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_7, IBUS_KEY_parenright, 0x2466, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_8, IBUS_KEY_parenright, 0x2467, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_9, IBUS_KEY_parenright, 0x2468, 
--IBUS_KEY_asterisk, IBUS_KEY_apostrophe, IBUS_KEY_A, 0x01FA, 
--IBUS_KEY_asterisk, IBUS_KEY_apostrophe, IBUS_KEY_a, 0x01FB, 
--IBUS_KEY_minus, IBUS_KEY_minus, IBUS_KEY_space, 0x00AD, 
--IBUS_KEY_minus, IBUS_KEY_minus, IBUS_KEY_minus, 0x2014, 
--IBUS_KEY_minus, IBUS_KEY_minus, IBUS_KEY_period, 0x2013, 
--IBUS_KEY_period, IBUS_KEY_exclam, IBUS_KEY_S, 0x1E68, 
--IBUS_KEY_period, IBUS_KEY_exclam, IBUS_KEY_s, 0x1E69, 
--IBUS_KEY_period, IBUS_KEY_apostrophe, IBUS_KEY_S, 0x1E64, 
--IBUS_KEY_period, IBUS_KEY_apostrophe, IBUS_KEY_s, 0x1E65, 
--IBUS_KEY_period, IBUS_KEY_acute, IBUS_KEY_S, 0x1E64, 
--IBUS_KEY_period, IBUS_KEY_acute, IBUS_KEY_s, 0x1E65, 
--IBUS_KEY_period, IBUS_KEY_dead_acute, IBUS_KEY_S, 0x1E64, 
--IBUS_KEY_period, IBUS_KEY_dead_acute, IBUS_KEY_s, 0x1E65, 
--IBUS_KEY_period, IBUS_KEY_dead_caron, IBUS_KEY_S, 0x1E66, 
--IBUS_KEY_period, IBUS_KEY_dead_caron, IBUS_KEY_s, 0x1E67, 
--IBUS_KEY_period, IBUS_KEY_dead_belowdot, IBUS_KEY_S, 0x1E68, 
--IBUS_KEY_period, IBUS_KEY_dead_belowdot, IBUS_KEY_s, 0x1E69, 
--IBUS_KEY_1, IBUS_KEY_1, IBUS_KEY_0, 0x2152, 
--IBUS_KEY_question, IBUS_KEY_plus, IBUS_KEY_O, 0x1EDE, 
--IBUS_KEY_question, IBUS_KEY_plus, IBUS_KEY_U, 0x1EEC, 
--IBUS_KEY_question, IBUS_KEY_plus, IBUS_KEY_o, 0x1EDF, 
--IBUS_KEY_question, IBUS_KEY_plus, IBUS_KEY_u, 0x1EED, 
--IBUS_KEY_question, IBUS_KEY_asciicircum, IBUS_KEY_A, 0x1EA8, 
--IBUS_KEY_question, IBUS_KEY_asciicircum, IBUS_KEY_E, 0x1EC2, 
--IBUS_KEY_question, IBUS_KEY_asciicircum, IBUS_KEY_O, 0x1ED4, 
--IBUS_KEY_question, IBUS_KEY_asciicircum, IBUS_KEY_a, 0x1EA9, 
--IBUS_KEY_question, IBUS_KEY_asciicircum, IBUS_KEY_e, 0x1EC3, 
--IBUS_KEY_question, IBUS_KEY_asciicircum, IBUS_KEY_o, 0x1ED5, 
--IBUS_KEY_question, IBUS_KEY_b, IBUS_KEY_A, 0x1EB2, 
--IBUS_KEY_question, IBUS_KEY_b, IBUS_KEY_a, 0x1EB3, 
--IBUS_KEY_question, IBUS_KEY_dead_circumflex, IBUS_KEY_A, 0x1EA8, 
--IBUS_KEY_question, IBUS_KEY_dead_circumflex, IBUS_KEY_E, 0x1EC2, 
--IBUS_KEY_question, IBUS_KEY_dead_circumflex, IBUS_KEY_O, 0x1ED4, 
--IBUS_KEY_question, IBUS_KEY_dead_circumflex, IBUS_KEY_a, 0x1EA9, 
--IBUS_KEY_question, IBUS_KEY_dead_circumflex, IBUS_KEY_e, 0x1EC3, 
--IBUS_KEY_question, IBUS_KEY_dead_circumflex, IBUS_KEY_o, 0x1ED5, 
--IBUS_KEY_question, IBUS_KEY_dead_breve, IBUS_KEY_A, 0x1EB2, 
--IBUS_KEY_question, IBUS_KEY_dead_breve, IBUS_KEY_a, 0x1EB3, 
--IBUS_KEY_question, IBUS_KEY_dead_horn, IBUS_KEY_O, 0x1EDE, 
--IBUS_KEY_question, IBUS_KEY_dead_horn, IBUS_KEY_U, 0x1EEC, 
--IBUS_KEY_question, IBUS_KEY_dead_horn, IBUS_KEY_o, 0x1EDF, 
--IBUS_KEY_question, IBUS_KEY_dead_horn, IBUS_KEY_u, 0x1EED, 
--IBUS_KEY_U, IBUS_KEY_exclam, IBUS_KEY_A, 0x1EB6, 
--IBUS_KEY_U, IBUS_KEY_exclam, IBUS_KEY_a, 0x1EB7, 
--IBUS_KEY_U, IBUS_KEY_cedilla, IBUS_KEY_E, 0x1E1C, 
--IBUS_KEY_U, IBUS_KEY_cedilla, IBUS_KEY_e, 0x1E1D, 
--IBUS_KEY_U, IBUS_KEY_dead_cedilla, IBUS_KEY_E, 0x1E1C, 
--IBUS_KEY_U, IBUS_KEY_dead_cedilla, IBUS_KEY_e, 0x1E1D, 
--IBUS_KEY_U, IBUS_KEY_dead_belowdot, IBUS_KEY_A, 0x1EB6, 
--IBUS_KEY_U, IBUS_KEY_dead_belowdot, IBUS_KEY_a, 0x1EB7, 
--IBUS_KEY_asciicircum, IBUS_KEY_exclam, IBUS_KEY_A, 0x1EAC, 
--IBUS_KEY_asciicircum, IBUS_KEY_exclam, IBUS_KEY_E, 0x1EC6, 
--IBUS_KEY_asciicircum, IBUS_KEY_exclam, IBUS_KEY_O, 0x1ED8, 
--IBUS_KEY_asciicircum, IBUS_KEY_exclam, IBUS_KEY_a, 0x1EAD, 
--IBUS_KEY_asciicircum, IBUS_KEY_exclam, IBUS_KEY_e, 0x1EC7, 
--IBUS_KEY_asciicircum, IBUS_KEY_exclam, IBUS_KEY_o, 0x1ED9, 
--IBUS_KEY_asciicircum, IBUS_KEY_underscore, IBUS_KEY_a, 0x00AA, 
--IBUS_KEY_asciicircum, IBUS_KEY_underscore, IBUS_KEY_h, 0x02B0, 
--IBUS_KEY_asciicircum, IBUS_KEY_underscore, IBUS_KEY_i, 0x2071, 
--IBUS_KEY_asciicircum, IBUS_KEY_underscore, IBUS_KEY_j, 0x02B2, 
--IBUS_KEY_asciicircum, IBUS_KEY_underscore, IBUS_KEY_l, 0x02E1, 
--IBUS_KEY_asciicircum, IBUS_KEY_underscore, IBUS_KEY_n, 0x207F, 
--IBUS_KEY_asciicircum, IBUS_KEY_underscore, IBUS_KEY_o, 0x00BA, 
--IBUS_KEY_asciicircum, IBUS_KEY_underscore, IBUS_KEY_r, 0x02B3, 
--IBUS_KEY_asciicircum, IBUS_KEY_underscore, IBUS_KEY_s, 0x02E2, 
--IBUS_KEY_asciicircum, IBUS_KEY_underscore, IBUS_KEY_w, 0x02B7, 
--IBUS_KEY_asciicircum, IBUS_KEY_underscore, IBUS_KEY_x, 0x02E3, 
--IBUS_KEY_asciicircum, IBUS_KEY_underscore, IBUS_KEY_y, 0x02B8, 
--IBUS_KEY_asciicircum, IBUS_KEY_underscore, 0x0263, 0x02E0, 
--IBUS_KEY_asciicircum, IBUS_KEY_underscore, 0x0266, 0x02B1, 
--IBUS_KEY_asciicircum, IBUS_KEY_underscore, 0x0279, 0x02B4, 
--IBUS_KEY_asciicircum, IBUS_KEY_underscore, 0x027B, 0x02B5, 
--IBUS_KEY_asciicircum, IBUS_KEY_underscore, 0x0281, 0x02B6, 
--IBUS_KEY_asciicircum, IBUS_KEY_underscore, 0x0295, 0x02E4, 
--IBUS_KEY_asciicircum, IBUS_KEY_underbar, IBUS_KEY_a, 0x00AA, 
--IBUS_KEY_asciicircum, IBUS_KEY_underbar, IBUS_KEY_h, 0x02B0, 
--IBUS_KEY_asciicircum, IBUS_KEY_underbar, IBUS_KEY_i, 0x2071, 
--IBUS_KEY_asciicircum, IBUS_KEY_underbar, IBUS_KEY_j, 0x02B2, 
--IBUS_KEY_asciicircum, IBUS_KEY_underbar, IBUS_KEY_l, 0x02E1, 
--IBUS_KEY_asciicircum, IBUS_KEY_underbar, IBUS_KEY_n, 0x207F, 
--IBUS_KEY_asciicircum, IBUS_KEY_underbar, IBUS_KEY_o, 0x00BA, 
--IBUS_KEY_asciicircum, IBUS_KEY_underbar, IBUS_KEY_r, 0x02B3, 
--IBUS_KEY_asciicircum, IBUS_KEY_underbar, IBUS_KEY_s, 0x02E2, 
--IBUS_KEY_asciicircum, IBUS_KEY_underbar, IBUS_KEY_w, 0x02B7, 
--IBUS_KEY_asciicircum, IBUS_KEY_underbar, IBUS_KEY_x, 0x02E3, 
--IBUS_KEY_asciicircum, IBUS_KEY_underbar, IBUS_KEY_y, 0x02B8, 
--IBUS_KEY_asciicircum, IBUS_KEY_underbar, 0x0263, 0x02E0, 
--IBUS_KEY_asciicircum, IBUS_KEY_underbar, 0x0266, 0x02B1, 
--IBUS_KEY_asciicircum, IBUS_KEY_underbar, 0x0279, 0x02B4, 
--IBUS_KEY_asciicircum, IBUS_KEY_underbar, 0x027B, 0x02B5, 
--IBUS_KEY_asciicircum, IBUS_KEY_underbar, 0x0281, 0x02B6, 
--IBUS_KEY_asciicircum, IBUS_KEY_underbar, 0x0295, 0x02E4, 
--IBUS_KEY_asciicircum, IBUS_KEY_dead_belowdot, IBUS_KEY_A, 0x1EAC, 
--IBUS_KEY_asciicircum, IBUS_KEY_dead_belowdot, IBUS_KEY_E, 0x1EC6, 
--IBUS_KEY_asciicircum, IBUS_KEY_dead_belowdot, IBUS_KEY_O, 0x1ED8, 
--IBUS_KEY_asciicircum, IBUS_KEY_dead_belowdot, IBUS_KEY_a, 0x1EAD, 
--IBUS_KEY_asciicircum, IBUS_KEY_dead_belowdot, IBUS_KEY_e, 0x1EC7, 
--IBUS_KEY_asciicircum, IBUS_KEY_dead_belowdot, IBUS_KEY_o, 0x1ED9, 
--IBUS_KEY_underscore, IBUS_KEY_exclam, IBUS_KEY_L, 0x1E38, 
--IBUS_KEY_underscore, IBUS_KEY_exclam, IBUS_KEY_R, 0x1E5C, 
--IBUS_KEY_underscore, IBUS_KEY_exclam, IBUS_KEY_l, 0x1E39, 
--IBUS_KEY_underscore, IBUS_KEY_exclam, IBUS_KEY_r, 0x1E5D, 
--IBUS_KEY_underscore, IBUS_KEY_quotedbl, IBUS_KEY_A, 0x01DE, 
--IBUS_KEY_underscore, IBUS_KEY_quotedbl, IBUS_KEY_O, 0x022A, 
--IBUS_KEY_underscore, IBUS_KEY_quotedbl, IBUS_KEY_U, 0x01D5, 
--IBUS_KEY_underscore, IBUS_KEY_quotedbl, IBUS_KEY_a, 0x01DF, 
--IBUS_KEY_underscore, IBUS_KEY_quotedbl, IBUS_KEY_o, 0x022B, 
--IBUS_KEY_underscore, IBUS_KEY_quotedbl, IBUS_KEY_u, 0x01D6, 
--IBUS_KEY_underscore, IBUS_KEY_period, IBUS_KEY_A, 0x01E0, 
--IBUS_KEY_underscore, IBUS_KEY_period, IBUS_KEY_O, 0x0230, 
--IBUS_KEY_underscore, IBUS_KEY_period, IBUS_KEY_a, 0x01E1, 
--IBUS_KEY_underscore, IBUS_KEY_period, IBUS_KEY_o, 0x0231, 
--IBUS_KEY_underscore, IBUS_KEY_semicolon, IBUS_KEY_O, 0x01EC, 
--IBUS_KEY_underscore, IBUS_KEY_semicolon, IBUS_KEY_o, 0x01ED, 
--IBUS_KEY_underscore, IBUS_KEY_asciitilde, IBUS_KEY_O, 0x022C, 
--IBUS_KEY_underscore, IBUS_KEY_asciitilde, IBUS_KEY_o, 0x022D, 
--IBUS_KEY_underscore, IBUS_KEY_dead_tilde, IBUS_KEY_O, 0x022C, 
--IBUS_KEY_underscore, IBUS_KEY_dead_tilde, IBUS_KEY_o, 0x022D, 
--IBUS_KEY_underscore, IBUS_KEY_dead_abovedot, IBUS_KEY_A, 0x01E0, 
--IBUS_KEY_underscore, IBUS_KEY_dead_abovedot, IBUS_KEY_O, 0x0230, 
--IBUS_KEY_underscore, IBUS_KEY_dead_abovedot, IBUS_KEY_a, 0x01E1, 
--IBUS_KEY_underscore, IBUS_KEY_dead_abovedot, IBUS_KEY_o, 0x0231, 
--IBUS_KEY_underscore, IBUS_KEY_dead_diaeresis, IBUS_KEY_A, 0x01DE, 
--IBUS_KEY_underscore, IBUS_KEY_dead_diaeresis, IBUS_KEY_O, 0x022A, 
--IBUS_KEY_underscore, IBUS_KEY_dead_diaeresis, IBUS_KEY_U, 0x01D5, 
--IBUS_KEY_underscore, IBUS_KEY_dead_diaeresis, IBUS_KEY_a, 0x01DF, 
--IBUS_KEY_underscore, IBUS_KEY_dead_diaeresis, IBUS_KEY_o, 0x022B, 
--IBUS_KEY_underscore, IBUS_KEY_dead_diaeresis, IBUS_KEY_u, 0x01D6, 
--IBUS_KEY_underscore, IBUS_KEY_dead_ogonek, IBUS_KEY_O, 0x01EC, 
--IBUS_KEY_underscore, IBUS_KEY_dead_ogonek, IBUS_KEY_o, 0x01ED, 
--IBUS_KEY_underscore, IBUS_KEY_dead_belowdot, IBUS_KEY_L, 0x1E38, 
--IBUS_KEY_underscore, IBUS_KEY_dead_belowdot, IBUS_KEY_R, 0x1E5C, 
--IBUS_KEY_underscore, IBUS_KEY_dead_belowdot, IBUS_KEY_l, 0x1E39, 
--IBUS_KEY_underscore, IBUS_KEY_dead_belowdot, IBUS_KEY_r, 0x1E5D, 
--IBUS_KEY_grave, IBUS_KEY_quotedbl, IBUS_KEY_U, 0x01DB, 
--IBUS_KEY_grave, IBUS_KEY_quotedbl, IBUS_KEY_u, 0x01DC, 
--IBUS_KEY_grave, IBUS_KEY_quotedbl, IBUS_KEY_Greek_iota, 0x1FD2, 
--IBUS_KEY_grave, IBUS_KEY_quotedbl, IBUS_KEY_Greek_upsilon, 0x1FE2, 
--IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA, 0x1F0B, 
--IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_EPSILON, 0x1F1B, 
--IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA, 0x1F2B, 
--IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_IOTA, 0x1F3B, 
--IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMICRON, 0x1F4B, 
--IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_UPSILON, 0x1F5B, 
--IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA, 0x1F6B, 
--IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha, 0x1F03, 
--IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_epsilon, 0x1F13, 
--IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta, 0x1F23, 
--IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_iota, 0x1F33, 
--IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_omicron, 0x1F43, 
--IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_upsilon, 0x1F53, 
--IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega, 0x1F63, 
--IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA, 0x1F0A, 
--IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_EPSILON, 0x1F1A, 
--IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA, 0x1F2A, 
--IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_IOTA, 0x1F3A, 
--IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_OMICRON, 0x1F4A, 
--IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA, 0x1F6A, 
--IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha, 0x1F02, 
--IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_epsilon, 0x1F12, 
--IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_eta, 0x1F22, 
--IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_iota, 0x1F32, 
--IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_omicron, 0x1F42, 
--IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_upsilon, 0x1F52, 
--IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_omega, 0x1F62, 
--IBUS_KEY_grave, IBUS_KEY_plus, IBUS_KEY_O, 0x1EDC, 
--IBUS_KEY_grave, IBUS_KEY_plus, IBUS_KEY_U, 0x1EEA, 
--IBUS_KEY_grave, IBUS_KEY_plus, IBUS_KEY_o, 0x1EDD, 
--IBUS_KEY_grave, IBUS_KEY_plus, IBUS_KEY_u, 0x1EEB, 
--IBUS_KEY_grave, IBUS_KEY_asciicircum, IBUS_KEY_A, 0x1EA6, 
--IBUS_KEY_grave, IBUS_KEY_asciicircum, IBUS_KEY_E, 0x1EC0, 
--IBUS_KEY_grave, IBUS_KEY_asciicircum, IBUS_KEY_O, 0x1ED2, 
--IBUS_KEY_grave, IBUS_KEY_asciicircum, IBUS_KEY_a, 0x1EA7, 
--IBUS_KEY_grave, IBUS_KEY_asciicircum, IBUS_KEY_e, 0x1EC1, 
--IBUS_KEY_grave, IBUS_KEY_asciicircum, IBUS_KEY_o, 0x1ED3, 
--IBUS_KEY_grave, IBUS_KEY_underscore, IBUS_KEY_E, 0x1E14, 
--IBUS_KEY_grave, IBUS_KEY_underscore, IBUS_KEY_O, 0x1E50, 
--IBUS_KEY_grave, IBUS_KEY_underscore, IBUS_KEY_e, 0x1E15, 
--IBUS_KEY_grave, IBUS_KEY_underscore, IBUS_KEY_o, 0x1E51, 
--IBUS_KEY_grave, IBUS_KEY_b, IBUS_KEY_A, 0x1EB0, 
--IBUS_KEY_grave, IBUS_KEY_b, IBUS_KEY_a, 0x1EB1, 
--IBUS_KEY_grave, IBUS_KEY_macron, IBUS_KEY_E, 0x1E14, 
--IBUS_KEY_grave, IBUS_KEY_macron, IBUS_KEY_O, 0x1E50, 
--IBUS_KEY_grave, IBUS_KEY_macron, IBUS_KEY_e, 0x1E15, 
--IBUS_KEY_grave, IBUS_KEY_macron, IBUS_KEY_o, 0x1E51, 
--IBUS_KEY_grave, IBUS_KEY_dead_circumflex, IBUS_KEY_A, 0x1EA6, 
--IBUS_KEY_grave, IBUS_KEY_dead_circumflex, IBUS_KEY_E, 0x1EC0, 
--IBUS_KEY_grave, IBUS_KEY_dead_circumflex, IBUS_KEY_O, 0x1ED2, 
--IBUS_KEY_grave, IBUS_KEY_dead_circumflex, IBUS_KEY_a, 0x1EA7, 
--IBUS_KEY_grave, IBUS_KEY_dead_circumflex, IBUS_KEY_e, 0x1EC1, 
--IBUS_KEY_grave, IBUS_KEY_dead_circumflex, IBUS_KEY_o, 0x1ED3, 
--IBUS_KEY_grave, IBUS_KEY_dead_macron, IBUS_KEY_E, 0x1E14, 
--IBUS_KEY_grave, IBUS_KEY_dead_macron, IBUS_KEY_O, 0x1E50, 
--IBUS_KEY_grave, IBUS_KEY_dead_macron, IBUS_KEY_e, 0x1E15, 
--IBUS_KEY_grave, IBUS_KEY_dead_macron, IBUS_KEY_o, 0x1E51, 
--IBUS_KEY_grave, IBUS_KEY_dead_breve, IBUS_KEY_A, 0x1EB0, 
--IBUS_KEY_grave, IBUS_KEY_dead_breve, IBUS_KEY_a, 0x1EB1, 
--IBUS_KEY_grave, IBUS_KEY_dead_diaeresis, IBUS_KEY_U, 0x01DB, 
--IBUS_KEY_grave, IBUS_KEY_dead_diaeresis, IBUS_KEY_u, 0x01DC, 
--IBUS_KEY_grave, IBUS_KEY_dead_diaeresis, IBUS_KEY_Greek_iota, 0x1FD2, 
--IBUS_KEY_grave, IBUS_KEY_dead_diaeresis, IBUS_KEY_Greek_upsilon, 0x1FE2, 
--IBUS_KEY_grave, IBUS_KEY_dead_horn, IBUS_KEY_O, 0x1EDC, 
--IBUS_KEY_grave, IBUS_KEY_dead_horn, IBUS_KEY_U, 0x1EEA, 
--IBUS_KEY_grave, IBUS_KEY_dead_horn, IBUS_KEY_o, 0x1EDD, 
--IBUS_KEY_grave, IBUS_KEY_dead_horn, IBUS_KEY_u, 0x1EEB, 
--IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA, 0x1F0A, 
--IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_EPSILON, 0x1F1A, 
--IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA, 0x1F2A, 
--IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_IOTA, 0x1F3A, 
--IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMICRON, 0x1F4A, 
--IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA, 0x1F6A, 
--IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha, 0x1F02, 
--IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_epsilon, 0x1F12, 
--IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta, 0x1F22, 
--IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_iota, 0x1F32, 
--IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omicron, 0x1F42, 
--IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_upsilon, 0x1F52, 
--IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega, 0x1F62, 
--IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA, 0x1F0B, 
--IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_EPSILON, 0x1F1B, 
--IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA, 0x1F2B, 
--IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_IOTA, 0x1F3B, 
--IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMICRON, 0x1F4B, 
--IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_UPSILON, 0x1F5B, 
--IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA, 0x1F6B, 
--IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha, 0x1F03, 
--IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_epsilon, 0x1F13, 
--IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta, 0x1F23, 
--IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_iota, 0x1F33, 
--IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omicron, 0x1F43, 
--IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_upsilon, 0x1F53, 
--IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega, 0x1F63, 
--IBUS_KEY_b, IBUS_KEY_exclam, IBUS_KEY_A, 0x1EB6, 
--IBUS_KEY_b, IBUS_KEY_exclam, IBUS_KEY_a, 0x1EB7, 
--IBUS_KEY_b, IBUS_KEY_comma, IBUS_KEY_E, 0x1E1C, 
--IBUS_KEY_b, IBUS_KEY_comma, IBUS_KEY_e, 0x1E1D, 
--IBUS_KEY_b, IBUS_KEY_cedilla, IBUS_KEY_E, 0x1E1C, 
--IBUS_KEY_b, IBUS_KEY_cedilla, IBUS_KEY_e, 0x1E1D, 
--IBUS_KEY_b, IBUS_KEY_dead_cedilla, IBUS_KEY_E, 0x1E1C, 
--IBUS_KEY_b, IBUS_KEY_dead_cedilla, IBUS_KEY_e, 0x1E1D, 
--IBUS_KEY_b, IBUS_KEY_dead_belowdot, IBUS_KEY_A, 0x1EB6, 
--IBUS_KEY_b, IBUS_KEY_dead_belowdot, IBUS_KEY_a, 0x1EB7, 
--IBUS_KEY_c, IBUS_KEY_quotedbl, IBUS_KEY_U, 0x01D9, 
--IBUS_KEY_c, IBUS_KEY_quotedbl, IBUS_KEY_u, 0x01DA, 
--IBUS_KEY_c, IBUS_KEY_dead_diaeresis, IBUS_KEY_U, 0x01D9, 
--IBUS_KEY_c, IBUS_KEY_dead_diaeresis, IBUS_KEY_u, 0x01DA, 
--IBUS_KEY_asciitilde, IBUS_KEY_quotedbl, IBUS_KEY_Greek_iota, 0x1FD7, 
--IBUS_KEY_asciitilde, IBUS_KEY_quotedbl, IBUS_KEY_Greek_upsilon, 0x1FE7, 
--IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA, 0x1F0F, 
--IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA, 0x1F2F, 
--IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_IOTA, 0x1F3F, 
--IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_UPSILON, 0x1F5F, 
--IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA, 0x1F6F, 
--IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha, 0x1F07, 
--IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta, 0x1F27, 
--IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_iota, 0x1F37, 
--IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_upsilon, 0x1F57, 
--IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega, 0x1F67, 
--IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA, 0x1F0E, 
--IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA, 0x1F2E, 
--IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_IOTA, 0x1F3E, 
--IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA, 0x1F6E, 
--IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha, 0x1F06, 
--IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_eta, 0x1F26, 
--IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_iota, 0x1F36, 
--IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_upsilon, 0x1F56, 
--IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_omega, 0x1F66, 
--IBUS_KEY_asciitilde, IBUS_KEY_plus, IBUS_KEY_O, 0x1EE0, 
--IBUS_KEY_asciitilde, IBUS_KEY_plus, IBUS_KEY_U, 0x1EEE, 
--IBUS_KEY_asciitilde, IBUS_KEY_plus, IBUS_KEY_o, 0x1EE1, 
--IBUS_KEY_asciitilde, IBUS_KEY_plus, IBUS_KEY_u, 0x1EEF, 
--IBUS_KEY_asciitilde, IBUS_KEY_asciicircum, IBUS_KEY_A, 0x1EAA, 
--IBUS_KEY_asciitilde, IBUS_KEY_asciicircum, IBUS_KEY_E, 0x1EC4, 
--IBUS_KEY_asciitilde, IBUS_KEY_asciicircum, IBUS_KEY_O, 0x1ED6, 
--IBUS_KEY_asciitilde, IBUS_KEY_asciicircum, IBUS_KEY_a, 0x1EAB, 
--IBUS_KEY_asciitilde, IBUS_KEY_asciicircum, IBUS_KEY_e, 0x1EC5, 
--IBUS_KEY_asciitilde, IBUS_KEY_asciicircum, IBUS_KEY_o, 0x1ED7, 
--IBUS_KEY_asciitilde, IBUS_KEY_b, IBUS_KEY_A, 0x1EB4, 
--IBUS_KEY_asciitilde, IBUS_KEY_b, IBUS_KEY_a, 0x1EB5, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_circumflex, IBUS_KEY_A, 0x1EAA, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_circumflex, IBUS_KEY_E, 0x1EC4, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_circumflex, IBUS_KEY_O, 0x1ED6, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_circumflex, IBUS_KEY_a, 0x1EAB, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_circumflex, IBUS_KEY_e, 0x1EC5, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_circumflex, IBUS_KEY_o, 0x1ED7, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_breve, IBUS_KEY_A, 0x1EB4, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_breve, IBUS_KEY_a, 0x1EB5, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_diaeresis, IBUS_KEY_Greek_iota, 0x1FD7, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_diaeresis, IBUS_KEY_Greek_upsilon, 0x1FE7, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_horn, IBUS_KEY_O, 0x1EE0, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_horn, IBUS_KEY_U, 0x1EEE, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_horn, IBUS_KEY_o, 0x1EE1, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_horn, IBUS_KEY_u, 0x1EEF, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA, 0x1F0E, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA, 0x1F2E, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_IOTA, 0x1F3E, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA, 0x1F6E, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha, 0x1F06, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta, 0x1F26, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_iota, 0x1F36, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_upsilon, 0x1F56, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega, 0x1F66, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA, 0x1F0F, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA, 0x1F2F, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_IOTA, 0x1F3F, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_UPSILON, 0x1F5F, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA, 0x1F6F, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha, 0x1F07, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta, 0x1F27, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_iota, 0x1F37, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_upsilon, 0x1F57, 
--IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega, 0x1F67, 
--IBUS_KEY_macron, IBUS_KEY_exclam, IBUS_KEY_L, 0x1E38, 
--IBUS_KEY_macron, IBUS_KEY_exclam, IBUS_KEY_R, 0x1E5C, 
--IBUS_KEY_macron, IBUS_KEY_exclam, IBUS_KEY_l, 0x1E39, 
--IBUS_KEY_macron, IBUS_KEY_exclam, IBUS_KEY_r, 0x1E5D, 
--IBUS_KEY_macron, IBUS_KEY_quotedbl, IBUS_KEY_A, 0x01DE, 
--IBUS_KEY_macron, IBUS_KEY_quotedbl, IBUS_KEY_O, 0x022A, 
--IBUS_KEY_macron, IBUS_KEY_quotedbl, IBUS_KEY_U, 0x01D5, 
--IBUS_KEY_macron, IBUS_KEY_quotedbl, IBUS_KEY_a, 0x01DF, 
--IBUS_KEY_macron, IBUS_KEY_quotedbl, IBUS_KEY_o, 0x022B, 
--IBUS_KEY_macron, IBUS_KEY_quotedbl, IBUS_KEY_u, 0x01D6, 
--IBUS_KEY_macron, IBUS_KEY_period, IBUS_KEY_A, 0x01E0, 
--IBUS_KEY_macron, IBUS_KEY_period, IBUS_KEY_O, 0x0230, 
--IBUS_KEY_macron, IBUS_KEY_period, IBUS_KEY_a, 0x01E1, 
--IBUS_KEY_macron, IBUS_KEY_period, IBUS_KEY_o, 0x0231, 
--IBUS_KEY_macron, IBUS_KEY_semicolon, IBUS_KEY_O, 0x01EC, 
--IBUS_KEY_macron, IBUS_KEY_semicolon, IBUS_KEY_o, 0x01ED, 
--IBUS_KEY_macron, IBUS_KEY_asciitilde, IBUS_KEY_O, 0x022C, 
--IBUS_KEY_macron, IBUS_KEY_asciitilde, IBUS_KEY_o, 0x022D, 
--IBUS_KEY_macron, IBUS_KEY_dead_tilde, IBUS_KEY_O, 0x022C, 
--IBUS_KEY_macron, IBUS_KEY_dead_tilde, IBUS_KEY_o, 0x022D, 
--IBUS_KEY_macron, IBUS_KEY_dead_abovedot, IBUS_KEY_A, 0x01E0, 
--IBUS_KEY_macron, IBUS_KEY_dead_abovedot, IBUS_KEY_O, 0x0230, 
--IBUS_KEY_macron, IBUS_KEY_dead_abovedot, IBUS_KEY_a, 0x01E1, 
--IBUS_KEY_macron, IBUS_KEY_dead_abovedot, IBUS_KEY_o, 0x0231, 
--IBUS_KEY_macron, IBUS_KEY_dead_diaeresis, IBUS_KEY_A, 0x01DE, 
--IBUS_KEY_macron, IBUS_KEY_dead_diaeresis, IBUS_KEY_O, 0x022A, 
--IBUS_KEY_macron, IBUS_KEY_dead_diaeresis, IBUS_KEY_U, 0x01D5, 
--IBUS_KEY_macron, IBUS_KEY_dead_diaeresis, IBUS_KEY_a, 0x01DF, 
--IBUS_KEY_macron, IBUS_KEY_dead_diaeresis, IBUS_KEY_o, 0x022B, 
--IBUS_KEY_macron, IBUS_KEY_dead_diaeresis, IBUS_KEY_u, 0x01D6, 
--IBUS_KEY_macron, IBUS_KEY_dead_ogonek, IBUS_KEY_O, 0x01EC, 
--IBUS_KEY_macron, IBUS_KEY_dead_ogonek, IBUS_KEY_o, 0x01ED, 
--IBUS_KEY_macron, IBUS_KEY_dead_belowdot, IBUS_KEY_L, 0x1E38, 
--IBUS_KEY_macron, IBUS_KEY_dead_belowdot, IBUS_KEY_R, 0x1E5C, 
--IBUS_KEY_macron, IBUS_KEY_dead_belowdot, IBUS_KEY_l, 0x1E39, 
--IBUS_KEY_macron, IBUS_KEY_dead_belowdot, IBUS_KEY_r, 0x1E5D, 
--IBUS_KEY_acute, IBUS_KEY_quotedbl, IBUS_KEY_I, 0x1E2E, 
--IBUS_KEY_acute, IBUS_KEY_quotedbl, IBUS_KEY_U, 0x01D7, 
--IBUS_KEY_acute, IBUS_KEY_quotedbl, IBUS_KEY_i, 0x1E2F, 
--IBUS_KEY_acute, IBUS_KEY_quotedbl, IBUS_KEY_u, 0x01D8, 
--IBUS_KEY_acute, IBUS_KEY_quotedbl, IBUS_KEY_Greek_iota, 0x0390, 
--IBUS_KEY_acute, IBUS_KEY_quotedbl, IBUS_KEY_Greek_upsilon, 0x03B0, 
--IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA, 0x1F0D, 
--IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_EPSILON, 0x1F1D, 
--IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA, 0x1F2D, 
--IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_IOTA, 0x1F3D, 
--IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMICRON, 0x1F4D, 
--IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_UPSILON, 0x1F5D, 
--IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA, 0x1F6D, 
--IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha, 0x1F05, 
--IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_epsilon, 0x1F15, 
--IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta, 0x1F25, 
--IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_iota, 0x1F35, 
--IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_omicron, 0x1F45, 
--IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_upsilon, 0x1F55, 
--IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega, 0x1F65, 
--IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA, 0x1F0C, 
--IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_EPSILON, 0x1F1C, 
--IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA, 0x1F2C, 
--IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_IOTA, 0x1F3C, 
--IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_OMICRON, 0x1F4C, 
--IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA, 0x1F6C, 
--IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha, 0x1F04, 
--IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_epsilon, 0x1F14, 
--IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_eta, 0x1F24, 
--IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_iota, 0x1F34, 
--IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_omicron, 0x1F44, 
--IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_upsilon, 0x1F54, 
--IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_omega, 0x1F64, 
--IBUS_KEY_acute, IBUS_KEY_plus, IBUS_KEY_O, 0x1EDA, 
--IBUS_KEY_acute, IBUS_KEY_plus, IBUS_KEY_U, 0x1EE8, 
--IBUS_KEY_acute, IBUS_KEY_plus, IBUS_KEY_o, 0x1EDB, 
--IBUS_KEY_acute, IBUS_KEY_plus, IBUS_KEY_u, 0x1EE9, 
--IBUS_KEY_acute, IBUS_KEY_comma, IBUS_KEY_C, 0x1E08, 
--IBUS_KEY_acute, IBUS_KEY_comma, IBUS_KEY_c, 0x1E09, 
--IBUS_KEY_acute, IBUS_KEY_slash, IBUS_KEY_O, 0x01FE, 
--IBUS_KEY_acute, IBUS_KEY_slash, IBUS_KEY_o, 0x01FF, 
--IBUS_KEY_acute, IBUS_KEY_asciicircum, IBUS_KEY_A, 0x1EA4, 
--IBUS_KEY_acute, IBUS_KEY_asciicircum, IBUS_KEY_E, 0x1EBE, 
--IBUS_KEY_acute, IBUS_KEY_asciicircum, IBUS_KEY_O, 0x1ED0, 
--IBUS_KEY_acute, IBUS_KEY_asciicircum, IBUS_KEY_a, 0x1EA5, 
--IBUS_KEY_acute, IBUS_KEY_asciicircum, IBUS_KEY_e, 0x1EBF, 
--IBUS_KEY_acute, IBUS_KEY_asciicircum, IBUS_KEY_o, 0x1ED1, 
--IBUS_KEY_acute, IBUS_KEY_underscore, IBUS_KEY_E, 0x1E16, 
--IBUS_KEY_acute, IBUS_KEY_underscore, IBUS_KEY_O, 0x1E52, 
--IBUS_KEY_acute, IBUS_KEY_underscore, IBUS_KEY_e, 0x1E17, 
--IBUS_KEY_acute, IBUS_KEY_underscore, IBUS_KEY_o, 0x1E53, 
--IBUS_KEY_acute, IBUS_KEY_b, IBUS_KEY_A, 0x1EAE, 
--IBUS_KEY_acute, IBUS_KEY_b, IBUS_KEY_a, 0x1EAF, 
--IBUS_KEY_acute, IBUS_KEY_asciitilde, IBUS_KEY_O, 0x1E4C, 
--IBUS_KEY_acute, IBUS_KEY_asciitilde, IBUS_KEY_U, 0x1E78, 
--IBUS_KEY_acute, IBUS_KEY_asciitilde, IBUS_KEY_o, 0x1E4D, 
--IBUS_KEY_acute, IBUS_KEY_asciitilde, IBUS_KEY_u, 0x1E79, 
--IBUS_KEY_acute, IBUS_KEY_macron, IBUS_KEY_E, 0x1E16, 
--IBUS_KEY_acute, IBUS_KEY_macron, IBUS_KEY_O, 0x1E52, 
--IBUS_KEY_acute, IBUS_KEY_macron, IBUS_KEY_e, 0x1E17, 
--IBUS_KEY_acute, IBUS_KEY_macron, IBUS_KEY_o, 0x1E53, 
--IBUS_KEY_acute, IBUS_KEY_cedilla, IBUS_KEY_C, 0x1E08, 
--IBUS_KEY_acute, IBUS_KEY_cedilla, IBUS_KEY_c, 0x1E09, 
--IBUS_KEY_acute, IBUS_KEY_dead_circumflex, IBUS_KEY_A, 0x1EA4, 
--IBUS_KEY_acute, IBUS_KEY_dead_circumflex, IBUS_KEY_E, 0x1EBE, 
--IBUS_KEY_acute, IBUS_KEY_dead_circumflex, IBUS_KEY_O, 0x1ED0, 
--IBUS_KEY_acute, IBUS_KEY_dead_circumflex, IBUS_KEY_a, 0x1EA5, 
--IBUS_KEY_acute, IBUS_KEY_dead_circumflex, IBUS_KEY_e, 0x1EBF, 
--IBUS_KEY_acute, IBUS_KEY_dead_circumflex, IBUS_KEY_o, 0x1ED1, 
--IBUS_KEY_acute, IBUS_KEY_dead_tilde, IBUS_KEY_O, 0x1E4C, 
--IBUS_KEY_acute, IBUS_KEY_dead_tilde, IBUS_KEY_U, 0x1E78, 
--IBUS_KEY_acute, IBUS_KEY_dead_tilde, IBUS_KEY_o, 0x1E4D, 
--IBUS_KEY_acute, IBUS_KEY_dead_tilde, IBUS_KEY_u, 0x1E79, 
--IBUS_KEY_acute, IBUS_KEY_dead_macron, IBUS_KEY_E, 0x1E16, 
--IBUS_KEY_acute, IBUS_KEY_dead_macron, IBUS_KEY_O, 0x1E52, 
--IBUS_KEY_acute, IBUS_KEY_dead_macron, IBUS_KEY_e, 0x1E17, 
--IBUS_KEY_acute, IBUS_KEY_dead_macron, IBUS_KEY_o, 0x1E53, 
--IBUS_KEY_acute, IBUS_KEY_dead_breve, IBUS_KEY_A, 0x1EAE, 
--IBUS_KEY_acute, IBUS_KEY_dead_breve, IBUS_KEY_a, 0x1EAF, 
--IBUS_KEY_acute, IBUS_KEY_dead_diaeresis, IBUS_KEY_I, 0x1E2E, 
--IBUS_KEY_acute, IBUS_KEY_dead_diaeresis, IBUS_KEY_U, 0x01D7, 
--IBUS_KEY_acute, IBUS_KEY_dead_diaeresis, IBUS_KEY_i, 0x1E2F, 
--IBUS_KEY_acute, IBUS_KEY_dead_diaeresis, IBUS_KEY_u, 0x01D8, 
--IBUS_KEY_acute, IBUS_KEY_dead_diaeresis, IBUS_KEY_Greek_iota, 0x0390, 
--IBUS_KEY_acute, IBUS_KEY_dead_diaeresis, IBUS_KEY_Greek_upsilon, 0x03B0, 
--IBUS_KEY_acute, IBUS_KEY_dead_abovering, IBUS_KEY_A, 0x01FA, 
--IBUS_KEY_acute, IBUS_KEY_dead_abovering, IBUS_KEY_a, 0x01FB, 
--IBUS_KEY_acute, IBUS_KEY_dead_cedilla, IBUS_KEY_C, 0x1E08, 
--IBUS_KEY_acute, IBUS_KEY_dead_cedilla, IBUS_KEY_c, 0x1E09, 
--IBUS_KEY_acute, IBUS_KEY_dead_horn, IBUS_KEY_O, 0x1EDA, 
--IBUS_KEY_acute, IBUS_KEY_dead_horn, IBUS_KEY_U, 0x1EE8, 
--IBUS_KEY_acute, IBUS_KEY_dead_horn, IBUS_KEY_o, 0x1EDB, 
--IBUS_KEY_acute, IBUS_KEY_dead_horn, IBUS_KEY_u, 0x1EE9, 
--IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA, 0x1F0C, 
--IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_EPSILON, 0x1F1C, 
--IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA, 0x1F2C, 
--IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_IOTA, 0x1F3C, 
--IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMICRON, 0x1F4C, 
--IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA, 0x1F6C, 
--IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha, 0x1F04, 
--IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_epsilon, 0x1F14, 
--IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta, 0x1F24, 
--IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_iota, 0x1F34, 
--IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omicron, 0x1F44, 
--IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_upsilon, 0x1F54, 
--IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega, 0x1F64, 
--IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA, 0x1F0D, 
--IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_EPSILON, 0x1F1D, 
--IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA, 0x1F2D, 
--IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_IOTA, 0x1F3D, 
--IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMICRON, 0x1F4D, 
--IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_UPSILON, 0x1F5D, 
--IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA, 0x1F6D, 
--IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha, 0x1F05, 
--IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_epsilon, 0x1F15, 
--IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta, 0x1F25, 
--IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_iota, 0x1F35, 
--IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omicron, 0x1F45, 
--IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_upsilon, 0x1F55, 
--IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega, 0x1F65, 
--IBUS_KEY_acute, IBUS_KEY_KP_Divide, IBUS_KEY_O, 0x01FE, 
--IBUS_KEY_acute, IBUS_KEY_KP_Divide, IBUS_KEY_o, 0x01FF, 
--0x05C1, 0x05BC, IBUS_KEY_hebrew_shin, 0xFB2C, 
--0x05C2, 0x05BC, IBUS_KEY_hebrew_shin, 0xFB2D, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_Greek_alpha, 0x1FB4, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_Greek_eta, 0x1FC4, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_Greek_omega, 0x1FF4, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, 0x1F00, 0x1F84, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, 0x1F01, 0x1F85, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, 0x1F08, 0x1F8C, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, 0x1F09, 0x1F8D, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, 0x1F20, 0x1F94, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, 0x1F21, 0x1F95, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, 0x1F28, 0x1F9C, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, 0x1F29, 0x1F9D, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, 0x1F60, 0x1FA4, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, 0x1F61, 0x1FA5, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, 0x1F68, 0x1FAC, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, 0x1F69, 0x1FAD, 
--IBUS_KEY_Greek_iota, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA, 0x1F89, 
--IBUS_KEY_Greek_iota, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA, 0x1F99, 
--IBUS_KEY_Greek_iota, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA, 0x1FA9, 
--IBUS_KEY_Greek_iota, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha, 0x1F81, 
--IBUS_KEY_Greek_iota, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta, 0x1F91, 
--IBUS_KEY_Greek_iota, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega, 0x1FA1, 
--IBUS_KEY_Greek_iota, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA, 0x1F88, 
--IBUS_KEY_Greek_iota, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA, 0x1F98, 
--IBUS_KEY_Greek_iota, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA, 0x1FA8, 
--IBUS_KEY_Greek_iota, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha, 0x1F80, 
--IBUS_KEY_Greek_iota, IBUS_KEY_parenright, IBUS_KEY_Greek_eta, 0x1F90, 
--IBUS_KEY_Greek_iota, IBUS_KEY_parenright, IBUS_KEY_Greek_omega, 0x1FA0, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_Greek_alpha, 0x1FB2, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_Greek_eta, 0x1FC2, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_Greek_omega, 0x1FF2, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, 0x1F00, 0x1F82, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, 0x1F01, 0x1F83, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, 0x1F08, 0x1F8A, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, 0x1F09, 0x1F8B, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, 0x1F20, 0x1F92, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, 0x1F21, 0x1F93, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, 0x1F28, 0x1F9A, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, 0x1F29, 0x1F9B, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, 0x1F60, 0x1FA2, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, 0x1F61, 0x1FA3, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, 0x1F68, 0x1FAA, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, 0x1F69, 0x1FAB, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_Greek_alpha, 0x1FB7, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_Greek_eta, 0x1FC7, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_Greek_omega, 0x1FF7, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, 0x1F00, 0x1F86, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, 0x1F01, 0x1F87, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, 0x1F08, 0x1F8E, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, 0x1F09, 0x1F8F, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, 0x1F20, 0x1F96, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, 0x1F21, 0x1F97, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, 0x1F28, 0x1F9E, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, 0x1F29, 0x1F9F, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, 0x1F60, 0x1FA6, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, 0x1F61, 0x1FA7, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, 0x1F68, 0x1FAE, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, 0x1F69, 0x1FAF, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_Greek_alpha, 0x1FB4, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_Greek_eta, 0x1FC4, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_Greek_omega, 0x1FF4, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, 0x1F00, 0x1F84, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, 0x1F01, 0x1F85, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, 0x1F08, 0x1F8C, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, 0x1F09, 0x1F8D, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, 0x1F20, 0x1F94, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, 0x1F21, 0x1F95, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, 0x1F28, 0x1F9C, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, 0x1F29, 0x1F9D, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, 0x1F60, 0x1FA4, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, 0x1F61, 0x1FA5, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, 0x1F68, 0x1FAC, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, 0x1F69, 0x1FAD, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_Greek_alpha, 0x1FB2, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_Greek_eta, 0x1FC2, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_Greek_omega, 0x1FF2, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, 0x1F00, 0x1F82, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, 0x1F01, 0x1F83, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, 0x1F08, 0x1F8A, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, 0x1F09, 0x1F8B, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, 0x1F20, 0x1F92, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, 0x1F21, 0x1F93, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, 0x1F28, 0x1F9A, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, 0x1F29, 0x1F9B, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, 0x1F60, 0x1FA2, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, 0x1F61, 0x1FA3, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, 0x1F68, 0x1FAA, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, 0x1F69, 0x1FAB, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_Greek_alpha, 0x1FB4, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_Greek_eta, 0x1FC4, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_Greek_omega, 0x1FF4, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, 0x1F00, 0x1F84, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, 0x1F01, 0x1F85, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, 0x1F08, 0x1F8C, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, 0x1F09, 0x1F8D, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, 0x1F20, 0x1F94, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, 0x1F21, 0x1F95, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, 0x1F28, 0x1F9C, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, 0x1F29, 0x1F9D, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, 0x1F60, 0x1FA4, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, 0x1F61, 0x1FA5, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, 0x1F68, 0x1FAC, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, 0x1F69, 0x1FAD, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_Greek_alpha, 0x1FB7, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_Greek_eta, 0x1FC7, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_Greek_omega, 0x1FF7, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, 0x1F00, 0x1F86, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, 0x1F01, 0x1F87, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, 0x1F08, 0x1F8E, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, 0x1F09, 0x1F8F, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, 0x1F20, 0x1F96, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, 0x1F21, 0x1F97, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, 0x1F28, 0x1F9E, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, 0x1F29, 0x1F9F, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, 0x1F60, 0x1FA6, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, 0x1F61, 0x1FA7, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, 0x1F68, 0x1FAE, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, 0x1F69, 0x1FAF, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA, 0x1F88, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA, 0x1F98, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA, 0x1FA8, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha, 0x1F80, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta, 0x1F90, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega, 0x1FA0, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA, 0x1F89, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA, 0x1F99, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA, 0x1FA9, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha, 0x1F81, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta, 0x1F91, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega, 0x1FA1, 
--IBUS_KEY_dead_abovedot, IBUS_KEY_f, IBUS_KEY_s, 0x1E9B, 
--IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_0, IBUS_KEY_parenright, 0x2469, 
--IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_1, IBUS_KEY_parenright, 0x246A, 
--IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_2, IBUS_KEY_parenright, 0x246B, 
--IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_3, IBUS_KEY_parenright, 0x246C, 
--IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_4, IBUS_KEY_parenright, 0x246D, 
--IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_5, IBUS_KEY_parenright, 0x246E, 
--IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_6, IBUS_KEY_parenright, 0x246F, 
--IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_7, IBUS_KEY_parenright, 0x2470, 
--IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_8, IBUS_KEY_parenright, 0x2471, 
--IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_9, IBUS_KEY_parenright, 0x2472, 
--IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_KP_Space, IBUS_KEY_parenright, 0x246B, 
--IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_KP_0, IBUS_KEY_parenright, 0x2469, 
--IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_KP_1, IBUS_KEY_parenright, 0x246A, 
--IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_KP_2, IBUS_KEY_parenright, 0x246B, 
--IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_KP_3, IBUS_KEY_parenright, 0x246C, 
--IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_KP_4, IBUS_KEY_parenright, 0x246D, 
--IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_KP_5, IBUS_KEY_parenright, 0x246E, 
--IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_KP_6, IBUS_KEY_parenright, 0x246F, 
--IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_KP_7, IBUS_KEY_parenright, 0x2470, 
--IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_KP_8, IBUS_KEY_parenright, 0x2471, 
--IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_KP_9, IBUS_KEY_parenright, 0x2472, 
--IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_0, IBUS_KEY_parenright, 0x2473, 
--IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_1, IBUS_KEY_parenright, 0x3251, 
--IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_2, IBUS_KEY_parenright, 0x3252, 
--IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_3, IBUS_KEY_parenright, 0x3253, 
--IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_4, IBUS_KEY_parenright, 0x3254, 
--IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_5, IBUS_KEY_parenright, 0x3255, 
--IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_6, IBUS_KEY_parenright, 0x3256, 
--IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_7, IBUS_KEY_parenright, 0x3257, 
--IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_8, IBUS_KEY_parenright, 0x3258, 
--IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_9, IBUS_KEY_parenright, 0x3259, 
--IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_KP_Space, IBUS_KEY_parenright, 0x3252, 
--IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_KP_0, IBUS_KEY_parenright, 0x2473, 
--IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_KP_1, IBUS_KEY_parenright, 0x3251, 
--IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_KP_2, IBUS_KEY_parenright, 0x3252, 
--IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_KP_3, IBUS_KEY_parenright, 0x3253, 
--IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_KP_4, IBUS_KEY_parenright, 0x3254, 
--IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_KP_5, IBUS_KEY_parenright, 0x3255, 
--IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_KP_6, IBUS_KEY_parenright, 0x3256, 
--IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_KP_7, IBUS_KEY_parenright, 0x3257, 
--IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_KP_8, IBUS_KEY_parenright, 0x3258, 
--IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_KP_9, IBUS_KEY_parenright, 0x3259, 
--IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_0, IBUS_KEY_parenright, 0x325A, 
--IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_1, IBUS_KEY_parenright, 0x325B, 
--IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_2, IBUS_KEY_parenright, 0x325C, 
--IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_3, IBUS_KEY_parenright, 0x325D, 
--IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_4, IBUS_KEY_parenright, 0x325E, 
--IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_5, IBUS_KEY_parenright, 0x325F, 
--IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_6, IBUS_KEY_parenright, 0x32B1, 
--IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_7, IBUS_KEY_parenright, 0x32B2, 
--IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_8, IBUS_KEY_parenright, 0x32B3, 
--IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_9, IBUS_KEY_parenright, 0x32B4, 
--IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_KP_Space, IBUS_KEY_parenright, 0x325C, 
--IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_KP_0, IBUS_KEY_parenright, 0x325A, 
--IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_KP_1, IBUS_KEY_parenright, 0x325B, 
--IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_KP_2, IBUS_KEY_parenright, 0x325C, 
--IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_KP_3, IBUS_KEY_parenright, 0x325D, 
--IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_KP_4, IBUS_KEY_parenright, 0x325E, 
--IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_KP_5, IBUS_KEY_parenright, 0x325F, 
--IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_KP_6, IBUS_KEY_parenright, 0x32B1, 
--IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_KP_7, IBUS_KEY_parenright, 0x32B2, 
--IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_KP_8, IBUS_KEY_parenright, 0x32B3, 
--IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_KP_9, IBUS_KEY_parenright, 0x32B4, 
--IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_0, IBUS_KEY_parenright, 0x32B5, 
--IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_1, IBUS_KEY_parenright, 0x32B6, 
--IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_2, IBUS_KEY_parenright, 0x32B7, 
--IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_3, IBUS_KEY_parenright, 0x32B8, 
--IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_4, IBUS_KEY_parenright, 0x32B9, 
--IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_5, IBUS_KEY_parenright, 0x32BA, 
--IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_6, IBUS_KEY_parenright, 0x32BB, 
--IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_7, IBUS_KEY_parenright, 0x32BC, 
--IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_8, IBUS_KEY_parenright, 0x32BD, 
--IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_9, IBUS_KEY_parenright, 0x32BE, 
--IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_KP_Space, IBUS_KEY_parenright, 0x32B7, 
--IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_KP_0, IBUS_KEY_parenright, 0x32B5, 
--IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_KP_1, IBUS_KEY_parenright, 0x32B6, 
--IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_KP_2, IBUS_KEY_parenright, 0x32B7, 
--IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_KP_3, IBUS_KEY_parenright, 0x32B8, 
--IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_KP_4, IBUS_KEY_parenright, 0x32B9, 
--IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_KP_5, IBUS_KEY_parenright, 0x32BA, 
--IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_KP_6, IBUS_KEY_parenright, 0x32BB, 
--IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_KP_7, IBUS_KEY_parenright, 0x32BC, 
--IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_KP_8, IBUS_KEY_parenright, 0x32BD, 
--IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_KP_9, IBUS_KEY_parenright, 0x32BE, 
--IBUS_KEY_parenleft, IBUS_KEY_5, IBUS_KEY_KP_0, IBUS_KEY_parenright, 0x32BF, 
--IBUS_KEY_parenleft, 0x1100, 0x1161, IBUS_KEY_parenright, 0x326E, 
--IBUS_KEY_parenleft, 0x1102, 0x1161, IBUS_KEY_parenright, 0x326F, 
--IBUS_KEY_parenleft, 0x1103, 0x1161, IBUS_KEY_parenright, 0x3270, 
--IBUS_KEY_parenleft, 0x1105, 0x1161, IBUS_KEY_parenright, 0x3271, 
--IBUS_KEY_parenleft, 0x1106, 0x1161, IBUS_KEY_parenright, 0x3272, 
--IBUS_KEY_parenleft, 0x1107, 0x1161, IBUS_KEY_parenright, 0x3273, 
--IBUS_KEY_parenleft, 0x1109, 0x1161, IBUS_KEY_parenright, 0x3274, 
--IBUS_KEY_parenleft, 0x110B, 0x1161, IBUS_KEY_parenright, 0x3275, 
--IBUS_KEY_parenleft, 0x110C, 0x1161, IBUS_KEY_parenright, 0x3276, 
--IBUS_KEY_parenleft, 0x110E, 0x1161, IBUS_KEY_parenright, 0x3277, 
--IBUS_KEY_parenleft, 0x110F, 0x1161, IBUS_KEY_parenright, 0x3278, 
--IBUS_KEY_parenleft, 0x1110, 0x1161, IBUS_KEY_parenright, 0x3279, 
--IBUS_KEY_parenleft, 0x1111, 0x1161, IBUS_KEY_parenright, 0x327A, 
--IBUS_KEY_parenleft, 0x1112, 0x1161, IBUS_KEY_parenright, 0x327B, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_0, IBUS_KEY_parenright, 0x2473, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_1, IBUS_KEY_parenright, 0x3251, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_2, IBUS_KEY_parenright, 0x3252, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_3, IBUS_KEY_parenright, 0x3253, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_4, IBUS_KEY_parenright, 0x3254, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_5, IBUS_KEY_parenright, 0x3255, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_6, IBUS_KEY_parenright, 0x3256, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_7, IBUS_KEY_parenright, 0x3257, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_8, IBUS_KEY_parenright, 0x3258, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_9, IBUS_KEY_parenright, 0x3259, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_KP_Space, IBUS_KEY_parenright, 0x3252, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_KP_0, IBUS_KEY_parenright, 0x2473, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_KP_1, IBUS_KEY_parenright, 0x3251, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_KP_2, IBUS_KEY_parenright, 0x3252, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_KP_3, IBUS_KEY_parenright, 0x3253, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_KP_4, IBUS_KEY_parenright, 0x3254, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_KP_5, IBUS_KEY_parenright, 0x3255, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_KP_6, IBUS_KEY_parenright, 0x3256, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_KP_7, IBUS_KEY_parenright, 0x3257, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_KP_8, IBUS_KEY_parenright, 0x3258, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_KP_9, IBUS_KEY_parenright, 0x3259, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_0, IBUS_KEY_parenright, 0x2469, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_1, IBUS_KEY_parenright, 0x246A, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_2, IBUS_KEY_parenright, 0x246B, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_3, IBUS_KEY_parenright, 0x246C, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_4, IBUS_KEY_parenright, 0x246D, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_5, IBUS_KEY_parenright, 0x246E, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_6, IBUS_KEY_parenright, 0x246F, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_7, IBUS_KEY_parenright, 0x2470, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_8, IBUS_KEY_parenright, 0x2471, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_9, IBUS_KEY_parenright, 0x2472, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_KP_Space, IBUS_KEY_parenright, 0x246B, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_KP_0, IBUS_KEY_parenright, 0x2469, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_KP_1, IBUS_KEY_parenright, 0x246A, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_KP_2, IBUS_KEY_parenright, 0x246B, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_KP_3, IBUS_KEY_parenright, 0x246C, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_KP_4, IBUS_KEY_parenright, 0x246D, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_KP_5, IBUS_KEY_parenright, 0x246E, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_KP_6, IBUS_KEY_parenright, 0x246F, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_KP_7, IBUS_KEY_parenright, 0x2470, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_KP_8, IBUS_KEY_parenright, 0x2471, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_KP_9, IBUS_KEY_parenright, 0x2472, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_0, IBUS_KEY_parenright, 0x2473, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_1, IBUS_KEY_parenright, 0x3251, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_2, IBUS_KEY_parenright, 0x3252, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_3, IBUS_KEY_parenright, 0x3253, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_4, IBUS_KEY_parenright, 0x3254, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_5, IBUS_KEY_parenright, 0x3255, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_6, IBUS_KEY_parenright, 0x3256, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_7, IBUS_KEY_parenright, 0x3257, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_8, IBUS_KEY_parenright, 0x3258, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_9, IBUS_KEY_parenright, 0x3259, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_KP_Space, IBUS_KEY_parenright, 0x3252, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_KP_0, IBUS_KEY_parenright, 0x2473, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_KP_1, IBUS_KEY_parenright, 0x3251, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_KP_2, IBUS_KEY_parenright, 0x3252, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_KP_3, IBUS_KEY_parenright, 0x3253, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_KP_4, IBUS_KEY_parenright, 0x3254, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_KP_5, IBUS_KEY_parenright, 0x3255, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_KP_6, IBUS_KEY_parenright, 0x3256, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_KP_7, IBUS_KEY_parenright, 0x3257, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_KP_8, IBUS_KEY_parenright, 0x3258, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_KP_9, IBUS_KEY_parenright, 0x3259, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_0, IBUS_KEY_parenright, 0x325A, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_1, IBUS_KEY_parenright, 0x325B, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_2, IBUS_KEY_parenright, 0x325C, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_3, IBUS_KEY_parenright, 0x325D, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_4, IBUS_KEY_parenright, 0x325E, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_5, IBUS_KEY_parenright, 0x325F, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_6, IBUS_KEY_parenright, 0x32B1, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_7, IBUS_KEY_parenright, 0x32B2, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_8, IBUS_KEY_parenright, 0x32B3, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_9, IBUS_KEY_parenright, 0x32B4, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_KP_Space, IBUS_KEY_parenright, 0x325C, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_KP_0, IBUS_KEY_parenright, 0x325A, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_KP_1, IBUS_KEY_parenright, 0x325B, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_KP_2, IBUS_KEY_parenright, 0x325C, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_KP_3, IBUS_KEY_parenright, 0x325D, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_KP_4, IBUS_KEY_parenright, 0x325E, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_KP_5, IBUS_KEY_parenright, 0x325F, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_KP_6, IBUS_KEY_parenright, 0x32B1, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_KP_7, IBUS_KEY_parenright, 0x32B2, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_KP_8, IBUS_KEY_parenright, 0x32B3, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_KP_9, IBUS_KEY_parenright, 0x32B4, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_0, IBUS_KEY_parenright, 0x32B5, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_1, IBUS_KEY_parenright, 0x32B6, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_2, IBUS_KEY_parenright, 0x32B7, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_3, IBUS_KEY_parenright, 0x32B8, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_4, IBUS_KEY_parenright, 0x32B9, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_5, IBUS_KEY_parenright, 0x32BA, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_6, IBUS_KEY_parenright, 0x32BB, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_7, IBUS_KEY_parenright, 0x32BC, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_8, IBUS_KEY_parenright, 0x32BD, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_9, IBUS_KEY_parenright, 0x32BE, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_KP_Space, IBUS_KEY_parenright, 0x32B7, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_KP_0, IBUS_KEY_parenright, 0x32B5, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_KP_1, IBUS_KEY_parenright, 0x32B6, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_KP_2, IBUS_KEY_parenright, 0x32B7, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_KP_3, IBUS_KEY_parenright, 0x32B8, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_KP_4, IBUS_KEY_parenright, 0x32B9, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_KP_5, IBUS_KEY_parenright, 0x32BA, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_KP_6, IBUS_KEY_parenright, 0x32BB, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_KP_7, IBUS_KEY_parenright, 0x32BC, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_KP_8, IBUS_KEY_parenright, 0x32BD, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_KP_9, IBUS_KEY_parenright, 0x32BE, 
--IBUS_KEY_parenleft, IBUS_KEY_KP_5, IBUS_KEY_KP_0, IBUS_KEY_parenright, 0x32BF, 
--IBUS_KEY_C, IBUS_KEY_C, IBUS_KEY_C, IBUS_KEY_P, 0x262D, 
--IBUS_KEY_U, IBUS_KEY_space, IBUS_KEY_comma, IBUS_KEY_E, 0x1E1C, 
--IBUS_KEY_U, IBUS_KEY_space, IBUS_KEY_comma, IBUS_KEY_e, 0x1E1D, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA, 0x1F8D, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA, 0x1F9D, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA, 0x1FAD, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha, 0x1F85, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta, 0x1F95, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega, 0x1FA5, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA, 0x1F8C, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA, 0x1F9C, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA, 0x1FAC, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha, 0x1F84, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_eta, 0x1F94, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_omega, 0x1FA4, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA, 0x1F8C, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA, 0x1F9C, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA, 0x1FAC, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha, 0x1F84, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta, 0x1F94, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega, 0x1FA4, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA, 0x1F8D, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA, 0x1F9D, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA, 0x1FAD, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha, 0x1F85, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta, 0x1F95, 
--IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega, 0x1FA5, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA, 0x1F8B, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA, 0x1F9B, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA, 0x1FAB, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha, 0x1F83, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta, 0x1F93, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega, 0x1FA3, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA, 0x1F8A, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA, 0x1F9A, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA, 0x1FAA, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha, 0x1F82, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_eta, 0x1F92, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_omega, 0x1FA2, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA, 0x1F8A, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA, 0x1F9A, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA, 0x1FAA, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha, 0x1F82, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta, 0x1F92, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega, 0x1FA2, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA, 0x1F8B, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA, 0x1F9B, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA, 0x1FAB, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha, 0x1F83, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta, 0x1F93, 
--IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega, 0x1FA3, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA, 0x1F8F, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA, 0x1F9F, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA, 0x1FAF, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha, 0x1F87, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta, 0x1F97, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega, 0x1FA7, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA, 0x1F8E, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA, 0x1F9E, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA, 0x1FAE, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha, 0x1F86, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_eta, 0x1F96, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_omega, 0x1FA6, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA, 0x1F8E, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA, 0x1F9E, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA, 0x1FAE, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha, 0x1F86, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta, 0x1F96, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega, 0x1FA6, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA, 0x1F8F, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA, 0x1F9F, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA, 0x1FAF, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha, 0x1F87, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta, 0x1F97, 
--IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega, 0x1FA7, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA, 0x1F8D, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA, 0x1F9D, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA, 0x1FAD, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha, 0x1F85, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta, 0x1F95, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega, 0x1FA5, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA, 0x1F8C, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA, 0x1F9C, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA, 0x1FAC, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha, 0x1F84, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_eta, 0x1F94, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_omega, 0x1FA4, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA, 0x1F8C, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA, 0x1F9C, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA, 0x1FAC, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha, 0x1F84, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta, 0x1F94, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega, 0x1FA4, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA, 0x1F8D, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA, 0x1F9D, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA, 0x1FAD, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha, 0x1F85, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta, 0x1F95, 
--IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega, 0x1FA5, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA, 0x1F8B, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA, 0x1F9B, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA, 0x1FAB, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha, 0x1F83, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta, 0x1F93, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega, 0x1FA3, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA, 0x1F8A, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA, 0x1F9A, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA, 0x1FAA, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha, 0x1F82, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_eta, 0x1F92, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_omega, 0x1FA2, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA, 0x1F8A, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA, 0x1F9A, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA, 0x1FAA, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha, 0x1F82, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta, 0x1F92, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega, 0x1FA2, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA, 0x1F8B, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA, 0x1F9B, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA, 0x1FAB, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha, 0x1F83, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta, 0x1F93, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega, 0x1FA3, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA, 0x1F8D, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA, 0x1F9D, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA, 0x1FAD, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha, 0x1F85, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta, 0x1F95, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega, 0x1FA5, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA, 0x1F8C, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA, 0x1F9C, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA, 0x1FAC, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha, 0x1F84, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_eta, 0x1F94, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_omega, 0x1FA4, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA, 0x1F8C, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA, 0x1F9C, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA, 0x1FAC, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha, 0x1F84, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta, 0x1F94, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega, 0x1FA4, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA, 0x1F8D, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA, 0x1F9D, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA, 0x1FAD, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha, 0x1F85, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta, 0x1F95, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega, 0x1FA5, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA, 0x1F8F, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA, 0x1F9F, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA, 0x1FAF, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha, 0x1F87, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta, 0x1F97, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega, 0x1FA7, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA, 0x1F8E, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA, 0x1F9E, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA, 0x1FAE, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha, 0x1F86, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_parenright, IBUS_KEY_Greek_eta, 0x1F96, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_parenright, IBUS_KEY_Greek_omega, 0x1FA6, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA, 0x1F8E, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA, 0x1F9E, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA, 0x1FAE, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha, 0x1F86, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta, 0x1F96, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega, 0x1FA6, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA, 0x1F8F, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA, 0x1F9F, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA, 0x1FAF, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha, 0x1F87, 
--IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta, 0x1F97, 
-+IBUS_KEY_Multi_key, 3952, 3952, 10495, 14203, 16083, 
-+IBUS_KEY_Greek_iota,  0x0390, 
-+IBUS_KEY_Greek_upsilon,  0x03B0, 
-+IBUS_KEY_space,  0x0060, 
-+IBUS_KEY_V,  0x01DB, 
-+IBUS_KEY_v,  0x01DC, 
-+IBUS_KEY_nobreakspace,  0x0300, 
-+IBUS_KEY_Abreve,  0x1EB0, 
-+IBUS_KEY_abreve,  0x1EB1, 
-+IBUS_KEY_Emacron,  0x1E14, 
-+IBUS_KEY_emacron,  0x1E15, 
-+IBUS_KEY_Omacron,  0x1E50, 
-+IBUS_KEY_omacron,  0x1E51, 
-+IBUS_KEY_Cyrillic_ie,  0x0450, 
-+IBUS_KEY_Cyrillic_i,  0x045D, 
-+IBUS_KEY_Cyrillic_IE,  0x0400, 
-+IBUS_KEY_Cyrillic_I,  0x040D, 
-+IBUS_KEY_Greek_iotadieresis,  0x1FD2, 
-+IBUS_KEY_Greek_upsilondieresis,  0x1FE2, 
-+IBUS_KEY_Greek_ALPHA,  0x1FBA, 
-+IBUS_KEY_Greek_EPSILON,  0x1FC8, 
-+IBUS_KEY_Greek_ETA,  0x1FCA, 
-+IBUS_KEY_Greek_IOTA,  0x1FDA, 
-+IBUS_KEY_Greek_OMICRON,  0x1FF8, 
-+IBUS_KEY_Greek_UPSILON,  0x1FEA, 
-+IBUS_KEY_Greek_OMEGA,  0x1FFA, 
-+IBUS_KEY_Greek_alpha,  0x1F70, 
-+IBUS_KEY_Greek_epsilon,  0x1F72, 
-+IBUS_KEY_Greek_eta,  0x1F74, 
-+IBUS_KEY_Greek_iota,  0x1F76, 
-+IBUS_KEY_Greek_omicron,  0x1F78, 
-+IBUS_KEY_Greek_upsilon,  0x1F7A, 
-+IBUS_KEY_Greek_omega,  0x1F7C, 
-+IBUS_KEY_dead_grave,  0x0060, 
-+IBUS_KEY_dead_diaeresis, IBUS_KEY_Greek_iota,  0x1FD2, 
-+IBUS_KEY_dead_diaeresis, IBUS_KEY_Greek_upsilon,  0x1FE2, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA,  0x1F0A, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_EPSILON,  0x1F1A, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA,  0x1F2A, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_IOTA,  0x1F3A, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMICRON,  0x1F4A, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA,  0x1F6A, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha,  0x1F02, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_epsilon,  0x1F12, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta,  0x1F22, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_iota,  0x1F32, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_omicron,  0x1F42, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_upsilon,  0x1F52, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega,  0x1F62, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA,  0x1F0B, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_EPSILON,  0x1F1B, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA,  0x1F2B, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_IOTA,  0x1F3B, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMICRON,  0x1F4B, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_UPSILON,  0x1F5B, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA,  0x1F6B, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha,  0x1F03, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_epsilon,  0x1F13, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta,  0x1F23, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_iota,  0x1F33, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omicron,  0x1F43, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_upsilon,  0x1F53, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega,  0x1F63, 
-+IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_U,  0x01DB, 
-+IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_u,  0x01DC, 
-+IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_Greek_iota,  0x1FD2, 
-+IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_Greek_upsilon,  0x1FE2, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA,  0x1F0B, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_EPSILON,  0x1F1B, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA,  0x1F2B, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_IOTA,  0x1F3B, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMICRON,  0x1F4B, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_UPSILON,  0x1F5B, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA,  0x1F6B, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha,  0x1F03, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_epsilon,  0x1F13, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta,  0x1F23, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_iota,  0x1F33, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_omicron,  0x1F43, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_upsilon,  0x1F53, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega,  0x1F63, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA,  0x1F0A, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_EPSILON,  0x1F1A, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA,  0x1F2A, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_IOTA,  0x1F3A, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_OMICRON,  0x1F4A, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA,  0x1F6A, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha,  0x1F02, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_epsilon,  0x1F12, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_eta,  0x1F22, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_iota,  0x1F32, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_omicron,  0x1F42, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_upsilon,  0x1F52, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_omega,  0x1F62, 
-+IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_O,  0x1EDC, 
-+IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_U,  0x1EEA, 
-+IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_o,  0x1EDD, 
-+IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_u,  0x1EEB, 
-+IBUS_KEY_Multi_key, IBUS_KEY_U, IBUS_KEY_A,  0x1EB0, 
-+IBUS_KEY_Multi_key, IBUS_KEY_U, IBUS_KEY_a,  0x1EB1, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_A,  0x1EA6, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_E,  0x1EC0, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_O,  0x1ED2, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_a,  0x1EA7, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_e,  0x1EC1, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_o,  0x1ED3, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_E,  0x1E14, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_O,  0x1E50, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_e,  0x1E15, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_o,  0x1E51, 
-+IBUS_KEY_Multi_key, IBUS_KEY_b, IBUS_KEY_A,  0x1EB0, 
-+IBUS_KEY_Multi_key, IBUS_KEY_b, IBUS_KEY_a,  0x1EB1, 
-+IBUS_KEY_Multi_key, IBUS_KEY_macron, IBUS_KEY_E,  0x1E14, 
-+IBUS_KEY_Multi_key, IBUS_KEY_macron, IBUS_KEY_O,  0x1E50, 
-+IBUS_KEY_Multi_key, IBUS_KEY_macron, IBUS_KEY_e,  0x1E15, 
-+IBUS_KEY_Multi_key, IBUS_KEY_macron, IBUS_KEY_o,  0x1E51, 
-+IBUS_KEY_space,  0x0027, 
-+IBUS_KEY_V,  0x01D7, 
-+IBUS_KEY_v,  0x01D8, 
-+IBUS_KEY_nobreakspace,  0x0301, 
-+IBUS_KEY_Abreve,  0x1EAE, 
-+IBUS_KEY_abreve,  0x1EAF, 
-+IBUS_KEY_Emacron,  0x1E16, 
-+IBUS_KEY_emacron,  0x1E17, 
-+IBUS_KEY_Utilde,  0x1E78, 
-+IBUS_KEY_omacron,  0x1E53, 
-+IBUS_KEY_utilde,  0x1E79, 
-+IBUS_KEY_Cyrillic_ghe,  0x0453, 
-+IBUS_KEY_Cyrillic_ka,  0x045C, 
-+IBUS_KEY_Cyrillic_GHE,  0x0403, 
-+IBUS_KEY_Cyrillic_KA,  0x040C, 
-+IBUS_KEY_Greek_iotadieresis,  0x0390, 
-+IBUS_KEY_Greek_upsilondieresis,  0x03B0, 
-+IBUS_KEY_Greek_ALPHA,  0x0386, 
-+IBUS_KEY_Greek_EPSILON,  0x0388, 
-+IBUS_KEY_Greek_ETA,  0x0389, 
-+IBUS_KEY_Greek_IOTA,  0x038A, 
-+IBUS_KEY_Greek_OMICRON,  0x038C, 
-+IBUS_KEY_Greek_UPSILON,  0x038E, 
-+IBUS_KEY_Greek_OMEGA,  0x038F, 
-+IBUS_KEY_Greek_alpha,  0x03AC, 
-+IBUS_KEY_Greek_epsilon,  0x03AD, 
-+IBUS_KEY_Greek_eta,  0x03AE, 
-+IBUS_KEY_Greek_iota,  0x03AF, 
-+IBUS_KEY_Greek_omicron,  0x03CC, 
-+IBUS_KEY_Greek_upsilon,  0x03CD, 
-+IBUS_KEY_Greek_omega,  0x03CE, 
-+IBUS_KEY_dead_acute,  0x00B4, 
-+IBUS_KEY_dead_diaeresis, IBUS_KEY_space,  0x0385, 
-+IBUS_KEY_dead_diaeresis, IBUS_KEY_Greek_iota,  0x0390, 
-+IBUS_KEY_dead_diaeresis, IBUS_KEY_Greek_upsilon,  0x03B0, 
-+IBUS_KEY_dead_stroke, IBUS_KEY_O,  0x01FE, 
-+IBUS_KEY_dead_stroke, IBUS_KEY_o,  0x01FF, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA,  0x1F0C, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_EPSILON,  0x1F1C, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA,  0x1F2C, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_IOTA,  0x1F3C, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMICRON,  0x1F4C, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA,  0x1F6C, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha,  0x1F04, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_epsilon,  0x1F14, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta,  0x1F24, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_iota,  0x1F34, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_omicron,  0x1F44, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_upsilon,  0x1F54, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega,  0x1F64, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA,  0x1F0D, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_EPSILON,  0x1F1D, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA,  0x1F2D, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_IOTA,  0x1F3D, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMICRON,  0x1F4D, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_UPSILON,  0x1F5D, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA,  0x1F6D, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha,  0x1F05, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_epsilon,  0x1F15, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta,  0x1F25, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_iota,  0x1F35, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omicron,  0x1F45, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_upsilon,  0x1F55, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega,  0x1F65, 
-+IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_I,  0x1E2E, 
-+IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_U,  0x01D7, 
-+IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_i,  0x1E2F, 
-+IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_u,  0x01D8, 
-+IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_Greek_iota,  0x0390, 
-+IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_Greek_upsilon,  0x03B0, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA,  0x1F0D, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_EPSILON,  0x1F1D, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA,  0x1F2D, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_IOTA,  0x1F3D, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMICRON,  0x1F4D, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_UPSILON,  0x1F5D, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA,  0x1F6D, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha,  0x1F05, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_epsilon,  0x1F15, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta,  0x1F25, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_iota,  0x1F35, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_omicron,  0x1F45, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_upsilon,  0x1F55, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega,  0x1F65, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA,  0x1F0C, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_EPSILON,  0x1F1C, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA,  0x1F2C, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_IOTA,  0x1F3C, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_OMICRON,  0x1F4C, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA,  0x1F6C, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha,  0x1F04, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_epsilon,  0x1F14, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_eta,  0x1F24, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_iota,  0x1F34, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_omicron,  0x1F44, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_upsilon,  0x1F54, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_omega,  0x1F64, 
-+IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_O,  0x1EDA, 
-+IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_U,  0x1EE8, 
-+IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_o,  0x1EDB, 
-+IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_u,  0x1EE9, 
-+IBUS_KEY_Multi_key, IBUS_KEY_comma, IBUS_KEY_C,  0x1E08, 
-+IBUS_KEY_Multi_key, IBUS_KEY_comma, IBUS_KEY_c,  0x1E09, 
-+IBUS_KEY_Multi_key, IBUS_KEY_slash, IBUS_KEY_O,  0x01FE, 
-+IBUS_KEY_Multi_key, IBUS_KEY_slash, IBUS_KEY_o,  0x01FF, 
-+IBUS_KEY_Multi_key, IBUS_KEY_U, IBUS_KEY_A,  0x1EAE, 
-+IBUS_KEY_Multi_key, IBUS_KEY_U, IBUS_KEY_a,  0x1EAF, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_A,  0x1EA4, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_E,  0x1EBE, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_O,  0x1ED0, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_a,  0x1EA5, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_e,  0x1EBF, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_o,  0x1ED1, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_E,  0x1E16, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_O,  0x1E52, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_e,  0x1E17, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_o,  0x1E53, 
-+IBUS_KEY_Multi_key, IBUS_KEY_b, IBUS_KEY_A,  0x1EAE, 
-+IBUS_KEY_Multi_key, IBUS_KEY_b, IBUS_KEY_a,  0x1EAF, 
-+IBUS_KEY_Multi_key, IBUS_KEY_o, IBUS_KEY_A,  0x01FA, 
-+IBUS_KEY_Multi_key, IBUS_KEY_o, IBUS_KEY_a,  0x01FB, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_O,  0x1E4C, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_U,  0x1E78, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_o,  0x1E4D, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_u,  0x1E79, 
-+IBUS_KEY_Multi_key, IBUS_KEY_macron, IBUS_KEY_E,  0x1E16, 
-+IBUS_KEY_Multi_key, IBUS_KEY_macron, IBUS_KEY_O,  0x1E52, 
-+IBUS_KEY_Multi_key, IBUS_KEY_macron, IBUS_KEY_e,  0x1E17, 
-+IBUS_KEY_Multi_key, IBUS_KEY_macron, IBUS_KEY_o,  0x1E53, 
-+IBUS_KEY_Multi_key, IBUS_KEY_cedilla, IBUS_KEY_C,  0x1E08, 
-+IBUS_KEY_Multi_key, IBUS_KEY_cedilla, IBUS_KEY_c,  0x1E09, 
-+IBUS_KEY_Multi_key, IBUS_KEY_KP_Divide, IBUS_KEY_O,  0x01FE, 
-+IBUS_KEY_Multi_key, IBUS_KEY_KP_Divide, IBUS_KEY_o,  0x01FF, 
-+IBUS_KEY_space,  0x005E, 
-+IBUS_KEY_parenleft,  0x207D, 
-+IBUS_KEY_parenright,  0x207E, 
-+IBUS_KEY_plus,  0x207A, 
-+IBUS_KEY_minus,  0x207B, 
-+IBUS_KEY_0,  0x2070, 
-+IBUS_KEY_1,  0x00B9, 
-+IBUS_KEY_2,  0x00B2, 
-+IBUS_KEY_3,  0x00B3, 
-+IBUS_KEY_4,  0x2074, 
-+IBUS_KEY_5,  0x2075, 
-+IBUS_KEY_6,  0x2076, 
-+IBUS_KEY_7,  0x2077, 
-+IBUS_KEY_8,  0x2078, 
-+IBUS_KEY_9,  0x2079, 
-+IBUS_KEY_equal,  0x207C, 
-+IBUS_KEY_nobreakspace,  0x0302, 
-+IBUS_KEY_Agrave,  0x1EA6, 
-+IBUS_KEY_Aacute,  0x1EA4, 
-+IBUS_KEY_Atilde,  0x1EAA, 
-+IBUS_KEY_Egrave,  0x1EC0, 
-+IBUS_KEY_Eacute,  0x1EBE, 
-+IBUS_KEY_Ograve,  0x1ED2, 
-+IBUS_KEY_Oacute,  0x1ED0, 
-+IBUS_KEY_Otilde,  0x1ED6, 
-+IBUS_KEY_agrave,  0x1EA7, 
-+IBUS_KEY_aacute,  0x1EA5, 
-+IBUS_KEY_atilde,  0x1EAB, 
-+IBUS_KEY_egrave,  0x1EC1, 
-+IBUS_KEY_eacute,  0x1EBF, 
-+IBUS_KEY_ograve,  0x1ED3, 
-+IBUS_KEY_oacute,  0x1ED1, 
-+IBUS_KEY_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_KEY_dead_circumflex,  0x005E, 
-+IBUS_KEY_KP_Space,  0x00B2, 
-+IBUS_KEY_KP_Add,  0x207A, 
-+IBUS_KEY_KP_0,  0x2070, 
-+IBUS_KEY_KP_1,  0x00B9, 
-+IBUS_KEY_KP_2,  0x00B2, 
-+IBUS_KEY_KP_3,  0x00B3, 
-+IBUS_KEY_KP_4,  0x2074, 
-+IBUS_KEY_KP_5,  0x2075, 
-+IBUS_KEY_KP_6,  0x2076, 
-+IBUS_KEY_KP_7,  0x2077, 
-+IBUS_KEY_KP_8,  0x2078, 
-+IBUS_KEY_KP_9,  0x2079, 
-+IBUS_KEY_KP_Equal,  0x207C, 
-+IBUS_KEY_Multi_key, IBUS_KEY_exclam, IBUS_KEY_A,  0x1EAC, 
-+IBUS_KEY_Multi_key, IBUS_KEY_exclam, IBUS_KEY_E,  0x1EC6, 
-+IBUS_KEY_Multi_key, IBUS_KEY_exclam, IBUS_KEY_O,  0x1ED8, 
-+IBUS_KEY_Multi_key, IBUS_KEY_exclam, IBUS_KEY_a,  0x1EAD, 
-+IBUS_KEY_Multi_key, IBUS_KEY_exclam, IBUS_KEY_e,  0x1EC7, 
-+IBUS_KEY_Multi_key, IBUS_KEY_exclam, IBUS_KEY_o,  0x1ED9, 
-+IBUS_KEY_Multi_key, IBUS_KEY_S, IBUS_KEY_M,  0x2120, 
-+IBUS_KEY_Multi_key, IBUS_KEY_S, IBUS_KEY_m,  0x2120, 
-+IBUS_KEY_Multi_key, IBUS_KEY_T, IBUS_KEY_M,  0x2122, 
-+IBUS_KEY_Multi_key, IBUS_KEY_T, IBUS_KEY_m,  0x2122, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_a,  0x00AA, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_h,  0x02B0, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_i,  0x2071, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_j,  0x02B2, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_l,  0x02E1, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_n,  0x207F, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_o,  0x00BA, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_r,  0x02B3, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_s,  0x02E2, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_w,  0x02B7, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_x,  0x02E3, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_y,  0x02B8, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underscore, 0x0263,  0x02E0, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underscore, 0x0266,  0x02B1, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underscore, 0x0279,  0x02B4, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underscore, 0x027B,  0x02B5, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underscore, 0x0281,  0x02B6, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underscore, 0x0295,  0x02E4, 
-+IBUS_KEY_Multi_key, IBUS_KEY_s, IBUS_KEY_M,  0x2120, 
-+IBUS_KEY_Multi_key, IBUS_KEY_s, IBUS_KEY_m,  0x2120, 
-+IBUS_KEY_Multi_key, IBUS_KEY_t, IBUS_KEY_M,  0x2122, 
-+IBUS_KEY_Multi_key, IBUS_KEY_t, IBUS_KEY_m,  0x2122, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underbar, IBUS_KEY_a,  0x00AA, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underbar, IBUS_KEY_h,  0x02B0, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underbar, IBUS_KEY_i,  0x2071, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underbar, IBUS_KEY_j,  0x02B2, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underbar, IBUS_KEY_l,  0x02E1, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underbar, IBUS_KEY_n,  0x207F, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underbar, IBUS_KEY_o,  0x00BA, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underbar, IBUS_KEY_r,  0x02B3, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underbar, IBUS_KEY_s,  0x02E2, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underbar, IBUS_KEY_w,  0x02B7, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underbar, IBUS_KEY_x,  0x02E3, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underbar, IBUS_KEY_y,  0x02B8, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underbar, 0x0263,  0x02E0, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underbar, 0x0266,  0x02B1, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underbar, 0x0279,  0x02B4, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underbar, 0x027B,  0x02B5, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underbar, 0x0281,  0x02B6, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underbar, 0x0295,  0x02E4, 
-+IBUS_KEY_space,  0x007E, 
-+IBUS_KEY_less,  0x2272, 
-+IBUS_KEY_equal,  0x2243, 
-+IBUS_KEY_greater,  0x2273, 
-+IBUS_KEY_nobreakspace,  0x0303, 
-+IBUS_KEY_Oacute,  0x1E4C, 
-+IBUS_KEY_Odiaeresis,  0x1E4E, 
-+IBUS_KEY_Uacute,  0x1E78, 
-+IBUS_KEY_oacute,  0x1E4D, 
-+IBUS_KEY_odiaeresis,  0x1E4F, 
-+IBUS_KEY_uacute,  0x1E79, 
-+IBUS_KEY_Abreve,  0x1EB4, 
-+IBUS_KEY_abreve,  0x1EB5, 
-+IBUS_KEY_Omacron,  0x022C, 
-+IBUS_KEY_omacron,  0x022D, 
-+IBUS_KEY_Greek_iotadieresis,  0x1FD7, 
-+IBUS_KEY_Greek_upsilondieresis,  0x1FE7, 
-+IBUS_KEY_Greek_alpha,  0x1FB6, 
-+IBUS_KEY_Greek_eta,  0x1FC6, 
-+IBUS_KEY_Greek_iota,  0x1FD6, 
-+IBUS_KEY_Greek_upsilon,  0x1FE6, 
-+IBUS_KEY_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_KEY_dead_tilde,  0x007E, 
-+IBUS_KEY_dead_diaeresis, IBUS_KEY_Greek_iota,  0x1FD7, 
-+IBUS_KEY_dead_diaeresis, IBUS_KEY_Greek_upsilon,  0x1FE7, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA,  0x1F0E, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA,  0x1F2E, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_IOTA,  0x1F3E, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA,  0x1F6E, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha,  0x1F06, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta,  0x1F26, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_iota,  0x1F36, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_upsilon,  0x1F56, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega,  0x1F66, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA,  0x1F0F, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA,  0x1F2F, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_IOTA,  0x1F3F, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_UPSILON,  0x1F5F, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA,  0x1F6F, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha,  0x1F07, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta,  0x1F27, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_iota,  0x1F37, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_upsilon,  0x1F57, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega,  0x1F67, 
-+IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_Greek_iota,  0x1FD7, 
-+IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_Greek_upsilon,  0x1FE7, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA,  0x1F0F, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA,  0x1F2F, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_IOTA,  0x1F3F, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_UPSILON,  0x1F5F, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA,  0x1F6F, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha,  0x1F07, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta,  0x1F27, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_iota,  0x1F37, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_upsilon,  0x1F57, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega,  0x1F67, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA,  0x1F0E, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA,  0x1F2E, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_IOTA,  0x1F3E, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA,  0x1F6E, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha,  0x1F06, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_eta,  0x1F26, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_iota,  0x1F36, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_upsilon,  0x1F56, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_omega,  0x1F66, 
-+IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_O,  0x1EE0, 
-+IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_U,  0x1EEE, 
-+IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_o,  0x1EE1, 
-+IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_u,  0x1EEF, 
-+IBUS_KEY_Multi_key, IBUS_KEY_U, IBUS_KEY_A,  0x1EB4, 
-+IBUS_KEY_Multi_key, IBUS_KEY_U, IBUS_KEY_a,  0x1EB5, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_A,  0x1EAA, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_E,  0x1EC4, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_O,  0x1ED6, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_a,  0x1EAB, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_e,  0x1EC5, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_o,  0x1ED7, 
-+IBUS_KEY_Multi_key, IBUS_KEY_b, IBUS_KEY_A,  0x1EB4, 
-+IBUS_KEY_Multi_key, IBUS_KEY_b, IBUS_KEY_a,  0x1EB5, 
-+IBUS_KEY_space,  0x00AF, 
-+IBUS_KEY_V,  0x01D5, 
-+IBUS_KEY_v,  0x01D6, 
-+IBUS_KEY_nobreakspace,  0x0304, 
-+IBUS_KEY_Egrave,  0x1E14, 
-+IBUS_KEY_Eacute,  0x1E16, 
-+IBUS_KEY_Ograve,  0x1E50, 
-+IBUS_KEY_Oacute,  0x1E52, 
-+IBUS_KEY_egrave,  0x1E15, 
-+IBUS_KEY_eacute,  0x1E17, 
-+IBUS_KEY_ograve,  0x1E51, 
-+IBUS_KEY_oacute,  0x1E53, 
-+IBUS_KEY_Cyrillic_i,  0x04E3, 
-+IBUS_KEY_Cyrillic_u,  0x04EF, 
-+IBUS_KEY_Cyrillic_I,  0x04E2, 
-+IBUS_KEY_Cyrillic_U,  0x04EE, 
-+IBUS_KEY_Greek_ALPHA,  0x1FB9, 
-+IBUS_KEY_Greek_IOTA,  0x1FD9, 
-+IBUS_KEY_Greek_UPSILON,  0x1FE9, 
-+IBUS_KEY_Greek_alpha,  0x1FB1, 
-+IBUS_KEY_Greek_iota,  0x1FD1, 
-+IBUS_KEY_Greek_upsilon,  0x1FE1, 
-+IBUS_KEY_dead_macron,  0x00AF, 
-+IBUS_KEY_dead_greek, IBUS_KEY_A,  0x1FB9, 
-+IBUS_KEY_dead_greek, IBUS_KEY_I,  0x1FD9, 
-+IBUS_KEY_dead_greek, IBUS_KEY_U,  0x1FE9, 
-+IBUS_KEY_dead_greek, IBUS_KEY_a,  0x1FB1, 
-+IBUS_KEY_dead_greek, IBUS_KEY_i,  0x1FD1, 
-+IBUS_KEY_dead_greek, IBUS_KEY_u,  0x1FE1, 
-+IBUS_KEY_Multi_key, IBUS_KEY_exclam, IBUS_KEY_L,  0x1E38, 
-+IBUS_KEY_Multi_key, IBUS_KEY_exclam, IBUS_KEY_R,  0x1E5C, 
-+IBUS_KEY_Multi_key, IBUS_KEY_exclam, IBUS_KEY_l,  0x1E39, 
-+IBUS_KEY_Multi_key, IBUS_KEY_exclam, IBUS_KEY_r,  0x1E5D, 
-+IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_A,  0x01DE, 
-+IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_O,  0x022A, 
-+IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_U,  0x01D5, 
-+IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_a,  0x01DF, 
-+IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_o,  0x022B, 
-+IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_u,  0x01D6, 
-+IBUS_KEY_Multi_key, IBUS_KEY_period, IBUS_KEY_A,  0x01E0, 
-+IBUS_KEY_Multi_key, IBUS_KEY_period, IBUS_KEY_O,  0x0230, 
-+IBUS_KEY_Multi_key, IBUS_KEY_period, IBUS_KEY_a,  0x01E1, 
-+IBUS_KEY_Multi_key, IBUS_KEY_period, IBUS_KEY_o,  0x0231, 
-+IBUS_KEY_Multi_key, IBUS_KEY_semicolon, IBUS_KEY_O,  0x01EC, 
-+IBUS_KEY_Multi_key, IBUS_KEY_semicolon, IBUS_KEY_o,  0x01ED, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_O,  0x022C, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_o,  0x022D, 
-+IBUS_KEY_space,  0x02D8, 
-+IBUS_KEY_nobreakspace,  0x0306, 
-+IBUS_KEY_Agrave,  0x1EB0, 
-+IBUS_KEY_Aacute,  0x1EAE, 
-+IBUS_KEY_Atilde,  0x1EB4, 
-+IBUS_KEY_agrave,  0x1EB1, 
-+IBUS_KEY_aacute,  0x1EAF, 
-+IBUS_KEY_atilde,  0x1EB5, 
-+IBUS_KEY_Cyrillic_a,  0x04D1, 
-+IBUS_KEY_Cyrillic_ie,  0x04D7, 
-+IBUS_KEY_Cyrillic_i,  0x0439, 
-+IBUS_KEY_Cyrillic_u,  0x045E, 
-+IBUS_KEY_Cyrillic_zhe,  0x04C2, 
-+IBUS_KEY_Cyrillic_A,  0x04D0, 
-+IBUS_KEY_Cyrillic_IE,  0x04D6, 
-+IBUS_KEY_Cyrillic_I,  0x0419, 
-+IBUS_KEY_Cyrillic_U,  0x040E, 
-+IBUS_KEY_Cyrillic_ZHE,  0x04C1, 
-+IBUS_KEY_Greek_ALPHA,  0x1FB8, 
-+IBUS_KEY_Greek_IOTA,  0x1FD8, 
-+IBUS_KEY_Greek_UPSILON,  0x1FE8, 
-+IBUS_KEY_Greek_alpha,  0x1FB0, 
-+IBUS_KEY_Greek_iota,  0x1FD0, 
-+IBUS_KEY_Greek_upsilon,  0x1FE0, 
-+IBUS_KEY_dead_breve,  0x02D8, 
-+IBUS_KEY_Multi_key, IBUS_KEY_exclam, IBUS_KEY_A,  0x1EB6, 
-+IBUS_KEY_Multi_key, IBUS_KEY_exclam, IBUS_KEY_a,  0x1EB7, 
-+IBUS_KEY_Multi_key, IBUS_KEY_comma, IBUS_KEY_E,  0x1E1C, 
-+IBUS_KEY_Multi_key, IBUS_KEY_comma, IBUS_KEY_e,  0x1E1D, 
-+IBUS_KEY_Multi_key, IBUS_KEY_cedilla, IBUS_KEY_E,  0x1E1C, 
-+IBUS_KEY_Multi_key, IBUS_KEY_cedilla, IBUS_KEY_e,  0x1E1D, 
-+IBUS_KEY_space,  0x02D9, 
-+IBUS_KEY_L,  0x013F, 
-+IBUS_KEY_i,  0x0131, 
-+IBUS_KEY_j,  0x0237, 
-+IBUS_KEY_l,  0x0140, 
-+IBUS_KEY_nobreakspace,  0x0307, 
-+IBUS_KEY_Sacute,  0x1E64, 
-+IBUS_KEY_Scaron,  0x1E66, 
-+IBUS_KEY_sacute,  0x1E65, 
-+IBUS_KEY_scaron,  0x1E67, 
-+IBUS_KEY_Amacron,  0x01E0, 
-+IBUS_KEY_Omacron,  0x0230, 
-+IBUS_KEY_amacron,  0x01E1, 
-+IBUS_KEY_omacron,  0x0231, 
-+IBUS_KEY_dead_abovedot,  0x02D9, 
-+IBUS_KEY_dead_stroke, IBUS_KEY_j,  0x025F, 
-+IBUS_KEY_Multi_key, IBUS_KEY_exclam, IBUS_KEY_S,  0x1E68, 
-+IBUS_KEY_Multi_key, IBUS_KEY_exclam, IBUS_KEY_s,  0x1E69, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_S,  0x1E64, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_s,  0x1E65, 
-+IBUS_KEY_Multi_key, IBUS_KEY_c, IBUS_KEY_S,  0x1E66, 
-+IBUS_KEY_Multi_key, IBUS_KEY_c, IBUS_KEY_s,  0x1E67, 
-+IBUS_KEY_Multi_key, IBUS_KEY_f, IBUS_KEY_s,  0x1E9B, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_S,  0x1E64, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_s,  0x1E65, 
-+IBUS_KEY_space,  0x0022, 
-+IBUS_KEY_apostrophe,  0x0344, 
-+IBUS_KEY_nobreakspace,  0x0308, 
-+IBUS_KEY_acute,  0x0344, 
-+IBUS_KEY_Iacute,  0x1E2E, 
-+IBUS_KEY_Ugrave,  0x01DB, 
-+IBUS_KEY_Uacute,  0x01D7, 
-+IBUS_KEY_iacute,  0x1E2F, 
-+IBUS_KEY_ugrave,  0x01DC, 
-+IBUS_KEY_uacute,  0x01D8, 
-+0x01D3,  0x01D9, 
-+0x01D4,  0x01DA, 
-+IBUS_KEY_Amacron,  0x01DE, 
-+IBUS_KEY_Umacron,  0x1E7A, 
-+IBUS_KEY_amacron,  0x01DF, 
-+IBUS_KEY_omacron,  0x022B, 
-+IBUS_KEY_umacron,  0x1E7B, 
-+IBUS_KEY_Ukrainian_i,  0x0457, 
-+IBUS_KEY_Ukrainian_I,  0x0407, 
-+IBUS_KEY_Cyrillic_a,  0x04D3, 
-+IBUS_KEY_Cyrillic_ie,  0x0451, 
-+IBUS_KEY_Cyrillic_i,  0x04E5, 
-+IBUS_KEY_Cyrillic_o,  0x04E7, 
-+IBUS_KEY_Cyrillic_u,  0x04F1, 
-+IBUS_KEY_Cyrillic_zhe,  0x04DD, 
-+IBUS_KEY_Cyrillic_yeru,  0x04F9, 
-+IBUS_KEY_Cyrillic_ze,  0x04DF, 
-+IBUS_KEY_Cyrillic_e,  0x04ED, 
-+IBUS_KEY_Cyrillic_che,  0x04F5, 
-+IBUS_KEY_Cyrillic_A,  0x04D2, 
-+IBUS_KEY_Cyrillic_IE,  0x0401, 
-+IBUS_KEY_Cyrillic_I,  0x04E4, 
-+IBUS_KEY_Cyrillic_O,  0x04E6, 
-+IBUS_KEY_Cyrillic_U,  0x04F0, 
-+IBUS_KEY_Cyrillic_ZHE,  0x04DC, 
-+IBUS_KEY_Cyrillic_YERU,  0x04F8, 
-+IBUS_KEY_Cyrillic_ZE,  0x04DE, 
-+IBUS_KEY_Cyrillic_E,  0x04EC, 
-+IBUS_KEY_Cyrillic_CHE,  0x04F4, 
-+IBUS_KEY_Greek_IOTA,  0x03AA, 
-+IBUS_KEY_Greek_UPSILON,  0x03AB, 
-+IBUS_KEY_Greek_iota,  0x03CA, 
-+IBUS_KEY_Greek_upsilon,  0x03CB, 
-+IBUS_KEY_dead_diaeresis,  0x00A8, 
-+IBUS_KEY_dead_acute, IBUS_KEY_space,  0x0385, 
-+IBUS_KEY_dead_acute, IBUS_KEY_Greek_iota,  0x0390, 
-+IBUS_KEY_dead_acute, IBUS_KEY_Greek_upsilon,  0x03B0, 
-+IBUS_KEY_dead_belowdiaeresis, IBUS_KEY_equal,  0x2A77, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_U,  0x1E7A, 
-+IBUS_KEY_Multi_key, IBUS_KEY_underscore, IBUS_KEY_u,  0x1E7B, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_O,  0x1E4E, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_o,  0x1E4F, 
-+IBUS_KEY_Multi_key, IBUS_KEY_macron, IBUS_KEY_U,  0x1E7A, 
-+IBUS_KEY_Multi_key, IBUS_KEY_macron, IBUS_KEY_u,  0x1E7B, 
-+IBUS_KEY_space,  0x00B0, 
-+IBUS_KEY_nobreakspace,  0x030A, 
-+IBUS_KEY_Aacute,  0x01FA, 
-+IBUS_KEY_aacute,  0x01FB, 
-+IBUS_KEY_dead_abovering,  0x00B0, 
-+IBUS_KEY_space,  0x02DD, 
-+IBUS_KEY_nobreakspace,  0x030B, 
-+IBUS_KEY_Cyrillic_u,  0x04F3, 
-+IBUS_KEY_Cyrillic_U,  0x04F2, 
-+IBUS_KEY_dead_doubleacute,  0x02DD, 
-+IBUS_KEY_space,  0x02C7, 
-+IBUS_KEY_parenleft,  0x208D, 
-+IBUS_KEY_parenright,  0x208E, 
-+IBUS_KEY_plus,  0x208A, 
-+IBUS_KEY_minus,  0x208B, 
-+IBUS_KEY_0,  0x2080, 
-+IBUS_KEY_1,  0x2081, 
-+IBUS_KEY_2,  0x2082, 
-+IBUS_KEY_3,  0x2083, 
-+IBUS_KEY_4,  0x2084, 
-+IBUS_KEY_5,  0x2085, 
-+IBUS_KEY_6,  0x2086, 
-+IBUS_KEY_7,  0x2087, 
-+IBUS_KEY_8,  0x2088, 
-+IBUS_KEY_9,  0x2089, 
-+IBUS_KEY_equal,  0x208C, 
-+IBUS_KEY_V,  0x01D9, 
-+IBUS_KEY_v,  0x01DA, 
-+IBUS_KEY_nobreakspace,  0x030C, 
-+0x01F2,  0x01C5, 
-+IBUS_KEY_dead_caron,  0x02C7, 
-+IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_U,  0x01D9, 
-+IBUS_KEY_Multi_key, IBUS_KEY_quotedbl, IBUS_KEY_u,  0x01DA, 
-+IBUS_KEY_space,  0x00B8, 
-+IBUS_KEY_nobreakspace,  0x0327, 
-+IBUS_KEY_cent,  0x20B5, 
-+IBUS_KEY_Cacute,  0x1E08, 
-+IBUS_KEY_cacute,  0x1E09, 
-+IBUS_KEY_dead_cedilla,  0x00B8, 
-+IBUS_KEY_dead_currency, IBUS_KEY_C,  0x20B5, 
-+IBUS_KEY_dead_currency, IBUS_KEY_c,  0x20B5, 
-+IBUS_KEY_space,  0x02DB, 
-+IBUS_KEY_nobreakspace,  0x0328, 
-+IBUS_KEY_Omacron,  0x01EC, 
-+IBUS_KEY_omacron,  0x01ED, 
-+IBUS_KEY_dead_ogonek,  0x02DB, 
-+IBUS_KEY_space,  0x037A, 
-+IBUS_KEY_Greek_alphaaccent,  0x1FB4, 
-+IBUS_KEY_Greek_etaaccent,  0x1FC4, 
-+IBUS_KEY_Greek_omegaaccent,  0x1FF4, 
-+IBUS_KEY_Greek_ALPHA,  0x1FBC, 
-+IBUS_KEY_Greek_ETA,  0x1FCC, 
-+IBUS_KEY_Greek_OMEGA,  0x1FFC, 
-+IBUS_KEY_Greek_alpha,  0x1FB3, 
-+IBUS_KEY_Greek_eta,  0x1FC3, 
-+IBUS_KEY_Greek_omega,  0x1FF3, 
-+IBUS_KEY_dead_iota,  0x037A, 
-+IBUS_KEY_dead_grave, IBUS_KEY_Greek_alpha,  0x1FB2, 
-+IBUS_KEY_dead_grave, IBUS_KEY_Greek_eta,  0x1FC2, 
-+IBUS_KEY_dead_grave, IBUS_KEY_Greek_omega,  0x1FF2, 
-+IBUS_KEY_dead_acute, IBUS_KEY_Greek_alpha,  0x1FB4, 
-+IBUS_KEY_dead_acute, IBUS_KEY_Greek_eta,  0x1FC4, 
-+IBUS_KEY_dead_acute, IBUS_KEY_Greek_omega,  0x1FF4, 
-+IBUS_KEY_dead_tilde, IBUS_KEY_Greek_alpha,  0x1FB7, 
-+IBUS_KEY_dead_tilde, IBUS_KEY_Greek_eta,  0x1FC7, 
-+IBUS_KEY_dead_tilde, IBUS_KEY_Greek_omega,  0x1FF7, 
-+IBUS_KEY_dead_tilde, 0x1F00,  0x1F86, 
-+IBUS_KEY_dead_tilde, 0x1F01,  0x1F87, 
-+IBUS_KEY_dead_tilde, 0x1F08,  0x1F8E, 
-+IBUS_KEY_dead_tilde, 0x1F09,  0x1F8F, 
-+IBUS_KEY_dead_tilde, 0x1F20,  0x1F96, 
-+IBUS_KEY_dead_tilde, 0x1F21,  0x1F97, 
-+IBUS_KEY_dead_tilde, 0x1F28,  0x1F9E, 
-+IBUS_KEY_dead_tilde, 0x1F29,  0x1F9F, 
-+IBUS_KEY_dead_tilde, 0x1F60,  0x1FA6, 
-+IBUS_KEY_dead_tilde, 0x1F61,  0x1FA7, 
-+IBUS_KEY_dead_tilde, 0x1F68,  0x1FAE, 
-+IBUS_KEY_dead_tilde, 0x1F69,  0x1FAF, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA,  0x1F88, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA,  0x1F98, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA,  0x1FA8, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha,  0x1F80, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta,  0x1F90, 
-+IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega,  0x1FA0, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA,  0x1F89, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA,  0x1F99, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA,  0x1FA9, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha,  0x1F81, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta,  0x1F91, 
-+IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega,  0x1FA1, 
-+IBUS_KEY_dead_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA,  0x1F8A, 
-+IBUS_KEY_dead_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA,  0x1F9A, 
-+IBUS_KEY_dead_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA,  0x1FAA, 
-+IBUS_KEY_dead_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha,  0x1F82, 
-+IBUS_KEY_dead_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta,  0x1F92, 
-+IBUS_KEY_dead_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega,  0x1FA2, 
-+IBUS_KEY_dead_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA,  0x1F8B, 
-+IBUS_KEY_dead_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA,  0x1F9B, 
-+IBUS_KEY_dead_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA,  0x1FAB, 
-+IBUS_KEY_dead_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha,  0x1F83, 
-+IBUS_KEY_dead_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta,  0x1F93, 
-+IBUS_KEY_dead_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega,  0x1FA3, 
-+IBUS_KEY_dead_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA,  0x1F8C, 
-+IBUS_KEY_dead_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA,  0x1F9C, 
-+IBUS_KEY_dead_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA,  0x1FAC, 
-+IBUS_KEY_dead_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha,  0x1F84, 
-+IBUS_KEY_dead_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta,  0x1F94, 
-+IBUS_KEY_dead_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega,  0x1FA4, 
-+IBUS_KEY_dead_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA,  0x1F8D, 
-+IBUS_KEY_dead_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA,  0x1F9D, 
-+IBUS_KEY_dead_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA,  0x1FAD, 
-+IBUS_KEY_dead_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha,  0x1F85, 
-+IBUS_KEY_dead_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta,  0x1F95, 
-+IBUS_KEY_dead_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega,  0x1FA5, 
-+IBUS_KEY_dead_tilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA,  0x1F8E, 
-+IBUS_KEY_dead_tilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA,  0x1F9E, 
-+IBUS_KEY_dead_tilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA,  0x1FAE, 
-+IBUS_KEY_dead_tilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha,  0x1F86, 
-+IBUS_KEY_dead_tilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta,  0x1F96, 
-+IBUS_KEY_dead_tilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega,  0x1FA6, 
-+IBUS_KEY_dead_tilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA,  0x1F8F, 
-+IBUS_KEY_dead_tilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA,  0x1F9F, 
-+IBUS_KEY_dead_tilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA,  0x1FAF, 
-+IBUS_KEY_dead_tilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha,  0x1F87, 
-+IBUS_KEY_dead_tilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta,  0x1F97, 
-+IBUS_KEY_dead_tilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega,  0x1FA7, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_Greek_alpha,  0x1FB4, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_Greek_eta,  0x1FC4, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_Greek_omega,  0x1FF4, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, 0x1F00,  0x1F84, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, 0x1F01,  0x1F85, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, 0x1F08,  0x1F8C, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, 0x1F09,  0x1F8D, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, 0x1F20,  0x1F94, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, 0x1F21,  0x1F95, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, 0x1F28,  0x1F9C, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, 0x1F29,  0x1F9D, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, 0x1F60,  0x1FA4, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, 0x1F61,  0x1FA5, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, 0x1F68,  0x1FAC, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, 0x1F69,  0x1FAD, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA,  0x1F89, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA,  0x1F99, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA,  0x1FA9, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha,  0x1F81, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta,  0x1F91, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega,  0x1FA1, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA,  0x1F88, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA,  0x1F98, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA,  0x1FA8, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha,  0x1F80, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_eta,  0x1F90, 
-+IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_omega,  0x1FA0, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_Greek_alpha,  0x1FB2, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_Greek_eta,  0x1FC2, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_Greek_omega,  0x1FF2, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, 0x1F00,  0x1F82, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, 0x1F01,  0x1F83, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, 0x1F08,  0x1F8A, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, 0x1F09,  0x1F8B, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, 0x1F20,  0x1F92, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, 0x1F21,  0x1F93, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, 0x1F28,  0x1F9A, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, 0x1F29,  0x1F9B, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, 0x1F60,  0x1FA2, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, 0x1F61,  0x1FA3, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, 0x1F68,  0x1FAA, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, 0x1F69,  0x1FAB, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_Greek_alpha,  0x1FB7, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_Greek_eta,  0x1FC7, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_Greek_omega,  0x1FF7, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, 0x1F00,  0x1F86, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, 0x1F01,  0x1F87, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, 0x1F08,  0x1F8E, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, 0x1F09,  0x1F8F, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, 0x1F20,  0x1F96, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, 0x1F21,  0x1F97, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, 0x1F28,  0x1F9E, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, 0x1F29,  0x1F9F, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, 0x1F60,  0x1FA6, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, 0x1F61,  0x1FA7, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, 0x1F68,  0x1FAE, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, 0x1F69,  0x1FAF, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_Greek_alpha,  0x1FB4, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_Greek_eta,  0x1FC4, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_Greek_omega,  0x1FF4, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, 0x1F00,  0x1F84, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, 0x1F01,  0x1F85, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, 0x1F08,  0x1F8C, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, 0x1F09,  0x1F8D, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, 0x1F20,  0x1F94, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, 0x1F21,  0x1F95, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, 0x1F28,  0x1F9C, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, 0x1F29,  0x1F9D, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, 0x1F60,  0x1FA4, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, 0x1F61,  0x1FA5, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, 0x1F68,  0x1FAC, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, 0x1F69,  0x1FAD, 
-+IBUS_KEY_dead_grave, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA,  0x1F8B, 
-+IBUS_KEY_dead_grave, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA,  0x1F9B, 
-+IBUS_KEY_dead_grave, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA,  0x1FAB, 
-+IBUS_KEY_dead_grave, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha,  0x1F83, 
-+IBUS_KEY_dead_grave, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta,  0x1F93, 
-+IBUS_KEY_dead_grave, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega,  0x1FA3, 
-+IBUS_KEY_dead_grave, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA,  0x1F8A, 
-+IBUS_KEY_dead_grave, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA,  0x1F9A, 
-+IBUS_KEY_dead_grave, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA,  0x1FAA, 
-+IBUS_KEY_dead_grave, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha,  0x1F82, 
-+IBUS_KEY_dead_grave, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_eta,  0x1F92, 
-+IBUS_KEY_dead_grave, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_omega,  0x1FA2, 
-+IBUS_KEY_dead_acute, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA,  0x1F8D, 
-+IBUS_KEY_dead_acute, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA,  0x1F9D, 
-+IBUS_KEY_dead_acute, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA,  0x1FAD, 
-+IBUS_KEY_dead_acute, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha,  0x1F85, 
-+IBUS_KEY_dead_acute, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta,  0x1F95, 
-+IBUS_KEY_dead_acute, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega,  0x1FA5, 
-+IBUS_KEY_dead_acute, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA,  0x1F8C, 
-+IBUS_KEY_dead_acute, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA,  0x1F9C, 
-+IBUS_KEY_dead_acute, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA,  0x1FAC, 
-+IBUS_KEY_dead_acute, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha,  0x1F84, 
-+IBUS_KEY_dead_acute, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_eta,  0x1F94, 
-+IBUS_KEY_dead_acute, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_omega,  0x1FA4, 
-+IBUS_KEY_dead_tilde, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA,  0x1F8F, 
-+IBUS_KEY_dead_tilde, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA,  0x1F9F, 
-+IBUS_KEY_dead_tilde, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA,  0x1FAF, 
-+IBUS_KEY_dead_tilde, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha,  0x1F87, 
-+IBUS_KEY_dead_tilde, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta,  0x1F97, 
-+IBUS_KEY_dead_tilde, IBUS_KEY_Multi_key, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega,  0x1FA7, 
-+IBUS_KEY_dead_tilde, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA,  0x1F8E, 
-+IBUS_KEY_dead_tilde, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA,  0x1F9E, 
-+IBUS_KEY_dead_tilde, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA,  0x1FAE, 
-+IBUS_KEY_dead_tilde, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha,  0x1F86, 
-+IBUS_KEY_dead_tilde, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_eta,  0x1F96, 
-+IBUS_KEY_dead_tilde, IBUS_KEY_Multi_key, IBUS_KEY_parenright, IBUS_KEY_Greek_omega,  0x1FA6, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA,  0x1F8D, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA,  0x1F9D, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA,  0x1FAD, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha,  0x1F85, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta,  0x1F95, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega,  0x1FA5, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA,  0x1F8C, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA,  0x1F9C, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA,  0x1FAC, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha,  0x1F84, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_eta,  0x1F94, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_omega,  0x1FA4, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA,  0x1F8C, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA,  0x1F9C, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA,  0x1FAC, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha,  0x1F84, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta,  0x1F94, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega,  0x1FA4, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA,  0x1F8D, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA,  0x1F9D, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA,  0x1FAD, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha,  0x1F85, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta,  0x1F95, 
-+IBUS_KEY_Multi_key, IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega,  0x1FA5, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA,  0x1F8B, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA,  0x1F9B, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA,  0x1FAB, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha,  0x1F83, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta,  0x1F93, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega,  0x1FA3, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA,  0x1F8A, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA,  0x1F9A, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA,  0x1FAA, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha,  0x1F82, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_eta,  0x1F92, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_omega,  0x1FA2, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA,  0x1F8A, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA,  0x1F9A, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA,  0x1FAA, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha,  0x1F82, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta,  0x1F92, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega,  0x1FA2, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA,  0x1F8B, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA,  0x1F9B, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA,  0x1FAB, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha,  0x1F83, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta,  0x1F93, 
-+IBUS_KEY_Multi_key, IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega,  0x1FA3, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA,  0x1F8F, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA,  0x1F9F, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA,  0x1FAF, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha,  0x1F87, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta,  0x1F97, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega,  0x1FA7, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA,  0x1F8E, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA,  0x1F9E, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA,  0x1FAE, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha,  0x1F86, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_eta,  0x1F96, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_omega,  0x1FA6, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA,  0x1F8E, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA,  0x1F9E, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA,  0x1FAE, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha,  0x1F86, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta,  0x1F96, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega,  0x1FA6, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA,  0x1F8F, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA,  0x1F9F, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA,  0x1FAF, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha,  0x1F87, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta,  0x1F97, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega,  0x1FA7, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA,  0x1F8D, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA,  0x1F9D, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA,  0x1FAD, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha,  0x1F85, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta,  0x1F95, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega,  0x1FA5, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA,  0x1F8C, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA,  0x1F9C, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA,  0x1FAC, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha,  0x1F84, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_eta,  0x1F94, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_omega,  0x1FA4, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA,  0x1F8C, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA,  0x1F9C, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA,  0x1FAC, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha,  0x1F84, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta,  0x1F94, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega,  0x1FA4, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA,  0x1F8D, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA,  0x1F9D, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA,  0x1FAD, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha,  0x1F85, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta,  0x1F95, 
-+IBUS_KEY_Multi_key, IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega,  0x1FA5, 
-+IBUS_KEY_kana_WO,  0x30FA, 
-+IBUS_KEY_kana_U,  0x30F4, 
-+IBUS_KEY_kana_KA,  0x30AC, 
-+IBUS_KEY_kana_KI,  0x30AE, 
-+IBUS_KEY_kana_KU,  0x30B0, 
-+IBUS_KEY_kana_KE,  0x30B2, 
-+IBUS_KEY_kana_KO,  0x30B4, 
-+IBUS_KEY_kana_SA,  0x30B6, 
-+IBUS_KEY_kana_SHI,  0x30B8, 
-+IBUS_KEY_kana_SU,  0x30BA, 
-+IBUS_KEY_kana_SE,  0x30BC, 
-+IBUS_KEY_kana_SO,  0x30BE, 
-+IBUS_KEY_kana_TA,  0x30C0, 
-+IBUS_KEY_kana_CHI,  0x30C2, 
-+IBUS_KEY_kana_TSU,  0x30C5, 
-+IBUS_KEY_kana_TE,  0x30C7, 
-+IBUS_KEY_kana_TO,  0x30C9, 
-+IBUS_KEY_kana_HA,  0x30D0, 
-+IBUS_KEY_kana_HI,  0x30D3, 
-+IBUS_KEY_kana_FU,  0x30D6, 
-+IBUS_KEY_kana_HE,  0x30D9, 
-+IBUS_KEY_kana_HO,  0x30DC, 
-+IBUS_KEY_kana_WA,  0x30F7, 
-+IBUS_KEY_kana_HA,  0x30D1, 
-+IBUS_KEY_kana_HI,  0x30D4, 
-+IBUS_KEY_kana_FU,  0x30D7, 
-+IBUS_KEY_kana_HE,  0x30DA, 
-+IBUS_KEY_kana_HO,  0x30DD, 
-+IBUS_KEY_space,  0x0323, 
-+IBUS_KEY_plus,  0x2A25, 
-+IBUS_KEY_minus,  0x2A2A, 
-+IBUS_KEY_equal,  0x2A66, 
-+IBUS_KEY_nobreakspace,  0x0323, 
-+IBUS_KEY_Abreve,  0x1EB6, 
-+IBUS_KEY_abreve,  0x1EB7, 
-+IBUS_KEY_dead_belowdot,  0x0323, 
-+IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_O,  0x1EE2, 
-+IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_U,  0x1EF0, 
-+IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_o,  0x1EE3, 
-+IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_u,  0x1EF1, 
-+IBUS_KEY_space,  0x0309, 
-+IBUS_KEY_B,  0x0181, 
-+IBUS_KEY_C,  0x0187, 
-+IBUS_KEY_D,  0x018A, 
-+IBUS_KEY_F,  0x0191, 
-+IBUS_KEY_G,  0x0193, 
-+IBUS_KEY_K,  0x0198, 
-+IBUS_KEY_M,  0x2C6E, 
-+IBUS_KEY_N,  0x019D, 
-+IBUS_KEY_P,  0x01A4, 
-+IBUS_KEY_T,  0x01AC, 
-+IBUS_KEY_V,  0x01B2, 
-+IBUS_KEY_W,  0x2C72, 
-+IBUS_KEY_Z,  0x0224, 
-+IBUS_KEY_b,  0x0253, 
-+IBUS_KEY_c,  0x0188, 
-+IBUS_KEY_d,  0x0257, 
-+IBUS_KEY_f,  0x0192, 
-+IBUS_KEY_g,  0x0260, 
-+IBUS_KEY_h,  0x0266, 
-+IBUS_KEY_k,  0x0199, 
-+IBUS_KEY_m,  0x0271, 
-+IBUS_KEY_n,  0x0272, 
-+IBUS_KEY_p,  0x01A5, 
-+IBUS_KEY_q,  0x02A0, 
-+IBUS_KEY_r,  0x027C, 
-+IBUS_KEY_s,  0x0282, 
-+IBUS_KEY_t,  0x01AD, 
-+IBUS_KEY_v,  0x028B, 
-+IBUS_KEY_w,  0x2C73, 
-+IBUS_KEY_z,  0x0225, 
-+IBUS_KEY_nobreakspace,  0x0309, 
-+IBUS_KEY_Abreve,  0x1EB2, 
-+IBUS_KEY_abreve,  0x1EB3, 
-+0x0256,  0x1D91, 
-+0x025C,  0x025D, 
-+0x025F,  0x0284, 
-+0x0279,  0x027B, 
-+IBUS_KEY_dead_hook,  0x0309, 
-+IBUS_KEY_dead_greek, IBUS_KEY_U,  0x03D2, 
-+IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_O,  0x1EDE, 
-+IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_U,  0x1EEC, 
-+IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_o,  0x1EDF, 
-+IBUS_KEY_Multi_key, IBUS_KEY_plus, IBUS_KEY_u,  0x1EED, 
-+IBUS_KEY_Multi_key, IBUS_KEY_U, IBUS_KEY_A,  0x1EB2, 
-+IBUS_KEY_Multi_key, IBUS_KEY_U, IBUS_KEY_a,  0x1EB3, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_A,  0x1EA8, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_E,  0x1EC2, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_O,  0x1ED4, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_a,  0x1EA9, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_e,  0x1EC3, 
-+IBUS_KEY_Multi_key, IBUS_KEY_asciicircum, IBUS_KEY_o,  0x1ED5, 
-+IBUS_KEY_Multi_key, IBUS_KEY_b, IBUS_KEY_A,  0x1EB2, 
-+IBUS_KEY_Multi_key, IBUS_KEY_b, IBUS_KEY_a,  0x1EB3, 
-+IBUS_KEY_space,  0x031B, 
-+IBUS_KEY_nobreakspace,  0x031B, 
-+IBUS_KEY_Utilde,  0x1EEE, 
-+IBUS_KEY_utilde,  0x1EEF, 
-+IBUS_KEY_dead_horn,  0x031B, 
-+IBUS_KEY_space,  0x002F, 
-+IBUS_KEY_2,  0x01BB, 
-+IBUS_KEY_A,  0x023A, 
-+IBUS_KEY_B,  0x0243, 
-+IBUS_KEY_C,  0x023B, 
-+IBUS_KEY_D,  0x0110, 
-+IBUS_KEY_E,  0x0246, 
-+IBUS_KEY_G,  0x01E4, 
-+IBUS_KEY_H,  0x0126, 
-+IBUS_KEY_I,  0x0197, 
-+IBUS_KEY_J,  0x0248, 
-+IBUS_KEY_L,  0x0141, 
-+IBUS_KEY_O,  0x00D8, 
-+IBUS_KEY_P,  0x2C63, 
-+IBUS_KEY_R,  0x024C, 
-+IBUS_KEY_T,  0x0166, 
-+IBUS_KEY_U,  0x0244, 
-+IBUS_KEY_Y,  0x024E, 
-+IBUS_KEY_Z,  0x01B5, 
-+IBUS_KEY_a,  0x2C65, 
-+IBUS_KEY_b,  0x0180, 
-+IBUS_KEY_c,  0x023C, 
-+IBUS_KEY_d,  0x0111, 
-+IBUS_KEY_e,  0x0247, 
-+IBUS_KEY_g,  0x01E5, 
-+IBUS_KEY_h,  0x0127, 
-+IBUS_KEY_i,  0x0268, 
-+IBUS_KEY_j,  0x0249, 
-+IBUS_KEY_l,  0x0142, 
-+IBUS_KEY_o,  0x00F8, 
-+IBUS_KEY_p,  0x1D7D, 
-+IBUS_KEY_r,  0x024D, 
-+IBUS_KEY_t,  0x0167, 
-+IBUS_KEY_u,  0x0289, 
-+IBUS_KEY_y,  0x024F, 
-+IBUS_KEY_z,  0x01B6, 
-+IBUS_KEY_nobreakspace,  0x0338, 
-+IBUS_KEY_Oacute,  0x01FE, 
-+IBUS_KEY_oacute,  0x01FF, 
-+0x0237,  0x025F, 
-+0x0269,  0x1D7C, 
-+IBUS_KEY_lessthanequal,  0x2270, 
-+IBUS_KEY_greaterthanequal,  0x2271, 
-+IBUS_KEY_dead_stroke,  0x002F, 
-+IBUS_KEY_dead_acute, IBUS_KEY_O,  0x01FE, 
-+IBUS_KEY_dead_acute, IBUS_KEY_o,  0x01FF, 
-+IBUS_KEY_dead_abovedot, IBUS_KEY_j,  0x025F, 
-+IBUS_KEY_dead_greek, IBUS_KEY_r,  0x03FC, 
-+IBUS_KEY_Greek_ALPHA,  0x1F08, 
-+IBUS_KEY_Greek_EPSILON,  0x1F18, 
-+IBUS_KEY_Greek_ETA,  0x1F28, 
-+IBUS_KEY_Greek_IOTA,  0x1F38, 
-+IBUS_KEY_Greek_OMICRON,  0x1F48, 
-+IBUS_KEY_Greek_OMEGA,  0x1F68, 
-+IBUS_KEY_Greek_alpha,  0x1F00, 
-+IBUS_KEY_Greek_epsilon,  0x1F10, 
-+IBUS_KEY_Greek_eta,  0x1F20, 
-+IBUS_KEY_Greek_iota,  0x1F30, 
-+IBUS_KEY_Greek_omicron,  0x1F40, 
-+IBUS_KEY_Greek_rho,  0x1FE4, 
-+IBUS_KEY_Greek_upsilon,  0x1F50, 
-+IBUS_KEY_Greek_omega,  0x1F60, 
-+IBUS_KEY_Greek_ALPHA,  0x1F09, 
-+IBUS_KEY_Greek_EPSILON,  0x1F19, 
-+IBUS_KEY_Greek_ETA,  0x1F29, 
-+IBUS_KEY_Greek_IOTA,  0x1F39, 
-+IBUS_KEY_Greek_OMICRON,  0x1F49, 
-+IBUS_KEY_Greek_RHO,  0x1FEC, 
-+IBUS_KEY_Greek_UPSILON,  0x1F59, 
-+IBUS_KEY_Greek_OMEGA,  0x1F69, 
-+IBUS_KEY_Greek_alpha,  0x1F01, 
-+IBUS_KEY_Greek_epsilon,  0x1F11, 
-+IBUS_KEY_Greek_eta,  0x1F21, 
-+IBUS_KEY_Greek_iota,  0x1F31, 
-+IBUS_KEY_Greek_omicron,  0x1F41, 
-+IBUS_KEY_Greek_rho,  0x1FE5, 
-+IBUS_KEY_Greek_upsilon,  0x1F51, 
-+IBUS_KEY_Greek_omega,  0x1F61, 
-+IBUS_KEY_bar,  0x2AF0, 
-+IBUS_KEY_plus,  0x2A26, 
-+IBUS_KEY_dead_diaeresis, IBUS_KEY_equal,  0x2A77, 
-+IBUS_KEY_space,  0x002C, 
-+IBUS_KEY_S,  0x0218, 
-+IBUS_KEY_T,  0x021A, 
-+IBUS_KEY_s,  0x0219, 
-+IBUS_KEY_t,  0x021B, 
-+IBUS_KEY_nobreakspace,  0x0326, 
-+IBUS_KEY_dead_belowcomma,  0x002C, 
-+IBUS_KEY_space,  0x00A4, 
-+IBUS_KEY_A,  0x20B3, 
-+IBUS_KEY_B,  0x20B1, 
-+IBUS_KEY_C,  0x20A1, 
-+IBUS_KEY_D,  0x20AF, 
-+IBUS_KEY_E,  0x20A0, 
-+IBUS_KEY_F,  0x20A3, 
-+IBUS_KEY_G,  0x20B2, 
-+IBUS_KEY_H,  0x20B4, 
-+IBUS_KEY_I,  0x17DB, 
-+IBUS_KEY_K,  0x20AD, 
-+IBUS_KEY_L,  0x20A4, 
-+IBUS_KEY_M,  0x2133, 
-+IBUS_KEY_N,  0x20A6, 
-+IBUS_KEY_O,  0x0AF1, 
-+IBUS_KEY_P,  0x20A7, 
-+IBUS_KEY_R,  0x20A8, 
-+IBUS_KEY_S,  0x0024, 
-+IBUS_KEY_T,  0x20AE, 
-+IBUS_KEY_U,  0x5713, 
-+IBUS_KEY_W,  0x20A9, 
-+IBUS_KEY_Y,  0x5186, 
-+IBUS_KEY_a,  0x060B, 
-+IBUS_KEY_b,  0x0E3F, 
-+IBUS_KEY_c,  0x00A2, 
-+IBUS_KEY_d,  0x20AB, 
-+IBUS_KEY_e,  0x20AC, 
-+IBUS_KEY_f,  0x0192, 
-+IBUS_KEY_g,  0x20B2, 
-+IBUS_KEY_h,  0x20B4, 
-+IBUS_KEY_i,  0xFDFC, 
-+IBUS_KEY_k,  0x20AD, 
-+IBUS_KEY_l,  0x00A3, 
-+IBUS_KEY_m,  0x20A5, 
-+IBUS_KEY_n,  0x20A6, 
-+IBUS_KEY_o,  0x0BF9, 
-+IBUS_KEY_p,  0x20B0, 
-+IBUS_KEY_r,  0x20A2, 
-+IBUS_KEY_s,  0x20AA, 
-+IBUS_KEY_t,  0x09F3, 
-+IBUS_KEY_u,  0x5143, 
-+IBUS_KEY_w,  0x20A9, 
-+IBUS_KEY_y,  0x00A5, 
-+IBUS_KEY_nobreakspace,  0x00A4, 
-+IBUS_KEY_Ccedilla,  0x20B5, 
-+IBUS_KEY_THORN,  0x09F2, 
-+IBUS_KEY_ccedilla,  0x20B5, 
-+IBUS_KEY_thorn,  0x09F2, 
-+IBUS_KEY_dead_currency,  0x00A4, 
-+IBUS_KEY_dead_cedilla, IBUS_KEY_C,  0x20B5, 
-+IBUS_KEY_dead_cedilla, IBUS_KEY_c,  0x20B5, 
-+IBUS_KEY_space,  0x00B5, 
-+IBUS_KEY_A,  0x0391, 
-+IBUS_KEY_B,  0x0392, 
-+IBUS_KEY_D,  0x0394, 
-+IBUS_KEY_E,  0x0395, 
-+IBUS_KEY_F,  0x03A6, 
-+IBUS_KEY_G,  0x0393, 
-+IBUS_KEY_H,  0x0397, 
-+IBUS_KEY_I,  0x0399, 
-+IBUS_KEY_J,  0x0398, 
-+IBUS_KEY_K,  0x039A, 
-+IBUS_KEY_L,  0x039B, 
-+IBUS_KEY_M,  0x039C, 
-+IBUS_KEY_N,  0x039D, 
-+IBUS_KEY_O,  0x039F, 
-+IBUS_KEY_P,  0x03A0, 
-+IBUS_KEY_Q,  0x03A7, 
-+IBUS_KEY_R,  0x03A1, 
-+IBUS_KEY_S,  0x03A3, 
-+IBUS_KEY_T,  0x03A4, 
-+IBUS_KEY_U,  0x03A5, 
-+IBUS_KEY_W,  0x03A9, 
-+IBUS_KEY_X,  0x039E, 
-+IBUS_KEY_Y,  0x03A8, 
-+IBUS_KEY_Z,  0x0396, 
-+IBUS_KEY_a,  0x03B1, 
-+IBUS_KEY_b,  0x03B2, 
-+IBUS_KEY_d,  0x03B4, 
-+IBUS_KEY_e,  0x03B5, 
-+IBUS_KEY_f,  0x03C6, 
-+IBUS_KEY_g,  0x03B3, 
-+IBUS_KEY_h,  0x03B7, 
-+IBUS_KEY_i,  0x03B9, 
-+IBUS_KEY_j,  0x03B8, 
-+IBUS_KEY_k,  0x03BA, 
-+IBUS_KEY_l,  0x03BB, 
-+IBUS_KEY_m,  0x03BC, 
-+IBUS_KEY_n,  0x03BD, 
-+IBUS_KEY_o,  0x03BF, 
-+IBUS_KEY_p,  0x03C0, 
-+IBUS_KEY_q,  0x03C7, 
-+IBUS_KEY_r,  0x03C1, 
-+IBUS_KEY_s,  0x03C3, 
-+IBUS_KEY_t,  0x03C4, 
-+IBUS_KEY_u,  0x03C5, 
-+IBUS_KEY_w,  0x03C9, 
-+IBUS_KEY_x,  0x03BE, 
-+IBUS_KEY_y,  0x03C8, 
-+IBUS_KEY_z,  0x03B6, 
-+IBUS_KEY_nobreakspace,  0x00B5, 
-+IBUS_KEY_dead_greek,  0x00B5, 
-+IBUS_KEY_dead_macron, IBUS_KEY_A,  0x1FB9, 
-+IBUS_KEY_dead_macron, IBUS_KEY_I,  0x1FD9, 
-+IBUS_KEY_dead_macron, IBUS_KEY_U,  0x1FE9, 
-+IBUS_KEY_dead_macron, IBUS_KEY_a,  0x1FB1, 
-+IBUS_KEY_dead_macron, IBUS_KEY_i,  0x1FD1, 
-+IBUS_KEY_dead_macron, IBUS_KEY_u,  0x1FE1, 
-+IBUS_KEY_dead_hook, IBUS_KEY_U,  0x03D2, 
-+IBUS_KEY_dead_stroke, IBUS_KEY_r,  0x03FC, 
-+IBUS_KEY_space, IBUS_KEY_space,  0x00A0, 
-+IBUS_KEY_space, IBUS_KEY_apostrophe,  0x0027, 
-+IBUS_KEY_space, IBUS_KEY_parenleft,  0x02D8, 
-+IBUS_KEY_space, IBUS_KEY_comma,  0x00B8, 
-+IBUS_KEY_space, IBUS_KEY_minus,  0x007E, 
-+IBUS_KEY_space, IBUS_KEY_period,  0x2008, 
-+IBUS_KEY_space, IBUS_KEY_less,  0x02C7, 
-+IBUS_KEY_space, IBUS_KEY_greater,  0x005E, 
-+IBUS_KEY_space, IBUS_KEY_asciicircum,  0x005E, 
-+IBUS_KEY_space, IBUS_KEY_grave,  0x0060, 
-+IBUS_KEY_space, IBUS_KEY_asciitilde,  0x007E, 
-+IBUS_KEY_exclam, IBUS_KEY_exclam,  0x00A1, 
-+IBUS_KEY_exclam, IBUS_KEY_question,  0x203D, 
-+IBUS_KEY_exclam, IBUS_KEY_A,  0x1EA0, 
-+IBUS_KEY_exclam, IBUS_KEY_B,  0x1E04, 
-+IBUS_KEY_exclam, IBUS_KEY_D,  0x1E0C, 
-+IBUS_KEY_exclam, IBUS_KEY_E,  0x1EB8, 
-+IBUS_KEY_exclam, IBUS_KEY_H,  0x1E24, 
-+IBUS_KEY_exclam, IBUS_KEY_I,  0x1ECA, 
-+IBUS_KEY_exclam, IBUS_KEY_K,  0x1E32, 
-+IBUS_KEY_exclam, IBUS_KEY_L,  0x1E36, 
-+IBUS_KEY_exclam, IBUS_KEY_M,  0x1E42, 
-+IBUS_KEY_exclam, IBUS_KEY_N,  0x1E46, 
-+IBUS_KEY_exclam, IBUS_KEY_O,  0x1ECC, 
-+IBUS_KEY_exclam, IBUS_KEY_P,  0x00B6, 
-+IBUS_KEY_exclam, IBUS_KEY_R,  0x1E5A, 
-+IBUS_KEY_exclam, IBUS_KEY_S,  0x1E62, 
-+IBUS_KEY_exclam, IBUS_KEY_T,  0x1E6C, 
-+IBUS_KEY_exclam, IBUS_KEY_U,  0x1EE4, 
-+IBUS_KEY_exclam, IBUS_KEY_V,  0x1E7E, 
-+IBUS_KEY_exclam, IBUS_KEY_W,  0x1E88, 
-+IBUS_KEY_exclam, IBUS_KEY_Y,  0x1EF4, 
-+IBUS_KEY_exclam, IBUS_KEY_Z,  0x1E92, 
-+IBUS_KEY_exclam, IBUS_KEY_asciicircum,  0x00A6, 
-+IBUS_KEY_exclam, IBUS_KEY_a,  0x1EA1, 
-+IBUS_KEY_exclam, IBUS_KEY_b,  0x1E05, 
-+IBUS_KEY_exclam, IBUS_KEY_d,  0x1E0D, 
-+IBUS_KEY_exclam, IBUS_KEY_e,  0x1EB9, 
-+IBUS_KEY_exclam, IBUS_KEY_h,  0x1E25, 
-+IBUS_KEY_exclam, IBUS_KEY_i,  0x1ECB, 
-+IBUS_KEY_exclam, IBUS_KEY_k,  0x1E33, 
-+IBUS_KEY_exclam, IBUS_KEY_l,  0x1E37, 
-+IBUS_KEY_exclam, IBUS_KEY_m,  0x1E43, 
-+IBUS_KEY_exclam, IBUS_KEY_n,  0x1E47, 
-+IBUS_KEY_exclam, IBUS_KEY_o,  0x1ECD, 
-+IBUS_KEY_exclam, IBUS_KEY_p,  0x00B6, 
-+IBUS_KEY_exclam, IBUS_KEY_r,  0x1E5B, 
-+IBUS_KEY_exclam, IBUS_KEY_s,  0x1E63, 
-+IBUS_KEY_exclam, IBUS_KEY_t,  0x1E6D, 
-+IBUS_KEY_exclam, IBUS_KEY_u,  0x1EE5, 
-+IBUS_KEY_exclam, IBUS_KEY_v,  0x1E7F, 
-+IBUS_KEY_exclam, IBUS_KEY_w,  0x1E89, 
-+IBUS_KEY_exclam, IBUS_KEY_y,  0x1EF5, 
-+IBUS_KEY_exclam, IBUS_KEY_z,  0x1E93, 
-+IBUS_KEY_quotedbl, IBUS_KEY_quotedbl,  0x00A8, 
-+IBUS_KEY_quotedbl, IBUS_KEY_apostrophe,  0x0344, 
-+IBUS_KEY_quotedbl, IBUS_KEY_comma,  0x201E, 
-+IBUS_KEY_quotedbl, IBUS_KEY_less,  0x201C, 
-+IBUS_KEY_quotedbl, IBUS_KEY_greater,  0x201D, 
-+IBUS_KEY_quotedbl, IBUS_KEY_A,  0x00C4, 
-+IBUS_KEY_quotedbl, IBUS_KEY_E,  0x00CB, 
-+IBUS_KEY_quotedbl, IBUS_KEY_H,  0x1E26, 
-+IBUS_KEY_quotedbl, IBUS_KEY_I,  0x00CF, 
-+IBUS_KEY_quotedbl, IBUS_KEY_O,  0x00D6, 
-+IBUS_KEY_quotedbl, IBUS_KEY_U,  0x00DC, 
-+IBUS_KEY_quotedbl, IBUS_KEY_W,  0x1E84, 
-+IBUS_KEY_quotedbl, IBUS_KEY_X,  0x1E8C, 
-+IBUS_KEY_quotedbl, IBUS_KEY_Y,  0x0178, 
-+IBUS_KEY_quotedbl, IBUS_KEY_a,  0x00E4, 
-+IBUS_KEY_quotedbl, IBUS_KEY_e,  0x00EB, 
-+IBUS_KEY_quotedbl, IBUS_KEY_h,  0x1E27, 
-+IBUS_KEY_quotedbl, IBUS_KEY_i,  0x00EF, 
-+IBUS_KEY_quotedbl, IBUS_KEY_o,  0x00F6, 
-+IBUS_KEY_quotedbl, IBUS_KEY_t,  0x1E97, 
-+IBUS_KEY_quotedbl, IBUS_KEY_u,  0x00FC, 
-+IBUS_KEY_quotedbl, IBUS_KEY_w,  0x1E85, 
-+IBUS_KEY_quotedbl, IBUS_KEY_x,  0x1E8D, 
-+IBUS_KEY_quotedbl, IBUS_KEY_y,  0x00FF, 
-+IBUS_KEY_quotedbl, IBUS_KEY_acute,  0x0344, 
-+IBUS_KEY_quotedbl, IBUS_KEY_Otilde,  0x1E4E, 
-+IBUS_KEY_quotedbl, IBUS_KEY_otilde,  0x1E4F, 
-+IBUS_KEY_quotedbl, 0x03D2,  0x03D4, 
-+IBUS_KEY_quotedbl, IBUS_KEY_Umacron,  0x1E7A, 
-+IBUS_KEY_quotedbl, IBUS_KEY_umacron,  0x1E7B, 
-+IBUS_KEY_quotedbl, 0x04D8,  0x04DA, 
-+IBUS_KEY_quotedbl, 0x04D9,  0x04DB, 
-+IBUS_KEY_quotedbl, 0x04E8,  0x04EA, 
-+IBUS_KEY_quotedbl, 0x04E9,  0x04EB, 
-+IBUS_KEY_quotedbl, IBUS_KEY_Ukrainian_i,  0x0457, 
-+IBUS_KEY_quotedbl, IBUS_KEY_Ukrainian_I,  0x0407, 
-+IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_a,  0x04D3, 
-+IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_ie,  0x0451, 
-+IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_i,  0x04E5, 
-+IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_o,  0x04E7, 
-+IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_u,  0x04F1, 
-+IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_zhe,  0x04DD, 
-+IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_yeru,  0x04F9, 
-+IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_ze,  0x04DF, 
-+IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_e,  0x04ED, 
-+IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_che,  0x04F5, 
-+IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_A,  0x04D2, 
-+IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_IE,  0x0401, 
-+IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_I,  0x04E4, 
-+IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_O,  0x04E6, 
-+IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_U,  0x04F0, 
-+IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_ZHE,  0x04DC, 
-+IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_YERU,  0x04F8, 
-+IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_ZE,  0x04DE, 
-+IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_E,  0x04EC, 
-+IBUS_KEY_quotedbl, IBUS_KEY_Cyrillic_CHE,  0x04F4, 
-+IBUS_KEY_quotedbl, IBUS_KEY_Greek_IOTA,  0x03AA, 
-+IBUS_KEY_quotedbl, IBUS_KEY_Greek_UPSILON,  0x03AB, 
-+IBUS_KEY_quotedbl, IBUS_KEY_Greek_iota,  0x03CA, 
-+IBUS_KEY_quotedbl, IBUS_KEY_Greek_upsilon,  0x03CB, 
-+IBUS_KEY_quotedbl, IBUS_KEY_dead_acute,  0x0344, 
-+IBUS_KEY_numbersign, IBUS_KEY_numbersign,  0x266F, 
-+IBUS_KEY_numbersign, IBUS_KEY_E,  0x266B, 
-+IBUS_KEY_numbersign, IBUS_KEY_S,  0x266C, 
-+IBUS_KEY_numbersign, IBUS_KEY_b,  0x266D, 
-+IBUS_KEY_numbersign, IBUS_KEY_e,  0x266A, 
-+IBUS_KEY_numbersign, IBUS_KEY_f,  0x266E, 
-+IBUS_KEY_numbersign, IBUS_KEY_q,  0x2669, 
-+IBUS_KEY_percent, IBUS_KEY_o,  0x2030, 
-+IBUS_KEY_apostrophe, IBUS_KEY_space,  0x0027, 
-+IBUS_KEY_apostrophe, IBUS_KEY_apostrophe,  0x00B4, 
-+IBUS_KEY_apostrophe, IBUS_KEY_comma,  0x201A, 
-+IBUS_KEY_apostrophe, IBUS_KEY_less,  0x2018, 
-+IBUS_KEY_apostrophe, IBUS_KEY_greater,  0x2019, 
-+IBUS_KEY_apostrophe, IBUS_KEY_A,  0x00C1, 
-+IBUS_KEY_apostrophe, IBUS_KEY_C,  0x0106, 
-+IBUS_KEY_apostrophe, IBUS_KEY_E,  0x00C9, 
-+IBUS_KEY_apostrophe, IBUS_KEY_G,  0x01F4, 
-+IBUS_KEY_apostrophe, IBUS_KEY_I,  0x00CD, 
-+IBUS_KEY_apostrophe, IBUS_KEY_K,  0x1E30, 
-+IBUS_KEY_apostrophe, IBUS_KEY_L,  0x0139, 
-+IBUS_KEY_apostrophe, IBUS_KEY_M,  0x1E3E, 
-+IBUS_KEY_apostrophe, IBUS_KEY_N,  0x0143, 
-+IBUS_KEY_apostrophe, IBUS_KEY_O,  0x00D3, 
-+IBUS_KEY_apostrophe, IBUS_KEY_P,  0x1E54, 
-+IBUS_KEY_apostrophe, IBUS_KEY_R,  0x0154, 
-+IBUS_KEY_apostrophe, IBUS_KEY_S,  0x015A, 
-+IBUS_KEY_apostrophe, IBUS_KEY_U,  0x00DA, 
-+IBUS_KEY_apostrophe, IBUS_KEY_W,  0x1E82, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Y,  0x00DD, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Z,  0x0179, 
-+IBUS_KEY_apostrophe, IBUS_KEY_a,  0x00E1, 
-+IBUS_KEY_apostrophe, IBUS_KEY_c,  0x0107, 
-+IBUS_KEY_apostrophe, IBUS_KEY_e,  0x00E9, 
-+IBUS_KEY_apostrophe, IBUS_KEY_g,  0x01F5, 
-+IBUS_KEY_apostrophe, IBUS_KEY_i,  0x00ED, 
-+IBUS_KEY_apostrophe, IBUS_KEY_k,  0x1E31, 
-+IBUS_KEY_apostrophe, IBUS_KEY_l,  0x013A, 
-+IBUS_KEY_apostrophe, IBUS_KEY_m,  0x1E3F, 
-+IBUS_KEY_apostrophe, IBUS_KEY_n,  0x0144, 
-+IBUS_KEY_apostrophe, IBUS_KEY_o,  0x00F3, 
-+IBUS_KEY_apostrophe, IBUS_KEY_p,  0x1E55, 
-+IBUS_KEY_apostrophe, IBUS_KEY_r,  0x0155, 
-+IBUS_KEY_apostrophe, IBUS_KEY_s,  0x015B, 
-+IBUS_KEY_apostrophe, IBUS_KEY_u,  0x00FA, 
-+IBUS_KEY_apostrophe, IBUS_KEY_w,  0x1E83, 
-+IBUS_KEY_apostrophe, IBUS_KEY_y,  0x00FD, 
-+IBUS_KEY_apostrophe, IBUS_KEY_z,  0x017A, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Acircumflex,  0x1EA4, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Aring,  0x01FA, 
-+IBUS_KEY_apostrophe, IBUS_KEY_AE,  0x01FC, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Ccedilla,  0x1E08, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Ecircumflex,  0x1EBE, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Idiaeresis,  0x1E2E, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Ocircumflex,  0x1ED0, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Otilde,  0x1E4C, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Ooblique,  0x01FE, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Udiaeresis,  0x01D7, 
-+IBUS_KEY_apostrophe, IBUS_KEY_acircumflex,  0x1EA5, 
-+IBUS_KEY_apostrophe, IBUS_KEY_aring,  0x01FB, 
-+IBUS_KEY_apostrophe, IBUS_KEY_ae,  0x01FD, 
-+IBUS_KEY_apostrophe, IBUS_KEY_ccedilla,  0x1E09, 
-+IBUS_KEY_apostrophe, IBUS_KEY_ecircumflex,  0x1EBF, 
-+IBUS_KEY_apostrophe, IBUS_KEY_idiaeresis,  0x1E2F, 
-+IBUS_KEY_apostrophe, IBUS_KEY_ocircumflex,  0x1ED1, 
-+IBUS_KEY_apostrophe, IBUS_KEY_otilde,  0x1E4D, 
-+IBUS_KEY_apostrophe, IBUS_KEY_oslash,  0x01FF, 
-+IBUS_KEY_apostrophe, IBUS_KEY_udiaeresis,  0x01D8, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Abreve,  0x1EAE, 
-+IBUS_KEY_apostrophe, IBUS_KEY_abreve,  0x1EAF, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Emacron,  0x1E16, 
-+IBUS_KEY_apostrophe, IBUS_KEY_emacron,  0x1E17, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Omacron,  0x1E52, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Utilde,  0x1E78, 
-+IBUS_KEY_apostrophe, IBUS_KEY_omacron,  0x1E53, 
-+IBUS_KEY_apostrophe, IBUS_KEY_utilde,  0x1E79, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Cyrillic_ghe,  0x0453, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Cyrillic_ka,  0x045C, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Cyrillic_GHE,  0x0403, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Cyrillic_KA,  0x040C, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Greek_iotadieresis,  0x0390, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Greek_upsilondieresis,  0x03B0, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Greek_ALPHA,  0x0386, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Greek_EPSILON,  0x0388, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Greek_ETA,  0x0389, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Greek_IOTA,  0x038A, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Greek_OMICRON,  0x038C, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Greek_UPSILON,  0x038E, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Greek_OMEGA,  0x038F, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Greek_alpha,  0x03AC, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Greek_epsilon,  0x03AD, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Greek_eta,  0x03AE, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Greek_iota,  0x03AF, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Greek_omicron,  0x03CC, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Greek_upsilon,  0x03CD, 
-+IBUS_KEY_apostrophe, IBUS_KEY_Greek_omega,  0x03CE, 
-+IBUS_KEY_apostrophe, 0x1F00,  0x1F04, 
-+IBUS_KEY_apostrophe, 0x1F01,  0x1F05, 
-+IBUS_KEY_apostrophe, 0x1F08,  0x1F0C, 
-+IBUS_KEY_apostrophe, 0x1F09,  0x1F0D, 
-+IBUS_KEY_apostrophe, 0x1F10,  0x1F14, 
-+IBUS_KEY_apostrophe, 0x1F11,  0x1F15, 
-+IBUS_KEY_apostrophe, 0x1F18,  0x1F1C, 
-+IBUS_KEY_apostrophe, 0x1F19,  0x1F1D, 
-+IBUS_KEY_apostrophe, 0x1F20,  0x1F24, 
-+IBUS_KEY_apostrophe, 0x1F21,  0x1F25, 
-+IBUS_KEY_apostrophe, 0x1F28,  0x1F2C, 
-+IBUS_KEY_apostrophe, 0x1F29,  0x1F2D, 
-+IBUS_KEY_apostrophe, 0x1F30,  0x1F34, 
-+IBUS_KEY_apostrophe, 0x1F31,  0x1F35, 
-+IBUS_KEY_apostrophe, 0x1F38,  0x1F3C, 
-+IBUS_KEY_apostrophe, 0x1F39,  0x1F3D, 
-+IBUS_KEY_apostrophe, 0x1F40,  0x1F44, 
-+IBUS_KEY_apostrophe, 0x1F41,  0x1F45, 
-+IBUS_KEY_apostrophe, 0x1F48,  0x1F4C, 
-+IBUS_KEY_apostrophe, 0x1F49,  0x1F4D, 
-+IBUS_KEY_apostrophe, 0x1F50,  0x1F54, 
-+IBUS_KEY_apostrophe, 0x1F51,  0x1F55, 
-+IBUS_KEY_apostrophe, 0x1F59,  0x1F5D, 
-+IBUS_KEY_apostrophe, 0x1F60,  0x1F64, 
-+IBUS_KEY_apostrophe, 0x1F61,  0x1F65, 
-+IBUS_KEY_apostrophe, 0x1F68,  0x1F6C, 
-+IBUS_KEY_apostrophe, 0x1F69,  0x1F6D, 
-+IBUS_KEY_apostrophe, 0x2395,  0x235E, 
-+IBUS_KEY_parenleft, IBUS_KEY_space,  0x02D8, 
-+IBUS_KEY_parenleft, IBUS_KEY_parenleft,  0x005B, 
-+IBUS_KEY_parenleft, IBUS_KEY_minus,  0x007B, 
-+IBUS_KEY_parenleft, IBUS_KEY_A,  0x0102, 
-+IBUS_KEY_parenleft, IBUS_KEY_G,  0x011E, 
-+IBUS_KEY_parenleft, IBUS_KEY_a,  0x0103, 
-+IBUS_KEY_parenleft, IBUS_KEY_c,  0x00A9, 
-+IBUS_KEY_parenleft, IBUS_KEY_g,  0x011F, 
-+IBUS_KEY_parenleft, IBUS_KEY_r,  0x00AE, 
-+IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA,  0x1F09, 
-+IBUS_KEY_parenleft, IBUS_KEY_Greek_EPSILON,  0x1F19, 
-+IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA,  0x1F29, 
-+IBUS_KEY_parenleft, IBUS_KEY_Greek_IOTA,  0x1F39, 
-+IBUS_KEY_parenleft, IBUS_KEY_Greek_OMICRON,  0x1F49, 
-+IBUS_KEY_parenleft, IBUS_KEY_Greek_RHO,  0x1FEC, 
-+IBUS_KEY_parenleft, IBUS_KEY_Greek_UPSILON,  0x1F59, 
-+IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA,  0x1F69, 
-+IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha,  0x1F01, 
-+IBUS_KEY_parenleft, IBUS_KEY_Greek_epsilon,  0x1F11, 
-+IBUS_KEY_parenleft, IBUS_KEY_Greek_eta,  0x1F21, 
-+IBUS_KEY_parenleft, IBUS_KEY_Greek_iota,  0x1F31, 
-+IBUS_KEY_parenleft, IBUS_KEY_Greek_omicron,  0x1F41, 
-+IBUS_KEY_parenleft, IBUS_KEY_Greek_rho,  0x1FE5, 
-+IBUS_KEY_parenleft, IBUS_KEY_Greek_upsilon,  0x1F51, 
-+IBUS_KEY_parenleft, IBUS_KEY_Greek_omega,  0x1F61, 
-+IBUS_KEY_parenright, IBUS_KEY_parenright,  0x005D, 
-+IBUS_KEY_parenright, IBUS_KEY_minus,  0x007D, 
-+IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA,  0x1F08, 
-+IBUS_KEY_parenright, IBUS_KEY_Greek_EPSILON,  0x1F18, 
-+IBUS_KEY_parenright, IBUS_KEY_Greek_ETA,  0x1F28, 
-+IBUS_KEY_parenright, IBUS_KEY_Greek_IOTA,  0x1F38, 
-+IBUS_KEY_parenright, IBUS_KEY_Greek_OMICRON,  0x1F48, 
-+IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA,  0x1F68, 
-+IBUS_KEY_parenright, IBUS_KEY_Greek_alpha,  0x1F00, 
-+IBUS_KEY_parenright, IBUS_KEY_Greek_epsilon,  0x1F10, 
-+IBUS_KEY_parenright, IBUS_KEY_Greek_eta,  0x1F20, 
-+IBUS_KEY_parenright, IBUS_KEY_Greek_iota,  0x1F30, 
-+IBUS_KEY_parenright, IBUS_KEY_Greek_omicron,  0x1F40, 
-+IBUS_KEY_parenright, IBUS_KEY_Greek_rho,  0x1FE4, 
-+IBUS_KEY_parenright, IBUS_KEY_Greek_upsilon,  0x1F50, 
-+IBUS_KEY_parenright, IBUS_KEY_Greek_omega,  0x1F60, 
-+IBUS_KEY_asterisk, IBUS_KEY_0,  0x00B0, 
-+IBUS_KEY_asterisk, IBUS_KEY_A,  0x00C5, 
-+IBUS_KEY_asterisk, IBUS_KEY_U,  0x016E, 
-+IBUS_KEY_asterisk, IBUS_KEY_a,  0x00E5, 
-+IBUS_KEY_asterisk, IBUS_KEY_u,  0x016F, 
-+IBUS_KEY_asterisk, IBUS_KEY_diaeresis,  0x2363, 
-+IBUS_KEY_asterisk, IBUS_KEY_emopencircle,  0x235F, 
-+IBUS_KEY_plus, IBUS_KEY_plus,  0x0023, 
-+IBUS_KEY_plus, IBUS_KEY_minus,  0x00B1, 
-+IBUS_KEY_plus, IBUS_KEY_O,  0x01A0, 
-+IBUS_KEY_plus, IBUS_KEY_U,  0x01AF, 
-+IBUS_KEY_plus, IBUS_KEY_o,  0x01A1, 
-+IBUS_KEY_plus, IBUS_KEY_u,  0x01B0, 
-+IBUS_KEY_comma, IBUS_KEY_space,  0x00B8, 
-+IBUS_KEY_comma, IBUS_KEY_quotedbl,  0x201E, 
-+IBUS_KEY_comma, IBUS_KEY_apostrophe,  0x201A, 
-+IBUS_KEY_comma, IBUS_KEY_comma,  0x00B8, 
-+IBUS_KEY_comma, IBUS_KEY_minus,  0x00AC, 
-+IBUS_KEY_comma, IBUS_KEY_A,  0x0104, 
-+IBUS_KEY_comma, IBUS_KEY_C,  0x00C7, 
-+IBUS_KEY_comma, IBUS_KEY_D,  0x1E10, 
-+IBUS_KEY_comma, IBUS_KEY_E,  0x0118, 
-+IBUS_KEY_comma, IBUS_KEY_G,  0x0122, 
-+IBUS_KEY_comma, IBUS_KEY_H,  0x1E28, 
-+IBUS_KEY_comma, IBUS_KEY_I,  0x012E, 
-+IBUS_KEY_comma, IBUS_KEY_K,  0x0136, 
-+IBUS_KEY_comma, IBUS_KEY_L,  0x013B, 
-+IBUS_KEY_comma, IBUS_KEY_N,  0x0145, 
-+IBUS_KEY_comma, IBUS_KEY_O,  0x01EA, 
-+IBUS_KEY_comma, IBUS_KEY_R,  0x0156, 
-+IBUS_KEY_comma, IBUS_KEY_S,  0x015E, 
-+IBUS_KEY_comma, IBUS_KEY_T,  0x0162, 
-+IBUS_KEY_comma, IBUS_KEY_U,  0x0172, 
-+IBUS_KEY_comma, IBUS_KEY_a,  0x0105, 
-+IBUS_KEY_comma, IBUS_KEY_c,  0x00E7, 
-+IBUS_KEY_comma, IBUS_KEY_d,  0x1E11, 
-+IBUS_KEY_comma, IBUS_KEY_e,  0x0119, 
-+IBUS_KEY_comma, IBUS_KEY_g,  0x0123, 
-+IBUS_KEY_comma, IBUS_KEY_h,  0x1E29, 
-+IBUS_KEY_comma, IBUS_KEY_i,  0x012F, 
-+IBUS_KEY_comma, IBUS_KEY_k,  0x0137, 
-+IBUS_KEY_comma, IBUS_KEY_l,  0x013C, 
-+IBUS_KEY_comma, IBUS_KEY_n,  0x0146, 
-+IBUS_KEY_comma, IBUS_KEY_o,  0x01EB, 
-+IBUS_KEY_comma, IBUS_KEY_r,  0x0157, 
-+IBUS_KEY_comma, IBUS_KEY_s,  0x015F, 
-+IBUS_KEY_comma, IBUS_KEY_t,  0x0163, 
-+IBUS_KEY_comma, IBUS_KEY_u,  0x0173, 
-+IBUS_KEY_minus, IBUS_KEY_space,  0x007E, 
-+IBUS_KEY_minus, IBUS_KEY_parenleft,  0x007B, 
-+IBUS_KEY_minus, IBUS_KEY_parenright,  0x007D, 
-+IBUS_KEY_minus, IBUS_KEY_plus,  0x00B1, 
-+IBUS_KEY_minus, IBUS_KEY_comma,  0x00AC, 
-+IBUS_KEY_minus, IBUS_KEY_slash,  0x233F, 
-+IBUS_KEY_minus, IBUS_KEY_colon,  0x00F7, 
-+IBUS_KEY_minus, IBUS_KEY_greater,  0x2192, 
-+IBUS_KEY_minus, IBUS_KEY_A,  0x0100, 
-+IBUS_KEY_minus, IBUS_KEY_D,  0x0110, 
-+IBUS_KEY_minus, IBUS_KEY_E,  0x0112, 
-+IBUS_KEY_minus, IBUS_KEY_I,  0x012A, 
-+IBUS_KEY_minus, IBUS_KEY_L,  0x00A3, 
-+IBUS_KEY_minus, IBUS_KEY_N,  0x00D1, 
-+IBUS_KEY_minus, IBUS_KEY_O,  0x014C, 
-+IBUS_KEY_minus, IBUS_KEY_U,  0x016A, 
-+IBUS_KEY_minus, IBUS_KEY_Y,  0x00A5, 
-+IBUS_KEY_minus, IBUS_KEY_backslash,  0x2340, 
-+IBUS_KEY_minus, IBUS_KEY_asciicircum,  0x00AF, 
-+IBUS_KEY_minus, IBUS_KEY_a,  0x0101, 
-+IBUS_KEY_minus, IBUS_KEY_d,  0x0111, 
-+IBUS_KEY_minus, IBUS_KEY_e,  0x0113, 
-+IBUS_KEY_minus, IBUS_KEY_i,  0x012B, 
-+IBUS_KEY_minus, IBUS_KEY_l,  0x00A3, 
-+IBUS_KEY_minus, IBUS_KEY_n,  0x00F1, 
-+IBUS_KEY_minus, IBUS_KEY_o,  0x014D, 
-+IBUS_KEY_minus, IBUS_KEY_u,  0x016B, 
-+IBUS_KEY_minus, IBUS_KEY_y,  0x00A5, 
-+IBUS_KEY_minus, 0x2191,  0x234F, 
-+IBUS_KEY_minus, 0x2193,  0x2356, 
-+IBUS_KEY_minus, IBUS_KEY_emopencircle,  0x2296, 
-+IBUS_KEY_period, IBUS_KEY_minus,  0x00B7, 
-+IBUS_KEY_period, IBUS_KEY_period,  0x2026, 
-+IBUS_KEY_period, IBUS_KEY_colon,  0x2235, 
-+IBUS_KEY_period, IBUS_KEY_less,  0x2039, 
-+IBUS_KEY_period, IBUS_KEY_equal,  0x2022, 
-+IBUS_KEY_period, IBUS_KEY_greater,  0x203A, 
-+IBUS_KEY_period, IBUS_KEY_A,  0x0226, 
-+IBUS_KEY_period, IBUS_KEY_B,  0x1E02, 
-+IBUS_KEY_period, IBUS_KEY_C,  0x010A, 
-+IBUS_KEY_period, IBUS_KEY_D,  0x1E0A, 
-+IBUS_KEY_period, IBUS_KEY_E,  0x0116, 
-+IBUS_KEY_period, IBUS_KEY_F,  0x1E1E, 
-+IBUS_KEY_period, IBUS_KEY_G,  0x0120, 
-+IBUS_KEY_period, IBUS_KEY_H,  0x1E22, 
-+IBUS_KEY_period, IBUS_KEY_I,  0x0130, 
-+IBUS_KEY_period, IBUS_KEY_M,  0x1E40, 
-+IBUS_KEY_period, IBUS_KEY_N,  0x1E44, 
-+IBUS_KEY_period, IBUS_KEY_O,  0x022E, 
-+IBUS_KEY_period, IBUS_KEY_P,  0x1E56, 
-+IBUS_KEY_period, IBUS_KEY_R,  0x1E58, 
-+IBUS_KEY_period, IBUS_KEY_S,  0x1E60, 
-+IBUS_KEY_period, IBUS_KEY_T,  0x1E6A, 
-+IBUS_KEY_period, IBUS_KEY_W,  0x1E86, 
-+IBUS_KEY_period, IBUS_KEY_X,  0x1E8A, 
-+IBUS_KEY_period, IBUS_KEY_Y,  0x1E8E, 
-+IBUS_KEY_period, IBUS_KEY_Z,  0x017B, 
-+IBUS_KEY_period, IBUS_KEY_asciicircum,  0x00B7, 
-+IBUS_KEY_period, IBUS_KEY_a,  0x0227, 
-+IBUS_KEY_period, IBUS_KEY_b,  0x1E03, 
-+IBUS_KEY_period, IBUS_KEY_c,  0x010B, 
-+IBUS_KEY_period, IBUS_KEY_d,  0x1E0B, 
-+IBUS_KEY_period, IBUS_KEY_e,  0x0117, 
-+IBUS_KEY_period, IBUS_KEY_f,  0x1E1F, 
-+IBUS_KEY_period, IBUS_KEY_g,  0x0121, 
-+IBUS_KEY_period, IBUS_KEY_h,  0x1E23, 
-+IBUS_KEY_period, IBUS_KEY_i,  0x0131, 
-+IBUS_KEY_period, IBUS_KEY_m,  0x1E41, 
-+IBUS_KEY_period, IBUS_KEY_n,  0x1E45, 
-+IBUS_KEY_period, IBUS_KEY_o,  0x022F, 
-+IBUS_KEY_period, IBUS_KEY_p,  0x1E57, 
-+IBUS_KEY_period, IBUS_KEY_r,  0x1E59, 
-+IBUS_KEY_period, IBUS_KEY_s,  0x1E61, 
-+IBUS_KEY_period, IBUS_KEY_t,  0x1E6B, 
-+IBUS_KEY_period, IBUS_KEY_w,  0x1E87, 
-+IBUS_KEY_period, IBUS_KEY_x,  0x1E8B, 
-+IBUS_KEY_period, IBUS_KEY_y,  0x1E8F, 
-+IBUS_KEY_period, IBUS_KEY_z,  0x017C, 
-+IBUS_KEY_period, 0x017F,  0x1E9B, 
-+IBUS_KEY_period, IBUS_KEY_Sacute,  0x1E64, 
-+IBUS_KEY_period, IBUS_KEY_Scaron,  0x1E66, 
-+IBUS_KEY_period, IBUS_KEY_sacute,  0x1E65, 
-+IBUS_KEY_period, IBUS_KEY_scaron,  0x1E67, 
-+IBUS_KEY_period, 0x1E62,  0x1E68, 
-+IBUS_KEY_period, 0x1E63,  0x1E69, 
-+IBUS_KEY_period, IBUS_KEY_emopencircle,  0x2299, 
-+IBUS_KEY_slash, IBUS_KEY_minus,  0x233F, 
-+IBUS_KEY_slash, IBUS_KEY_slash,  0x005C, 
-+IBUS_KEY_slash, IBUS_KEY_less,  0x005C, 
-+IBUS_KEY_slash, IBUS_KEY_equal,  0x2260, 
-+IBUS_KEY_slash, IBUS_KEY_C,  0x20A1, 
-+IBUS_KEY_slash, IBUS_KEY_D,  0x0110, 
-+IBUS_KEY_slash, IBUS_KEY_G,  0x01E4, 
-+IBUS_KEY_slash, IBUS_KEY_H,  0x0126, 
-+IBUS_KEY_slash, IBUS_KEY_I,  0x0197, 
-+IBUS_KEY_slash, IBUS_KEY_L,  0x0141, 
-+IBUS_KEY_slash, IBUS_KEY_O,  0x00D8, 
-+IBUS_KEY_slash, IBUS_KEY_T,  0x0166, 
-+IBUS_KEY_slash, IBUS_KEY_U,  0x00B5, 
-+IBUS_KEY_slash, IBUS_KEY_Z,  0x01B5, 
-+IBUS_KEY_slash, IBUS_KEY_asciicircum,  0x007C, 
-+IBUS_KEY_slash, IBUS_KEY_b,  0x0180, 
-+IBUS_KEY_slash, IBUS_KEY_c,  0x00A2, 
-+IBUS_KEY_slash, IBUS_KEY_d,  0x0111, 
-+IBUS_KEY_slash, IBUS_KEY_g,  0x01E5, 
-+IBUS_KEY_slash, IBUS_KEY_h,  0x0127, 
-+IBUS_KEY_slash, IBUS_KEY_i,  0x0268, 
-+IBUS_KEY_slash, IBUS_KEY_l,  0x0142, 
-+IBUS_KEY_slash, IBUS_KEY_m,  0x20A5, 
-+IBUS_KEY_slash, IBUS_KEY_o,  0x00F8, 
-+IBUS_KEY_slash, IBUS_KEY_t,  0x0167, 
-+IBUS_KEY_slash, IBUS_KEY_u,  0x00B5, 
-+IBUS_KEY_slash, IBUS_KEY_v,  0x221A, 
-+IBUS_KEY_slash, IBUS_KEY_z,  0x01B6, 
-+IBUS_KEY_slash, 0x0294,  0x02A1, 
-+IBUS_KEY_slash, 0x04AE,  0x04B0, 
-+IBUS_KEY_slash, 0x04AF,  0x04B1, 
-+IBUS_KEY_slash, IBUS_KEY_Cyrillic_ghe,  0x0493, 
-+IBUS_KEY_slash, IBUS_KEY_Cyrillic_ka,  0x049F, 
-+IBUS_KEY_slash, IBUS_KEY_Cyrillic_GHE,  0x0492, 
-+IBUS_KEY_slash, IBUS_KEY_Cyrillic_KA,  0x049E, 
-+IBUS_KEY_slash, IBUS_KEY_leftarrow,  0x219A, 
-+IBUS_KEY_slash, IBUS_KEY_rightarrow,  0x219B, 
-+IBUS_KEY_slash, 0x2194,  0x21AE, 
-+IBUS_KEY_slash, 0x2395,  0x2341, 
-+IBUS_KEY_0, IBUS_KEY_asterisk,  0x00B0, 
-+IBUS_KEY_0, IBUS_KEY_3,  0x2189, 
-+IBUS_KEY_0, IBUS_KEY_C,  0x00A9, 
-+IBUS_KEY_0, IBUS_KEY_S,  0x00A7, 
-+IBUS_KEY_0, IBUS_KEY_X,  0x00A4, 
-+IBUS_KEY_0, IBUS_KEY_asciicircum,  0x00B0, 
-+IBUS_KEY_0, IBUS_KEY_c,  0x00A9, 
-+IBUS_KEY_0, IBUS_KEY_s,  0x00A7, 
-+IBUS_KEY_0, IBUS_KEY_x,  0x00A4, 
-+IBUS_KEY_0, IBUS_KEY_asciitilde,  0x236C, 
-+IBUS_KEY_1, IBUS_KEY_2,  0x00BD, 
-+IBUS_KEY_1, IBUS_KEY_3,  0x2153, 
-+IBUS_KEY_1, IBUS_KEY_4,  0x00BC, 
-+IBUS_KEY_1, IBUS_KEY_5,  0x2155, 
-+IBUS_KEY_1, IBUS_KEY_6,  0x2159, 
-+IBUS_KEY_1, IBUS_KEY_7,  0x2150, 
-+IBUS_KEY_1, IBUS_KEY_8,  0x215B, 
-+IBUS_KEY_1, IBUS_KEY_9,  0x2151, 
-+IBUS_KEY_1, IBUS_KEY_S,  0x00B9, 
-+IBUS_KEY_1, IBUS_KEY_asciicircum,  0x00B9, 
-+IBUS_KEY_1, IBUS_KEY_s,  0x00B9, 
-+IBUS_KEY_2, IBUS_KEY_3,  0x2154, 
-+IBUS_KEY_2, IBUS_KEY_5,  0x2156, 
-+IBUS_KEY_2, IBUS_KEY_S,  0x00B2, 
-+IBUS_KEY_2, IBUS_KEY_asciicircum,  0x00B2, 
-+IBUS_KEY_2, IBUS_KEY_s,  0x00B2, 
-+IBUS_KEY_3, IBUS_KEY_4,  0x00BE, 
-+IBUS_KEY_3, IBUS_KEY_5,  0x2157, 
-+IBUS_KEY_3, IBUS_KEY_8,  0x215C, 
-+IBUS_KEY_3, IBUS_KEY_S,  0x00B3, 
-+IBUS_KEY_3, IBUS_KEY_asciicircum,  0x00B3, 
-+IBUS_KEY_3, IBUS_KEY_s,  0x00B3, 
-+IBUS_KEY_4, IBUS_KEY_5,  0x2158, 
-+IBUS_KEY_5, IBUS_KEY_6,  0x215A, 
-+IBUS_KEY_5, IBUS_KEY_8,  0x215D, 
-+IBUS_KEY_7, IBUS_KEY_8,  0x215E, 
-+IBUS_KEY_8, IBUS_KEY_8,  0x221E, 
-+IBUS_KEY_colon, IBUS_KEY_parenleft,  0x2639, 
-+IBUS_KEY_colon, IBUS_KEY_parenright,  0x263A, 
-+IBUS_KEY_colon, IBUS_KEY_minus,  0x00F7, 
-+IBUS_KEY_colon, IBUS_KEY_period,  0x2234, 
-+IBUS_KEY_colon, 0x2395,  0x2360, 
-+IBUS_KEY_semicolon, IBUS_KEY_A,  0x0104, 
-+IBUS_KEY_semicolon, IBUS_KEY_E,  0x0118, 
-+IBUS_KEY_semicolon, IBUS_KEY_I,  0x012E, 
-+IBUS_KEY_semicolon, IBUS_KEY_O,  0x01EA, 
-+IBUS_KEY_semicolon, IBUS_KEY_S,  0x0218, 
-+IBUS_KEY_semicolon, IBUS_KEY_T,  0x021A, 
-+IBUS_KEY_semicolon, IBUS_KEY_U,  0x0172, 
-+IBUS_KEY_semicolon, IBUS_KEY_underscore,  0x236E, 
-+IBUS_KEY_semicolon, IBUS_KEY_a,  0x0105, 
-+IBUS_KEY_semicolon, IBUS_KEY_e,  0x0119, 
-+IBUS_KEY_semicolon, IBUS_KEY_i,  0x012F, 
-+IBUS_KEY_semicolon, IBUS_KEY_o,  0x01EB, 
-+IBUS_KEY_semicolon, IBUS_KEY_s,  0x0219, 
-+IBUS_KEY_semicolon, IBUS_KEY_t,  0x021B, 
-+IBUS_KEY_semicolon, IBUS_KEY_u,  0x0173, 
-+IBUS_KEY_less, IBUS_KEY_space,  0x02C7, 
-+IBUS_KEY_less, IBUS_KEY_quotedbl,  0x201C, 
-+IBUS_KEY_less, IBUS_KEY_apostrophe,  0x2018, 
-+IBUS_KEY_less, IBUS_KEY_minus,  0x2190, 
-+IBUS_KEY_less, IBUS_KEY_slash,  0x005C, 
-+IBUS_KEY_less, IBUS_KEY_3,  0x2665, 
-+IBUS_KEY_less, IBUS_KEY_less,  0x00AB, 
-+IBUS_KEY_less, IBUS_KEY_equal,  0x2264, 
-+IBUS_KEY_less, IBUS_KEY_greater,  0x22C4, 
-+IBUS_KEY_less, IBUS_KEY_C,  0x010C, 
-+IBUS_KEY_less, IBUS_KEY_D,  0x010E, 
-+IBUS_KEY_less, IBUS_KEY_E,  0x011A, 
-+IBUS_KEY_less, IBUS_KEY_L,  0x013D, 
-+IBUS_KEY_less, IBUS_KEY_N,  0x0147, 
-+IBUS_KEY_less, IBUS_KEY_R,  0x0158, 
-+IBUS_KEY_less, IBUS_KEY_S,  0x0160, 
-+IBUS_KEY_less, IBUS_KEY_T,  0x0164, 
-+IBUS_KEY_less, IBUS_KEY_Z,  0x017D, 
-+IBUS_KEY_less, IBUS_KEY_underscore,  0x2264, 
-+IBUS_KEY_less, IBUS_KEY_c,  0x010D, 
-+IBUS_KEY_less, IBUS_KEY_d,  0x010F, 
-+IBUS_KEY_less, IBUS_KEY_e,  0x011B, 
-+IBUS_KEY_less, IBUS_KEY_l,  0x013E, 
-+IBUS_KEY_less, IBUS_KEY_n,  0x0148, 
-+IBUS_KEY_less, IBUS_KEY_r,  0x0159, 
-+IBUS_KEY_less, IBUS_KEY_s,  0x0161, 
-+IBUS_KEY_less, IBUS_KEY_t,  0x0165, 
-+IBUS_KEY_less, IBUS_KEY_z,  0x017E, 
-+IBUS_KEY_less, 0x0338,  0x226E, 
-+IBUS_KEY_less, 0x2395,  0x2343, 
-+IBUS_KEY_equal, IBUS_KEY_slash,  0x2260, 
-+IBUS_KEY_equal, IBUS_KEY_greater,  0x21D2, 
-+IBUS_KEY_equal, IBUS_KEY_C,  0x20AC, 
-+IBUS_KEY_equal, IBUS_KEY_E,  0x20AC, 
-+IBUS_KEY_equal, IBUS_KEY_L,  0x20A4, 
-+IBUS_KEY_equal, IBUS_KEY_N,  0x20A6, 
-+IBUS_KEY_equal, IBUS_KEY_O,  0x0150, 
-+IBUS_KEY_equal, IBUS_KEY_R,  0x20B9, 
-+IBUS_KEY_equal, IBUS_KEY_U,  0x0170, 
-+IBUS_KEY_equal, IBUS_KEY_W,  0x20A9, 
-+IBUS_KEY_equal, IBUS_KEY_Y,  0x00A5, 
-+IBUS_KEY_equal, IBUS_KEY_underscore,  0x2261, 
-+IBUS_KEY_equal, IBUS_KEY_c,  0x20AC, 
-+IBUS_KEY_equal, IBUS_KEY_d,  0x20AB, 
-+IBUS_KEY_equal, IBUS_KEY_e,  0x20AC, 
-+IBUS_KEY_equal, IBUS_KEY_l,  0x00A3, 
-+IBUS_KEY_equal, IBUS_KEY_o,  0x0151, 
-+IBUS_KEY_equal, IBUS_KEY_r,  0x20B9, 
-+IBUS_KEY_equal, IBUS_KEY_u,  0x0171, 
-+IBUS_KEY_equal, IBUS_KEY_y,  0x00A5, 
-+IBUS_KEY_equal, 0x0338,  0x2260, 
-+IBUS_KEY_equal, IBUS_KEY_Cyrillic_u,  0x04F3, 
-+IBUS_KEY_equal, IBUS_KEY_Cyrillic_IE,  0x20AC, 
-+IBUS_KEY_equal, IBUS_KEY_Cyrillic_ES,  0x20AC, 
-+IBUS_KEY_equal, IBUS_KEY_Cyrillic_U,  0x04F2, 
-+IBUS_KEY_equal, 0x2395,  0x2338, 
-+IBUS_KEY_greater, IBUS_KEY_space,  0x005E, 
-+IBUS_KEY_greater, IBUS_KEY_quotedbl,  0x201D, 
-+IBUS_KEY_greater, IBUS_KEY_apostrophe,  0x2019, 
-+IBUS_KEY_greater, IBUS_KEY_less,  0x22C4, 
-+IBUS_KEY_greater, IBUS_KEY_equal,  0x2265, 
-+IBUS_KEY_greater, IBUS_KEY_greater,  0x00BB, 
-+IBUS_KEY_greater, IBUS_KEY_A,  0x00C2, 
-+IBUS_KEY_greater, IBUS_KEY_E,  0x00CA, 
-+IBUS_KEY_greater, IBUS_KEY_I,  0x00CE, 
-+IBUS_KEY_greater, IBUS_KEY_O,  0x00D4, 
-+IBUS_KEY_greater, IBUS_KEY_U,  0x00DB, 
-+IBUS_KEY_greater, IBUS_KEY_underscore,  0x2265, 
-+IBUS_KEY_greater, IBUS_KEY_a,  0x00E2, 
-+IBUS_KEY_greater, IBUS_KEY_e,  0x00EA, 
-+IBUS_KEY_greater, IBUS_KEY_i,  0x00EE, 
-+IBUS_KEY_greater, IBUS_KEY_o,  0x00F4, 
-+IBUS_KEY_greater, IBUS_KEY_u,  0x00FB, 
-+IBUS_KEY_greater, IBUS_KEY_diaeresis,  0x2369, 
-+IBUS_KEY_greater, 0x0338,  0x226F, 
-+IBUS_KEY_greater, 0x2395,  0x2344, 
-+IBUS_KEY_question, IBUS_KEY_exclam,  0x2E18, 
-+IBUS_KEY_question, IBUS_KEY_question,  0x00BF, 
-+IBUS_KEY_question, IBUS_KEY_A,  0x1EA2, 
-+IBUS_KEY_question, IBUS_KEY_E,  0x1EBA, 
-+IBUS_KEY_question, IBUS_KEY_I,  0x1EC8, 
-+IBUS_KEY_question, IBUS_KEY_O,  0x1ECE, 
-+IBUS_KEY_question, IBUS_KEY_U,  0x1EE6, 
-+IBUS_KEY_question, IBUS_KEY_Y,  0x1EF6, 
-+IBUS_KEY_question, IBUS_KEY_a,  0x1EA3, 
-+IBUS_KEY_question, IBUS_KEY_e,  0x1EBB, 
-+IBUS_KEY_question, IBUS_KEY_i,  0x1EC9, 
-+IBUS_KEY_question, IBUS_KEY_o,  0x1ECF, 
-+IBUS_KEY_question, IBUS_KEY_u,  0x1EE7, 
-+IBUS_KEY_question, IBUS_KEY_y,  0x1EF7, 
-+IBUS_KEY_question, IBUS_KEY_Acircumflex,  0x1EA8, 
-+IBUS_KEY_question, IBUS_KEY_Ecircumflex,  0x1EC2, 
-+IBUS_KEY_question, IBUS_KEY_Ocircumflex,  0x1ED4, 
-+IBUS_KEY_question, IBUS_KEY_acircumflex,  0x1EA9, 
-+IBUS_KEY_question, IBUS_KEY_ecircumflex,  0x1EC3, 
-+IBUS_KEY_question, IBUS_KEY_ocircumflex,  0x1ED5, 
-+IBUS_KEY_question, IBUS_KEY_Abreve,  0x1EB2, 
-+IBUS_KEY_question, IBUS_KEY_abreve,  0x1EB3, 
-+IBUS_KEY_question, 0x2395,  0x2370, 
-+IBUS_KEY_A, IBUS_KEY_quotedbl,  0x00C4, 
-+IBUS_KEY_A, IBUS_KEY_apostrophe,  0x00C1, 
-+IBUS_KEY_A, IBUS_KEY_parenleft,  0x0102, 
-+IBUS_KEY_A, IBUS_KEY_asterisk,  0x00C5, 
-+IBUS_KEY_A, IBUS_KEY_comma,  0x0104, 
-+IBUS_KEY_A, IBUS_KEY_minus,  0x0100, 
-+IBUS_KEY_A, IBUS_KEY_semicolon,  0x0104, 
-+IBUS_KEY_A, IBUS_KEY_greater,  0x00C2, 
-+IBUS_KEY_A, IBUS_KEY_A,  0x00C5, 
-+IBUS_KEY_A, IBUS_KEY_E,  0x00C6, 
-+IBUS_KEY_A, IBUS_KEY_T,  0x0040, 
-+IBUS_KEY_A, IBUS_KEY_asciicircum,  0x00C2, 
-+IBUS_KEY_A, IBUS_KEY_underscore,  0x0100, 
-+IBUS_KEY_A, IBUS_KEY_grave,  0x00C0, 
-+IBUS_KEY_A, IBUS_KEY_asciitilde,  0x00C3, 
-+IBUS_KEY_A, IBUS_KEY_diaeresis,  0x00C4, 
-+IBUS_KEY_A, IBUS_KEY_acute,  0x00C1, 
-+IBUS_KEY_B, IBUS_KEY_period,  0x1E02, 
-+IBUS_KEY_C, IBUS_KEY_apostrophe,  0x0106, 
-+IBUS_KEY_C, IBUS_KEY_comma,  0x00C7, 
-+IBUS_KEY_C, IBUS_KEY_period,  0x010A, 
-+IBUS_KEY_C, IBUS_KEY_slash,  0x20A1, 
-+IBUS_KEY_C, IBUS_KEY_0,  0x00A9, 
-+IBUS_KEY_C, IBUS_KEY_less,  0x010C, 
-+IBUS_KEY_C, IBUS_KEY_equal,  0x20AC, 
-+IBUS_KEY_C, IBUS_KEY_E,  0x20A0, 
-+IBUS_KEY_C, IBUS_KEY_O,  0x00A9, 
-+IBUS_KEY_C, IBUS_KEY_o,  0x00A9, 
-+IBUS_KEY_C, IBUS_KEY_r,  0x20A2, 
-+IBUS_KEY_C, IBUS_KEY_bar,  0x00A2, 
-+IBUS_KEY_D, IBUS_KEY_comma,  0x1E10, 
-+IBUS_KEY_D, IBUS_KEY_minus,  0x0110, 
-+IBUS_KEY_D, IBUS_KEY_period,  0x1E0A, 
-+IBUS_KEY_D, IBUS_KEY_less,  0x010E, 
-+IBUS_KEY_D, IBUS_KEY_H,  0x00D0, 
-+IBUS_KEY_E, IBUS_KEY_quotedbl,  0x00CB, 
-+IBUS_KEY_E, IBUS_KEY_apostrophe,  0x00C9, 
-+IBUS_KEY_E, IBUS_KEY_comma,  0x0118, 
-+IBUS_KEY_E, IBUS_KEY_minus,  0x0112, 
-+IBUS_KEY_E, IBUS_KEY_period,  0x0116, 
-+IBUS_KEY_E, IBUS_KEY_semicolon,  0x0118, 
-+IBUS_KEY_E, IBUS_KEY_less,  0x011A, 
-+IBUS_KEY_E, IBUS_KEY_equal,  0x20AC, 
-+IBUS_KEY_E, IBUS_KEY_greater,  0x00CA, 
-+IBUS_KEY_E, IBUS_KEY_asciicircum,  0x00CA, 
-+IBUS_KEY_E, IBUS_KEY_underscore,  0x0112, 
-+IBUS_KEY_E, IBUS_KEY_grave,  0x00C8, 
-+IBUS_KEY_E, IBUS_KEY_diaeresis,  0x00CB, 
-+IBUS_KEY_E, IBUS_KEY_acute,  0x00C9, 
-+IBUS_KEY_F, IBUS_KEY_period,  0x1E1E, 
-+IBUS_KEY_F, IBUS_KEY_i,  0xFB03, 
-+IBUS_KEY_F, IBUS_KEY_l,  0xFB04, 
-+IBUS_KEY_F, IBUS_KEY_r,  0x20A3, 
-+IBUS_KEY_G, IBUS_KEY_parenleft,  0x011E, 
-+IBUS_KEY_G, IBUS_KEY_comma,  0x0122, 
-+IBUS_KEY_G, IBUS_KEY_period,  0x0120, 
-+IBUS_KEY_G, IBUS_KEY_U,  0x011E, 
-+IBUS_KEY_G, IBUS_KEY_breve,  0x011E, 
-+IBUS_KEY_H, IBUS_KEY_comma,  0x1E28, 
-+IBUS_KEY_I, IBUS_KEY_quotedbl,  0x00CF, 
-+IBUS_KEY_I, IBUS_KEY_apostrophe,  0x00CD, 
-+IBUS_KEY_I, IBUS_KEY_comma,  0x012E, 
-+IBUS_KEY_I, IBUS_KEY_minus,  0x012A, 
-+IBUS_KEY_I, IBUS_KEY_period,  0x0130, 
-+IBUS_KEY_I, IBUS_KEY_semicolon,  0x012E, 
-+IBUS_KEY_I, IBUS_KEY_greater,  0x00CE, 
-+IBUS_KEY_I, IBUS_KEY_J,  0x0132, 
-+IBUS_KEY_I, IBUS_KEY_asciicircum,  0x00CE, 
-+IBUS_KEY_I, IBUS_KEY_underscore,  0x012A, 
-+IBUS_KEY_I, IBUS_KEY_grave,  0x00CC, 
-+IBUS_KEY_I, IBUS_KEY_j,  0x0132, 
-+IBUS_KEY_I, IBUS_KEY_asciitilde,  0x0128, 
-+IBUS_KEY_I, IBUS_KEY_diaeresis,  0x00CF, 
-+IBUS_KEY_I, IBUS_KEY_acute,  0x00CD, 
-+IBUS_KEY_K, IBUS_KEY_comma,  0x0136, 
-+IBUS_KEY_L, IBUS_KEY_apostrophe,  0x0139, 
-+IBUS_KEY_L, IBUS_KEY_comma,  0x013B, 
-+IBUS_KEY_L, IBUS_KEY_minus,  0x00A3, 
-+IBUS_KEY_L, IBUS_KEY_slash,  0x0141, 
-+IBUS_KEY_L, IBUS_KEY_less,  0x013D, 
-+IBUS_KEY_L, IBUS_KEY_equal,  0x20A4, 
-+IBUS_KEY_L, IBUS_KEY_V,  0x007C, 
-+IBUS_KEY_M, IBUS_KEY_period,  0x1E40, 
-+IBUS_KEY_N, IBUS_KEY_apostrophe,  0x0143, 
-+IBUS_KEY_N, IBUS_KEY_comma,  0x0145, 
-+IBUS_KEY_N, IBUS_KEY_minus,  0x00D1, 
-+IBUS_KEY_N, IBUS_KEY_less,  0x0147, 
-+IBUS_KEY_N, IBUS_KEY_equal,  0x20A6, 
-+IBUS_KEY_N, IBUS_KEY_G,  0x014A, 
-+IBUS_KEY_N, IBUS_KEY_O,  0x2116, 
-+IBUS_KEY_N, IBUS_KEY_o,  0x2116, 
-+IBUS_KEY_N, IBUS_KEY_asciitilde,  0x00D1, 
-+IBUS_KEY_O, IBUS_KEY_quotedbl,  0x00D6, 
-+IBUS_KEY_O, IBUS_KEY_apostrophe,  0x00D3, 
-+IBUS_KEY_O, IBUS_KEY_comma,  0x01EA, 
-+IBUS_KEY_O, IBUS_KEY_minus,  0x014C, 
-+IBUS_KEY_O, IBUS_KEY_slash,  0x00D8, 
-+IBUS_KEY_O, IBUS_KEY_semicolon,  0x01EA, 
-+IBUS_KEY_O, IBUS_KEY_greater,  0x00D4, 
-+IBUS_KEY_O, IBUS_KEY_A,  0x24B6, 
-+IBUS_KEY_O, IBUS_KEY_C,  0x00A9, 
-+IBUS_KEY_O, IBUS_KEY_E,  0x0152, 
-+IBUS_KEY_O, IBUS_KEY_R,  0x00AE, 
-+IBUS_KEY_O, IBUS_KEY_S,  0x00A7, 
-+IBUS_KEY_O, IBUS_KEY_X,  0x00A4, 
-+IBUS_KEY_O, IBUS_KEY_asciicircum,  0x00D4, 
-+IBUS_KEY_O, IBUS_KEY_underscore,  0x014C, 
-+IBUS_KEY_O, IBUS_KEY_grave,  0x00D2, 
-+IBUS_KEY_O, IBUS_KEY_c,  0x00A9, 
-+IBUS_KEY_O, IBUS_KEY_r,  0x00AE, 
-+IBUS_KEY_O, IBUS_KEY_x,  0x00A4, 
-+IBUS_KEY_O, IBUS_KEY_asciitilde,  0x00D5, 
-+IBUS_KEY_O, IBUS_KEY_diaeresis,  0x00D6, 
-+IBUS_KEY_O, IBUS_KEY_acute,  0x00D3, 
-+IBUS_KEY_P, IBUS_KEY_exclam,  0x00B6, 
-+IBUS_KEY_P, IBUS_KEY_period,  0x1E56, 
-+IBUS_KEY_P, IBUS_KEY_P,  0x00B6, 
-+IBUS_KEY_P, IBUS_KEY_t,  0x20A7, 
-+IBUS_KEY_R, IBUS_KEY_apostrophe,  0x0154, 
-+IBUS_KEY_R, IBUS_KEY_comma,  0x0156, 
-+IBUS_KEY_R, IBUS_KEY_less,  0x0158, 
-+IBUS_KEY_R, IBUS_KEY_equal,  0x20B9, 
-+IBUS_KEY_R, IBUS_KEY_O,  0x00AE, 
-+IBUS_KEY_R, IBUS_KEY_o,  0x00AE, 
-+IBUS_KEY_R, IBUS_KEY_s,  0x20A8, 
-+IBUS_KEY_S, IBUS_KEY_exclam,  0x00A7, 
-+IBUS_KEY_S, IBUS_KEY_apostrophe,  0x015A, 
-+IBUS_KEY_S, IBUS_KEY_comma,  0x015E, 
-+IBUS_KEY_S, IBUS_KEY_period,  0x1E60, 
-+IBUS_KEY_S, IBUS_KEY_0,  0x00A7, 
-+IBUS_KEY_S, IBUS_KEY_1,  0x00B9, 
-+IBUS_KEY_S, IBUS_KEY_2,  0x00B2, 
-+IBUS_KEY_S, IBUS_KEY_3,  0x00B3, 
-+IBUS_KEY_S, IBUS_KEY_semicolon,  0x0218, 
-+IBUS_KEY_S, IBUS_KEY_less,  0x0160, 
-+IBUS_KEY_S, IBUS_KEY_M,  0x2120, 
-+IBUS_KEY_S, IBUS_KEY_O,  0x00A7, 
-+IBUS_KEY_S, IBUS_KEY_S,  0x1E9E, 
-+IBUS_KEY_S, IBUS_KEY_m,  0x2120, 
-+IBUS_KEY_S, IBUS_KEY_cedilla,  0x015E, 
-+IBUS_KEY_T, IBUS_KEY_comma,  0x0162, 
-+IBUS_KEY_T, IBUS_KEY_minus,  0x0166, 
-+IBUS_KEY_T, IBUS_KEY_period,  0x1E6A, 
-+IBUS_KEY_T, IBUS_KEY_slash,  0x0166, 
-+IBUS_KEY_T, IBUS_KEY_semicolon,  0x021A, 
-+IBUS_KEY_T, IBUS_KEY_less,  0x0164, 
-+IBUS_KEY_T, IBUS_KEY_H,  0x00DE, 
-+IBUS_KEY_T, IBUS_KEY_M,  0x2122, 
-+IBUS_KEY_T, IBUS_KEY_m,  0x2122, 
-+IBUS_KEY_U, IBUS_KEY_quotedbl,  0x00DC, 
-+IBUS_KEY_U, IBUS_KEY_apostrophe,  0x00DA, 
-+IBUS_KEY_U, IBUS_KEY_asterisk,  0x016E, 
-+IBUS_KEY_U, IBUS_KEY_comma,  0x0172, 
-+IBUS_KEY_U, IBUS_KEY_minus,  0x016A, 
-+IBUS_KEY_U, IBUS_KEY_slash,  0x00B5, 
-+IBUS_KEY_U, IBUS_KEY_semicolon,  0x0172, 
-+IBUS_KEY_U, IBUS_KEY_greater,  0x00DB, 
-+IBUS_KEY_U, IBUS_KEY_A,  0x0102, 
-+IBUS_KEY_U, IBUS_KEY_E,  0x0114, 
-+IBUS_KEY_U, IBUS_KEY_G,  0x011E, 
-+IBUS_KEY_U, IBUS_KEY_I,  0x012C, 
-+IBUS_KEY_U, IBUS_KEY_O,  0x014E, 
-+IBUS_KEY_U, IBUS_KEY_U,  0x016C, 
-+IBUS_KEY_U, IBUS_KEY_asciicircum,  0x00DB, 
-+IBUS_KEY_U, IBUS_KEY_underscore,  0x016A, 
-+IBUS_KEY_U, IBUS_KEY_grave,  0x00D9, 
-+IBUS_KEY_U, IBUS_KEY_a,  0x0103, 
-+IBUS_KEY_U, IBUS_KEY_e,  0x0115, 
-+IBUS_KEY_U, IBUS_KEY_g,  0x011F, 
-+IBUS_KEY_U, IBUS_KEY_i,  0x012D, 
-+IBUS_KEY_U, IBUS_KEY_o,  0x014F, 
-+IBUS_KEY_U, IBUS_KEY_u,  0x016D, 
-+IBUS_KEY_U, IBUS_KEY_asciitilde,  0x0168, 
-+IBUS_KEY_U, IBUS_KEY_diaeresis,  0x00DC, 
-+IBUS_KEY_U, IBUS_KEY_acute,  0x00DA, 
-+IBUS_KEY_U, 0x0228,  0x1E1C, 
-+IBUS_KEY_U, 0x0229,  0x1E1D, 
-+IBUS_KEY_U, IBUS_KEY_Cyrillic_a,  0x04D1, 
-+IBUS_KEY_U, IBUS_KEY_Cyrillic_ie,  0x04D7, 
-+IBUS_KEY_U, IBUS_KEY_Cyrillic_i,  0x0439, 
-+IBUS_KEY_U, IBUS_KEY_Cyrillic_u,  0x045E, 
-+IBUS_KEY_U, IBUS_KEY_Cyrillic_zhe,  0x04C2, 
-+IBUS_KEY_U, IBUS_KEY_Cyrillic_A,  0x04D0, 
-+IBUS_KEY_U, IBUS_KEY_Cyrillic_IE,  0x04D6, 
-+IBUS_KEY_U, IBUS_KEY_Cyrillic_I,  0x0419, 
-+IBUS_KEY_U, IBUS_KEY_Cyrillic_U,  0x040E, 
-+IBUS_KEY_U, IBUS_KEY_Cyrillic_ZHE,  0x04C1, 
-+IBUS_KEY_U, IBUS_KEY_Greek_ALPHA,  0x1FB8, 
-+IBUS_KEY_U, IBUS_KEY_Greek_IOTA,  0x1FD8, 
-+IBUS_KEY_U, IBUS_KEY_Greek_UPSILON,  0x1FE8, 
-+IBUS_KEY_U, IBUS_KEY_Greek_alpha,  0x1FB0, 
-+IBUS_KEY_U, IBUS_KEY_Greek_iota,  0x1FD0, 
-+IBUS_KEY_U, IBUS_KEY_Greek_upsilon,  0x1FE0, 
-+IBUS_KEY_U, 0x1EA0,  0x1EB6, 
-+IBUS_KEY_U, 0x1EA1,  0x1EB7, 
-+IBUS_KEY_V, IBUS_KEY_L,  0x007C, 
-+IBUS_KEY_W, IBUS_KEY_equal,  0x20A9, 
-+IBUS_KEY_W, IBUS_KEY_asciicircum,  0x0174, 
-+IBUS_KEY_X, IBUS_KEY_0,  0x00A4, 
-+IBUS_KEY_X, IBUS_KEY_O,  0x00A4, 
-+IBUS_KEY_X, IBUS_KEY_o,  0x00A4, 
-+IBUS_KEY_Y, IBUS_KEY_quotedbl,  0x0178, 
-+IBUS_KEY_Y, IBUS_KEY_apostrophe,  0x00DD, 
-+IBUS_KEY_Y, IBUS_KEY_minus,  0x00A5, 
-+IBUS_KEY_Y, IBUS_KEY_equal,  0x00A5, 
-+IBUS_KEY_Y, IBUS_KEY_asciicircum,  0x0176, 
-+IBUS_KEY_Y, IBUS_KEY_diaeresis,  0x0178, 
-+IBUS_KEY_Y, IBUS_KEY_acute,  0x00DD, 
-+IBUS_KEY_Z, IBUS_KEY_apostrophe,  0x0179, 
-+IBUS_KEY_Z, IBUS_KEY_period,  0x017B, 
-+IBUS_KEY_Z, IBUS_KEY_less,  0x017D, 
-+IBUS_KEY_bracketleft, IBUS_KEY_bracketright,  0x2337, 
-+IBUS_KEY_backslash, IBUS_KEY_minus,  0x2340, 
-+IBUS_KEY_backslash, 0x2395,  0x2342, 
-+IBUS_KEY_backslash, IBUS_KEY_emopencircle,  0x2349, 
-+IBUS_KEY_bracketright, IBUS_KEY_bracketleft,  0x2337, 
-+IBUS_KEY_asciicircum, IBUS_KEY_space,  0x005E, 
-+IBUS_KEY_asciicircum, IBUS_KEY_parenleft,  0x207D, 
-+IBUS_KEY_asciicircum, IBUS_KEY_parenright,  0x207E, 
-+IBUS_KEY_asciicircum, IBUS_KEY_plus,  0x207A, 
-+IBUS_KEY_asciicircum, IBUS_KEY_minus,  0x00AF, 
-+IBUS_KEY_asciicircum, IBUS_KEY_period,  0x00B7, 
-+IBUS_KEY_asciicircum, IBUS_KEY_slash,  0x007C, 
-+IBUS_KEY_asciicircum, IBUS_KEY_0,  0x2070, 
-+IBUS_KEY_asciicircum, IBUS_KEY_1,  0x00B9, 
-+IBUS_KEY_asciicircum, IBUS_KEY_2,  0x00B2, 
-+IBUS_KEY_asciicircum, IBUS_KEY_3,  0x00B3, 
-+IBUS_KEY_asciicircum, IBUS_KEY_4,  0x2074, 
-+IBUS_KEY_asciicircum, IBUS_KEY_5,  0x2075, 
-+IBUS_KEY_asciicircum, IBUS_KEY_6,  0x2076, 
-+IBUS_KEY_asciicircum, IBUS_KEY_7,  0x2077, 
-+IBUS_KEY_asciicircum, IBUS_KEY_8,  0x2078, 
-+IBUS_KEY_asciicircum, IBUS_KEY_9,  0x2079, 
-+IBUS_KEY_asciicircum, IBUS_KEY_equal,  0x207C, 
-+IBUS_KEY_asciicircum, IBUS_KEY_A,  0x00C2, 
-+IBUS_KEY_asciicircum, IBUS_KEY_C,  0x0108, 
-+IBUS_KEY_asciicircum, IBUS_KEY_E,  0x00CA, 
-+IBUS_KEY_asciicircum, IBUS_KEY_G,  0x011C, 
-+IBUS_KEY_asciicircum, IBUS_KEY_H,  0x0124, 
-+IBUS_KEY_asciicircum, IBUS_KEY_I,  0x00CE, 
-+IBUS_KEY_asciicircum, IBUS_KEY_J,  0x0134, 
-+IBUS_KEY_asciicircum, IBUS_KEY_O,  0x00D4, 
-+IBUS_KEY_asciicircum, IBUS_KEY_S,  0x015C, 
-+IBUS_KEY_asciicircum, IBUS_KEY_U,  0x00DB, 
-+IBUS_KEY_asciicircum, IBUS_KEY_W,  0x0174, 
-+IBUS_KEY_asciicircum, IBUS_KEY_Y,  0x0176, 
-+IBUS_KEY_asciicircum, IBUS_KEY_Z,  0x1E90, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underscore,  0x00AF, 
-+IBUS_KEY_asciicircum, IBUS_KEY_a,  0x00E2, 
-+IBUS_KEY_asciicircum, IBUS_KEY_c,  0x0109, 
-+IBUS_KEY_asciicircum, IBUS_KEY_e,  0x00EA, 
-+IBUS_KEY_asciicircum, IBUS_KEY_g,  0x011D, 
-+IBUS_KEY_asciicircum, IBUS_KEY_h,  0x0125, 
-+IBUS_KEY_asciicircum, IBUS_KEY_i,  0x00EE, 
-+IBUS_KEY_asciicircum, IBUS_KEY_j,  0x0135, 
-+IBUS_KEY_asciicircum, IBUS_KEY_o,  0x00F4, 
-+IBUS_KEY_asciicircum, IBUS_KEY_s,  0x015D, 
-+IBUS_KEY_asciicircum, IBUS_KEY_u,  0x00FB, 
-+IBUS_KEY_asciicircum, IBUS_KEY_w,  0x0175, 
-+IBUS_KEY_asciicircum, IBUS_KEY_y,  0x0177, 
-+IBUS_KEY_asciicircum, IBUS_KEY_z,  0x1E91, 
-+IBUS_KEY_asciicircum, 0x1EA0,  0x1EAC, 
-+IBUS_KEY_asciicircum, 0x1EA1,  0x1EAD, 
-+IBUS_KEY_asciicircum, 0x1EB8,  0x1EC6, 
-+IBUS_KEY_asciicircum, 0x1EB9,  0x1EC7, 
-+IBUS_KEY_asciicircum, 0x1ECC,  0x1ED8, 
-+IBUS_KEY_asciicircum, 0x1ECD,  0x1ED9, 
-+IBUS_KEY_asciicircum, 0x2212,  0x207B, 
-+IBUS_KEY_asciicircum, 0x4E00,  0x3192, 
-+IBUS_KEY_asciicircum, 0x4E01,  0x319C, 
-+IBUS_KEY_asciicircum, 0x4E09,  0x3194, 
-+IBUS_KEY_asciicircum, 0x4E0A,  0x3196, 
-+IBUS_KEY_asciicircum, 0x4E0B,  0x3198, 
-+IBUS_KEY_asciicircum, 0x4E19,  0x319B, 
-+IBUS_KEY_asciicircum, 0x4E2D,  0x3197, 
-+IBUS_KEY_asciicircum, 0x4E59,  0x319A, 
-+IBUS_KEY_asciicircum, 0x4E8C,  0x3193, 
-+IBUS_KEY_asciicircum, 0x4EBA,  0x319F, 
-+IBUS_KEY_asciicircum, 0x56DB,  0x3195, 
-+IBUS_KEY_asciicircum, 0x5730,  0x319E, 
-+IBUS_KEY_asciicircum, 0x5929,  0x319D, 
-+IBUS_KEY_asciicircum, 0x7532,  0x3199, 
-+IBUS_KEY_asciicircum, IBUS_KEY_KP_Space,  0x00B2, 
-+IBUS_KEY_asciicircum, IBUS_KEY_KP_Add,  0x207A, 
-+IBUS_KEY_asciicircum, IBUS_KEY_KP_0,  0x2070, 
-+IBUS_KEY_asciicircum, IBUS_KEY_KP_1,  0x00B9, 
-+IBUS_KEY_asciicircum, IBUS_KEY_KP_2,  0x00B2, 
-+IBUS_KEY_asciicircum, IBUS_KEY_KP_3,  0x00B3, 
-+IBUS_KEY_asciicircum, IBUS_KEY_KP_4,  0x2074, 
-+IBUS_KEY_asciicircum, IBUS_KEY_KP_5,  0x2075, 
-+IBUS_KEY_asciicircum, IBUS_KEY_KP_6,  0x2076, 
-+IBUS_KEY_asciicircum, IBUS_KEY_KP_7,  0x2077, 
-+IBUS_KEY_asciicircum, IBUS_KEY_KP_8,  0x2078, 
-+IBUS_KEY_asciicircum, IBUS_KEY_KP_9,  0x2079, 
-+IBUS_KEY_asciicircum, IBUS_KEY_KP_Equal,  0x207C, 
-+IBUS_KEY_underscore, IBUS_KEY_apostrophe,  0x2358, 
-+IBUS_KEY_underscore, IBUS_KEY_parenleft,  0x208D, 
-+IBUS_KEY_underscore, IBUS_KEY_parenright,  0x208E, 
-+IBUS_KEY_underscore, IBUS_KEY_plus,  0x208A, 
-+IBUS_KEY_underscore, IBUS_KEY_0,  0x2080, 
-+IBUS_KEY_underscore, IBUS_KEY_1,  0x2081, 
-+IBUS_KEY_underscore, IBUS_KEY_2,  0x2082, 
-+IBUS_KEY_underscore, IBUS_KEY_3,  0x2083, 
-+IBUS_KEY_underscore, IBUS_KEY_4,  0x2084, 
-+IBUS_KEY_underscore, IBUS_KEY_5,  0x2085, 
-+IBUS_KEY_underscore, IBUS_KEY_6,  0x2086, 
-+IBUS_KEY_underscore, IBUS_KEY_7,  0x2087, 
-+IBUS_KEY_underscore, IBUS_KEY_8,  0x2088, 
-+IBUS_KEY_underscore, IBUS_KEY_9,  0x2089, 
-+IBUS_KEY_underscore, IBUS_KEY_less,  0x2264, 
-+IBUS_KEY_underscore, IBUS_KEY_equal,  0x208C, 
-+IBUS_KEY_underscore, IBUS_KEY_greater,  0x2265, 
-+IBUS_KEY_underscore, IBUS_KEY_A,  0x0100, 
-+IBUS_KEY_underscore, IBUS_KEY_E,  0x0112, 
-+IBUS_KEY_underscore, IBUS_KEY_G,  0x1E20, 
-+IBUS_KEY_underscore, IBUS_KEY_I,  0x012A, 
-+IBUS_KEY_underscore, IBUS_KEY_O,  0x014C, 
-+IBUS_KEY_underscore, IBUS_KEY_U,  0x016A, 
-+IBUS_KEY_underscore, IBUS_KEY_Y,  0x0232, 
-+IBUS_KEY_underscore, IBUS_KEY_asciicircum,  0x00AF, 
-+IBUS_KEY_underscore, IBUS_KEY_underscore,  0x00AF, 
-+IBUS_KEY_underscore, IBUS_KEY_a,  0x0101, 
-+IBUS_KEY_underscore, IBUS_KEY_e,  0x0113, 
-+IBUS_KEY_underscore, IBUS_KEY_g,  0x1E21, 
-+IBUS_KEY_underscore, IBUS_KEY_i,  0x012B, 
-+IBUS_KEY_underscore, IBUS_KEY_o,  0x014D, 
-+IBUS_KEY_underscore, IBUS_KEY_u,  0x016B, 
-+IBUS_KEY_underscore, IBUS_KEY_y,  0x0233, 
-+IBUS_KEY_underscore, IBUS_KEY_Adiaeresis,  0x01DE, 
-+IBUS_KEY_underscore, IBUS_KEY_AE,  0x01E2, 
-+IBUS_KEY_underscore, IBUS_KEY_Otilde,  0x022C, 
-+IBUS_KEY_underscore, IBUS_KEY_Odiaeresis,  0x022A, 
-+IBUS_KEY_underscore, IBUS_KEY_Udiaeresis,  0x01D5, 
-+IBUS_KEY_underscore, IBUS_KEY_adiaeresis,  0x01DF, 
-+IBUS_KEY_underscore, IBUS_KEY_ae,  0x01E3, 
-+IBUS_KEY_underscore, IBUS_KEY_otilde,  0x022D, 
-+IBUS_KEY_underscore, IBUS_KEY_odiaeresis,  0x022B, 
-+IBUS_KEY_underscore, IBUS_KEY_udiaeresis,  0x01D6, 
-+IBUS_KEY_underscore, 0x01EA,  0x01EC, 
-+IBUS_KEY_underscore, 0x01EB,  0x01ED, 
-+IBUS_KEY_underscore, 0x0226,  0x01E0, 
-+IBUS_KEY_underscore, 0x0227,  0x01E1, 
-+IBUS_KEY_underscore, 0x022E,  0x0230, 
-+IBUS_KEY_underscore, 0x022F,  0x0231, 
-+IBUS_KEY_underscore, IBUS_KEY_Cyrillic_i,  0x04E3, 
-+IBUS_KEY_underscore, IBUS_KEY_Cyrillic_u,  0x04EF, 
-+IBUS_KEY_underscore, IBUS_KEY_Cyrillic_I,  0x04E2, 
-+IBUS_KEY_underscore, IBUS_KEY_Cyrillic_U,  0x04EE, 
-+IBUS_KEY_underscore, IBUS_KEY_Greek_ALPHA,  0x1FB9, 
-+IBUS_KEY_underscore, IBUS_KEY_Greek_IOTA,  0x1FD9, 
-+IBUS_KEY_underscore, IBUS_KEY_Greek_UPSILON,  0x1FE9, 
-+IBUS_KEY_underscore, IBUS_KEY_Greek_alpha,  0x1FB1, 
-+IBUS_KEY_underscore, IBUS_KEY_Greek_iota,  0x1FD1, 
-+IBUS_KEY_underscore, IBUS_KEY_Greek_upsilon,  0x1FE1, 
-+IBUS_KEY_underscore, 0x1E36,  0x1E38, 
-+IBUS_KEY_underscore, 0x1E37,  0x1E39, 
-+IBUS_KEY_underscore, 0x1E5A,  0x1E5C, 
-+IBUS_KEY_underscore, 0x1E5B,  0x1E5D, 
-+IBUS_KEY_underscore, 0x2206,  0x2359, 
-+IBUS_KEY_underscore, 0x220A,  0x2377, 
-+IBUS_KEY_underscore, 0x2212,  0x208B, 
-+IBUS_KEY_underscore, 0x2218,  0x235B, 
-+IBUS_KEY_underscore, 0x2260,  0x2262, 
-+IBUS_KEY_underscore, 0x2282,  0x2286, 
-+IBUS_KEY_underscore, 0x2283,  0x2287, 
-+IBUS_KEY_underscore, IBUS_KEY_downtack,  0x234A, 
-+IBUS_KEY_underscore, 0x22C4,  0x235A, 
-+IBUS_KEY_underscore, 0x2373,  0x2378, 
-+IBUS_KEY_underscore, 0x2375,  0x2379, 
-+IBUS_KEY_underscore, 0x237A,  0x2376, 
-+IBUS_KEY_underscore, IBUS_KEY_emopencircle,  0x235C, 
-+IBUS_KEY_underscore, IBUS_KEY_KP_Space,  0x2082, 
-+IBUS_KEY_underscore, IBUS_KEY_KP_Add,  0x208A, 
-+IBUS_KEY_underscore, IBUS_KEY_KP_0,  0x2080, 
-+IBUS_KEY_underscore, IBUS_KEY_KP_1,  0x2081, 
-+IBUS_KEY_underscore, IBUS_KEY_KP_2,  0x2082, 
-+IBUS_KEY_underscore, IBUS_KEY_KP_3,  0x2083, 
-+IBUS_KEY_underscore, IBUS_KEY_KP_4,  0x2084, 
-+IBUS_KEY_underscore, IBUS_KEY_KP_5,  0x2085, 
-+IBUS_KEY_underscore, IBUS_KEY_KP_6,  0x2086, 
-+IBUS_KEY_underscore, IBUS_KEY_KP_7,  0x2087, 
-+IBUS_KEY_underscore, IBUS_KEY_KP_8,  0x2088, 
-+IBUS_KEY_underscore, IBUS_KEY_KP_9,  0x2089, 
-+IBUS_KEY_underscore, IBUS_KEY_KP_Equal,  0x208C, 
-+IBUS_KEY_grave, IBUS_KEY_space,  0x0060, 
-+IBUS_KEY_grave, IBUS_KEY_A,  0x00C0, 
-+IBUS_KEY_grave, IBUS_KEY_E,  0x00C8, 
-+IBUS_KEY_grave, IBUS_KEY_I,  0x00CC, 
-+IBUS_KEY_grave, IBUS_KEY_N,  0x01F8, 
-+IBUS_KEY_grave, IBUS_KEY_O,  0x00D2, 
-+IBUS_KEY_grave, IBUS_KEY_U,  0x00D9, 
-+IBUS_KEY_grave, IBUS_KEY_W,  0x1E80, 
-+IBUS_KEY_grave, IBUS_KEY_Y,  0x1EF2, 
-+IBUS_KEY_grave, IBUS_KEY_a,  0x00E0, 
-+IBUS_KEY_grave, IBUS_KEY_e,  0x00E8, 
-+IBUS_KEY_grave, IBUS_KEY_i,  0x00EC, 
-+IBUS_KEY_grave, IBUS_KEY_n,  0x01F9, 
-+IBUS_KEY_grave, IBUS_KEY_o,  0x00F2, 
-+IBUS_KEY_grave, IBUS_KEY_u,  0x00F9, 
-+IBUS_KEY_grave, IBUS_KEY_w,  0x1E81, 
-+IBUS_KEY_grave, IBUS_KEY_y,  0x1EF3, 
-+IBUS_KEY_grave, IBUS_KEY_Acircumflex,  0x1EA6, 
-+IBUS_KEY_grave, IBUS_KEY_Ecircumflex,  0x1EC0, 
-+IBUS_KEY_grave, IBUS_KEY_Ocircumflex,  0x1ED2, 
-+IBUS_KEY_grave, IBUS_KEY_Udiaeresis,  0x01DB, 
-+IBUS_KEY_grave, IBUS_KEY_acircumflex,  0x1EA7, 
-+IBUS_KEY_grave, IBUS_KEY_ecircumflex,  0x1EC1, 
-+IBUS_KEY_grave, IBUS_KEY_ocircumflex,  0x1ED3, 
-+IBUS_KEY_grave, IBUS_KEY_udiaeresis,  0x01DC, 
-+IBUS_KEY_grave, IBUS_KEY_Abreve,  0x1EB0, 
-+IBUS_KEY_grave, IBUS_KEY_abreve,  0x1EB1, 
-+IBUS_KEY_grave, IBUS_KEY_Emacron,  0x1E14, 
-+IBUS_KEY_grave, IBUS_KEY_emacron,  0x1E15, 
-+IBUS_KEY_grave, IBUS_KEY_Omacron,  0x1E50, 
-+IBUS_KEY_grave, IBUS_KEY_omacron,  0x1E51, 
-+IBUS_KEY_grave, IBUS_KEY_Cyrillic_ie,  0x0450, 
-+IBUS_KEY_grave, IBUS_KEY_Cyrillic_i,  0x045D, 
-+IBUS_KEY_grave, IBUS_KEY_Cyrillic_IE,  0x0400, 
-+IBUS_KEY_grave, IBUS_KEY_Cyrillic_I,  0x040D, 
-+IBUS_KEY_grave, IBUS_KEY_Greek_iotadieresis,  0x1FD2, 
-+IBUS_KEY_grave, IBUS_KEY_Greek_upsilondieresis,  0x1FE2, 
-+IBUS_KEY_grave, IBUS_KEY_Greek_ALPHA,  0x1FBA, 
-+IBUS_KEY_grave, IBUS_KEY_Greek_EPSILON,  0x1FC8, 
-+IBUS_KEY_grave, IBUS_KEY_Greek_ETA,  0x1FCA, 
-+IBUS_KEY_grave, IBUS_KEY_Greek_IOTA,  0x1FDA, 
-+IBUS_KEY_grave, IBUS_KEY_Greek_OMICRON,  0x1FF8, 
-+IBUS_KEY_grave, IBUS_KEY_Greek_UPSILON,  0x1FEA, 
-+IBUS_KEY_grave, IBUS_KEY_Greek_OMEGA,  0x1FFA, 
-+IBUS_KEY_grave, IBUS_KEY_Greek_alpha,  0x1F70, 
-+IBUS_KEY_grave, IBUS_KEY_Greek_epsilon,  0x1F72, 
-+IBUS_KEY_grave, IBUS_KEY_Greek_eta,  0x1F74, 
-+IBUS_KEY_grave, IBUS_KEY_Greek_iota,  0x1F76, 
-+IBUS_KEY_grave, IBUS_KEY_Greek_omicron,  0x1F78, 
-+IBUS_KEY_grave, IBUS_KEY_Greek_upsilon,  0x1F7A, 
-+IBUS_KEY_grave, IBUS_KEY_Greek_omega,  0x1F7C, 
-+IBUS_KEY_grave, 0x1F00,  0x1F02, 
-+IBUS_KEY_grave, 0x1F01,  0x1F03, 
-+IBUS_KEY_grave, 0x1F08,  0x1F0A, 
-+IBUS_KEY_grave, 0x1F09,  0x1F0B, 
-+IBUS_KEY_grave, 0x1F10,  0x1F12, 
-+IBUS_KEY_grave, 0x1F11,  0x1F13, 
-+IBUS_KEY_grave, 0x1F18,  0x1F1A, 
-+IBUS_KEY_grave, 0x1F19,  0x1F1B, 
-+IBUS_KEY_grave, 0x1F20,  0x1F22, 
-+IBUS_KEY_grave, 0x1F21,  0x1F23, 
-+IBUS_KEY_grave, 0x1F28,  0x1F2A, 
-+IBUS_KEY_grave, 0x1F29,  0x1F2B, 
-+IBUS_KEY_grave, 0x1F30,  0x1F32, 
-+IBUS_KEY_grave, 0x1F31,  0x1F33, 
-+IBUS_KEY_grave, 0x1F38,  0x1F3A, 
-+IBUS_KEY_grave, 0x1F39,  0x1F3B, 
-+IBUS_KEY_grave, 0x1F40,  0x1F42, 
-+IBUS_KEY_grave, 0x1F41,  0x1F43, 
-+IBUS_KEY_grave, 0x1F48,  0x1F4A, 
-+IBUS_KEY_grave, 0x1F49,  0x1F4B, 
-+IBUS_KEY_grave, 0x1F50,  0x1F52, 
-+IBUS_KEY_grave, 0x1F51,  0x1F53, 
-+IBUS_KEY_grave, 0x1F59,  0x1F5B, 
-+IBUS_KEY_grave, 0x1F60,  0x1F62, 
-+IBUS_KEY_grave, 0x1F61,  0x1F63, 
-+IBUS_KEY_grave, 0x1F68,  0x1F6A, 
-+IBUS_KEY_grave, 0x1F69,  0x1F6B, 
-+IBUS_KEY_a, IBUS_KEY_quotedbl,  0x00E4, 
-+IBUS_KEY_a, IBUS_KEY_apostrophe,  0x00E1, 
-+IBUS_KEY_a, IBUS_KEY_parenleft,  0x0103, 
-+IBUS_KEY_a, IBUS_KEY_asterisk,  0x00E5, 
-+IBUS_KEY_a, IBUS_KEY_comma,  0x0105, 
-+IBUS_KEY_a, IBUS_KEY_minus,  0x0101, 
-+IBUS_KEY_a, IBUS_KEY_semicolon,  0x0105, 
-+IBUS_KEY_a, IBUS_KEY_greater,  0x00E2, 
-+IBUS_KEY_a, IBUS_KEY_asciicircum,  0x00E2, 
-+IBUS_KEY_a, IBUS_KEY_underscore,  0x0101, 
-+IBUS_KEY_a, IBUS_KEY_grave,  0x00E0, 
-+IBUS_KEY_a, IBUS_KEY_a,  0x00E5, 
-+IBUS_KEY_a, IBUS_KEY_e,  0x00E6, 
-+IBUS_KEY_a, IBUS_KEY_asciitilde,  0x00E3, 
-+IBUS_KEY_a, IBUS_KEY_diaeresis,  0x00E4, 
-+IBUS_KEY_a, IBUS_KEY_acute,  0x00E1, 
-+IBUS_KEY_b, IBUS_KEY_period,  0x1E03, 
-+IBUS_KEY_b, IBUS_KEY_A,  0x0102, 
-+IBUS_KEY_b, IBUS_KEY_E,  0x0114, 
-+IBUS_KEY_b, IBUS_KEY_G,  0x011E, 
-+IBUS_KEY_b, IBUS_KEY_I,  0x012C, 
-+IBUS_KEY_b, IBUS_KEY_O,  0x014E, 
-+IBUS_KEY_b, IBUS_KEY_U,  0x016C, 
-+IBUS_KEY_b, IBUS_KEY_a,  0x0103, 
-+IBUS_KEY_b, IBUS_KEY_e,  0x0115, 
-+IBUS_KEY_b, IBUS_KEY_g,  0x011F, 
-+IBUS_KEY_b, IBUS_KEY_i,  0x012D, 
-+IBUS_KEY_b, IBUS_KEY_o,  0x014F, 
-+IBUS_KEY_b, IBUS_KEY_u,  0x016D, 
-+IBUS_KEY_b, 0x0228,  0x1E1C, 
-+IBUS_KEY_b, 0x0229,  0x1E1D, 
-+IBUS_KEY_b, IBUS_KEY_Cyrillic_a,  0x04D1, 
-+IBUS_KEY_b, IBUS_KEY_Cyrillic_ie,  0x04D7, 
-+IBUS_KEY_b, IBUS_KEY_Cyrillic_i,  0x0439, 
-+IBUS_KEY_b, IBUS_KEY_Cyrillic_u,  0x045E, 
-+IBUS_KEY_b, IBUS_KEY_Cyrillic_zhe,  0x04C2, 
-+IBUS_KEY_b, IBUS_KEY_Cyrillic_A,  0x04D0, 
-+IBUS_KEY_b, IBUS_KEY_Cyrillic_IE,  0x04D6, 
-+IBUS_KEY_b, IBUS_KEY_Cyrillic_I,  0x0419, 
-+IBUS_KEY_b, IBUS_KEY_Cyrillic_U,  0x040E, 
-+IBUS_KEY_b, IBUS_KEY_Cyrillic_ZHE,  0x04C1, 
-+IBUS_KEY_b, IBUS_KEY_Greek_ALPHA,  0x1FB8, 
-+IBUS_KEY_b, IBUS_KEY_Greek_IOTA,  0x1FD8, 
-+IBUS_KEY_b, IBUS_KEY_Greek_UPSILON,  0x1FE8, 
-+IBUS_KEY_b, IBUS_KEY_Greek_alpha,  0x1FB0, 
-+IBUS_KEY_b, IBUS_KEY_Greek_iota,  0x1FD0, 
-+IBUS_KEY_b, IBUS_KEY_Greek_upsilon,  0x1FE0, 
-+IBUS_KEY_b, 0x1EA0,  0x1EB6, 
-+IBUS_KEY_b, 0x1EA1,  0x1EB7, 
-+IBUS_KEY_c, IBUS_KEY_apostrophe,  0x0107, 
-+IBUS_KEY_c, IBUS_KEY_comma,  0x00E7, 
-+IBUS_KEY_c, IBUS_KEY_period,  0x010B, 
-+IBUS_KEY_c, IBUS_KEY_slash,  0x00A2, 
-+IBUS_KEY_c, IBUS_KEY_0,  0x00A9, 
-+IBUS_KEY_c, IBUS_KEY_less,  0x010D, 
-+IBUS_KEY_c, IBUS_KEY_equal,  0x20AC, 
-+IBUS_KEY_c, IBUS_KEY_A,  0x01CD, 
-+IBUS_KEY_c, IBUS_KEY_C,  0x010C, 
-+IBUS_KEY_c, IBUS_KEY_D,  0x010E, 
-+IBUS_KEY_c, IBUS_KEY_E,  0x011A, 
-+IBUS_KEY_c, IBUS_KEY_G,  0x01E6, 
-+IBUS_KEY_c, IBUS_KEY_H,  0x021E, 
-+IBUS_KEY_c, IBUS_KEY_I,  0x01CF, 
-+IBUS_KEY_c, IBUS_KEY_K,  0x01E8, 
-+IBUS_KEY_c, IBUS_KEY_L,  0x013D, 
-+IBUS_KEY_c, IBUS_KEY_N,  0x0147, 
-+IBUS_KEY_c, IBUS_KEY_O,  0x01D1, 
-+IBUS_KEY_c, IBUS_KEY_R,  0x0158, 
-+IBUS_KEY_c, IBUS_KEY_S,  0x0160, 
-+IBUS_KEY_c, IBUS_KEY_T,  0x0164, 
-+IBUS_KEY_c, IBUS_KEY_U,  0x01D3, 
-+IBUS_KEY_c, IBUS_KEY_Z,  0x017D, 
-+IBUS_KEY_c, IBUS_KEY_a,  0x01CE, 
-+IBUS_KEY_c, IBUS_KEY_c,  0x010D, 
-+IBUS_KEY_c, IBUS_KEY_d,  0x010F, 
-+IBUS_KEY_c, IBUS_KEY_e,  0x011B, 
-+IBUS_KEY_c, IBUS_KEY_g,  0x01E7, 
-+IBUS_KEY_c, IBUS_KEY_h,  0x021F, 
-+IBUS_KEY_c, IBUS_KEY_i,  0x01D0, 
-+IBUS_KEY_c, IBUS_KEY_j,  0x01F0, 
-+IBUS_KEY_c, IBUS_KEY_k,  0x01E9, 
-+IBUS_KEY_c, IBUS_KEY_l,  0x013E, 
-+IBUS_KEY_c, IBUS_KEY_n,  0x0148, 
-+IBUS_KEY_c, IBUS_KEY_o,  0x01D2, 
-+IBUS_KEY_c, IBUS_KEY_r,  0x0159, 
-+IBUS_KEY_c, IBUS_KEY_s,  0x0161, 
-+IBUS_KEY_c, IBUS_KEY_t,  0x0165, 
-+IBUS_KEY_c, IBUS_KEY_u,  0x01D4, 
-+IBUS_KEY_c, IBUS_KEY_z,  0x017E, 
-+IBUS_KEY_c, IBUS_KEY_bar,  0x00A2, 
-+IBUS_KEY_c, IBUS_KEY_Udiaeresis,  0x01D9, 
-+IBUS_KEY_c, IBUS_KEY_udiaeresis,  0x01DA, 
-+IBUS_KEY_d, IBUS_KEY_comma,  0x1E11, 
-+IBUS_KEY_d, IBUS_KEY_minus,  0x0111, 
-+IBUS_KEY_d, IBUS_KEY_period,  0x1E0B, 
-+IBUS_KEY_d, IBUS_KEY_less,  0x010F, 
-+IBUS_KEY_d, IBUS_KEY_equal,  0x20AB, 
-+IBUS_KEY_d, IBUS_KEY_h,  0x00F0, 
-+IBUS_KEY_d, IBUS_KEY_i,  0x2300, 
-+IBUS_KEY_e, IBUS_KEY_quotedbl,  0x00EB, 
-+IBUS_KEY_e, IBUS_KEY_apostrophe,  0x00E9, 
-+IBUS_KEY_e, IBUS_KEY_comma,  0x0119, 
-+IBUS_KEY_e, IBUS_KEY_minus,  0x0113, 
-+IBUS_KEY_e, IBUS_KEY_period,  0x0117, 
-+IBUS_KEY_e, IBUS_KEY_semicolon,  0x0119, 
-+IBUS_KEY_e, IBUS_KEY_less,  0x011B, 
-+IBUS_KEY_e, IBUS_KEY_equal,  0x20AC, 
-+IBUS_KEY_e, IBUS_KEY_greater,  0x00EA, 
-+IBUS_KEY_e, IBUS_KEY_asciicircum,  0x00EA, 
-+IBUS_KEY_e, IBUS_KEY_underscore,  0x0113, 
-+IBUS_KEY_e, IBUS_KEY_grave,  0x00E8, 
-+IBUS_KEY_e, IBUS_KEY_e,  0x0259, 
-+IBUS_KEY_e, IBUS_KEY_diaeresis,  0x00EB, 
-+IBUS_KEY_e, IBUS_KEY_acute,  0x00E9, 
-+IBUS_KEY_f, IBUS_KEY_period,  0x1E1F, 
-+IBUS_KEY_f, IBUS_KEY_S,  0x017F, 
-+IBUS_KEY_f, IBUS_KEY_f,  0xFB00, 
-+IBUS_KEY_f, IBUS_KEY_i,  0xFB01, 
-+IBUS_KEY_f, IBUS_KEY_l,  0xFB02, 
-+IBUS_KEY_f, IBUS_KEY_s,  0x017F, 
-+IBUS_KEY_g, IBUS_KEY_parenleft,  0x011F, 
-+IBUS_KEY_g, IBUS_KEY_comma,  0x0123, 
-+IBUS_KEY_g, IBUS_KEY_period,  0x0121, 
-+IBUS_KEY_g, IBUS_KEY_U,  0x011F, 
-+IBUS_KEY_g, IBUS_KEY_breve,  0x011F, 
-+IBUS_KEY_h, IBUS_KEY_comma,  0x1E29, 
-+IBUS_KEY_i, IBUS_KEY_quotedbl,  0x00EF, 
-+IBUS_KEY_i, IBUS_KEY_apostrophe,  0x00ED, 
-+IBUS_KEY_i, IBUS_KEY_comma,  0x012F, 
-+IBUS_KEY_i, IBUS_KEY_minus,  0x012B, 
-+IBUS_KEY_i, IBUS_KEY_period,  0x0131, 
-+IBUS_KEY_i, IBUS_KEY_semicolon,  0x012F, 
-+IBUS_KEY_i, IBUS_KEY_greater,  0x00EE, 
-+IBUS_KEY_i, IBUS_KEY_asciicircum,  0x00EE, 
-+IBUS_KEY_i, IBUS_KEY_underscore,  0x012B, 
-+IBUS_KEY_i, IBUS_KEY_grave,  0x00EC, 
-+IBUS_KEY_i, IBUS_KEY_j,  0x0133, 
-+IBUS_KEY_i, IBUS_KEY_asciitilde,  0x0129, 
-+IBUS_KEY_i, IBUS_KEY_diaeresis,  0x00EF, 
-+IBUS_KEY_i, IBUS_KEY_acute,  0x00ED, 
-+IBUS_KEY_k, IBUS_KEY_comma,  0x0137, 
-+IBUS_KEY_k, IBUS_KEY_k,  0x0138, 
-+IBUS_KEY_l, IBUS_KEY_apostrophe,  0x013A, 
-+IBUS_KEY_l, IBUS_KEY_comma,  0x013C, 
-+IBUS_KEY_l, IBUS_KEY_minus,  0x00A3, 
-+IBUS_KEY_l, IBUS_KEY_slash,  0x0142, 
-+IBUS_KEY_l, IBUS_KEY_less,  0x013E, 
-+IBUS_KEY_l, IBUS_KEY_equal,  0x00A3, 
-+IBUS_KEY_l, IBUS_KEY_v,  0x007C, 
-+IBUS_KEY_m, IBUS_KEY_period,  0x1E41, 
-+IBUS_KEY_m, IBUS_KEY_slash,  0x20A5, 
-+IBUS_KEY_m, IBUS_KEY_u,  0x00B5, 
-+IBUS_KEY_n, IBUS_KEY_apostrophe,  0x0144, 
-+IBUS_KEY_n, IBUS_KEY_comma,  0x0146, 
-+IBUS_KEY_n, IBUS_KEY_minus,  0x00F1, 
-+IBUS_KEY_n, IBUS_KEY_less,  0x0148, 
-+IBUS_KEY_n, IBUS_KEY_g,  0x014B, 
-+IBUS_KEY_n, IBUS_KEY_asciitilde,  0x00F1, 
-+IBUS_KEY_o, IBUS_KEY_quotedbl,  0x00F6, 
-+IBUS_KEY_o, IBUS_KEY_apostrophe,  0x00F3, 
-+IBUS_KEY_o, IBUS_KEY_comma,  0x01EB, 
-+IBUS_KEY_o, IBUS_KEY_minus,  0x014D, 
-+IBUS_KEY_o, IBUS_KEY_slash,  0x00F8, 
-+IBUS_KEY_o, IBUS_KEY_semicolon,  0x01EB, 
-+IBUS_KEY_o, IBUS_KEY_greater,  0x00F4, 
-+IBUS_KEY_o, IBUS_KEY_A,  0x00C5, 
-+IBUS_KEY_o, IBUS_KEY_C,  0x00A9, 
-+IBUS_KEY_o, IBUS_KEY_R,  0x00AE, 
-+IBUS_KEY_o, IBUS_KEY_U,  0x016E, 
-+IBUS_KEY_o, IBUS_KEY_X,  0x00A4, 
-+IBUS_KEY_o, IBUS_KEY_asciicircum,  0x00F4, 
-+IBUS_KEY_o, IBUS_KEY_underscore,  0x014D, 
-+IBUS_KEY_o, IBUS_KEY_grave,  0x00F2, 
-+IBUS_KEY_o, IBUS_KEY_a,  0x00E5, 
-+IBUS_KEY_o, IBUS_KEY_c,  0x00A9, 
-+IBUS_KEY_o, IBUS_KEY_e,  0x0153, 
-+IBUS_KEY_o, IBUS_KEY_o,  0x00B0, 
-+IBUS_KEY_o, IBUS_KEY_r,  0x00AE, 
-+IBUS_KEY_o, IBUS_KEY_s,  0x00A7, 
-+IBUS_KEY_o, IBUS_KEY_u,  0x016F, 
-+IBUS_KEY_o, IBUS_KEY_w,  0x1E98, 
-+IBUS_KEY_o, IBUS_KEY_x,  0x00A4, 
-+IBUS_KEY_o, IBUS_KEY_y,  0x1E99, 
-+IBUS_KEY_o, IBUS_KEY_asciitilde,  0x00F5, 
-+IBUS_KEY_o, IBUS_KEY_diaeresis,  0x00F6, 
-+IBUS_KEY_o, IBUS_KEY_acute,  0x00F3, 
-+IBUS_KEY_p, IBUS_KEY_exclam,  0x00B6, 
-+IBUS_KEY_p, IBUS_KEY_period,  0x1E57, 
-+IBUS_KEY_r, IBUS_KEY_apostrophe,  0x0155, 
-+IBUS_KEY_r, IBUS_KEY_comma,  0x0157, 
-+IBUS_KEY_r, IBUS_KEY_less,  0x0159, 
-+IBUS_KEY_r, IBUS_KEY_equal,  0x20B9, 
-+IBUS_KEY_s, IBUS_KEY_exclam,  0x00A7, 
-+IBUS_KEY_s, IBUS_KEY_apostrophe,  0x015B, 
-+IBUS_KEY_s, IBUS_KEY_comma,  0x015F, 
-+IBUS_KEY_s, IBUS_KEY_period,  0x1E61, 
-+IBUS_KEY_s, IBUS_KEY_0,  0x00A7, 
-+IBUS_KEY_s, IBUS_KEY_1,  0x00B9, 
-+IBUS_KEY_s, IBUS_KEY_2,  0x00B2, 
-+IBUS_KEY_s, IBUS_KEY_3,  0x00B3, 
-+IBUS_KEY_s, IBUS_KEY_semicolon,  0x0219, 
-+IBUS_KEY_s, IBUS_KEY_less,  0x0161, 
-+IBUS_KEY_s, IBUS_KEY_M,  0x2120, 
-+IBUS_KEY_s, IBUS_KEY_m,  0x2120, 
-+IBUS_KEY_s, IBUS_KEY_o,  0x00A7, 
-+IBUS_KEY_s, IBUS_KEY_s,  0x00DF, 
-+IBUS_KEY_s, IBUS_KEY_cedilla,  0x015F, 
-+IBUS_KEY_t, IBUS_KEY_comma,  0x0163, 
-+IBUS_KEY_t, IBUS_KEY_minus,  0x0167, 
-+IBUS_KEY_t, IBUS_KEY_period,  0x1E6B, 
-+IBUS_KEY_t, IBUS_KEY_slash,  0x0167, 
-+IBUS_KEY_t, IBUS_KEY_semicolon,  0x021B, 
-+IBUS_KEY_t, IBUS_KEY_less,  0x0165, 
-+IBUS_KEY_t, IBUS_KEY_M,  0x2122, 
-+IBUS_KEY_t, IBUS_KEY_h,  0x00FE, 
-+IBUS_KEY_t, IBUS_KEY_m,  0x2122, 
-+IBUS_KEY_u, IBUS_KEY_quotedbl,  0x00FC, 
-+IBUS_KEY_u, IBUS_KEY_apostrophe,  0x00FA, 
-+IBUS_KEY_u, IBUS_KEY_asterisk,  0x016F, 
-+IBUS_KEY_u, IBUS_KEY_comma,  0x0173, 
-+IBUS_KEY_u, IBUS_KEY_minus,  0x016B, 
-+IBUS_KEY_u, IBUS_KEY_slash,  0x00B5, 
-+IBUS_KEY_u, IBUS_KEY_semicolon,  0x0173, 
-+IBUS_KEY_u, IBUS_KEY_greater,  0x00FB, 
-+IBUS_KEY_u, IBUS_KEY_A,  0x0102, 
-+IBUS_KEY_u, IBUS_KEY_U,  0x016C, 
-+IBUS_KEY_u, IBUS_KEY_asciicircum,  0x00FB, 
-+IBUS_KEY_u, IBUS_KEY_underscore,  0x016B, 
-+IBUS_KEY_u, IBUS_KEY_grave,  0x00F9, 
-+IBUS_KEY_u, IBUS_KEY_a,  0x0103, 
-+IBUS_KEY_u, IBUS_KEY_u,  0x016D, 
-+IBUS_KEY_u, IBUS_KEY_asciitilde,  0x0169, 
-+IBUS_KEY_u, IBUS_KEY_diaeresis,  0x00FC, 
-+IBUS_KEY_u, IBUS_KEY_acute,  0x00FA, 
-+IBUS_KEY_v, IBUS_KEY_slash,  0x221A, 
-+IBUS_KEY_v, IBUS_KEY_Z,  0x017D, 
-+IBUS_KEY_v, IBUS_KEY_l,  0x007C, 
-+IBUS_KEY_v, IBUS_KEY_z,  0x017E, 
-+IBUS_KEY_w, IBUS_KEY_asciicircum,  0x0175, 
-+IBUS_KEY_x, IBUS_KEY_0,  0x00A4, 
-+IBUS_KEY_x, IBUS_KEY_O,  0x00A4, 
-+IBUS_KEY_x, IBUS_KEY_o,  0x00A4, 
-+IBUS_KEY_x, IBUS_KEY_x,  0x00D7, 
-+IBUS_KEY_y, IBUS_KEY_quotedbl,  0x00FF, 
-+IBUS_KEY_y, IBUS_KEY_apostrophe,  0x00FD, 
-+IBUS_KEY_y, IBUS_KEY_minus,  0x00A5, 
-+IBUS_KEY_y, IBUS_KEY_equal,  0x00A5, 
-+IBUS_KEY_y, IBUS_KEY_asciicircum,  0x0177, 
-+IBUS_KEY_y, IBUS_KEY_diaeresis,  0x00FF, 
-+IBUS_KEY_y, IBUS_KEY_acute,  0x00FD, 
-+IBUS_KEY_z, IBUS_KEY_apostrophe,  0x017A, 
-+IBUS_KEY_z, IBUS_KEY_period,  0x017C, 
-+IBUS_KEY_z, IBUS_KEY_less,  0x017E, 
-+IBUS_KEY_braceleft, IBUS_KEY_braceright,  0x2205, 
-+IBUS_KEY_bar, IBUS_KEY_C,  0x00A2, 
-+IBUS_KEY_bar, IBUS_KEY_c,  0x00A2, 
-+IBUS_KEY_bar, IBUS_KEY_asciitilde,  0x236D, 
-+IBUS_KEY_bar, 0x2190,  0x2345, 
-+IBUS_KEY_bar, 0x2192,  0x2346, 
-+IBUS_KEY_bar, 0x2206,  0x234B, 
-+IBUS_KEY_bar, 0x2207,  0x2352, 
-+IBUS_KEY_bar, IBUS_KEY_union,  0x2366, 
-+IBUS_KEY_bar, 0x2282,  0x2367, 
-+IBUS_KEY_bar, IBUS_KEY_emopencircle,  0x233D, 
-+IBUS_KEY_asciitilde, IBUS_KEY_space,  0x007E, 
-+IBUS_KEY_asciitilde, IBUS_KEY_0,  0x236C, 
-+IBUS_KEY_asciitilde, IBUS_KEY_A,  0x00C3, 
-+IBUS_KEY_asciitilde, IBUS_KEY_E,  0x1EBC, 
-+IBUS_KEY_asciitilde, IBUS_KEY_I,  0x0128, 
-+IBUS_KEY_asciitilde, IBUS_KEY_N,  0x00D1, 
-+IBUS_KEY_asciitilde, IBUS_KEY_O,  0x00D5, 
-+IBUS_KEY_asciitilde, IBUS_KEY_U,  0x0168, 
-+IBUS_KEY_asciitilde, IBUS_KEY_V,  0x1E7C, 
-+IBUS_KEY_asciitilde, IBUS_KEY_Y,  0x1EF8, 
-+IBUS_KEY_asciitilde, IBUS_KEY_a,  0x00E3, 
-+IBUS_KEY_asciitilde, IBUS_KEY_e,  0x1EBD, 
-+IBUS_KEY_asciitilde, IBUS_KEY_i,  0x0129, 
-+IBUS_KEY_asciitilde, IBUS_KEY_n,  0x00F1, 
-+IBUS_KEY_asciitilde, IBUS_KEY_o,  0x00F5, 
-+IBUS_KEY_asciitilde, IBUS_KEY_u,  0x0169, 
-+IBUS_KEY_asciitilde, IBUS_KEY_v,  0x1E7D, 
-+IBUS_KEY_asciitilde, IBUS_KEY_y,  0x1EF9, 
-+IBUS_KEY_asciitilde, IBUS_KEY_bar,  0x236D, 
-+IBUS_KEY_asciitilde, IBUS_KEY_diaeresis,  0x2368, 
-+IBUS_KEY_asciitilde, IBUS_KEY_Acircumflex,  0x1EAA, 
-+IBUS_KEY_asciitilde, IBUS_KEY_Ecircumflex,  0x1EC4, 
-+IBUS_KEY_asciitilde, IBUS_KEY_Ocircumflex,  0x1ED6, 
-+IBUS_KEY_asciitilde, IBUS_KEY_acircumflex,  0x1EAB, 
-+IBUS_KEY_asciitilde, IBUS_KEY_ecircumflex,  0x1EC5, 
-+IBUS_KEY_asciitilde, IBUS_KEY_ocircumflex,  0x1ED7, 
-+IBUS_KEY_asciitilde, IBUS_KEY_Abreve,  0x1EB4, 
-+IBUS_KEY_asciitilde, IBUS_KEY_abreve,  0x1EB5, 
-+IBUS_KEY_asciitilde, IBUS_KEY_Greek_iotadieresis,  0x1FD7, 
-+IBUS_KEY_asciitilde, IBUS_KEY_Greek_upsilondieresis,  0x1FE7, 
-+IBUS_KEY_asciitilde, IBUS_KEY_Greek_alpha,  0x1FB6, 
-+IBUS_KEY_asciitilde, IBUS_KEY_Greek_eta,  0x1FC6, 
-+IBUS_KEY_asciitilde, IBUS_KEY_Greek_iota,  0x1FD6, 
-+IBUS_KEY_asciitilde, IBUS_KEY_Greek_upsilon,  0x1FE6, 
-+IBUS_KEY_asciitilde, IBUS_KEY_Greek_omega,  0x1FF6, 
-+IBUS_KEY_asciitilde, 0x1F00,  0x1F06, 
-+IBUS_KEY_asciitilde, 0x1F01,  0x1F07, 
-+IBUS_KEY_asciitilde, 0x1F08,  0x1F0E, 
-+IBUS_KEY_asciitilde, 0x1F09,  0x1F0F, 
-+IBUS_KEY_asciitilde, 0x1F20,  0x1F26, 
-+IBUS_KEY_asciitilde, 0x1F21,  0x1F27, 
-+IBUS_KEY_asciitilde, 0x1F28,  0x1F2E, 
-+IBUS_KEY_asciitilde, 0x1F29,  0x1F2F, 
-+IBUS_KEY_asciitilde, 0x1F30,  0x1F36, 
-+IBUS_KEY_asciitilde, 0x1F31,  0x1F37, 
-+IBUS_KEY_asciitilde, 0x1F38,  0x1F3E, 
-+IBUS_KEY_asciitilde, 0x1F39,  0x1F3F, 
-+IBUS_KEY_asciitilde, 0x1F50,  0x1F56, 
-+IBUS_KEY_asciitilde, 0x1F51,  0x1F57, 
-+IBUS_KEY_asciitilde, 0x1F59,  0x1F5F, 
-+IBUS_KEY_asciitilde, 0x1F60,  0x1F66, 
-+IBUS_KEY_asciitilde, 0x1F61,  0x1F67, 
-+IBUS_KEY_asciitilde, 0x1F68,  0x1F6E, 
-+IBUS_KEY_asciitilde, 0x1F69,  0x1F6F, 
-+IBUS_KEY_asciitilde, 0x2207,  0x236B, 
-+IBUS_KEY_asciitilde, 0x2227,  0x2372, 
-+IBUS_KEY_asciitilde, 0x2228,  0x2371, 
-+IBUS_KEY_diaeresis, IBUS_KEY_apostrophe,  0x0385, 
-+IBUS_KEY_diaeresis, IBUS_KEY_asterisk,  0x2363, 
-+IBUS_KEY_diaeresis, IBUS_KEY_greater,  0x2369, 
-+IBUS_KEY_diaeresis, IBUS_KEY_A,  0x00C4, 
-+IBUS_KEY_diaeresis, IBUS_KEY_E,  0x00CB, 
-+IBUS_KEY_diaeresis, IBUS_KEY_I,  0x00CF, 
-+IBUS_KEY_diaeresis, IBUS_KEY_O,  0x00D6, 
-+IBUS_KEY_diaeresis, IBUS_KEY_U,  0x00DC, 
-+IBUS_KEY_diaeresis, IBUS_KEY_Y,  0x0178, 
-+IBUS_KEY_diaeresis, IBUS_KEY_grave,  0x1FED, 
-+IBUS_KEY_diaeresis, IBUS_KEY_a,  0x00E4, 
-+IBUS_KEY_diaeresis, IBUS_KEY_e,  0x00EB, 
-+IBUS_KEY_diaeresis, IBUS_KEY_i,  0x00EF, 
-+IBUS_KEY_diaeresis, IBUS_KEY_o,  0x00F6, 
-+IBUS_KEY_diaeresis, IBUS_KEY_u,  0x00FC, 
-+IBUS_KEY_diaeresis, IBUS_KEY_y,  0x00FF, 
-+IBUS_KEY_diaeresis, IBUS_KEY_asciitilde,  0x1FC1, 
-+IBUS_KEY_diaeresis, IBUS_KEY_acute,  0x0385, 
-+IBUS_KEY_diaeresis, 0x2207,  0x2362, 
-+IBUS_KEY_diaeresis, 0x2218,  0x2364, 
-+IBUS_KEY_diaeresis, IBUS_KEY_uptack,  0x2361, 
-+IBUS_KEY_diaeresis, IBUS_KEY_emopencircle,  0x2365, 
-+IBUS_KEY_diaeresis, IBUS_KEY_dead_grave,  0x1FED, 
-+IBUS_KEY_diaeresis, IBUS_KEY_dead_acute,  0x0385, 
-+IBUS_KEY_diaeresis, IBUS_KEY_dead_tilde,  0x1FC1, 
-+IBUS_KEY_macron, IBUS_KEY_A,  0x0100, 
-+IBUS_KEY_macron, IBUS_KEY_E,  0x0112, 
-+IBUS_KEY_macron, IBUS_KEY_G,  0x1E20, 
-+IBUS_KEY_macron, IBUS_KEY_I,  0x012A, 
-+IBUS_KEY_macron, IBUS_KEY_O,  0x014C, 
-+IBUS_KEY_macron, IBUS_KEY_U,  0x016A, 
-+IBUS_KEY_macron, IBUS_KEY_Y,  0x0232, 
-+IBUS_KEY_macron, IBUS_KEY_a,  0x0101, 
-+IBUS_KEY_macron, IBUS_KEY_e,  0x0113, 
-+IBUS_KEY_macron, IBUS_KEY_g,  0x1E21, 
-+IBUS_KEY_macron, IBUS_KEY_i,  0x012B, 
-+IBUS_KEY_macron, IBUS_KEY_o,  0x014D, 
-+IBUS_KEY_macron, IBUS_KEY_u,  0x016B, 
-+IBUS_KEY_macron, IBUS_KEY_y,  0x0233, 
-+IBUS_KEY_macron, IBUS_KEY_Adiaeresis,  0x01DE, 
-+IBUS_KEY_macron, IBUS_KEY_AE,  0x01E2, 
-+IBUS_KEY_macron, IBUS_KEY_Otilde,  0x022C, 
-+IBUS_KEY_macron, IBUS_KEY_Odiaeresis,  0x022A, 
-+IBUS_KEY_macron, IBUS_KEY_Udiaeresis,  0x01D5, 
-+IBUS_KEY_macron, IBUS_KEY_adiaeresis,  0x01DF, 
-+IBUS_KEY_macron, IBUS_KEY_ae,  0x01E3, 
-+IBUS_KEY_macron, IBUS_KEY_otilde,  0x022D, 
-+IBUS_KEY_macron, IBUS_KEY_odiaeresis,  0x022B, 
-+IBUS_KEY_macron, IBUS_KEY_udiaeresis,  0x01D6, 
-+IBUS_KEY_macron, 0x01EA,  0x01EC, 
-+IBUS_KEY_macron, 0x01EB,  0x01ED, 
-+IBUS_KEY_macron, 0x0226,  0x01E0, 
-+IBUS_KEY_macron, 0x0227,  0x01E1, 
-+IBUS_KEY_macron, 0x022E,  0x0230, 
-+IBUS_KEY_macron, 0x022F,  0x0231, 
-+IBUS_KEY_macron, IBUS_KEY_Cyrillic_i,  0x04E3, 
-+IBUS_KEY_macron, IBUS_KEY_Cyrillic_u,  0x04EF, 
-+IBUS_KEY_macron, IBUS_KEY_Cyrillic_I,  0x04E2, 
-+IBUS_KEY_macron, IBUS_KEY_Cyrillic_U,  0x04EE, 
-+IBUS_KEY_macron, IBUS_KEY_Greek_ALPHA,  0x1FB9, 
-+IBUS_KEY_macron, IBUS_KEY_Greek_IOTA,  0x1FD9, 
-+IBUS_KEY_macron, IBUS_KEY_Greek_UPSILON,  0x1FE9, 
-+IBUS_KEY_macron, IBUS_KEY_Greek_alpha,  0x1FB1, 
-+IBUS_KEY_macron, IBUS_KEY_Greek_iota,  0x1FD1, 
-+IBUS_KEY_macron, IBUS_KEY_Greek_upsilon,  0x1FE1, 
-+IBUS_KEY_macron, 0x1E36,  0x1E38, 
-+IBUS_KEY_macron, 0x1E37,  0x1E39, 
-+IBUS_KEY_macron, 0x1E5A,  0x1E5C, 
-+IBUS_KEY_macron, 0x1E5B,  0x1E5D, 
-+IBUS_KEY_macron, IBUS_KEY_uptack,  0x2351, 
-+IBUS_KEY_acute, IBUS_KEY_A,  0x00C1, 
-+IBUS_KEY_acute, IBUS_KEY_C,  0x0106, 
-+IBUS_KEY_acute, IBUS_KEY_E,  0x00C9, 
-+IBUS_KEY_acute, IBUS_KEY_G,  0x01F4, 
-+IBUS_KEY_acute, IBUS_KEY_I,  0x00CD, 
-+IBUS_KEY_acute, IBUS_KEY_K,  0x1E30, 
-+IBUS_KEY_acute, IBUS_KEY_L,  0x0139, 
-+IBUS_KEY_acute, IBUS_KEY_M,  0x1E3E, 
-+IBUS_KEY_acute, IBUS_KEY_N,  0x0143, 
-+IBUS_KEY_acute, IBUS_KEY_O,  0x00D3, 
-+IBUS_KEY_acute, IBUS_KEY_P,  0x1E54, 
-+IBUS_KEY_acute, IBUS_KEY_R,  0x0154, 
-+IBUS_KEY_acute, IBUS_KEY_S,  0x015A, 
-+IBUS_KEY_acute, IBUS_KEY_U,  0x00DA, 
-+IBUS_KEY_acute, IBUS_KEY_W,  0x1E82, 
-+IBUS_KEY_acute, IBUS_KEY_Y,  0x00DD, 
-+IBUS_KEY_acute, IBUS_KEY_Z,  0x0179, 
-+IBUS_KEY_acute, IBUS_KEY_a,  0x00E1, 
-+IBUS_KEY_acute, IBUS_KEY_c,  0x0107, 
-+IBUS_KEY_acute, IBUS_KEY_e,  0x00E9, 
-+IBUS_KEY_acute, IBUS_KEY_g,  0x01F5, 
-+IBUS_KEY_acute, IBUS_KEY_i,  0x00ED, 
-+IBUS_KEY_acute, IBUS_KEY_k,  0x1E31, 
-+IBUS_KEY_acute, IBUS_KEY_l,  0x013A, 
-+IBUS_KEY_acute, IBUS_KEY_m,  0x1E3F, 
-+IBUS_KEY_acute, IBUS_KEY_n,  0x0144, 
-+IBUS_KEY_acute, IBUS_KEY_o,  0x00F3, 
-+IBUS_KEY_acute, IBUS_KEY_p,  0x1E55, 
-+IBUS_KEY_acute, IBUS_KEY_r,  0x0155, 
-+IBUS_KEY_acute, IBUS_KEY_s,  0x015B, 
-+IBUS_KEY_acute, IBUS_KEY_u,  0x00FA, 
-+IBUS_KEY_acute, IBUS_KEY_w,  0x1E83, 
-+IBUS_KEY_acute, IBUS_KEY_y,  0x00FD, 
-+IBUS_KEY_acute, IBUS_KEY_z,  0x017A, 
-+IBUS_KEY_acute, IBUS_KEY_Acircumflex,  0x1EA4, 
-+IBUS_KEY_acute, IBUS_KEY_Aring,  0x01FA, 
-+IBUS_KEY_acute, IBUS_KEY_AE,  0x01FC, 
-+IBUS_KEY_acute, IBUS_KEY_Ccedilla,  0x1E08, 
-+IBUS_KEY_acute, IBUS_KEY_Ecircumflex,  0x1EBE, 
-+IBUS_KEY_acute, IBUS_KEY_Idiaeresis,  0x1E2E, 
-+IBUS_KEY_acute, IBUS_KEY_Ocircumflex,  0x1ED0, 
-+IBUS_KEY_acute, IBUS_KEY_Otilde,  0x1E4C, 
-+IBUS_KEY_acute, IBUS_KEY_Ooblique,  0x01FE, 
-+IBUS_KEY_acute, IBUS_KEY_Udiaeresis,  0x01D7, 
-+IBUS_KEY_acute, IBUS_KEY_acircumflex,  0x1EA5, 
-+IBUS_KEY_acute, IBUS_KEY_aring,  0x01FB, 
-+IBUS_KEY_acute, IBUS_KEY_ae,  0x01FD, 
-+IBUS_KEY_acute, IBUS_KEY_ccedilla,  0x1E09, 
-+IBUS_KEY_acute, IBUS_KEY_ecircumflex,  0x1EBF, 
-+IBUS_KEY_acute, IBUS_KEY_idiaeresis,  0x1E2F, 
-+IBUS_KEY_acute, IBUS_KEY_ocircumflex,  0x1ED1, 
-+IBUS_KEY_acute, IBUS_KEY_otilde,  0x1E4D, 
-+IBUS_KEY_acute, IBUS_KEY_oslash,  0x01FF, 
-+IBUS_KEY_acute, IBUS_KEY_udiaeresis,  0x01D8, 
-+IBUS_KEY_acute, IBUS_KEY_Abreve,  0x1EAE, 
-+IBUS_KEY_acute, IBUS_KEY_abreve,  0x1EAF, 
-+IBUS_KEY_acute, IBUS_KEY_Emacron,  0x1E16, 
-+IBUS_KEY_acute, IBUS_KEY_emacron,  0x1E17, 
-+IBUS_KEY_acute, IBUS_KEY_Omacron,  0x1E52, 
-+IBUS_KEY_acute, IBUS_KEY_Utilde,  0x1E78, 
-+IBUS_KEY_acute, IBUS_KEY_omacron,  0x1E53, 
-+IBUS_KEY_acute, IBUS_KEY_utilde,  0x1E79, 
-+IBUS_KEY_acute, IBUS_KEY_Cyrillic_ghe,  0x0453, 
-+IBUS_KEY_acute, IBUS_KEY_Cyrillic_ka,  0x045C, 
-+IBUS_KEY_acute, IBUS_KEY_Cyrillic_GHE,  0x0403, 
-+IBUS_KEY_acute, IBUS_KEY_Cyrillic_KA,  0x040C, 
-+IBUS_KEY_acute, IBUS_KEY_Greek_iotadieresis,  0x0390, 
-+IBUS_KEY_acute, IBUS_KEY_Greek_upsilondieresis,  0x03B0, 
-+IBUS_KEY_acute, IBUS_KEY_Greek_ALPHA,  0x0386, 
-+IBUS_KEY_acute, IBUS_KEY_Greek_EPSILON,  0x0388, 
-+IBUS_KEY_acute, IBUS_KEY_Greek_ETA,  0x0389, 
-+IBUS_KEY_acute, IBUS_KEY_Greek_IOTA,  0x038A, 
-+IBUS_KEY_acute, IBUS_KEY_Greek_OMICRON,  0x038C, 
-+IBUS_KEY_acute, IBUS_KEY_Greek_UPSILON,  0x038E, 
-+IBUS_KEY_acute, IBUS_KEY_Greek_OMEGA,  0x038F, 
-+IBUS_KEY_acute, IBUS_KEY_Greek_alpha,  0x03AC, 
-+IBUS_KEY_acute, IBUS_KEY_Greek_epsilon,  0x03AD, 
-+IBUS_KEY_acute, IBUS_KEY_Greek_eta,  0x03AE, 
-+IBUS_KEY_acute, IBUS_KEY_Greek_iota,  0x03AF, 
-+IBUS_KEY_acute, IBUS_KEY_Greek_omicron,  0x03CC, 
-+IBUS_KEY_acute, IBUS_KEY_Greek_upsilon,  0x03CD, 
-+IBUS_KEY_acute, IBUS_KEY_Greek_omega,  0x03CE, 
-+IBUS_KEY_acute, 0x1F00,  0x1F04, 
-+IBUS_KEY_acute, 0x1F01,  0x1F05, 
-+IBUS_KEY_acute, 0x1F08,  0x1F0C, 
-+IBUS_KEY_acute, 0x1F09,  0x1F0D, 
-+IBUS_KEY_acute, 0x1F10,  0x1F14, 
-+IBUS_KEY_acute, 0x1F11,  0x1F15, 
-+IBUS_KEY_acute, 0x1F18,  0x1F1C, 
-+IBUS_KEY_acute, 0x1F19,  0x1F1D, 
-+IBUS_KEY_acute, 0x1F20,  0x1F24, 
-+IBUS_KEY_acute, 0x1F21,  0x1F25, 
-+IBUS_KEY_acute, 0x1F28,  0x1F2C, 
-+IBUS_KEY_acute, 0x1F29,  0x1F2D, 
-+IBUS_KEY_acute, 0x1F30,  0x1F34, 
-+IBUS_KEY_acute, 0x1F31,  0x1F35, 
-+IBUS_KEY_acute, 0x1F38,  0x1F3C, 
-+IBUS_KEY_acute, 0x1F39,  0x1F3D, 
-+IBUS_KEY_acute, 0x1F40,  0x1F44, 
-+IBUS_KEY_acute, 0x1F41,  0x1F45, 
-+IBUS_KEY_acute, 0x1F48,  0x1F4C, 
-+IBUS_KEY_acute, 0x1F49,  0x1F4D, 
-+IBUS_KEY_acute, 0x1F50,  0x1F54, 
-+IBUS_KEY_acute, 0x1F51,  0x1F55, 
-+IBUS_KEY_acute, 0x1F59,  0x1F5D, 
-+IBUS_KEY_acute, 0x1F60,  0x1F64, 
-+IBUS_KEY_acute, 0x1F61,  0x1F65, 
-+IBUS_KEY_acute, 0x1F68,  0x1F6C, 
-+IBUS_KEY_acute, 0x1F69,  0x1F6D, 
-+IBUS_KEY_cedilla, IBUS_KEY_C,  0x00C7, 
-+IBUS_KEY_cedilla, IBUS_KEY_D,  0x1E10, 
-+IBUS_KEY_cedilla, IBUS_KEY_E,  0x0228, 
-+IBUS_KEY_cedilla, IBUS_KEY_G,  0x0122, 
-+IBUS_KEY_cedilla, IBUS_KEY_H,  0x1E28, 
-+IBUS_KEY_cedilla, IBUS_KEY_K,  0x0136, 
-+IBUS_KEY_cedilla, IBUS_KEY_L,  0x013B, 
-+IBUS_KEY_cedilla, IBUS_KEY_N,  0x0145, 
-+IBUS_KEY_cedilla, IBUS_KEY_R,  0x0156, 
-+IBUS_KEY_cedilla, IBUS_KEY_S,  0x015E, 
-+IBUS_KEY_cedilla, IBUS_KEY_T,  0x0162, 
-+IBUS_KEY_cedilla, IBUS_KEY_c,  0x00E7, 
-+IBUS_KEY_cedilla, IBUS_KEY_d,  0x1E11, 
-+IBUS_KEY_cedilla, IBUS_KEY_e,  0x0229, 
-+IBUS_KEY_cedilla, IBUS_KEY_g,  0x0123, 
-+IBUS_KEY_cedilla, IBUS_KEY_h,  0x1E29, 
-+IBUS_KEY_cedilla, IBUS_KEY_k,  0x0137, 
-+IBUS_KEY_cedilla, IBUS_KEY_l,  0x013C, 
-+IBUS_KEY_cedilla, IBUS_KEY_n,  0x0146, 
-+IBUS_KEY_cedilla, IBUS_KEY_r,  0x0157, 
-+IBUS_KEY_cedilla, IBUS_KEY_s,  0x015F, 
-+IBUS_KEY_cedilla, IBUS_KEY_t,  0x0163, 
-+IBUS_KEY_division, 0x2395,  0x2339, 
-+IBUS_KEY_breve, IBUS_KEY_G,  0x011E, 
-+IBUS_KEY_breve, IBUS_KEY_g,  0x011F, 
-+0x05B4, IBUS_KEY_hebrew_yod,  0xFB1D, 
-+0x05B7, 0x05F2,  0xFB1F, 
-+0x05B7, IBUS_KEY_hebrew_aleph,  0xFB2E, 
-+0x05B8, IBUS_KEY_hebrew_aleph,  0xFB2F, 
-+0x05B9, IBUS_KEY_hebrew_waw,  0xFB4B, 
-+0x05BC, IBUS_KEY_hebrew_aleph,  0xFB30, 
-+0x05BC, IBUS_KEY_hebrew_bet,  0xFB31, 
-+0x05BC, IBUS_KEY_hebrew_gimel,  0xFB32, 
-+0x05BC, IBUS_KEY_hebrew_dalet,  0xFB33, 
-+0x05BC, IBUS_KEY_hebrew_he,  0xFB34, 
-+0x05BC, IBUS_KEY_hebrew_waw,  0xFB35, 
-+0x05BC, IBUS_KEY_hebrew_zain,  0xFB36, 
-+0x05BC, IBUS_KEY_hebrew_tet,  0xFB38, 
-+0x05BC, IBUS_KEY_hebrew_yod,  0xFB39, 
-+0x05BC, IBUS_KEY_hebrew_finalkaph,  0xFB3A, 
-+0x05BC, IBUS_KEY_hebrew_kaph,  0xFB3B, 
-+0x05BC, IBUS_KEY_hebrew_lamed,  0xFB3C, 
-+0x05BC, IBUS_KEY_hebrew_mem,  0xFB3E, 
-+0x05BC, IBUS_KEY_hebrew_nun,  0xFB40, 
-+0x05BC, IBUS_KEY_hebrew_samech,  0xFB41, 
-+0x05BC, IBUS_KEY_hebrew_finalpe,  0xFB43, 
-+0x05BC, IBUS_KEY_hebrew_pe,  0xFB44, 
-+0x05BC, IBUS_KEY_hebrew_zade,  0xFB46, 
-+0x05BC, IBUS_KEY_hebrew_kuf,  0xFB47, 
-+0x05BC, IBUS_KEY_hebrew_resh,  0xFB48, 
-+0x05BC, IBUS_KEY_hebrew_shin,  0xFB49, 
-+0x05BC, IBUS_KEY_hebrew_taf,  0xFB4A, 
-+0x05BF, IBUS_KEY_hebrew_bet,  0xFB4C, 
-+0x05BF, IBUS_KEY_hebrew_kaph,  0xFB4D, 
-+0x05BF, IBUS_KEY_hebrew_pe,  0xFB4E, 
-+0x05C1, IBUS_KEY_hebrew_shin,  0xFB2A, 
-+0x05C1, 0xFB49,  0xFB2C, 
-+0x05C2, IBUS_KEY_hebrew_shin,  0xFB2B, 
-+0x05C2, 0xFB49,  0xFB2D, 
-+0x0653, IBUS_KEY_Arabic_alef,  0x0622, 
-+0x0654, IBUS_KEY_Arabic_alef,  0x0623, 
-+0x0654, IBUS_KEY_Arabic_waw,  0x0624, 
-+0x0654, IBUS_KEY_Arabic_yeh,  0x0626, 
-+0x0654, 0x06C1,  0x06C2, 
-+0x0654, 0x06D2,  0x06D3, 
-+0x0654, 0x06D5,  0x06C0, 
-+0x0655, IBUS_KEY_Arabic_alef,  0x0625, 
-+IBUS_KEY_Cyrillic_pe, IBUS_KEY_Cyrillic_a,  0x00A7, 
-+IBUS_KEY_Cyrillic_IE, IBUS_KEY_equal,  0x20AC, 
-+IBUS_KEY_Cyrillic_EN, IBUS_KEY_Cyrillic_o,  0x2116, 
-+IBUS_KEY_Cyrillic_EN, IBUS_KEY_Cyrillic_O,  0x2116, 
-+IBUS_KEY_Cyrillic_ES, IBUS_KEY_equal,  0x20AC, 
-+IBUS_KEY_Greek_ALPHA, IBUS_KEY_apostrophe,  0x0386, 
-+IBUS_KEY_Greek_EPSILON, IBUS_KEY_apostrophe,  0x0388, 
-+IBUS_KEY_Greek_ETA, IBUS_KEY_apostrophe,  0x0389, 
-+IBUS_KEY_Greek_IOTA, IBUS_KEY_quotedbl,  0x03AA, 
-+IBUS_KEY_Greek_IOTA, IBUS_KEY_apostrophe,  0x038A, 
-+IBUS_KEY_Greek_OMICRON, IBUS_KEY_apostrophe,  0x038C, 
-+IBUS_KEY_Greek_UPSILON, IBUS_KEY_quotedbl,  0x03AB, 
-+IBUS_KEY_Greek_UPSILON, IBUS_KEY_apostrophe,  0x038E, 
-+IBUS_KEY_Greek_OMEGA, IBUS_KEY_apostrophe,  0x038F, 
-+IBUS_KEY_Greek_alpha, IBUS_KEY_apostrophe,  0x03AC, 
-+IBUS_KEY_Greek_epsilon, IBUS_KEY_apostrophe,  0x03AD, 
-+IBUS_KEY_Greek_eta, IBUS_KEY_apostrophe,  0x03AE, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_quotedbl,  0x03CA, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe,  0x03AF, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_Greek_alphaaccent,  0x1FB4, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_Greek_etaaccent,  0x1FC4, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_Greek_omegaaccent,  0x1FF4, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_Greek_ALPHA,  0x1FBC, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_Greek_ETA,  0x1FCC, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_Greek_OMEGA,  0x1FFC, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_Greek_alpha,  0x1FB3, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_Greek_eta,  0x1FC3, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_Greek_omega,  0x1FF3, 
-+IBUS_KEY_Greek_iota, 0x1F00,  0x1F80, 
-+IBUS_KEY_Greek_iota, 0x1F01,  0x1F81, 
-+IBUS_KEY_Greek_iota, 0x1F02,  0x1F82, 
-+IBUS_KEY_Greek_iota, 0x1F03,  0x1F83, 
-+IBUS_KEY_Greek_iota, 0x1F04,  0x1F84, 
-+IBUS_KEY_Greek_iota, 0x1F05,  0x1F85, 
-+IBUS_KEY_Greek_iota, 0x1F06,  0x1F86, 
-+IBUS_KEY_Greek_iota, 0x1F07,  0x1F87, 
-+IBUS_KEY_Greek_iota, 0x1F08,  0x1F88, 
-+IBUS_KEY_Greek_iota, 0x1F09,  0x1F89, 
-+IBUS_KEY_Greek_iota, 0x1F0A,  0x1F8A, 
-+IBUS_KEY_Greek_iota, 0x1F0B,  0x1F8B, 
-+IBUS_KEY_Greek_iota, 0x1F0C,  0x1F8C, 
-+IBUS_KEY_Greek_iota, 0x1F0D,  0x1F8D, 
-+IBUS_KEY_Greek_iota, 0x1F0E,  0x1F8E, 
-+IBUS_KEY_Greek_iota, 0x1F0F,  0x1F8F, 
-+IBUS_KEY_Greek_iota, 0x1F20,  0x1F90, 
-+IBUS_KEY_Greek_iota, 0x1F21,  0x1F91, 
-+IBUS_KEY_Greek_iota, 0x1F22,  0x1F92, 
-+IBUS_KEY_Greek_iota, 0x1F23,  0x1F93, 
-+IBUS_KEY_Greek_iota, 0x1F24,  0x1F94, 
-+IBUS_KEY_Greek_iota, 0x1F25,  0x1F95, 
-+IBUS_KEY_Greek_iota, 0x1F26,  0x1F96, 
-+IBUS_KEY_Greek_iota, 0x1F27,  0x1F97, 
-+IBUS_KEY_Greek_iota, 0x1F28,  0x1F98, 
-+IBUS_KEY_Greek_iota, 0x1F29,  0x1F99, 
-+IBUS_KEY_Greek_iota, 0x1F2A,  0x1F9A, 
-+IBUS_KEY_Greek_iota, 0x1F2B,  0x1F9B, 
-+IBUS_KEY_Greek_iota, 0x1F2C,  0x1F9C, 
-+IBUS_KEY_Greek_iota, 0x1F2D,  0x1F9D, 
-+IBUS_KEY_Greek_iota, 0x1F2E,  0x1F9E, 
-+IBUS_KEY_Greek_iota, 0x1F2F,  0x1F9F, 
-+IBUS_KEY_Greek_iota, 0x1F60,  0x1FA0, 
-+IBUS_KEY_Greek_iota, 0x1F61,  0x1FA1, 
-+IBUS_KEY_Greek_iota, 0x1F62,  0x1FA2, 
-+IBUS_KEY_Greek_iota, 0x1F63,  0x1FA3, 
-+IBUS_KEY_Greek_iota, 0x1F64,  0x1FA4, 
-+IBUS_KEY_Greek_iota, 0x1F65,  0x1FA5, 
-+IBUS_KEY_Greek_iota, 0x1F66,  0x1FA6, 
-+IBUS_KEY_Greek_iota, 0x1F67,  0x1FA7, 
-+IBUS_KEY_Greek_iota, 0x1F68,  0x1FA8, 
-+IBUS_KEY_Greek_iota, 0x1F69,  0x1FA9, 
-+IBUS_KEY_Greek_iota, 0x1F6A,  0x1FAA, 
-+IBUS_KEY_Greek_iota, 0x1F6B,  0x1FAB, 
-+IBUS_KEY_Greek_iota, 0x1F6C,  0x1FAC, 
-+IBUS_KEY_Greek_iota, 0x1F6D,  0x1FAD, 
-+IBUS_KEY_Greek_iota, 0x1F6E,  0x1FAE, 
-+IBUS_KEY_Greek_iota, 0x1F6F,  0x1FAF, 
-+IBUS_KEY_Greek_iota, 0x1F70,  0x1FB2, 
-+IBUS_KEY_Greek_iota, 0x1F74,  0x1FC2, 
-+IBUS_KEY_Greek_iota, 0x1F7C,  0x1FF2, 
-+IBUS_KEY_Greek_iota, 0x1FB6,  0x1FB7, 
-+IBUS_KEY_Greek_iota, 0x1FC6,  0x1FC7, 
-+IBUS_KEY_Greek_iota, 0x1FF6,  0x1FF7, 
-+IBUS_KEY_Greek_omicron, IBUS_KEY_apostrophe,  0x03CC, 
-+IBUS_KEY_Greek_upsilon, IBUS_KEY_quotedbl,  0x03CB, 
-+IBUS_KEY_Greek_upsilon, IBUS_KEY_apostrophe,  0x03CD, 
-+IBUS_KEY_Greek_omega, IBUS_KEY_apostrophe,  0x03CE, 
-+IBUS_KEY_lessthanequal, 0x0338,  0x2270, 
-+IBUS_KEY_greaterthanequal, 0x0338,  0x2271, 
-+IBUS_KEY_approximate, 0x0338,  0x2247, 
-+IBUS_KEY_identical, 0x0338,  0x2262, 
-+IBUS_KEY_includedin, 0x0338,  0x2284, 
-+IBUS_KEY_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_KEY_leftcaret, 0x0338,  0x226E, 
-+IBUS_KEY_rightcaret, 0x0338,  0x226F, 
-+IBUS_KEY_underbar, IBUS_KEY_parenleft,  0x208D, 
-+IBUS_KEY_underbar, IBUS_KEY_parenright,  0x208E, 
-+IBUS_KEY_underbar, IBUS_KEY_plus,  0x208A, 
-+IBUS_KEY_underbar, IBUS_KEY_0,  0x2080, 
-+IBUS_KEY_underbar, IBUS_KEY_1,  0x2081, 
-+IBUS_KEY_underbar, IBUS_KEY_2,  0x2082, 
-+IBUS_KEY_underbar, IBUS_KEY_3,  0x2083, 
-+IBUS_KEY_underbar, IBUS_KEY_4,  0x2084, 
-+IBUS_KEY_underbar, IBUS_KEY_5,  0x2085, 
-+IBUS_KEY_underbar, IBUS_KEY_6,  0x2086, 
-+IBUS_KEY_underbar, IBUS_KEY_7,  0x2087, 
-+IBUS_KEY_underbar, IBUS_KEY_8,  0x2088, 
-+IBUS_KEY_underbar, IBUS_KEY_9,  0x2089, 
-+IBUS_KEY_underbar, IBUS_KEY_equal,  0x208C, 
-+0x0BC6, 0x0BBE,  0x0BCA, 
-+0x0BC6, 0x0BD7,  0x0BCC, 
-+IBUS_KEY_underbar, 0x2212,  0x208B, 
-+IBUS_KEY_underbar, IBUS_KEY_KP_Space,  0x2082, 
-+IBUS_KEY_underbar, IBUS_KEY_KP_Add,  0x208A, 
-+IBUS_KEY_underbar, IBUS_KEY_KP_0,  0x2080, 
-+IBUS_KEY_underbar, IBUS_KEY_KP_1,  0x2081, 
-+IBUS_KEY_underbar, IBUS_KEY_KP_2,  0x2082, 
-+IBUS_KEY_underbar, IBUS_KEY_KP_3,  0x2083, 
-+IBUS_KEY_underbar, IBUS_KEY_KP_4,  0x2084, 
-+IBUS_KEY_underbar, IBUS_KEY_KP_5,  0x2085, 
-+IBUS_KEY_underbar, IBUS_KEY_KP_6,  0x2086, 
-+IBUS_KEY_underbar, IBUS_KEY_KP_7,  0x2087, 
-+IBUS_KEY_underbar, IBUS_KEY_KP_8,  0x2088, 
-+IBUS_KEY_underbar, IBUS_KEY_KP_9,  0x2089, 
-+IBUS_KEY_underbar, IBUS_KEY_KP_Equal,  0x208C, 
-+0x0BC7, 0x0BBE,  0x0BCB, 
-+0x0BD7, 0x0B92,  0x0B94, 
-+IBUS_KEY_rightshoe, 0x0338,  0x2285, 
-+IBUS_KEY_leftshoe, 0x0338,  0x2284, 
-+IBUS_KEY_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_KEY_apostrophe,  0x1FCE, 
-+0x1FBF, IBUS_KEY_grave,  0x1FCD, 
-+0x1FBF, IBUS_KEY_asciitilde,  0x1FCF, 
-+0x1FBF, IBUS_KEY_acute,  0x1FCE, 
-+0x1FBF, IBUS_KEY_dead_grave,  0x1FCD, 
-+0x1FBF, IBUS_KEY_dead_acute,  0x1FCE, 
-+0x1FBF, IBUS_KEY_dead_tilde,  0x1FCF, 
-+0x1FFE, IBUS_KEY_apostrophe,  0x1FDE, 
-+0x1FFE, IBUS_KEY_grave,  0x1FDD, 
-+0x1FFE, IBUS_KEY_asciitilde,  0x1FDF, 
-+0x1FFE, IBUS_KEY_acute,  0x1FDE, 
-+0x1FFE, IBUS_KEY_dead_grave,  0x1FDD, 
-+0x1FFE, IBUS_KEY_dead_acute,  0x1FDE, 
-+0x1FFE, IBUS_KEY_dead_tilde,  0x1FDF, 
-+0x2190, IBUS_KEY_bar,  0x2345, 
-+0x2190, 0x2395,  0x2347, 
-+0x2191, IBUS_KEY_minus,  0x234F, 
-+0x2191, 0x2395,  0x2350, 
-+0x2192, IBUS_KEY_bar,  0x2346, 
-+0x2192, 0x2395,  0x2348, 
-+0x2193, IBUS_KEY_minus,  0x2356, 
-+0x2193, 0x2395,  0x2357, 
-+0x2203, 0x0338,  0x2204, 
-+0x2206, IBUS_KEY_underscore,  0x2359, 
-+0x2206, IBUS_KEY_bar,  0x234B, 
-+0x2206, 0x2395,  0x234D, 
-+0x2207, IBUS_KEY_bar,  0x2352, 
-+0x2207, IBUS_KEY_asciitilde,  0x236B, 
-+0x2207, IBUS_KEY_diaeresis,  0x2362, 
-+0x2207, 0x2395,  0x2354, 
-+0x2208, 0x0338,  0x2209, 
-+0x220A, IBUS_KEY_underscore,  0x2377, 
-+0x220B, 0x0338,  0x220C, 
-+0x2218, IBUS_KEY_underscore,  0x235B, 
-+0x2218, IBUS_KEY_diaeresis,  0x2364, 
-+0x2218, 0x2229,  0x235D, 
-+0x2218, IBUS_KEY_uptack,  0x2355, 
-+0x2218, IBUS_KEY_downtack,  0x234E, 
-+0x2218, 0x2395,  0x233B, 
-+0x2218, IBUS_KEY_emopencircle,  0x233E, 
-+0x2223, 0x0338,  0x2224, 
-+0x2225, 0x0338,  0x2226, 
-+0x2227, IBUS_KEY_asciitilde,  0x2372, 
-+0x2227, 0x2228,  0x22C4, 
-+0x2227, 0x2395,  0x2353, 
-+0x2228, IBUS_KEY_asciitilde,  0x2371, 
-+0x2228, 0x2227,  0x22C4, 
-+0x2228, 0x2395,  0x234C, 
-+0x2229, 0x2218,  0x235D, 
-+IBUS_KEY_union, IBUS_KEY_bar,  0x2366, 
-+0x223C, 0x0338,  0x2241, 
-+0x2243, 0x0338,  0x2244, 
-+0x2248, 0x0338,  0x2249, 
-+0x224D, 0x0338,  0x226D, 
-+0x2260, IBUS_KEY_underscore,  0x2262, 
-+0x2260, 0x2395,  0x236F, 
-+0x2272, 0x0338,  0x2274, 
-+0x2273, 0x0338,  0x2275, 
-+0x2276, 0x0338,  0x2278, 
-+0x2277, 0x0338,  0x2279, 
-+0x227A, 0x0338,  0x2280, 
-+0x227B, 0x0338,  0x2281, 
-+0x227C, 0x0338,  0x22E0, 
-+0x227D, 0x0338,  0x22E1, 
-+0x2282, IBUS_KEY_underscore,  0x2286, 
-+0x2282, IBUS_KEY_bar,  0x2367, 
-+0x2283, IBUS_KEY_underscore,  0x2287, 
-+0x2286, 0x0338,  0x2288, 
-+0x2287, 0x0338,  0x2289, 
-+0x2291, 0x0338,  0x22E2, 
-+0x2292, 0x0338,  0x22E3, 
-+IBUS_KEY_uptack, IBUS_KEY_diaeresis,  0x2361, 
-+IBUS_KEY_uptack, IBUS_KEY_macron,  0x2351, 
-+IBUS_KEY_uptack, 0x2218,  0x2355, 
-+IBUS_KEY_uptack, IBUS_KEY_downtack,  0x2336, 
-+IBUS_KEY_downtack, IBUS_KEY_underscore,  0x234A, 
-+IBUS_KEY_downtack, 0x2218,  0x234E, 
-+IBUS_KEY_downtack, IBUS_KEY_uptack,  0x2336, 
-+0x22A8, 0x0338,  0x22AD, 
-+0x22A9, 0x0338,  0x22AE, 
-+0x22AB, 0x0338,  0x22AF, 
-+0x22B2, 0x0338,  0x22EA, 
-+0x22B3, 0x0338,  0x22EB, 
-+0x22B4, 0x0338,  0x22EC, 
-+0x22B5, 0x0338,  0x22ED, 
-+0x22C4, IBUS_KEY_underscore,  0x235A, 
-+0x22C4, 0x2395,  0x233A, 
-+0x2373, IBUS_KEY_underscore,  0x2378, 
-+0x2375, IBUS_KEY_underscore,  0x2379, 
-+0x237A, IBUS_KEY_underscore,  0x2376, 
-+0x2395, IBUS_KEY_apostrophe,  0x235E, 
-+0x2395, IBUS_KEY_slash,  0x2341, 
-+0x2395, IBUS_KEY_colon,  0x2360, 
-+0x2395, IBUS_KEY_less,  0x2343, 
-+0x2395, IBUS_KEY_equal,  0x2338, 
-+0x2395, IBUS_KEY_greater,  0x2344, 
-+0x2395, IBUS_KEY_question,  0x2370, 
-+0x2395, IBUS_KEY_backslash,  0x2342, 
-+0x2395, IBUS_KEY_division,  0x2339, 
-+0x2395, 0x2190,  0x2347, 
-+0x2395, 0x2191,  0x2350, 
-+0x2395, 0x2192,  0x2348, 
-+0x2395, 0x2193,  0x2357, 
-+0x2395, 0x2206,  0x234D, 
-+0x2395, 0x2207,  0x2354, 
-+0x2395, 0x2218,  0x233B, 
-+0x2395, 0x2227,  0x2353, 
-+0x2395, 0x2228,  0x234C, 
-+0x2395, 0x2260,  0x236F, 
-+0x2395, 0x22C4,  0x233A, 
-+0x2395, IBUS_KEY_emopencircle,  0x233C, 
-+IBUS_KEY_emopencircle, IBUS_KEY_asterisk,  0x235F, 
-+IBUS_KEY_emopencircle, IBUS_KEY_minus,  0x2296, 
-+IBUS_KEY_emopencircle, IBUS_KEY_period,  0x2299, 
-+IBUS_KEY_emopencircle, IBUS_KEY_backslash,  0x2349, 
-+IBUS_KEY_emopencircle, IBUS_KEY_underscore,  0x235C, 
-+IBUS_KEY_emopencircle, IBUS_KEY_bar,  0x233D, 
-+IBUS_KEY_emopencircle, IBUS_KEY_diaeresis,  0x2365, 
-+IBUS_KEY_emopencircle, 0x2218,  0x233E, 
-+IBUS_KEY_emopencircle, 0x2395,  0x233C, 
-+0x2ADD, 0x0338,  0x2ADC, 
-+IBUS_KEY_KP_Divide, IBUS_KEY_D,  0x0110, 
-+IBUS_KEY_KP_Divide, IBUS_KEY_G,  0x01E4, 
-+IBUS_KEY_KP_Divide, IBUS_KEY_H,  0x0126, 
-+IBUS_KEY_KP_Divide, IBUS_KEY_I,  0x0197, 
-+IBUS_KEY_KP_Divide, IBUS_KEY_L,  0x0141, 
-+IBUS_KEY_KP_Divide, IBUS_KEY_O,  0x00D8, 
-+IBUS_KEY_KP_Divide, IBUS_KEY_T,  0x0166, 
-+IBUS_KEY_KP_Divide, IBUS_KEY_Z,  0x01B5, 
-+IBUS_KEY_KP_Divide, IBUS_KEY_b,  0x0180, 
-+IBUS_KEY_KP_Divide, IBUS_KEY_d,  0x0111, 
-+IBUS_KEY_KP_Divide, IBUS_KEY_g,  0x01E5, 
-+IBUS_KEY_KP_Divide, IBUS_KEY_h,  0x0127, 
-+IBUS_KEY_KP_Divide, IBUS_KEY_i,  0x0268, 
-+IBUS_KEY_KP_Divide, IBUS_KEY_l,  0x0142, 
-+IBUS_KEY_KP_Divide, IBUS_KEY_o,  0x00F8, 
-+IBUS_KEY_KP_Divide, IBUS_KEY_t,  0x0167, 
-+IBUS_KEY_KP_Divide, IBUS_KEY_z,  0x01B6, 
-+IBUS_KEY_KP_Divide, 0x0294,  0x02A1, 
-+IBUS_KEY_KP_Divide, 0x04AE,  0x04B0, 
-+IBUS_KEY_KP_Divide, 0x04AF,  0x04B1, 
-+IBUS_KEY_KP_Divide, IBUS_KEY_Cyrillic_ghe,  0x0493, 
-+IBUS_KEY_KP_Divide, IBUS_KEY_Cyrillic_ka,  0x049F, 
-+IBUS_KEY_KP_Divide, IBUS_KEY_Cyrillic_GHE,  0x0492, 
-+IBUS_KEY_KP_Divide, IBUS_KEY_Cyrillic_KA,  0x049E, 
-+IBUS_KEY_KP_Divide, IBUS_KEY_leftarrow,  0x219A, 
-+IBUS_KEY_KP_Divide, IBUS_KEY_rightarrow,  0x219B, 
-+IBUS_KEY_KP_Divide, 0x2194,  0x21AE, 
-+IBUS_KEY_KP_Equal, 0x0338,  0x2260, 
-+IBUS_KEY_exclam, IBUS_KEY_plus, IBUS_KEY_O,  0x1EE2, 
-+IBUS_KEY_exclam, IBUS_KEY_plus, IBUS_KEY_U,  0x1EF0, 
-+IBUS_KEY_exclam, IBUS_KEY_plus, IBUS_KEY_o,  0x1EE3, 
-+IBUS_KEY_exclam, IBUS_KEY_plus, IBUS_KEY_u,  0x1EF1, 
-+IBUS_KEY_exclam, IBUS_KEY_dead_horn, IBUS_KEY_O,  0x1EE2, 
-+IBUS_KEY_exclam, IBUS_KEY_dead_horn, IBUS_KEY_U,  0x1EF0, 
-+IBUS_KEY_exclam, IBUS_KEY_dead_horn, IBUS_KEY_o,  0x1EE3, 
-+IBUS_KEY_exclam, IBUS_KEY_dead_horn, IBUS_KEY_u,  0x1EF1, 
-+IBUS_KEY_quotedbl, IBUS_KEY_apostrophe, IBUS_KEY_space,  0x0385, 
-+IBUS_KEY_quotedbl, IBUS_KEY_apostrophe, IBUS_KEY_Greek_iota,  0x0390, 
-+IBUS_KEY_quotedbl, IBUS_KEY_apostrophe, IBUS_KEY_Greek_upsilon,  0x03B0, 
-+IBUS_KEY_quotedbl, IBUS_KEY_underscore, IBUS_KEY_U,  0x1E7A, 
-+IBUS_KEY_quotedbl, IBUS_KEY_underscore, IBUS_KEY_u,  0x1E7B, 
-+IBUS_KEY_quotedbl, IBUS_KEY_asciitilde, IBUS_KEY_O,  0x1E4E, 
-+IBUS_KEY_quotedbl, IBUS_KEY_asciitilde, IBUS_KEY_o,  0x1E4F, 
-+IBUS_KEY_quotedbl, IBUS_KEY_macron, IBUS_KEY_U,  0x1E7A, 
-+IBUS_KEY_quotedbl, IBUS_KEY_macron, IBUS_KEY_u,  0x1E7B, 
-+IBUS_KEY_quotedbl, IBUS_KEY_dead_tilde, IBUS_KEY_O,  0x1E4E, 
-+IBUS_KEY_quotedbl, IBUS_KEY_dead_tilde, IBUS_KEY_o,  0x1E4F, 
-+IBUS_KEY_quotedbl, IBUS_KEY_dead_macron, IBUS_KEY_U,  0x1E7A, 
-+IBUS_KEY_quotedbl, IBUS_KEY_dead_macron, IBUS_KEY_u,  0x1E7B, 
-+IBUS_KEY_apostrophe, IBUS_KEY_quotedbl, IBUS_KEY_space,  0x0385, 
-+IBUS_KEY_apostrophe, IBUS_KEY_quotedbl, IBUS_KEY_I,  0x1E2E, 
-+IBUS_KEY_apostrophe, IBUS_KEY_quotedbl, IBUS_KEY_U,  0x01D7, 
-+IBUS_KEY_apostrophe, IBUS_KEY_quotedbl, IBUS_KEY_i,  0x1E2F, 
-+IBUS_KEY_apostrophe, IBUS_KEY_quotedbl, IBUS_KEY_u,  0x01D8, 
-+IBUS_KEY_apostrophe, IBUS_KEY_quotedbl, IBUS_KEY_Greek_iota,  0x0390, 
-+IBUS_KEY_apostrophe, IBUS_KEY_quotedbl, IBUS_KEY_Greek_upsilon,  0x03B0, 
-+IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA,  0x1F0D, 
-+IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_EPSILON,  0x1F1D, 
-+IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA,  0x1F2D, 
-+IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_IOTA,  0x1F3D, 
-+IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMICRON,  0x1F4D, 
-+IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_UPSILON,  0x1F5D, 
-+IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA,  0x1F6D, 
-+IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha,  0x1F05, 
-+IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_epsilon,  0x1F15, 
-+IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta,  0x1F25, 
-+IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_iota,  0x1F35, 
-+IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_omicron,  0x1F45, 
-+IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_upsilon,  0x1F55, 
-+IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega,  0x1F65, 
-+IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA,  0x1F0C, 
-+IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_EPSILON,  0x1F1C, 
-+IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA,  0x1F2C, 
-+IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_IOTA,  0x1F3C, 
-+IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_OMICRON,  0x1F4C, 
-+IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA,  0x1F6C, 
-+IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha,  0x1F04, 
-+IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_epsilon,  0x1F14, 
-+IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_eta,  0x1F24, 
-+IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_iota,  0x1F34, 
-+IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_omicron,  0x1F44, 
-+IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_upsilon,  0x1F54, 
-+IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_omega,  0x1F64, 
-+IBUS_KEY_apostrophe, IBUS_KEY_plus, IBUS_KEY_O,  0x1EDA, 
-+IBUS_KEY_apostrophe, IBUS_KEY_plus, IBUS_KEY_U,  0x1EE8, 
-+IBUS_KEY_apostrophe, IBUS_KEY_plus, IBUS_KEY_o,  0x1EDB, 
-+IBUS_KEY_apostrophe, IBUS_KEY_plus, IBUS_KEY_u,  0x1EE9, 
-+IBUS_KEY_apostrophe, IBUS_KEY_slash, IBUS_KEY_O,  0x01FE, 
-+IBUS_KEY_apostrophe, IBUS_KEY_slash, IBUS_KEY_o,  0x01FF, 
-+IBUS_KEY_apostrophe, IBUS_KEY_asciicircum, IBUS_KEY_A,  0x1EA4, 
-+IBUS_KEY_apostrophe, IBUS_KEY_asciicircum, IBUS_KEY_E,  0x1EBE, 
-+IBUS_KEY_apostrophe, IBUS_KEY_asciicircum, IBUS_KEY_O,  0x1ED0, 
-+IBUS_KEY_apostrophe, IBUS_KEY_asciicircum, IBUS_KEY_a,  0x1EA5, 
-+IBUS_KEY_apostrophe, IBUS_KEY_asciicircum, IBUS_KEY_e,  0x1EBF, 
-+IBUS_KEY_apostrophe, IBUS_KEY_asciicircum, IBUS_KEY_o,  0x1ED1, 
-+IBUS_KEY_apostrophe, IBUS_KEY_underscore, IBUS_KEY_E,  0x1E16, 
-+IBUS_KEY_apostrophe, IBUS_KEY_underscore, IBUS_KEY_O,  0x1E52, 
-+IBUS_KEY_apostrophe, IBUS_KEY_underscore, IBUS_KEY_e,  0x1E17, 
-+IBUS_KEY_apostrophe, IBUS_KEY_underscore, IBUS_KEY_o,  0x1E53, 
-+IBUS_KEY_apostrophe, IBUS_KEY_b, IBUS_KEY_A,  0x1EAE, 
-+IBUS_KEY_apostrophe, IBUS_KEY_b, IBUS_KEY_a,  0x1EAF, 
-+IBUS_KEY_apostrophe, IBUS_KEY_asciitilde, IBUS_KEY_O,  0x1E4C, 
-+IBUS_KEY_apostrophe, IBUS_KEY_asciitilde, IBUS_KEY_U,  0x1E78, 
-+IBUS_KEY_apostrophe, IBUS_KEY_asciitilde, IBUS_KEY_o,  0x1E4D, 
-+IBUS_KEY_apostrophe, IBUS_KEY_asciitilde, IBUS_KEY_u,  0x1E79, 
-+IBUS_KEY_apostrophe, IBUS_KEY_macron, IBUS_KEY_E,  0x1E16, 
-+IBUS_KEY_apostrophe, IBUS_KEY_macron, IBUS_KEY_O,  0x1E52, 
-+IBUS_KEY_apostrophe, IBUS_KEY_macron, IBUS_KEY_e,  0x1E17, 
-+IBUS_KEY_apostrophe, IBUS_KEY_macron, IBUS_KEY_o,  0x1E53, 
-+IBUS_KEY_apostrophe, IBUS_KEY_cedilla, IBUS_KEY_C,  0x1E08, 
-+IBUS_KEY_apostrophe, IBUS_KEY_cedilla, IBUS_KEY_c,  0x1E09, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_circumflex, IBUS_KEY_A,  0x1EA4, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_circumflex, IBUS_KEY_E,  0x1EBE, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_circumflex, IBUS_KEY_O,  0x1ED0, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_circumflex, IBUS_KEY_a,  0x1EA5, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_circumflex, IBUS_KEY_e,  0x1EBF, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_circumflex, IBUS_KEY_o,  0x1ED1, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_tilde, IBUS_KEY_O,  0x1E4C, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_tilde, IBUS_KEY_U,  0x1E78, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_tilde, IBUS_KEY_o,  0x1E4D, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_tilde, IBUS_KEY_u,  0x1E79, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_macron, IBUS_KEY_E,  0x1E16, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_macron, IBUS_KEY_O,  0x1E52, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_macron, IBUS_KEY_e,  0x1E17, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_macron, IBUS_KEY_o,  0x1E53, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_breve, IBUS_KEY_A,  0x1EAE, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_breve, IBUS_KEY_a,  0x1EAF, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_diaeresis, IBUS_KEY_I,  0x1E2E, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_diaeresis, IBUS_KEY_U,  0x01D7, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_diaeresis, IBUS_KEY_i,  0x1E2F, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_diaeresis, IBUS_KEY_u,  0x01D8, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_diaeresis, IBUS_KEY_Greek_iota,  0x0390, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_diaeresis, IBUS_KEY_Greek_upsilon,  0x03B0, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_abovering, IBUS_KEY_A,  0x01FA, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_abovering, IBUS_KEY_a,  0x01FB, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_cedilla, IBUS_KEY_C,  0x1E08, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_cedilla, IBUS_KEY_c,  0x1E09, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_horn, IBUS_KEY_O,  0x1EDA, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_horn, IBUS_KEY_U,  0x1EE8, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_horn, IBUS_KEY_o,  0x1EDB, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_horn, IBUS_KEY_u,  0x1EE9, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA,  0x1F0C, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_EPSILON,  0x1F1C, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA,  0x1F2C, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_IOTA,  0x1F3C, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMICRON,  0x1F4C, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA,  0x1F6C, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha,  0x1F04, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_epsilon,  0x1F14, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta,  0x1F24, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_iota,  0x1F34, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omicron,  0x1F44, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_upsilon,  0x1F54, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega,  0x1F64, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA,  0x1F0D, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_EPSILON,  0x1F1D, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA,  0x1F2D, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_IOTA,  0x1F3D, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMICRON,  0x1F4D, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_UPSILON,  0x1F5D, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA,  0x1F6D, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha,  0x1F05, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_epsilon,  0x1F15, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta,  0x1F25, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_iota,  0x1F35, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omicron,  0x1F45, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_upsilon,  0x1F55, 
-+IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega,  0x1F65, 
-+IBUS_KEY_apostrophe, IBUS_KEY_KP_Divide, IBUS_KEY_O,  0x01FE, 
-+IBUS_KEY_apostrophe, IBUS_KEY_KP_Divide, IBUS_KEY_o,  0x01FF, 
-+IBUS_KEY_parenleft, IBUS_KEY_0, IBUS_KEY_parenright,  0x24EA, 
-+IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_parenright,  0x2460, 
-+IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_parenright,  0x2461, 
-+IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_parenright,  0x2462, 
-+IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_parenright,  0x2463, 
-+IBUS_KEY_parenleft, IBUS_KEY_5, IBUS_KEY_parenright,  0x2464, 
-+IBUS_KEY_parenleft, IBUS_KEY_6, IBUS_KEY_parenright,  0x2465, 
-+IBUS_KEY_parenleft, IBUS_KEY_7, IBUS_KEY_parenright,  0x2466, 
-+IBUS_KEY_parenleft, IBUS_KEY_8, IBUS_KEY_parenright,  0x2467, 
-+IBUS_KEY_parenleft, IBUS_KEY_9, IBUS_KEY_parenright,  0x2468, 
-+IBUS_KEY_parenleft, IBUS_KEY_A, IBUS_KEY_parenright,  0x24B6, 
-+IBUS_KEY_parenleft, IBUS_KEY_B, IBUS_KEY_parenright,  0x24B7, 
-+IBUS_KEY_parenleft, IBUS_KEY_C, IBUS_KEY_parenright,  0x24B8, 
-+IBUS_KEY_parenleft, IBUS_KEY_D, IBUS_KEY_parenright,  0x24B9, 
-+IBUS_KEY_parenleft, IBUS_KEY_E, IBUS_KEY_parenright,  0x24BA, 
-+IBUS_KEY_parenleft, IBUS_KEY_F, IBUS_KEY_parenright,  0x24BB, 
-+IBUS_KEY_parenleft, IBUS_KEY_G, IBUS_KEY_parenright,  0x24BC, 
-+IBUS_KEY_parenleft, IBUS_KEY_H, IBUS_KEY_parenright,  0x24BD, 
-+IBUS_KEY_parenleft, IBUS_KEY_I, IBUS_KEY_parenright,  0x24BE, 
-+IBUS_KEY_parenleft, IBUS_KEY_J, IBUS_KEY_parenright,  0x24BF, 
-+IBUS_KEY_parenleft, IBUS_KEY_K, IBUS_KEY_parenright,  0x24C0, 
-+IBUS_KEY_parenleft, IBUS_KEY_L, IBUS_KEY_parenright,  0x24C1, 
-+IBUS_KEY_parenleft, IBUS_KEY_M, IBUS_KEY_parenright,  0x24C2, 
-+IBUS_KEY_parenleft, IBUS_KEY_N, IBUS_KEY_parenright,  0x24C3, 
-+IBUS_KEY_parenleft, IBUS_KEY_O, IBUS_KEY_parenright,  0x24C4, 
-+IBUS_KEY_parenleft, IBUS_KEY_P, IBUS_KEY_parenright,  0x24C5, 
-+IBUS_KEY_parenleft, IBUS_KEY_Q, IBUS_KEY_parenright,  0x24C6, 
-+IBUS_KEY_parenleft, IBUS_KEY_R, IBUS_KEY_parenright,  0x24C7, 
-+IBUS_KEY_parenleft, IBUS_KEY_S, IBUS_KEY_parenright,  0x24C8, 
-+IBUS_KEY_parenleft, IBUS_KEY_T, IBUS_KEY_parenright,  0x24C9, 
-+IBUS_KEY_parenleft, IBUS_KEY_U, IBUS_KEY_parenright,  0x24CA, 
-+IBUS_KEY_parenleft, IBUS_KEY_V, IBUS_KEY_parenright,  0x24CB, 
-+IBUS_KEY_parenleft, IBUS_KEY_W, IBUS_KEY_parenright,  0x24CC, 
-+IBUS_KEY_parenleft, IBUS_KEY_X, IBUS_KEY_parenright,  0x24CD, 
-+IBUS_KEY_parenleft, IBUS_KEY_Y, IBUS_KEY_parenright,  0x24CE, 
-+IBUS_KEY_parenleft, IBUS_KEY_Z, IBUS_KEY_parenright,  0x24CF, 
-+IBUS_KEY_parenleft, IBUS_KEY_a, IBUS_KEY_parenright,  0x24D0, 
-+IBUS_KEY_parenleft, IBUS_KEY_b, IBUS_KEY_parenright,  0x24D1, 
-+IBUS_KEY_parenleft, IBUS_KEY_c, IBUS_KEY_parenright,  0x24D2, 
-+IBUS_KEY_parenleft, IBUS_KEY_d, IBUS_KEY_parenright,  0x24D3, 
-+IBUS_KEY_parenleft, IBUS_KEY_e, IBUS_KEY_parenright,  0x24D4, 
-+IBUS_KEY_parenleft, IBUS_KEY_f, IBUS_KEY_parenright,  0x24D5, 
-+IBUS_KEY_parenleft, IBUS_KEY_g, IBUS_KEY_parenright,  0x24D6, 
-+IBUS_KEY_parenleft, IBUS_KEY_h, IBUS_KEY_parenright,  0x24D7, 
-+IBUS_KEY_parenleft, IBUS_KEY_i, IBUS_KEY_parenright,  0x24D8, 
-+IBUS_KEY_parenleft, IBUS_KEY_j, IBUS_KEY_parenright,  0x24D9, 
-+IBUS_KEY_parenleft, IBUS_KEY_k, IBUS_KEY_parenright,  0x24DA, 
-+IBUS_KEY_parenleft, IBUS_KEY_l, IBUS_KEY_parenright,  0x24DB, 
-+IBUS_KEY_parenleft, IBUS_KEY_m, IBUS_KEY_parenright,  0x24DC, 
-+IBUS_KEY_parenleft, IBUS_KEY_n, IBUS_KEY_parenright,  0x24DD, 
-+IBUS_KEY_parenleft, IBUS_KEY_o, IBUS_KEY_parenright,  0x24DE, 
-+IBUS_KEY_parenleft, IBUS_KEY_p, IBUS_KEY_parenright,  0x24DF, 
-+IBUS_KEY_parenleft, IBUS_KEY_q, IBUS_KEY_parenright,  0x24E0, 
-+IBUS_KEY_parenleft, IBUS_KEY_r, IBUS_KEY_parenright,  0x24E1, 
-+IBUS_KEY_parenleft, IBUS_KEY_s, IBUS_KEY_parenright,  0x24E2, 
-+IBUS_KEY_parenleft, IBUS_KEY_t, IBUS_KEY_parenright,  0x24E3, 
-+IBUS_KEY_parenleft, IBUS_KEY_u, IBUS_KEY_parenright,  0x24E4, 
-+IBUS_KEY_parenleft, IBUS_KEY_v, IBUS_KEY_parenright,  0x24E5, 
-+IBUS_KEY_parenleft, IBUS_KEY_w, IBUS_KEY_parenright,  0x24E6, 
-+IBUS_KEY_parenleft, IBUS_KEY_x, IBUS_KEY_parenright,  0x24E7, 
-+IBUS_KEY_parenleft, IBUS_KEY_y, IBUS_KEY_parenright,  0x24E8, 
-+IBUS_KEY_parenleft, IBUS_KEY_z, IBUS_KEY_parenright,  0x24E9, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_WO, IBUS_KEY_parenright,  0x32FE, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_A, IBUS_KEY_parenright,  0x32D0, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_I, IBUS_KEY_parenright,  0x32D1, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_U, IBUS_KEY_parenright,  0x32D2, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_E, IBUS_KEY_parenright,  0x32D3, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_O, IBUS_KEY_parenright,  0x32D4, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_KA, IBUS_KEY_parenright,  0x32D5, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_KI, IBUS_KEY_parenright,  0x32D6, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_KU, IBUS_KEY_parenright,  0x32D7, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_KE, IBUS_KEY_parenright,  0x32D8, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_KO, IBUS_KEY_parenright,  0x32D9, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_SA, IBUS_KEY_parenright,  0x32DA, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_SHI, IBUS_KEY_parenright,  0x32DB, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_SU, IBUS_KEY_parenright,  0x32DC, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_SE, IBUS_KEY_parenright,  0x32DD, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_SO, IBUS_KEY_parenright,  0x32DE, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_TA, IBUS_KEY_parenright,  0x32DF, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_CHI, IBUS_KEY_parenright,  0x32E0, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_TSU, IBUS_KEY_parenright,  0x32E1, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_TE, IBUS_KEY_parenright,  0x32E2, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_TO, IBUS_KEY_parenright,  0x32E3, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_NA, IBUS_KEY_parenright,  0x32E4, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_NI, IBUS_KEY_parenright,  0x32E5, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_NU, IBUS_KEY_parenright,  0x32E6, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_NE, IBUS_KEY_parenright,  0x32E7, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_NO, IBUS_KEY_parenright,  0x32E8, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_HA, IBUS_KEY_parenright,  0x32E9, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_HI, IBUS_KEY_parenright,  0x32EA, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_FU, IBUS_KEY_parenright,  0x32EB, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_HE, IBUS_KEY_parenright,  0x32EC, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_HO, IBUS_KEY_parenright,  0x32ED, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_MA, IBUS_KEY_parenright,  0x32EE, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_MI, IBUS_KEY_parenright,  0x32EF, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_MU, IBUS_KEY_parenright,  0x32F0, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_ME, IBUS_KEY_parenright,  0x32F1, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_MO, IBUS_KEY_parenright,  0x32F2, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_YA, IBUS_KEY_parenright,  0x32F3, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_YU, IBUS_KEY_parenright,  0x32F4, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_YO, IBUS_KEY_parenright,  0x32F5, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_RA, IBUS_KEY_parenright,  0x32F6, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_RI, IBUS_KEY_parenright,  0x32F7, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_RU, IBUS_KEY_parenright,  0x32F8, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_RE, IBUS_KEY_parenright,  0x32F9, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_RO, IBUS_KEY_parenright,  0x32FA, 
-+IBUS_KEY_parenleft, IBUS_KEY_kana_WA, IBUS_KEY_parenright,  0x32FB, 
-+IBUS_KEY_parenleft, 0x1100, IBUS_KEY_parenright,  0x3260, 
-+IBUS_KEY_parenleft, 0x1102, IBUS_KEY_parenright,  0x3261, 
-+IBUS_KEY_parenleft, 0x1103, IBUS_KEY_parenright,  0x3262, 
-+IBUS_KEY_parenleft, 0x1105, IBUS_KEY_parenright,  0x3263, 
-+IBUS_KEY_parenleft, 0x1106, IBUS_KEY_parenright,  0x3264, 
-+IBUS_KEY_parenleft, 0x1107, IBUS_KEY_parenright,  0x3265, 
-+IBUS_KEY_parenleft, 0x1109, IBUS_KEY_parenright,  0x3266, 
-+IBUS_KEY_parenleft, 0x110B, IBUS_KEY_parenright,  0x3267, 
-+IBUS_KEY_parenleft, 0x110C, IBUS_KEY_parenright,  0x3268, 
-+IBUS_KEY_parenleft, 0x110E, IBUS_KEY_parenright,  0x3269, 
-+IBUS_KEY_parenleft, 0x110F, IBUS_KEY_parenright,  0x326A, 
-+IBUS_KEY_parenleft, 0x1110, IBUS_KEY_parenright,  0x326B, 
-+IBUS_KEY_parenleft, 0x1111, IBUS_KEY_parenright,  0x326C, 
-+IBUS_KEY_parenleft, 0x1112, IBUS_KEY_parenright,  0x326D, 
-+IBUS_KEY_parenleft, 0x30F0, IBUS_KEY_parenright,  0x32FC, 
-+IBUS_KEY_parenleft, 0x30F1, IBUS_KEY_parenright,  0x32FD, 
-+IBUS_KEY_parenleft, 0x4E00, IBUS_KEY_parenright,  0x3280, 
-+IBUS_KEY_parenleft, 0x4E03, IBUS_KEY_parenright,  0x3286, 
-+IBUS_KEY_parenleft, 0x4E09, IBUS_KEY_parenright,  0x3282, 
-+IBUS_KEY_parenleft, 0x4E0A, IBUS_KEY_parenright,  0x32A4, 
-+IBUS_KEY_parenleft, 0x4E0B, IBUS_KEY_parenright,  0x32A6, 
-+IBUS_KEY_parenleft, 0x4E2D, IBUS_KEY_parenright,  0x32A5, 
-+IBUS_KEY_parenleft, 0x4E5D, IBUS_KEY_parenright,  0x3288, 
-+IBUS_KEY_parenleft, 0x4E8C, IBUS_KEY_parenright,  0x3281, 
-+IBUS_KEY_parenleft, 0x4E94, IBUS_KEY_parenright,  0x3284, 
-+IBUS_KEY_parenleft, 0x4F01, IBUS_KEY_parenright,  0x32AD, 
-+IBUS_KEY_parenleft, 0x4F11, IBUS_KEY_parenright,  0x32A1, 
-+IBUS_KEY_parenleft, 0x512A, IBUS_KEY_parenright,  0x329D, 
-+IBUS_KEY_parenleft, 0x516B, IBUS_KEY_parenright,  0x3287, 
-+IBUS_KEY_parenleft, 0x516D, IBUS_KEY_parenright,  0x3285, 
-+IBUS_KEY_parenleft, 0x5199, IBUS_KEY_parenright,  0x32A2, 
-+IBUS_KEY_parenleft, 0x52B4, IBUS_KEY_parenright,  0x3298, 
-+IBUS_KEY_parenleft, 0x533B, IBUS_KEY_parenright,  0x32A9, 
-+IBUS_KEY_parenleft, 0x5341, IBUS_KEY_parenright,  0x3289, 
-+IBUS_KEY_parenleft, 0x5354, IBUS_KEY_parenright,  0x32AF, 
-+IBUS_KEY_parenleft, 0x5370, IBUS_KEY_parenright,  0x329E, 
-+IBUS_KEY_parenleft, 0x53F3, IBUS_KEY_parenright,  0x32A8, 
-+IBUS_KEY_parenleft, 0x540D, IBUS_KEY_parenright,  0x3294, 
-+IBUS_KEY_parenleft, 0x56DB, IBUS_KEY_parenright,  0x3283, 
-+IBUS_KEY_parenleft, 0x571F, IBUS_KEY_parenright,  0x328F, 
-+IBUS_KEY_parenleft, 0x591C, IBUS_KEY_parenright,  0x32B0, 
-+IBUS_KEY_parenleft, 0x5973, IBUS_KEY_parenright,  0x329B, 
-+IBUS_KEY_parenleft, 0x5B66, IBUS_KEY_parenright,  0x32AB, 
-+IBUS_KEY_parenleft, 0x5B97, IBUS_KEY_parenright,  0x32AA, 
-+IBUS_KEY_parenleft, 0x5DE6, IBUS_KEY_parenright,  0x32A7, 
-+IBUS_KEY_parenleft, 0x65E5, IBUS_KEY_parenright,  0x3290, 
-+IBUS_KEY_parenleft, 0x6708, IBUS_KEY_parenright,  0x328A, 
-+IBUS_KEY_parenleft, 0x6709, IBUS_KEY_parenright,  0x3292, 
-+IBUS_KEY_parenleft, 0x6728, IBUS_KEY_parenright,  0x328D, 
-+IBUS_KEY_parenleft, 0x682A, IBUS_KEY_parenright,  0x3291, 
-+IBUS_KEY_parenleft, 0x6B63, IBUS_KEY_parenright,  0x32A3, 
-+IBUS_KEY_parenleft, 0x6C34, IBUS_KEY_parenright,  0x328C, 
-+IBUS_KEY_parenleft, 0x6CE8, IBUS_KEY_parenright,  0x329F, 
-+IBUS_KEY_parenleft, 0x706B, IBUS_KEY_parenright,  0x328B, 
-+IBUS_KEY_parenleft, 0x7279, IBUS_KEY_parenright,  0x3295, 
-+IBUS_KEY_parenleft, 0x7537, IBUS_KEY_parenright,  0x329A, 
-+IBUS_KEY_parenleft, 0x76E3, IBUS_KEY_parenright,  0x32AC, 
-+IBUS_KEY_parenleft, 0x793E, IBUS_KEY_parenright,  0x3293, 
-+IBUS_KEY_parenleft, 0x795D, IBUS_KEY_parenright,  0x3297, 
-+IBUS_KEY_parenleft, 0x79D8, IBUS_KEY_parenright,  0x3299, 
-+IBUS_KEY_parenleft, 0x8CA1, IBUS_KEY_parenright,  0x3296, 
-+IBUS_KEY_parenleft, 0x8CC7, IBUS_KEY_parenright,  0x32AE, 
-+IBUS_KEY_parenleft, 0x9069, IBUS_KEY_parenright,  0x329C, 
-+IBUS_KEY_parenleft, 0x91D1, IBUS_KEY_parenright,  0x328E, 
-+IBUS_KEY_parenleft, 0x9805, IBUS_KEY_parenright,  0x32A0, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_parenright,  0x2461, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_0, IBUS_KEY_parenright,  0x24EA, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_parenright,  0x2460, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_parenright,  0x2461, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_parenright,  0x2462, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_parenright,  0x2463, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_5, IBUS_KEY_parenright,  0x2464, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_6, IBUS_KEY_parenright,  0x2465, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_7, IBUS_KEY_parenright,  0x2466, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_8, IBUS_KEY_parenright,  0x2467, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_9, IBUS_KEY_parenright,  0x2468, 
-+IBUS_KEY_asterisk, IBUS_KEY_apostrophe, IBUS_KEY_A,  0x01FA, 
-+IBUS_KEY_asterisk, IBUS_KEY_apostrophe, IBUS_KEY_a,  0x01FB, 
-+IBUS_KEY_minus, IBUS_KEY_minus, IBUS_KEY_space,  0x00AD, 
-+IBUS_KEY_minus, IBUS_KEY_minus, IBUS_KEY_minus,  0x2014, 
-+IBUS_KEY_minus, IBUS_KEY_minus, IBUS_KEY_period,  0x2013, 
-+IBUS_KEY_period, IBUS_KEY_exclam, IBUS_KEY_S,  0x1E68, 
-+IBUS_KEY_period, IBUS_KEY_exclam, IBUS_KEY_s,  0x1E69, 
-+IBUS_KEY_period, IBUS_KEY_apostrophe, IBUS_KEY_S,  0x1E64, 
-+IBUS_KEY_period, IBUS_KEY_apostrophe, IBUS_KEY_s,  0x1E65, 
-+IBUS_KEY_period, IBUS_KEY_acute, IBUS_KEY_S,  0x1E64, 
-+IBUS_KEY_period, IBUS_KEY_acute, IBUS_KEY_s,  0x1E65, 
-+IBUS_KEY_period, IBUS_KEY_dead_acute, IBUS_KEY_S,  0x1E64, 
-+IBUS_KEY_period, IBUS_KEY_dead_acute, IBUS_KEY_s,  0x1E65, 
-+IBUS_KEY_period, IBUS_KEY_dead_caron, IBUS_KEY_S,  0x1E66, 
-+IBUS_KEY_period, IBUS_KEY_dead_caron, IBUS_KEY_s,  0x1E67, 
-+IBUS_KEY_period, IBUS_KEY_dead_belowdot, IBUS_KEY_S,  0x1E68, 
-+IBUS_KEY_period, IBUS_KEY_dead_belowdot, IBUS_KEY_s,  0x1E69, 
-+IBUS_KEY_1, IBUS_KEY_1, IBUS_KEY_0,  0x2152, 
-+IBUS_KEY_question, IBUS_KEY_plus, IBUS_KEY_O,  0x1EDE, 
-+IBUS_KEY_question, IBUS_KEY_plus, IBUS_KEY_U,  0x1EEC, 
-+IBUS_KEY_question, IBUS_KEY_plus, IBUS_KEY_o,  0x1EDF, 
-+IBUS_KEY_question, IBUS_KEY_plus, IBUS_KEY_u,  0x1EED, 
-+IBUS_KEY_question, IBUS_KEY_asciicircum, IBUS_KEY_A,  0x1EA8, 
-+IBUS_KEY_question, IBUS_KEY_asciicircum, IBUS_KEY_E,  0x1EC2, 
-+IBUS_KEY_question, IBUS_KEY_asciicircum, IBUS_KEY_O,  0x1ED4, 
-+IBUS_KEY_question, IBUS_KEY_asciicircum, IBUS_KEY_a,  0x1EA9, 
-+IBUS_KEY_question, IBUS_KEY_asciicircum, IBUS_KEY_e,  0x1EC3, 
-+IBUS_KEY_question, IBUS_KEY_asciicircum, IBUS_KEY_o,  0x1ED5, 
-+IBUS_KEY_question, IBUS_KEY_b, IBUS_KEY_A,  0x1EB2, 
-+IBUS_KEY_question, IBUS_KEY_b, IBUS_KEY_a,  0x1EB3, 
-+IBUS_KEY_question, IBUS_KEY_dead_circumflex, IBUS_KEY_A,  0x1EA8, 
-+IBUS_KEY_question, IBUS_KEY_dead_circumflex, IBUS_KEY_E,  0x1EC2, 
-+IBUS_KEY_question, IBUS_KEY_dead_circumflex, IBUS_KEY_O,  0x1ED4, 
-+IBUS_KEY_question, IBUS_KEY_dead_circumflex, IBUS_KEY_a,  0x1EA9, 
-+IBUS_KEY_question, IBUS_KEY_dead_circumflex, IBUS_KEY_e,  0x1EC3, 
-+IBUS_KEY_question, IBUS_KEY_dead_circumflex, IBUS_KEY_o,  0x1ED5, 
-+IBUS_KEY_question, IBUS_KEY_dead_breve, IBUS_KEY_A,  0x1EB2, 
-+IBUS_KEY_question, IBUS_KEY_dead_breve, IBUS_KEY_a,  0x1EB3, 
-+IBUS_KEY_question, IBUS_KEY_dead_horn, IBUS_KEY_O,  0x1EDE, 
-+IBUS_KEY_question, IBUS_KEY_dead_horn, IBUS_KEY_U,  0x1EEC, 
-+IBUS_KEY_question, IBUS_KEY_dead_horn, IBUS_KEY_o,  0x1EDF, 
-+IBUS_KEY_question, IBUS_KEY_dead_horn, IBUS_KEY_u,  0x1EED, 
-+IBUS_KEY_U, IBUS_KEY_exclam, IBUS_KEY_A,  0x1EB6, 
-+IBUS_KEY_U, IBUS_KEY_exclam, IBUS_KEY_a,  0x1EB7, 
-+IBUS_KEY_U, IBUS_KEY_cedilla, IBUS_KEY_E,  0x1E1C, 
-+IBUS_KEY_U, IBUS_KEY_cedilla, IBUS_KEY_e,  0x1E1D, 
-+IBUS_KEY_U, IBUS_KEY_dead_cedilla, IBUS_KEY_E,  0x1E1C, 
-+IBUS_KEY_U, IBUS_KEY_dead_cedilla, IBUS_KEY_e,  0x1E1D, 
-+IBUS_KEY_U, IBUS_KEY_dead_belowdot, IBUS_KEY_A,  0x1EB6, 
-+IBUS_KEY_U, IBUS_KEY_dead_belowdot, IBUS_KEY_a,  0x1EB7, 
-+IBUS_KEY_asciicircum, IBUS_KEY_exclam, IBUS_KEY_A,  0x1EAC, 
-+IBUS_KEY_asciicircum, IBUS_KEY_exclam, IBUS_KEY_E,  0x1EC6, 
-+IBUS_KEY_asciicircum, IBUS_KEY_exclam, IBUS_KEY_O,  0x1ED8, 
-+IBUS_KEY_asciicircum, IBUS_KEY_exclam, IBUS_KEY_a,  0x1EAD, 
-+IBUS_KEY_asciicircum, IBUS_KEY_exclam, IBUS_KEY_e,  0x1EC7, 
-+IBUS_KEY_asciicircum, IBUS_KEY_exclam, IBUS_KEY_o,  0x1ED9, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underscore, IBUS_KEY_a,  0x00AA, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underscore, IBUS_KEY_h,  0x02B0, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underscore, IBUS_KEY_i,  0x2071, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underscore, IBUS_KEY_j,  0x02B2, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underscore, IBUS_KEY_l,  0x02E1, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underscore, IBUS_KEY_n,  0x207F, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underscore, IBUS_KEY_o,  0x00BA, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underscore, IBUS_KEY_r,  0x02B3, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underscore, IBUS_KEY_s,  0x02E2, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underscore, IBUS_KEY_w,  0x02B7, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underscore, IBUS_KEY_x,  0x02E3, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underscore, IBUS_KEY_y,  0x02B8, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underscore, 0x0263,  0x02E0, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underscore, 0x0266,  0x02B1, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underscore, 0x0279,  0x02B4, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underscore, 0x027B,  0x02B5, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underscore, 0x0281,  0x02B6, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underscore, 0x0295,  0x02E4, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underbar, IBUS_KEY_a,  0x00AA, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underbar, IBUS_KEY_h,  0x02B0, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underbar, IBUS_KEY_i,  0x2071, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underbar, IBUS_KEY_j,  0x02B2, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underbar, IBUS_KEY_l,  0x02E1, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underbar, IBUS_KEY_n,  0x207F, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underbar, IBUS_KEY_o,  0x00BA, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underbar, IBUS_KEY_r,  0x02B3, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underbar, IBUS_KEY_s,  0x02E2, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underbar, IBUS_KEY_w,  0x02B7, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underbar, IBUS_KEY_x,  0x02E3, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underbar, IBUS_KEY_y,  0x02B8, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underbar, 0x0263,  0x02E0, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underbar, 0x0266,  0x02B1, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underbar, 0x0279,  0x02B4, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underbar, 0x027B,  0x02B5, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underbar, 0x0281,  0x02B6, 
-+IBUS_KEY_asciicircum, IBUS_KEY_underbar, 0x0295,  0x02E4, 
-+IBUS_KEY_asciicircum, IBUS_KEY_dead_belowdot, IBUS_KEY_A,  0x1EAC, 
-+IBUS_KEY_asciicircum, IBUS_KEY_dead_belowdot, IBUS_KEY_E,  0x1EC6, 
-+IBUS_KEY_asciicircum, IBUS_KEY_dead_belowdot, IBUS_KEY_O,  0x1ED8, 
-+IBUS_KEY_asciicircum, IBUS_KEY_dead_belowdot, IBUS_KEY_a,  0x1EAD, 
-+IBUS_KEY_asciicircum, IBUS_KEY_dead_belowdot, IBUS_KEY_e,  0x1EC7, 
-+IBUS_KEY_asciicircum, IBUS_KEY_dead_belowdot, IBUS_KEY_o,  0x1ED9, 
-+IBUS_KEY_underscore, IBUS_KEY_exclam, IBUS_KEY_L,  0x1E38, 
-+IBUS_KEY_underscore, IBUS_KEY_exclam, IBUS_KEY_R,  0x1E5C, 
-+IBUS_KEY_underscore, IBUS_KEY_exclam, IBUS_KEY_l,  0x1E39, 
-+IBUS_KEY_underscore, IBUS_KEY_exclam, IBUS_KEY_r,  0x1E5D, 
-+IBUS_KEY_underscore, IBUS_KEY_quotedbl, IBUS_KEY_A,  0x01DE, 
-+IBUS_KEY_underscore, IBUS_KEY_quotedbl, IBUS_KEY_O,  0x022A, 
-+IBUS_KEY_underscore, IBUS_KEY_quotedbl, IBUS_KEY_U,  0x01D5, 
-+IBUS_KEY_underscore, IBUS_KEY_quotedbl, IBUS_KEY_a,  0x01DF, 
-+IBUS_KEY_underscore, IBUS_KEY_quotedbl, IBUS_KEY_o,  0x022B, 
-+IBUS_KEY_underscore, IBUS_KEY_quotedbl, IBUS_KEY_u,  0x01D6, 
-+IBUS_KEY_underscore, IBUS_KEY_period, IBUS_KEY_A,  0x01E0, 
-+IBUS_KEY_underscore, IBUS_KEY_period, IBUS_KEY_O,  0x0230, 
-+IBUS_KEY_underscore, IBUS_KEY_period, IBUS_KEY_a,  0x01E1, 
-+IBUS_KEY_underscore, IBUS_KEY_period, IBUS_KEY_o,  0x0231, 
-+IBUS_KEY_underscore, IBUS_KEY_semicolon, IBUS_KEY_O,  0x01EC, 
-+IBUS_KEY_underscore, IBUS_KEY_semicolon, IBUS_KEY_o,  0x01ED, 
-+IBUS_KEY_underscore, IBUS_KEY_asciitilde, IBUS_KEY_O,  0x022C, 
-+IBUS_KEY_underscore, IBUS_KEY_asciitilde, IBUS_KEY_o,  0x022D, 
-+IBUS_KEY_underscore, IBUS_KEY_dead_tilde, IBUS_KEY_O,  0x022C, 
-+IBUS_KEY_underscore, IBUS_KEY_dead_tilde, IBUS_KEY_o,  0x022D, 
-+IBUS_KEY_underscore, IBUS_KEY_dead_abovedot, IBUS_KEY_A,  0x01E0, 
-+IBUS_KEY_underscore, IBUS_KEY_dead_abovedot, IBUS_KEY_O,  0x0230, 
-+IBUS_KEY_underscore, IBUS_KEY_dead_abovedot, IBUS_KEY_a,  0x01E1, 
-+IBUS_KEY_underscore, IBUS_KEY_dead_abovedot, IBUS_KEY_o,  0x0231, 
-+IBUS_KEY_underscore, IBUS_KEY_dead_diaeresis, IBUS_KEY_A,  0x01DE, 
-+IBUS_KEY_underscore, IBUS_KEY_dead_diaeresis, IBUS_KEY_O,  0x022A, 
-+IBUS_KEY_underscore, IBUS_KEY_dead_diaeresis, IBUS_KEY_U,  0x01D5, 
-+IBUS_KEY_underscore, IBUS_KEY_dead_diaeresis, IBUS_KEY_a,  0x01DF, 
-+IBUS_KEY_underscore, IBUS_KEY_dead_diaeresis, IBUS_KEY_o,  0x022B, 
-+IBUS_KEY_underscore, IBUS_KEY_dead_diaeresis, IBUS_KEY_u,  0x01D6, 
-+IBUS_KEY_underscore, IBUS_KEY_dead_ogonek, IBUS_KEY_O,  0x01EC, 
-+IBUS_KEY_underscore, IBUS_KEY_dead_ogonek, IBUS_KEY_o,  0x01ED, 
-+IBUS_KEY_underscore, IBUS_KEY_dead_belowdot, IBUS_KEY_L,  0x1E38, 
-+IBUS_KEY_underscore, IBUS_KEY_dead_belowdot, IBUS_KEY_R,  0x1E5C, 
-+IBUS_KEY_underscore, IBUS_KEY_dead_belowdot, IBUS_KEY_l,  0x1E39, 
-+IBUS_KEY_underscore, IBUS_KEY_dead_belowdot, IBUS_KEY_r,  0x1E5D, 
-+IBUS_KEY_grave, IBUS_KEY_quotedbl, IBUS_KEY_U,  0x01DB, 
-+IBUS_KEY_grave, IBUS_KEY_quotedbl, IBUS_KEY_u,  0x01DC, 
-+IBUS_KEY_grave, IBUS_KEY_quotedbl, IBUS_KEY_Greek_iota,  0x1FD2, 
-+IBUS_KEY_grave, IBUS_KEY_quotedbl, IBUS_KEY_Greek_upsilon,  0x1FE2, 
-+IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA,  0x1F0B, 
-+IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_EPSILON,  0x1F1B, 
-+IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA,  0x1F2B, 
-+IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_IOTA,  0x1F3B, 
-+IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMICRON,  0x1F4B, 
-+IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_UPSILON,  0x1F5B, 
-+IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA,  0x1F6B, 
-+IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha,  0x1F03, 
-+IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_epsilon,  0x1F13, 
-+IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta,  0x1F23, 
-+IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_iota,  0x1F33, 
-+IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_omicron,  0x1F43, 
-+IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_upsilon,  0x1F53, 
-+IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega,  0x1F63, 
-+IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA,  0x1F0A, 
-+IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_EPSILON,  0x1F1A, 
-+IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA,  0x1F2A, 
-+IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_IOTA,  0x1F3A, 
-+IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_OMICRON,  0x1F4A, 
-+IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA,  0x1F6A, 
-+IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha,  0x1F02, 
-+IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_epsilon,  0x1F12, 
-+IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_eta,  0x1F22, 
-+IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_iota,  0x1F32, 
-+IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_omicron,  0x1F42, 
-+IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_upsilon,  0x1F52, 
-+IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_omega,  0x1F62, 
-+IBUS_KEY_grave, IBUS_KEY_plus, IBUS_KEY_O,  0x1EDC, 
-+IBUS_KEY_grave, IBUS_KEY_plus, IBUS_KEY_U,  0x1EEA, 
-+IBUS_KEY_grave, IBUS_KEY_plus, IBUS_KEY_o,  0x1EDD, 
-+IBUS_KEY_grave, IBUS_KEY_plus, IBUS_KEY_u,  0x1EEB, 
-+IBUS_KEY_grave, IBUS_KEY_asciicircum, IBUS_KEY_A,  0x1EA6, 
-+IBUS_KEY_grave, IBUS_KEY_asciicircum, IBUS_KEY_E,  0x1EC0, 
-+IBUS_KEY_grave, IBUS_KEY_asciicircum, IBUS_KEY_O,  0x1ED2, 
-+IBUS_KEY_grave, IBUS_KEY_asciicircum, IBUS_KEY_a,  0x1EA7, 
-+IBUS_KEY_grave, IBUS_KEY_asciicircum, IBUS_KEY_e,  0x1EC1, 
-+IBUS_KEY_grave, IBUS_KEY_asciicircum, IBUS_KEY_o,  0x1ED3, 
-+IBUS_KEY_grave, IBUS_KEY_underscore, IBUS_KEY_E,  0x1E14, 
-+IBUS_KEY_grave, IBUS_KEY_underscore, IBUS_KEY_O,  0x1E50, 
-+IBUS_KEY_grave, IBUS_KEY_underscore, IBUS_KEY_e,  0x1E15, 
-+IBUS_KEY_grave, IBUS_KEY_underscore, IBUS_KEY_o,  0x1E51, 
-+IBUS_KEY_grave, IBUS_KEY_b, IBUS_KEY_A,  0x1EB0, 
-+IBUS_KEY_grave, IBUS_KEY_b, IBUS_KEY_a,  0x1EB1, 
-+IBUS_KEY_grave, IBUS_KEY_macron, IBUS_KEY_E,  0x1E14, 
-+IBUS_KEY_grave, IBUS_KEY_macron, IBUS_KEY_O,  0x1E50, 
-+IBUS_KEY_grave, IBUS_KEY_macron, IBUS_KEY_e,  0x1E15, 
-+IBUS_KEY_grave, IBUS_KEY_macron, IBUS_KEY_o,  0x1E51, 
-+IBUS_KEY_grave, IBUS_KEY_dead_circumflex, IBUS_KEY_A,  0x1EA6, 
-+IBUS_KEY_grave, IBUS_KEY_dead_circumflex, IBUS_KEY_E,  0x1EC0, 
-+IBUS_KEY_grave, IBUS_KEY_dead_circumflex, IBUS_KEY_O,  0x1ED2, 
-+IBUS_KEY_grave, IBUS_KEY_dead_circumflex, IBUS_KEY_a,  0x1EA7, 
-+IBUS_KEY_grave, IBUS_KEY_dead_circumflex, IBUS_KEY_e,  0x1EC1, 
-+IBUS_KEY_grave, IBUS_KEY_dead_circumflex, IBUS_KEY_o,  0x1ED3, 
-+IBUS_KEY_grave, IBUS_KEY_dead_macron, IBUS_KEY_E,  0x1E14, 
-+IBUS_KEY_grave, IBUS_KEY_dead_macron, IBUS_KEY_O,  0x1E50, 
-+IBUS_KEY_grave, IBUS_KEY_dead_macron, IBUS_KEY_e,  0x1E15, 
-+IBUS_KEY_grave, IBUS_KEY_dead_macron, IBUS_KEY_o,  0x1E51, 
-+IBUS_KEY_grave, IBUS_KEY_dead_breve, IBUS_KEY_A,  0x1EB0, 
-+IBUS_KEY_grave, IBUS_KEY_dead_breve, IBUS_KEY_a,  0x1EB1, 
-+IBUS_KEY_grave, IBUS_KEY_dead_diaeresis, IBUS_KEY_U,  0x01DB, 
-+IBUS_KEY_grave, IBUS_KEY_dead_diaeresis, IBUS_KEY_u,  0x01DC, 
-+IBUS_KEY_grave, IBUS_KEY_dead_diaeresis, IBUS_KEY_Greek_iota,  0x1FD2, 
-+IBUS_KEY_grave, IBUS_KEY_dead_diaeresis, IBUS_KEY_Greek_upsilon,  0x1FE2, 
-+IBUS_KEY_grave, IBUS_KEY_dead_horn, IBUS_KEY_O,  0x1EDC, 
-+IBUS_KEY_grave, IBUS_KEY_dead_horn, IBUS_KEY_U,  0x1EEA, 
-+IBUS_KEY_grave, IBUS_KEY_dead_horn, IBUS_KEY_o,  0x1EDD, 
-+IBUS_KEY_grave, IBUS_KEY_dead_horn, IBUS_KEY_u,  0x1EEB, 
-+IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA,  0x1F0A, 
-+IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_EPSILON,  0x1F1A, 
-+IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA,  0x1F2A, 
-+IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_IOTA,  0x1F3A, 
-+IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMICRON,  0x1F4A, 
-+IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA,  0x1F6A, 
-+IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha,  0x1F02, 
-+IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_epsilon,  0x1F12, 
-+IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta,  0x1F22, 
-+IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_iota,  0x1F32, 
-+IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omicron,  0x1F42, 
-+IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_upsilon,  0x1F52, 
-+IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega,  0x1F62, 
-+IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA,  0x1F0B, 
-+IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_EPSILON,  0x1F1B, 
-+IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA,  0x1F2B, 
-+IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_IOTA,  0x1F3B, 
-+IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMICRON,  0x1F4B, 
-+IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_UPSILON,  0x1F5B, 
-+IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA,  0x1F6B, 
-+IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha,  0x1F03, 
-+IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_epsilon,  0x1F13, 
-+IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta,  0x1F23, 
-+IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_iota,  0x1F33, 
-+IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omicron,  0x1F43, 
-+IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_upsilon,  0x1F53, 
-+IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega,  0x1F63, 
-+IBUS_KEY_b, IBUS_KEY_exclam, IBUS_KEY_A,  0x1EB6, 
-+IBUS_KEY_b, IBUS_KEY_exclam, IBUS_KEY_a,  0x1EB7, 
-+IBUS_KEY_b, IBUS_KEY_comma, IBUS_KEY_E,  0x1E1C, 
-+IBUS_KEY_b, IBUS_KEY_comma, IBUS_KEY_e,  0x1E1D, 
-+IBUS_KEY_b, IBUS_KEY_cedilla, IBUS_KEY_E,  0x1E1C, 
-+IBUS_KEY_b, IBUS_KEY_cedilla, IBUS_KEY_e,  0x1E1D, 
-+IBUS_KEY_b, IBUS_KEY_dead_cedilla, IBUS_KEY_E,  0x1E1C, 
-+IBUS_KEY_b, IBUS_KEY_dead_cedilla, IBUS_KEY_e,  0x1E1D, 
-+IBUS_KEY_b, IBUS_KEY_dead_belowdot, IBUS_KEY_A,  0x1EB6, 
-+IBUS_KEY_b, IBUS_KEY_dead_belowdot, IBUS_KEY_a,  0x1EB7, 
-+IBUS_KEY_c, IBUS_KEY_quotedbl, IBUS_KEY_U,  0x01D9, 
-+IBUS_KEY_c, IBUS_KEY_quotedbl, IBUS_KEY_u,  0x01DA, 
-+IBUS_KEY_c, IBUS_KEY_dead_diaeresis, IBUS_KEY_U,  0x01D9, 
-+IBUS_KEY_c, IBUS_KEY_dead_diaeresis, IBUS_KEY_u,  0x01DA, 
-+IBUS_KEY_asciitilde, IBUS_KEY_quotedbl, IBUS_KEY_Greek_iota,  0x1FD7, 
-+IBUS_KEY_asciitilde, IBUS_KEY_quotedbl, IBUS_KEY_Greek_upsilon,  0x1FE7, 
-+IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA,  0x1F0F, 
-+IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA,  0x1F2F, 
-+IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_IOTA,  0x1F3F, 
-+IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_UPSILON,  0x1F5F, 
-+IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA,  0x1F6F, 
-+IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha,  0x1F07, 
-+IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta,  0x1F27, 
-+IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_iota,  0x1F37, 
-+IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_upsilon,  0x1F57, 
-+IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega,  0x1F67, 
-+IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA,  0x1F0E, 
-+IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA,  0x1F2E, 
-+IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_IOTA,  0x1F3E, 
-+IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA,  0x1F6E, 
-+IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha,  0x1F06, 
-+IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_eta,  0x1F26, 
-+IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_iota,  0x1F36, 
-+IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_upsilon,  0x1F56, 
-+IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_omega,  0x1F66, 
-+IBUS_KEY_asciitilde, IBUS_KEY_plus, IBUS_KEY_O,  0x1EE0, 
-+IBUS_KEY_asciitilde, IBUS_KEY_plus, IBUS_KEY_U,  0x1EEE, 
-+IBUS_KEY_asciitilde, IBUS_KEY_plus, IBUS_KEY_o,  0x1EE1, 
-+IBUS_KEY_asciitilde, IBUS_KEY_plus, IBUS_KEY_u,  0x1EEF, 
-+IBUS_KEY_asciitilde, IBUS_KEY_asciicircum, IBUS_KEY_A,  0x1EAA, 
-+IBUS_KEY_asciitilde, IBUS_KEY_asciicircum, IBUS_KEY_E,  0x1EC4, 
-+IBUS_KEY_asciitilde, IBUS_KEY_asciicircum, IBUS_KEY_O,  0x1ED6, 
-+IBUS_KEY_asciitilde, IBUS_KEY_asciicircum, IBUS_KEY_a,  0x1EAB, 
-+IBUS_KEY_asciitilde, IBUS_KEY_asciicircum, IBUS_KEY_e,  0x1EC5, 
-+IBUS_KEY_asciitilde, IBUS_KEY_asciicircum, IBUS_KEY_o,  0x1ED7, 
-+IBUS_KEY_asciitilde, IBUS_KEY_b, IBUS_KEY_A,  0x1EB4, 
-+IBUS_KEY_asciitilde, IBUS_KEY_b, IBUS_KEY_a,  0x1EB5, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_circumflex, IBUS_KEY_A,  0x1EAA, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_circumflex, IBUS_KEY_E,  0x1EC4, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_circumflex, IBUS_KEY_O,  0x1ED6, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_circumflex, IBUS_KEY_a,  0x1EAB, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_circumflex, IBUS_KEY_e,  0x1EC5, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_circumflex, IBUS_KEY_o,  0x1ED7, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_breve, IBUS_KEY_A,  0x1EB4, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_breve, IBUS_KEY_a,  0x1EB5, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_diaeresis, IBUS_KEY_Greek_iota,  0x1FD7, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_diaeresis, IBUS_KEY_Greek_upsilon,  0x1FE7, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_horn, IBUS_KEY_O,  0x1EE0, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_horn, IBUS_KEY_U,  0x1EEE, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_horn, IBUS_KEY_o,  0x1EE1, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_horn, IBUS_KEY_u,  0x1EEF, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA,  0x1F0E, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA,  0x1F2E, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_IOTA,  0x1F3E, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA,  0x1F6E, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha,  0x1F06, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta,  0x1F26, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_iota,  0x1F36, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_upsilon,  0x1F56, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega,  0x1F66, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA,  0x1F0F, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA,  0x1F2F, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_IOTA,  0x1F3F, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_UPSILON,  0x1F5F, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA,  0x1F6F, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha,  0x1F07, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta,  0x1F27, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_iota,  0x1F37, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_upsilon,  0x1F57, 
-+IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega,  0x1F67, 
-+IBUS_KEY_macron, IBUS_KEY_exclam, IBUS_KEY_L,  0x1E38, 
-+IBUS_KEY_macron, IBUS_KEY_exclam, IBUS_KEY_R,  0x1E5C, 
-+IBUS_KEY_macron, IBUS_KEY_exclam, IBUS_KEY_l,  0x1E39, 
-+IBUS_KEY_macron, IBUS_KEY_exclam, IBUS_KEY_r,  0x1E5D, 
-+IBUS_KEY_macron, IBUS_KEY_quotedbl, IBUS_KEY_A,  0x01DE, 
-+IBUS_KEY_macron, IBUS_KEY_quotedbl, IBUS_KEY_O,  0x022A, 
-+IBUS_KEY_macron, IBUS_KEY_quotedbl, IBUS_KEY_U,  0x01D5, 
-+IBUS_KEY_macron, IBUS_KEY_quotedbl, IBUS_KEY_a,  0x01DF, 
-+IBUS_KEY_macron, IBUS_KEY_quotedbl, IBUS_KEY_o,  0x022B, 
-+IBUS_KEY_macron, IBUS_KEY_quotedbl, IBUS_KEY_u,  0x01D6, 
-+IBUS_KEY_macron, IBUS_KEY_period, IBUS_KEY_A,  0x01E0, 
-+IBUS_KEY_macron, IBUS_KEY_period, IBUS_KEY_O,  0x0230, 
-+IBUS_KEY_macron, IBUS_KEY_period, IBUS_KEY_a,  0x01E1, 
-+IBUS_KEY_macron, IBUS_KEY_period, IBUS_KEY_o,  0x0231, 
-+IBUS_KEY_macron, IBUS_KEY_semicolon, IBUS_KEY_O,  0x01EC, 
-+IBUS_KEY_macron, IBUS_KEY_semicolon, IBUS_KEY_o,  0x01ED, 
-+IBUS_KEY_macron, IBUS_KEY_asciitilde, IBUS_KEY_O,  0x022C, 
-+IBUS_KEY_macron, IBUS_KEY_asciitilde, IBUS_KEY_o,  0x022D, 
-+IBUS_KEY_macron, IBUS_KEY_dead_tilde, IBUS_KEY_O,  0x022C, 
-+IBUS_KEY_macron, IBUS_KEY_dead_tilde, IBUS_KEY_o,  0x022D, 
-+IBUS_KEY_macron, IBUS_KEY_dead_abovedot, IBUS_KEY_A,  0x01E0, 
-+IBUS_KEY_macron, IBUS_KEY_dead_abovedot, IBUS_KEY_O,  0x0230, 
-+IBUS_KEY_macron, IBUS_KEY_dead_abovedot, IBUS_KEY_a,  0x01E1, 
-+IBUS_KEY_macron, IBUS_KEY_dead_abovedot, IBUS_KEY_o,  0x0231, 
-+IBUS_KEY_macron, IBUS_KEY_dead_diaeresis, IBUS_KEY_A,  0x01DE, 
-+IBUS_KEY_macron, IBUS_KEY_dead_diaeresis, IBUS_KEY_O,  0x022A, 
-+IBUS_KEY_macron, IBUS_KEY_dead_diaeresis, IBUS_KEY_U,  0x01D5, 
-+IBUS_KEY_macron, IBUS_KEY_dead_diaeresis, IBUS_KEY_a,  0x01DF, 
-+IBUS_KEY_macron, IBUS_KEY_dead_diaeresis, IBUS_KEY_o,  0x022B, 
-+IBUS_KEY_macron, IBUS_KEY_dead_diaeresis, IBUS_KEY_u,  0x01D6, 
-+IBUS_KEY_macron, IBUS_KEY_dead_ogonek, IBUS_KEY_O,  0x01EC, 
-+IBUS_KEY_macron, IBUS_KEY_dead_ogonek, IBUS_KEY_o,  0x01ED, 
-+IBUS_KEY_macron, IBUS_KEY_dead_belowdot, IBUS_KEY_L,  0x1E38, 
-+IBUS_KEY_macron, IBUS_KEY_dead_belowdot, IBUS_KEY_R,  0x1E5C, 
-+IBUS_KEY_macron, IBUS_KEY_dead_belowdot, IBUS_KEY_l,  0x1E39, 
-+IBUS_KEY_macron, IBUS_KEY_dead_belowdot, IBUS_KEY_r,  0x1E5D, 
-+IBUS_KEY_acute, IBUS_KEY_quotedbl, IBUS_KEY_I,  0x1E2E, 
-+IBUS_KEY_acute, IBUS_KEY_quotedbl, IBUS_KEY_U,  0x01D7, 
-+IBUS_KEY_acute, IBUS_KEY_quotedbl, IBUS_KEY_i,  0x1E2F, 
-+IBUS_KEY_acute, IBUS_KEY_quotedbl, IBUS_KEY_u,  0x01D8, 
-+IBUS_KEY_acute, IBUS_KEY_quotedbl, IBUS_KEY_Greek_iota,  0x0390, 
-+IBUS_KEY_acute, IBUS_KEY_quotedbl, IBUS_KEY_Greek_upsilon,  0x03B0, 
-+IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA,  0x1F0D, 
-+IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_EPSILON,  0x1F1D, 
-+IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA,  0x1F2D, 
-+IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_IOTA,  0x1F3D, 
-+IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMICRON,  0x1F4D, 
-+IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_UPSILON,  0x1F5D, 
-+IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA,  0x1F6D, 
-+IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha,  0x1F05, 
-+IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_epsilon,  0x1F15, 
-+IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta,  0x1F25, 
-+IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_iota,  0x1F35, 
-+IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_omicron,  0x1F45, 
-+IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_upsilon,  0x1F55, 
-+IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega,  0x1F65, 
-+IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA,  0x1F0C, 
-+IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_EPSILON,  0x1F1C, 
-+IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA,  0x1F2C, 
-+IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_IOTA,  0x1F3C, 
-+IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_OMICRON,  0x1F4C, 
-+IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA,  0x1F6C, 
-+IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha,  0x1F04, 
-+IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_epsilon,  0x1F14, 
-+IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_eta,  0x1F24, 
-+IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_iota,  0x1F34, 
-+IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_omicron,  0x1F44, 
-+IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_upsilon,  0x1F54, 
-+IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_omega,  0x1F64, 
-+IBUS_KEY_acute, IBUS_KEY_plus, IBUS_KEY_O,  0x1EDA, 
-+IBUS_KEY_acute, IBUS_KEY_plus, IBUS_KEY_U,  0x1EE8, 
-+IBUS_KEY_acute, IBUS_KEY_plus, IBUS_KEY_o,  0x1EDB, 
-+IBUS_KEY_acute, IBUS_KEY_plus, IBUS_KEY_u,  0x1EE9, 
-+IBUS_KEY_acute, IBUS_KEY_comma, IBUS_KEY_C,  0x1E08, 
-+IBUS_KEY_acute, IBUS_KEY_comma, IBUS_KEY_c,  0x1E09, 
-+IBUS_KEY_acute, IBUS_KEY_slash, IBUS_KEY_O,  0x01FE, 
-+IBUS_KEY_acute, IBUS_KEY_slash, IBUS_KEY_o,  0x01FF, 
-+IBUS_KEY_acute, IBUS_KEY_asciicircum, IBUS_KEY_A,  0x1EA4, 
-+IBUS_KEY_acute, IBUS_KEY_asciicircum, IBUS_KEY_E,  0x1EBE, 
-+IBUS_KEY_acute, IBUS_KEY_asciicircum, IBUS_KEY_O,  0x1ED0, 
-+IBUS_KEY_acute, IBUS_KEY_asciicircum, IBUS_KEY_a,  0x1EA5, 
-+IBUS_KEY_acute, IBUS_KEY_asciicircum, IBUS_KEY_e,  0x1EBF, 
-+IBUS_KEY_acute, IBUS_KEY_asciicircum, IBUS_KEY_o,  0x1ED1, 
-+IBUS_KEY_acute, IBUS_KEY_underscore, IBUS_KEY_E,  0x1E16, 
-+IBUS_KEY_acute, IBUS_KEY_underscore, IBUS_KEY_O,  0x1E52, 
-+IBUS_KEY_acute, IBUS_KEY_underscore, IBUS_KEY_e,  0x1E17, 
-+IBUS_KEY_acute, IBUS_KEY_underscore, IBUS_KEY_o,  0x1E53, 
-+IBUS_KEY_acute, IBUS_KEY_b, IBUS_KEY_A,  0x1EAE, 
-+IBUS_KEY_acute, IBUS_KEY_b, IBUS_KEY_a,  0x1EAF, 
-+IBUS_KEY_acute, IBUS_KEY_asciitilde, IBUS_KEY_O,  0x1E4C, 
-+IBUS_KEY_acute, IBUS_KEY_asciitilde, IBUS_KEY_U,  0x1E78, 
-+IBUS_KEY_acute, IBUS_KEY_asciitilde, IBUS_KEY_o,  0x1E4D, 
-+IBUS_KEY_acute, IBUS_KEY_asciitilde, IBUS_KEY_u,  0x1E79, 
-+IBUS_KEY_acute, IBUS_KEY_macron, IBUS_KEY_E,  0x1E16, 
-+IBUS_KEY_acute, IBUS_KEY_macron, IBUS_KEY_O,  0x1E52, 
-+IBUS_KEY_acute, IBUS_KEY_macron, IBUS_KEY_e,  0x1E17, 
-+IBUS_KEY_acute, IBUS_KEY_macron, IBUS_KEY_o,  0x1E53, 
-+IBUS_KEY_acute, IBUS_KEY_cedilla, IBUS_KEY_C,  0x1E08, 
-+IBUS_KEY_acute, IBUS_KEY_cedilla, IBUS_KEY_c,  0x1E09, 
-+IBUS_KEY_acute, IBUS_KEY_dead_circumflex, IBUS_KEY_A,  0x1EA4, 
-+IBUS_KEY_acute, IBUS_KEY_dead_circumflex, IBUS_KEY_E,  0x1EBE, 
-+IBUS_KEY_acute, IBUS_KEY_dead_circumflex, IBUS_KEY_O,  0x1ED0, 
-+IBUS_KEY_acute, IBUS_KEY_dead_circumflex, IBUS_KEY_a,  0x1EA5, 
-+IBUS_KEY_acute, IBUS_KEY_dead_circumflex, IBUS_KEY_e,  0x1EBF, 
-+IBUS_KEY_acute, IBUS_KEY_dead_circumflex, IBUS_KEY_o,  0x1ED1, 
-+IBUS_KEY_acute, IBUS_KEY_dead_tilde, IBUS_KEY_O,  0x1E4C, 
-+IBUS_KEY_acute, IBUS_KEY_dead_tilde, IBUS_KEY_U,  0x1E78, 
-+IBUS_KEY_acute, IBUS_KEY_dead_tilde, IBUS_KEY_o,  0x1E4D, 
-+IBUS_KEY_acute, IBUS_KEY_dead_tilde, IBUS_KEY_u,  0x1E79, 
-+IBUS_KEY_acute, IBUS_KEY_dead_macron, IBUS_KEY_E,  0x1E16, 
-+IBUS_KEY_acute, IBUS_KEY_dead_macron, IBUS_KEY_O,  0x1E52, 
-+IBUS_KEY_acute, IBUS_KEY_dead_macron, IBUS_KEY_e,  0x1E17, 
-+IBUS_KEY_acute, IBUS_KEY_dead_macron, IBUS_KEY_o,  0x1E53, 
-+IBUS_KEY_acute, IBUS_KEY_dead_breve, IBUS_KEY_A,  0x1EAE, 
-+IBUS_KEY_acute, IBUS_KEY_dead_breve, IBUS_KEY_a,  0x1EAF, 
-+IBUS_KEY_acute, IBUS_KEY_dead_diaeresis, IBUS_KEY_I,  0x1E2E, 
-+IBUS_KEY_acute, IBUS_KEY_dead_diaeresis, IBUS_KEY_U,  0x01D7, 
-+IBUS_KEY_acute, IBUS_KEY_dead_diaeresis, IBUS_KEY_i,  0x1E2F, 
-+IBUS_KEY_acute, IBUS_KEY_dead_diaeresis, IBUS_KEY_u,  0x01D8, 
-+IBUS_KEY_acute, IBUS_KEY_dead_diaeresis, IBUS_KEY_Greek_iota,  0x0390, 
-+IBUS_KEY_acute, IBUS_KEY_dead_diaeresis, IBUS_KEY_Greek_upsilon,  0x03B0, 
-+IBUS_KEY_acute, IBUS_KEY_dead_abovering, IBUS_KEY_A,  0x01FA, 
-+IBUS_KEY_acute, IBUS_KEY_dead_abovering, IBUS_KEY_a,  0x01FB, 
-+IBUS_KEY_acute, IBUS_KEY_dead_cedilla, IBUS_KEY_C,  0x1E08, 
-+IBUS_KEY_acute, IBUS_KEY_dead_cedilla, IBUS_KEY_c,  0x1E09, 
-+IBUS_KEY_acute, IBUS_KEY_dead_horn, IBUS_KEY_O,  0x1EDA, 
-+IBUS_KEY_acute, IBUS_KEY_dead_horn, IBUS_KEY_U,  0x1EE8, 
-+IBUS_KEY_acute, IBUS_KEY_dead_horn, IBUS_KEY_o,  0x1EDB, 
-+IBUS_KEY_acute, IBUS_KEY_dead_horn, IBUS_KEY_u,  0x1EE9, 
-+IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA,  0x1F0C, 
-+IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_EPSILON,  0x1F1C, 
-+IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA,  0x1F2C, 
-+IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_IOTA,  0x1F3C, 
-+IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMICRON,  0x1F4C, 
-+IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA,  0x1F6C, 
-+IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha,  0x1F04, 
-+IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_epsilon,  0x1F14, 
-+IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta,  0x1F24, 
-+IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_iota,  0x1F34, 
-+IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omicron,  0x1F44, 
-+IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_upsilon,  0x1F54, 
-+IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega,  0x1F64, 
-+IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA,  0x1F0D, 
-+IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_EPSILON,  0x1F1D, 
-+IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA,  0x1F2D, 
-+IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_IOTA,  0x1F3D, 
-+IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMICRON,  0x1F4D, 
-+IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_UPSILON,  0x1F5D, 
-+IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA,  0x1F6D, 
-+IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha,  0x1F05, 
-+IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_epsilon,  0x1F15, 
-+IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta,  0x1F25, 
-+IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_iota,  0x1F35, 
-+IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omicron,  0x1F45, 
-+IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_upsilon,  0x1F55, 
-+IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega,  0x1F65, 
-+IBUS_KEY_acute, IBUS_KEY_KP_Divide, IBUS_KEY_O,  0x01FE, 
-+IBUS_KEY_acute, IBUS_KEY_KP_Divide, IBUS_KEY_o,  0x01FF, 
-+0x05C1, 0x05BC, IBUS_KEY_hebrew_shin,  0xFB2C, 
-+0x05C2, 0x05BC, IBUS_KEY_hebrew_shin,  0xFB2D, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_Greek_alpha,  0x1FB4, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_Greek_eta,  0x1FC4, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_Greek_omega,  0x1FF4, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, 0x1F00,  0x1F84, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, 0x1F01,  0x1F85, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, 0x1F08,  0x1F8C, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, 0x1F09,  0x1F8D, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, 0x1F20,  0x1F94, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, 0x1F21,  0x1F95, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, 0x1F28,  0x1F9C, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, 0x1F29,  0x1F9D, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, 0x1F60,  0x1FA4, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, 0x1F61,  0x1FA5, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, 0x1F68,  0x1FAC, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, 0x1F69,  0x1FAD, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA,  0x1F89, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA,  0x1F99, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA,  0x1FA9, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha,  0x1F81, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta,  0x1F91, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega,  0x1FA1, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA,  0x1F88, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA,  0x1F98, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA,  0x1FA8, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha,  0x1F80, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_parenright, IBUS_KEY_Greek_eta,  0x1F90, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_parenright, IBUS_KEY_Greek_omega,  0x1FA0, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_Greek_alpha,  0x1FB2, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_Greek_eta,  0x1FC2, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_Greek_omega,  0x1FF2, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, 0x1F00,  0x1F82, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, 0x1F01,  0x1F83, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, 0x1F08,  0x1F8A, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, 0x1F09,  0x1F8B, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, 0x1F20,  0x1F92, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, 0x1F21,  0x1F93, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, 0x1F28,  0x1F9A, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, 0x1F29,  0x1F9B, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, 0x1F60,  0x1FA2, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, 0x1F61,  0x1FA3, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, 0x1F68,  0x1FAA, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, 0x1F69,  0x1FAB, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_Greek_alpha,  0x1FB7, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_Greek_eta,  0x1FC7, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_Greek_omega,  0x1FF7, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, 0x1F00,  0x1F86, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, 0x1F01,  0x1F87, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, 0x1F08,  0x1F8E, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, 0x1F09,  0x1F8F, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, 0x1F20,  0x1F96, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, 0x1F21,  0x1F97, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, 0x1F28,  0x1F9E, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, 0x1F29,  0x1F9F, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, 0x1F60,  0x1FA6, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, 0x1F61,  0x1FA7, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, 0x1F68,  0x1FAE, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, 0x1F69,  0x1FAF, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_Greek_alpha,  0x1FB4, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_Greek_eta,  0x1FC4, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_Greek_omega,  0x1FF4, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, 0x1F00,  0x1F84, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, 0x1F01,  0x1F85, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, 0x1F08,  0x1F8C, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, 0x1F09,  0x1F8D, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, 0x1F20,  0x1F94, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, 0x1F21,  0x1F95, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, 0x1F28,  0x1F9C, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, 0x1F29,  0x1F9D, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, 0x1F60,  0x1FA4, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, 0x1F61,  0x1FA5, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, 0x1F68,  0x1FAC, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, 0x1F69,  0x1FAD, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_Greek_alpha,  0x1FB2, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_Greek_eta,  0x1FC2, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_Greek_omega,  0x1FF2, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, 0x1F00,  0x1F82, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, 0x1F01,  0x1F83, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, 0x1F08,  0x1F8A, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, 0x1F09,  0x1F8B, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, 0x1F20,  0x1F92, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, 0x1F21,  0x1F93, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, 0x1F28,  0x1F9A, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, 0x1F29,  0x1F9B, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, 0x1F60,  0x1FA2, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, 0x1F61,  0x1FA3, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, 0x1F68,  0x1FAA, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, 0x1F69,  0x1FAB, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_Greek_alpha,  0x1FB4, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_Greek_eta,  0x1FC4, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_Greek_omega,  0x1FF4, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, 0x1F00,  0x1F84, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, 0x1F01,  0x1F85, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, 0x1F08,  0x1F8C, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, 0x1F09,  0x1F8D, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, 0x1F20,  0x1F94, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, 0x1F21,  0x1F95, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, 0x1F28,  0x1F9C, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, 0x1F29,  0x1F9D, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, 0x1F60,  0x1FA4, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, 0x1F61,  0x1FA5, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, 0x1F68,  0x1FAC, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, 0x1F69,  0x1FAD, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_Greek_alpha,  0x1FB7, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_Greek_eta,  0x1FC7, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_Greek_omega,  0x1FF7, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, 0x1F00,  0x1F86, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, 0x1F01,  0x1F87, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, 0x1F08,  0x1F8E, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, 0x1F09,  0x1F8F, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, 0x1F20,  0x1F96, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, 0x1F21,  0x1F97, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, 0x1F28,  0x1F9E, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, 0x1F29,  0x1F9F, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, 0x1F60,  0x1FA6, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, 0x1F61,  0x1FA7, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, 0x1F68,  0x1FAE, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, 0x1F69,  0x1FAF, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA,  0x1F88, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA,  0x1F98, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA,  0x1FA8, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha,  0x1F80, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta,  0x1F90, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega,  0x1FA0, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA,  0x1F89, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA,  0x1F99, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA,  0x1FA9, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha,  0x1F81, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta,  0x1F91, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega,  0x1FA1, 
-+IBUS_KEY_dead_abovedot, IBUS_KEY_f, IBUS_KEY_s,  0x1E9B, 
-+IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_0, IBUS_KEY_parenright,  0x2469, 
-+IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_1, IBUS_KEY_parenright,  0x246A, 
-+IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_2, IBUS_KEY_parenright,  0x246B, 
-+IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_3, IBUS_KEY_parenright,  0x246C, 
-+IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_4, IBUS_KEY_parenright,  0x246D, 
-+IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_5, IBUS_KEY_parenright,  0x246E, 
-+IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_6, IBUS_KEY_parenright,  0x246F, 
-+IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_7, IBUS_KEY_parenright,  0x2470, 
-+IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_8, IBUS_KEY_parenright,  0x2471, 
-+IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_9, IBUS_KEY_parenright,  0x2472, 
-+IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_KP_Space, IBUS_KEY_parenright,  0x246B, 
-+IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_KP_0, IBUS_KEY_parenright,  0x2469, 
-+IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_KP_1, IBUS_KEY_parenright,  0x246A, 
-+IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_KP_2, IBUS_KEY_parenright,  0x246B, 
-+IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_KP_3, IBUS_KEY_parenright,  0x246C, 
-+IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_KP_4, IBUS_KEY_parenright,  0x246D, 
-+IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_KP_5, IBUS_KEY_parenright,  0x246E, 
-+IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_KP_6, IBUS_KEY_parenright,  0x246F, 
-+IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_KP_7, IBUS_KEY_parenright,  0x2470, 
-+IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_KP_8, IBUS_KEY_parenright,  0x2471, 
-+IBUS_KEY_parenleft, IBUS_KEY_1, IBUS_KEY_KP_9, IBUS_KEY_parenright,  0x2472, 
-+IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_0, IBUS_KEY_parenright,  0x2473, 
-+IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_1, IBUS_KEY_parenright,  0x3251, 
-+IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_2, IBUS_KEY_parenright,  0x3252, 
-+IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_3, IBUS_KEY_parenright,  0x3253, 
-+IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_4, IBUS_KEY_parenright,  0x3254, 
-+IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_5, IBUS_KEY_parenright,  0x3255, 
-+IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_6, IBUS_KEY_parenright,  0x3256, 
-+IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_7, IBUS_KEY_parenright,  0x3257, 
-+IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_8, IBUS_KEY_parenright,  0x3258, 
-+IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_9, IBUS_KEY_parenright,  0x3259, 
-+IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_KP_Space, IBUS_KEY_parenright,  0x3252, 
-+IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_KP_0, IBUS_KEY_parenright,  0x2473, 
-+IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_KP_1, IBUS_KEY_parenright,  0x3251, 
-+IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_KP_2, IBUS_KEY_parenright,  0x3252, 
-+IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_KP_3, IBUS_KEY_parenright,  0x3253, 
-+IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_KP_4, IBUS_KEY_parenright,  0x3254, 
-+IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_KP_5, IBUS_KEY_parenright,  0x3255, 
-+IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_KP_6, IBUS_KEY_parenright,  0x3256, 
-+IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_KP_7, IBUS_KEY_parenright,  0x3257, 
-+IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_KP_8, IBUS_KEY_parenright,  0x3258, 
-+IBUS_KEY_parenleft, IBUS_KEY_2, IBUS_KEY_KP_9, IBUS_KEY_parenright,  0x3259, 
-+IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_0, IBUS_KEY_parenright,  0x325A, 
-+IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_1, IBUS_KEY_parenright,  0x325B, 
-+IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_2, IBUS_KEY_parenright,  0x325C, 
-+IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_3, IBUS_KEY_parenright,  0x325D, 
-+IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_4, IBUS_KEY_parenright,  0x325E, 
-+IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_5, IBUS_KEY_parenright,  0x325F, 
-+IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_6, IBUS_KEY_parenright,  0x32B1, 
-+IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_7, IBUS_KEY_parenright,  0x32B2, 
-+IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_8, IBUS_KEY_parenright,  0x32B3, 
-+IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_9, IBUS_KEY_parenright,  0x32B4, 
-+IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_KP_Space, IBUS_KEY_parenright,  0x325C, 
-+IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_KP_0, IBUS_KEY_parenright,  0x325A, 
-+IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_KP_1, IBUS_KEY_parenright,  0x325B, 
-+IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_KP_2, IBUS_KEY_parenright,  0x325C, 
-+IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_KP_3, IBUS_KEY_parenright,  0x325D, 
-+IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_KP_4, IBUS_KEY_parenright,  0x325E, 
-+IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_KP_5, IBUS_KEY_parenright,  0x325F, 
-+IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_KP_6, IBUS_KEY_parenright,  0x32B1, 
-+IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_KP_7, IBUS_KEY_parenright,  0x32B2, 
-+IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_KP_8, IBUS_KEY_parenright,  0x32B3, 
-+IBUS_KEY_parenleft, IBUS_KEY_3, IBUS_KEY_KP_9, IBUS_KEY_parenright,  0x32B4, 
-+IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_0, IBUS_KEY_parenright,  0x32B5, 
-+IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_1, IBUS_KEY_parenright,  0x32B6, 
-+IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_2, IBUS_KEY_parenright,  0x32B7, 
-+IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_3, IBUS_KEY_parenright,  0x32B8, 
-+IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_4, IBUS_KEY_parenright,  0x32B9, 
-+IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_5, IBUS_KEY_parenright,  0x32BA, 
-+IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_6, IBUS_KEY_parenright,  0x32BB, 
-+IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_7, IBUS_KEY_parenright,  0x32BC, 
-+IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_8, IBUS_KEY_parenright,  0x32BD, 
-+IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_9, IBUS_KEY_parenright,  0x32BE, 
-+IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_KP_Space, IBUS_KEY_parenright,  0x32B7, 
-+IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_KP_0, IBUS_KEY_parenright,  0x32B5, 
-+IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_KP_1, IBUS_KEY_parenright,  0x32B6, 
-+IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_KP_2, IBUS_KEY_parenright,  0x32B7, 
-+IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_KP_3, IBUS_KEY_parenright,  0x32B8, 
-+IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_KP_4, IBUS_KEY_parenright,  0x32B9, 
-+IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_KP_5, IBUS_KEY_parenright,  0x32BA, 
-+IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_KP_6, IBUS_KEY_parenright,  0x32BB, 
-+IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_KP_7, IBUS_KEY_parenright,  0x32BC, 
-+IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_KP_8, IBUS_KEY_parenright,  0x32BD, 
-+IBUS_KEY_parenleft, IBUS_KEY_4, IBUS_KEY_KP_9, IBUS_KEY_parenright,  0x32BE, 
-+IBUS_KEY_parenleft, IBUS_KEY_5, IBUS_KEY_0, IBUS_KEY_parenright,  0x32BF, 
-+IBUS_KEY_parenleft, 0x1100, 0x1161, IBUS_KEY_parenright,  0x326E, 
-+IBUS_KEY_parenleft, 0x1102, 0x1161, IBUS_KEY_parenright,  0x326F, 
-+IBUS_KEY_parenleft, 0x1103, 0x1161, IBUS_KEY_parenright,  0x3270, 
-+IBUS_KEY_parenleft, 0x1105, 0x1161, IBUS_KEY_parenright,  0x3271, 
-+IBUS_KEY_parenleft, 0x1106, 0x1161, IBUS_KEY_parenright,  0x3272, 
-+IBUS_KEY_parenleft, 0x1107, 0x1161, IBUS_KEY_parenright,  0x3273, 
-+IBUS_KEY_parenleft, 0x1109, 0x1161, IBUS_KEY_parenright,  0x3274, 
-+IBUS_KEY_parenleft, 0x110B, 0x1161, IBUS_KEY_parenright,  0x3275, 
-+IBUS_KEY_parenleft, 0x110C, 0x1161, IBUS_KEY_parenright,  0x3276, 
-+IBUS_KEY_parenleft, 0x110E, 0x1161, IBUS_KEY_parenright,  0x3277, 
-+IBUS_KEY_parenleft, 0x110F, 0x1161, IBUS_KEY_parenright,  0x3278, 
-+IBUS_KEY_parenleft, 0x1110, 0x1161, IBUS_KEY_parenright,  0x3279, 
-+IBUS_KEY_parenleft, 0x1111, 0x1161, IBUS_KEY_parenright,  0x327A, 
-+IBUS_KEY_parenleft, 0x1112, 0x1161, IBUS_KEY_parenright,  0x327B, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_0, IBUS_KEY_parenright,  0x2473, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_1, IBUS_KEY_parenright,  0x3251, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_2, IBUS_KEY_parenright,  0x3252, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_3, IBUS_KEY_parenright,  0x3253, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_4, IBUS_KEY_parenright,  0x3254, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_5, IBUS_KEY_parenright,  0x3255, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_6, IBUS_KEY_parenright,  0x3256, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_7, IBUS_KEY_parenright,  0x3257, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_8, IBUS_KEY_parenright,  0x3258, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_9, IBUS_KEY_parenright,  0x3259, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_KP_Space, IBUS_KEY_parenright,  0x3252, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_KP_0, IBUS_KEY_parenright,  0x2473, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_KP_1, IBUS_KEY_parenright,  0x3251, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_KP_2, IBUS_KEY_parenright,  0x3252, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_KP_3, IBUS_KEY_parenright,  0x3253, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_KP_4, IBUS_KEY_parenright,  0x3254, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_KP_5, IBUS_KEY_parenright,  0x3255, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_KP_6, IBUS_KEY_parenright,  0x3256, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_KP_7, IBUS_KEY_parenright,  0x3257, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_KP_8, IBUS_KEY_parenright,  0x3258, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_Space, IBUS_KEY_KP_9, IBUS_KEY_parenright,  0x3259, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_0, IBUS_KEY_parenright,  0x2469, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_1, IBUS_KEY_parenright,  0x246A, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_2, IBUS_KEY_parenright,  0x246B, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_3, IBUS_KEY_parenright,  0x246C, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_4, IBUS_KEY_parenright,  0x246D, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_5, IBUS_KEY_parenright,  0x246E, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_6, IBUS_KEY_parenright,  0x246F, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_7, IBUS_KEY_parenright,  0x2470, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_8, IBUS_KEY_parenright,  0x2471, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_9, IBUS_KEY_parenright,  0x2472, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_KP_Space, IBUS_KEY_parenright,  0x246B, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_KP_0, IBUS_KEY_parenright,  0x2469, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_KP_1, IBUS_KEY_parenright,  0x246A, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_KP_2, IBUS_KEY_parenright,  0x246B, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_KP_3, IBUS_KEY_parenright,  0x246C, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_KP_4, IBUS_KEY_parenright,  0x246D, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_KP_5, IBUS_KEY_parenright,  0x246E, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_KP_6, IBUS_KEY_parenright,  0x246F, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_KP_7, IBUS_KEY_parenright,  0x2470, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_KP_8, IBUS_KEY_parenright,  0x2471, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_1, IBUS_KEY_KP_9, IBUS_KEY_parenright,  0x2472, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_0, IBUS_KEY_parenright,  0x2473, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_1, IBUS_KEY_parenright,  0x3251, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_2, IBUS_KEY_parenright,  0x3252, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_3, IBUS_KEY_parenright,  0x3253, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_4, IBUS_KEY_parenright,  0x3254, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_5, IBUS_KEY_parenright,  0x3255, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_6, IBUS_KEY_parenright,  0x3256, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_7, IBUS_KEY_parenright,  0x3257, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_8, IBUS_KEY_parenright,  0x3258, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_9, IBUS_KEY_parenright,  0x3259, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_KP_Space, IBUS_KEY_parenright,  0x3252, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_KP_0, IBUS_KEY_parenright,  0x2473, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_KP_1, IBUS_KEY_parenright,  0x3251, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_KP_2, IBUS_KEY_parenright,  0x3252, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_KP_3, IBUS_KEY_parenright,  0x3253, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_KP_4, IBUS_KEY_parenright,  0x3254, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_KP_5, IBUS_KEY_parenright,  0x3255, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_KP_6, IBUS_KEY_parenright,  0x3256, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_KP_7, IBUS_KEY_parenright,  0x3257, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_KP_8, IBUS_KEY_parenright,  0x3258, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_2, IBUS_KEY_KP_9, IBUS_KEY_parenright,  0x3259, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_0, IBUS_KEY_parenright,  0x325A, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_1, IBUS_KEY_parenright,  0x325B, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_2, IBUS_KEY_parenright,  0x325C, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_3, IBUS_KEY_parenright,  0x325D, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_4, IBUS_KEY_parenright,  0x325E, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_5, IBUS_KEY_parenright,  0x325F, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_6, IBUS_KEY_parenright,  0x32B1, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_7, IBUS_KEY_parenright,  0x32B2, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_8, IBUS_KEY_parenright,  0x32B3, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_9, IBUS_KEY_parenright,  0x32B4, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_KP_Space, IBUS_KEY_parenright,  0x325C, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_KP_0, IBUS_KEY_parenright,  0x325A, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_KP_1, IBUS_KEY_parenright,  0x325B, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_KP_2, IBUS_KEY_parenright,  0x325C, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_KP_3, IBUS_KEY_parenright,  0x325D, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_KP_4, IBUS_KEY_parenright,  0x325E, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_KP_5, IBUS_KEY_parenright,  0x325F, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_KP_6, IBUS_KEY_parenright,  0x32B1, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_KP_7, IBUS_KEY_parenright,  0x32B2, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_KP_8, IBUS_KEY_parenright,  0x32B3, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_3, IBUS_KEY_KP_9, IBUS_KEY_parenright,  0x32B4, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_0, IBUS_KEY_parenright,  0x32B5, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_1, IBUS_KEY_parenright,  0x32B6, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_2, IBUS_KEY_parenright,  0x32B7, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_3, IBUS_KEY_parenright,  0x32B8, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_4, IBUS_KEY_parenright,  0x32B9, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_5, IBUS_KEY_parenright,  0x32BA, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_6, IBUS_KEY_parenright,  0x32BB, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_7, IBUS_KEY_parenright,  0x32BC, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_8, IBUS_KEY_parenright,  0x32BD, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_9, IBUS_KEY_parenright,  0x32BE, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_KP_Space, IBUS_KEY_parenright,  0x32B7, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_KP_0, IBUS_KEY_parenright,  0x32B5, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_KP_1, IBUS_KEY_parenright,  0x32B6, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_KP_2, IBUS_KEY_parenright,  0x32B7, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_KP_3, IBUS_KEY_parenright,  0x32B8, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_KP_4, IBUS_KEY_parenright,  0x32B9, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_KP_5, IBUS_KEY_parenright,  0x32BA, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_KP_6, IBUS_KEY_parenright,  0x32BB, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_KP_7, IBUS_KEY_parenright,  0x32BC, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_KP_8, IBUS_KEY_parenright,  0x32BD, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_4, IBUS_KEY_KP_9, IBUS_KEY_parenright,  0x32BE, 
-+IBUS_KEY_parenleft, IBUS_KEY_KP_5, IBUS_KEY_0, IBUS_KEY_parenright,  0x32BF, 
-+IBUS_KEY_C, IBUS_KEY_C, IBUS_KEY_C, IBUS_KEY_P,  0x262D, 
-+IBUS_KEY_U, IBUS_KEY_space, IBUS_KEY_comma, IBUS_KEY_E,  0x1E1C, 
-+IBUS_KEY_U, IBUS_KEY_space, IBUS_KEY_comma, IBUS_KEY_e,  0x1E1D, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA,  0x1F8D, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA,  0x1F9D, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA,  0x1FAD, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha,  0x1F85, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta,  0x1F95, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega,  0x1FA5, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA,  0x1F8C, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA,  0x1F9C, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA,  0x1FAC, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha,  0x1F84, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_eta,  0x1F94, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_parenright, IBUS_KEY_Greek_omega,  0x1FA4, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA,  0x1F8C, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA,  0x1F9C, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA,  0x1FAC, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha,  0x1F84, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta,  0x1F94, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega,  0x1FA4, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA,  0x1F8D, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA,  0x1F9D, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA,  0x1FAD, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha,  0x1F85, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta,  0x1F95, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_apostrophe, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega,  0x1FA5, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA,  0x1F8B, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA,  0x1F9B, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA,  0x1FAB, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha,  0x1F83, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta,  0x1F93, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega,  0x1FA3, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA,  0x1F8A, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA,  0x1F9A, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA,  0x1FAA, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha,  0x1F82, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_eta,  0x1F92, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_omega,  0x1FA2, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA,  0x1F8A, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA,  0x1F9A, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA,  0x1FAA, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha,  0x1F82, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta,  0x1F92, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega,  0x1FA2, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA,  0x1F8B, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA,  0x1F9B, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA,  0x1FAB, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha,  0x1F83, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta,  0x1F93, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega,  0x1FA3, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA,  0x1F8F, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA,  0x1F9F, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA,  0x1FAF, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha,  0x1F87, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta,  0x1F97, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega,  0x1FA7, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA,  0x1F8E, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA,  0x1F9E, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA,  0x1FAE, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha,  0x1F86, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_eta,  0x1F96, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_parenright, IBUS_KEY_Greek_omega,  0x1FA6, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA,  0x1F8E, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA,  0x1F9E, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA,  0x1FAE, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha,  0x1F86, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta,  0x1F96, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega,  0x1FA6, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA,  0x1F8F, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA,  0x1F9F, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA,  0x1FAF, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha,  0x1F87, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta,  0x1F97, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_asciitilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega,  0x1FA7, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA,  0x1F8D, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA,  0x1F9D, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA,  0x1FAD, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha,  0x1F85, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta,  0x1F95, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega,  0x1FA5, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA,  0x1F8C, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA,  0x1F9C, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA,  0x1FAC, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha,  0x1F84, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_eta,  0x1F94, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_omega,  0x1FA4, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA,  0x1F8C, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA,  0x1F9C, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA,  0x1FAC, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha,  0x1F84, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta,  0x1F94, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega,  0x1FA4, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA,  0x1F8D, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA,  0x1F9D, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA,  0x1FAD, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha,  0x1F85, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta,  0x1F95, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega,  0x1FA5, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA,  0x1F8B, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA,  0x1F9B, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA,  0x1FAB, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha,  0x1F83, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta,  0x1F93, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega,  0x1FA3, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA,  0x1F8A, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA,  0x1F9A, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA,  0x1FAA, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha,  0x1F82, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_eta,  0x1F92, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_parenright, IBUS_KEY_Greek_omega,  0x1FA2, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA,  0x1F8A, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA,  0x1F9A, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA,  0x1FAA, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha,  0x1F82, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta,  0x1F92, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega,  0x1FA2, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA,  0x1F8B, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA,  0x1F9B, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA,  0x1FAB, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha,  0x1F83, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta,  0x1F93, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_grave, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega,  0x1FA3, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA,  0x1F8D, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA,  0x1F9D, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA,  0x1FAD, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha,  0x1F85, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta,  0x1F95, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega,  0x1FA5, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA,  0x1F8C, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA,  0x1F9C, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA,  0x1FAC, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha,  0x1F84, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_eta,  0x1F94, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_parenright, IBUS_KEY_Greek_omega,  0x1FA4, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA,  0x1F8C, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA,  0x1F9C, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA,  0x1FAC, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha,  0x1F84, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta,  0x1F94, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega,  0x1FA4, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA,  0x1F8D, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA,  0x1F9D, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA,  0x1FAD, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha,  0x1F85, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta,  0x1F95, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_acute, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega,  0x1FA5, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_ALPHA,  0x1F8F, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_ETA,  0x1F9F, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_OMEGA,  0x1FAF, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_alpha,  0x1F87, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_eta,  0x1F97, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_parenleft, IBUS_KEY_Greek_omega,  0x1FA7, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_parenright, IBUS_KEY_Greek_ALPHA,  0x1F8E, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_parenright, IBUS_KEY_Greek_ETA,  0x1F9E, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_parenright, IBUS_KEY_Greek_OMEGA,  0x1FAE, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_parenright, IBUS_KEY_Greek_alpha,  0x1F86, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_parenright, IBUS_KEY_Greek_eta,  0x1F96, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_parenright, IBUS_KEY_Greek_omega,  0x1FA6, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ALPHA,  0x1F8E, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_ETA,  0x1F9E, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_OMEGA,  0x1FAE, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_alpha,  0x1F86, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_eta,  0x1F96, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_dead_psili, IBUS_KEY_Greek_omega,  0x1FA6, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ALPHA,  0x1F8F, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_ETA,  0x1F9F, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_OMEGA,  0x1FAF, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_alpha,  0x1F87, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_eta,  0x1F97, 
-+IBUS_KEY_Greek_iota, IBUS_KEY_dead_tilde, IBUS_KEY_dead_dasia, IBUS_KEY_Greek_omega,  0x1FA7, 
-+};
-+
-+static const guint16 gtk_compose_seqs_compact_32bit_first[] = {
-+IBUS_KEY_dead_grave, 54, 123, 187, 187, 187, 
-+IBUS_KEY_dead_acute, 187, 268, 316, 316, 316, 
-+IBUS_KEY_dead_circumflex, 316, 388, 388, 388, 388, 
-+IBUS_KEY_dead_tilde, 388, 406, 406, 406, 406, 
-+IBUS_KEY_dead_macron, 406, 466, 466, 466, 466, 
-+IBUS_KEY_dead_caron, 466, 502, 502, 502, 502, 
-+IBUS_KEY_dead_doublegrave, 502, 538, 538, 538, 538, 
-+IBUS_KEY_dead_invertedbreve, 538, 574, 574, 574, 574, 
-+IBUS_KEY_Multi_key, 574, 574, 850, 920, 926, 
-+IBUS_KEY_M,  0, 2,
-+IBUS_KEY_m,  2, 2,
-+0x0186,  4, 2,
-+0x018E,  6, 2,
-+0x0190,  8, 2,
-+0x0196,  10, 2,
-+0x01B1,  12, 2,
-+0x01B2,  14, 2,
-+0x01DD,  16, 2,
-+0x0254,  18, 2,
-+0x025B,  20, 2,
-+0x0269,  22, 2,
-+0x028A,  24, 2,
-+0x028B,  26, 2,
-+IBUS_KEY_ENG,  28, 2,
-+IBUS_KEY_Cyrillic_a,  30, 2,
-+IBUS_KEY_Cyrillic_o,  32, 2,
-+IBUS_KEY_Cyrillic_er,  34, 2,
-+IBUS_KEY_Cyrillic_u,  36, 2,
-+IBUS_KEY_Cyrillic_A,  38, 2,
-+IBUS_KEY_Cyrillic_O,  40, 2,
-+IBUS_KEY_Cyrillic_ER,  42, 2,
-+IBUS_KEY_Cyrillic_U,  44, 2,
-+IBUS_KEY_dead_tilde, IBUS_KEY_A,  46, 3,
-+IBUS_KEY_dead_tilde, IBUS_KEY_E,  49, 3,
-+IBUS_KEY_dead_tilde, IBUS_KEY_I,  52, 3,
-+IBUS_KEY_dead_tilde, IBUS_KEY_O,  55, 3,
-+IBUS_KEY_dead_tilde, IBUS_KEY_U,  58, 3,
-+IBUS_KEY_dead_tilde, IBUS_KEY_a,  61, 3,
-+IBUS_KEY_dead_tilde, IBUS_KEY_e,  64, 3,
-+IBUS_KEY_dead_tilde, IBUS_KEY_i,  67, 3,
-+IBUS_KEY_dead_tilde, IBUS_KEY_o,  70, 3,
-+IBUS_KEY_dead_tilde, IBUS_KEY_u,  73, 3,
-+IBUS_KEY_dead_tilde, 0x0186,  76, 3,
-+IBUS_KEY_dead_tilde, 0x018E,  79, 3,
-+IBUS_KEY_dead_tilde, 0x0190,  82, 3,
-+IBUS_KEY_dead_tilde, 0x01DD,  85, 3,
-+IBUS_KEY_dead_tilde, 0x0254,  88, 3,
-+IBUS_KEY_dead_tilde, 0x025B,  91, 3,
-+IBUS_KEY_J,  94, 2,
-+IBUS_KEY_j,  96, 2,
-+0x0186,  98, 2,
-+0x018E,  100, 2,
-+0x0190,  102, 2,
-+0x0196,  104, 2,
-+0x01B1,  106, 2,
-+0x01B2,  108, 2,
-+0x01DD,  110, 2,
-+0x0254,  112, 2,
-+0x025B,  114, 2,
-+0x0269,  116, 2,
-+0x028A,  118, 2,
-+0x028B,  120, 2,
-+IBUS_KEY_ENG,  122, 2,
-+IBUS_KEY_Cyrillic_a,  124, 2,
-+IBUS_KEY_Cyrillic_ie,  126, 2,
-+IBUS_KEY_Cyrillic_i,  128, 2,
-+IBUS_KEY_Cyrillic_o,  130, 2,
-+IBUS_KEY_Cyrillic_er,  132, 2,
-+IBUS_KEY_Cyrillic_u,  134, 2,
-+IBUS_KEY_Cyrillic_A,  136, 2,
-+IBUS_KEY_Cyrillic_IE,  138, 2,
-+IBUS_KEY_Cyrillic_I,  140, 2,
-+IBUS_KEY_Cyrillic_O,  142, 2,
-+IBUS_KEY_Cyrillic_ER,  144, 2,
-+IBUS_KEY_Cyrillic_U,  146, 2,
-+IBUS_KEY_dead_tilde, IBUS_KEY_A,  148, 3,
-+IBUS_KEY_dead_tilde, IBUS_KEY_E,  151, 3,
-+IBUS_KEY_dead_tilde, IBUS_KEY_I,  154, 3,
-+IBUS_KEY_dead_tilde, IBUS_KEY_a,  157, 3,
-+IBUS_KEY_dead_tilde, IBUS_KEY_e,  160, 3,
-+IBUS_KEY_dead_tilde, IBUS_KEY_i,  163, 3,
-+IBUS_KEY_dead_tilde, 0x0186,  166, 3,
-+IBUS_KEY_dead_tilde, 0x018E,  169, 3,
-+IBUS_KEY_dead_tilde, 0x0190,  172, 3,
-+IBUS_KEY_dead_tilde, 0x01DD,  175, 3,
-+IBUS_KEY_dead_tilde, 0x0254,  178, 3,
-+IBUS_KEY_dead_tilde, 0x025B,  181, 3,
-+0x0186,  184, 2,
-+0x018E,  186, 2,
-+0x0190,  188, 2,
-+0x0196,  190, 2,
-+0x01B1,  192, 2,
-+0x01B2,  194, 2,
-+0x01DD,  196, 2,
-+0x0254,  198, 2,
-+0x025B,  200, 2,
-+0x0269,  202, 2,
-+0x028A,  204, 2,
-+0x028B,  206, 2,
-+IBUS_KEY_Cyrillic_a,  208, 2,
-+IBUS_KEY_Cyrillic_ie,  210, 2,
-+IBUS_KEY_Cyrillic_i,  212, 2,
-+IBUS_KEY_Cyrillic_o,  214, 2,
-+IBUS_KEY_Cyrillic_er,  216, 2,
-+IBUS_KEY_Cyrillic_u,  218, 2,
-+IBUS_KEY_Cyrillic_A,  220, 2,
-+IBUS_KEY_Cyrillic_IE,  222, 2,
-+IBUS_KEY_Cyrillic_I,  224, 2,
-+IBUS_KEY_Cyrillic_O,  226, 2,
-+IBUS_KEY_Cyrillic_ER,  228, 2,
-+IBUS_KEY_Cyrillic_U,  230, 2,
-+0x0186,  232, 2,
-+0x018E,  234, 2,
-+0x0190,  236, 2,
-+0x01DD,  238, 2,
-+0x0254,  240, 2,
-+0x025B,  242, 2,
-+0x0186,  244, 2,
-+0x018E,  246, 2,
-+0x0190,  248, 2,
-+0x0196,  250, 2,
-+0x01B1,  252, 2,
-+0x01B2,  254, 2,
-+0x01DD,  256, 2,
-+0x0254,  258, 2,
-+0x025B,  260, 2,
-+0x0269,  262, 2,
-+0x028A,  264, 2,
-+0x028B,  266, 2,
-+IBUS_KEY_Cyrillic_a,  268, 2,
-+IBUS_KEY_Cyrillic_ie,  270, 2,
-+IBUS_KEY_Cyrillic_o,  272, 2,
-+IBUS_KEY_Cyrillic_er,  274, 2,
-+IBUS_KEY_Cyrillic_A,  276, 2,
-+IBUS_KEY_Cyrillic_IE,  278, 2,
-+IBUS_KEY_Cyrillic_O,  280, 2,
-+IBUS_KEY_Cyrillic_ER,  282, 2,
-+0x0186,  284, 2,
-+0x018E,  286, 2,
-+0x0190,  288, 2,
-+0x0196,  290, 2,
-+0x01B1,  292, 2,
-+0x01B2,  294, 2,
-+0x01DD,  296, 2,
-+0x0254,  298, 2,
-+0x025B,  300, 2,
-+0x0269,  302, 2,
-+0x028A,  304, 2,
-+0x028B,  306, 2,
-+IBUS_KEY_Cyrillic_a,  308, 2,
-+IBUS_KEY_Cyrillic_ie,  310, 2,
-+IBUS_KEY_Cyrillic_i,  312, 2,
-+IBUS_KEY_Cyrillic_o,  314, 2,
-+IBUS_KEY_Cyrillic_er,  316, 2,
-+IBUS_KEY_Cyrillic_u,  318, 2,
-+IBUS_KEY_Cyrillic_A,  320, 2,
-+IBUS_KEY_Cyrillic_IE,  322, 2,
-+IBUS_KEY_Cyrillic_I,  324, 2,
-+IBUS_KEY_Cyrillic_O,  326, 2,
-+IBUS_KEY_Cyrillic_ER,  328, 2,
-+IBUS_KEY_Cyrillic_U,  330, 2,
-+IBUS_KEY_Cyrillic_a,  332, 2,
-+IBUS_KEY_Cyrillic_ie,  334, 2,
-+IBUS_KEY_Cyrillic_i,  336, 2,
-+IBUS_KEY_Cyrillic_o,  338, 2,
-+IBUS_KEY_Cyrillic_er,  340, 2,
-+IBUS_KEY_Cyrillic_u,  342, 2,
-+IBUS_KEY_Cyrillic_A,  344, 2,
-+IBUS_KEY_Cyrillic_IE,  346, 2,
-+IBUS_KEY_Cyrillic_I,  348, 2,
-+IBUS_KEY_Cyrillic_O,  350, 2,
-+IBUS_KEY_Cyrillic_ER,  352, 2,
-+IBUS_KEY_Cyrillic_U,  354, 2,
-+IBUS_KEY_apostrophe, IBUS_KEY_J,  356, 2,
-+IBUS_KEY_apostrophe, IBUS_KEY_j,  358, 2,
-+IBUS_KEY_apostrophe, IBUS_KEY_Cyrillic_a,  360, 2,
-+IBUS_KEY_apostrophe, IBUS_KEY_Cyrillic_ie,  362, 2,
-+IBUS_KEY_apostrophe, IBUS_KEY_Cyrillic_i,  364, 2,
-+IBUS_KEY_apostrophe, IBUS_KEY_Cyrillic_o,  366, 2,
-+IBUS_KEY_apostrophe, IBUS_KEY_Cyrillic_er,  368, 2,
-+IBUS_KEY_apostrophe, IBUS_KEY_Cyrillic_u,  370, 2,
-+IBUS_KEY_apostrophe, IBUS_KEY_Cyrillic_A,  372, 2,
-+IBUS_KEY_apostrophe, IBUS_KEY_Cyrillic_IE,  374, 2,
-+IBUS_KEY_apostrophe, IBUS_KEY_Cyrillic_I,  376, 2,
-+IBUS_KEY_apostrophe, IBUS_KEY_Cyrillic_O,  378, 2,
-+IBUS_KEY_apostrophe, IBUS_KEY_Cyrillic_ER,  380, 2,
-+IBUS_KEY_apostrophe, IBUS_KEY_Cyrillic_U,  382, 2,
-+IBUS_KEY_F, IBUS_KEY_U,  384, 1,
-+IBUS_KEY_J, IBUS_KEY_apostrophe,  385, 2,
-+IBUS_KEY_J, IBUS_KEY_acute,  387, 2,
-+IBUS_KEY_asciicircum, IBUS_KEY_Cyrillic_a,  389, 2,
-+IBUS_KEY_asciicircum, IBUS_KEY_Cyrillic_ie,  391, 2,
-+IBUS_KEY_asciicircum, IBUS_KEY_Cyrillic_i,  393, 2,
-+IBUS_KEY_asciicircum, IBUS_KEY_Cyrillic_o,  395, 2,
-+IBUS_KEY_asciicircum, IBUS_KEY_Cyrillic_er,  397, 2,
-+IBUS_KEY_asciicircum, IBUS_KEY_Cyrillic_u,  399, 2,
-+IBUS_KEY_asciicircum, IBUS_KEY_Cyrillic_A,  401, 2,
-+IBUS_KEY_asciicircum, IBUS_KEY_Cyrillic_IE,  403, 2,
-+IBUS_KEY_asciicircum, IBUS_KEY_Cyrillic_I,  405, 2,
-+IBUS_KEY_asciicircum, IBUS_KEY_Cyrillic_O,  407, 2,
-+IBUS_KEY_asciicircum, IBUS_KEY_Cyrillic_ER,  409, 2,
-+IBUS_KEY_asciicircum, IBUS_KEY_Cyrillic_U,  411, 2,
-+IBUS_KEY_underscore, IBUS_KEY_Cyrillic_a,  413, 2,
-+IBUS_KEY_underscore, IBUS_KEY_Cyrillic_ie,  415, 2,
-+IBUS_KEY_underscore, IBUS_KEY_Cyrillic_o,  417, 2,
-+IBUS_KEY_underscore, IBUS_KEY_Cyrillic_er,  419, 2,
-+IBUS_KEY_underscore, IBUS_KEY_Cyrillic_A,  421, 2,
-+IBUS_KEY_underscore, IBUS_KEY_Cyrillic_IE,  423, 2,
-+IBUS_KEY_underscore, IBUS_KEY_Cyrillic_O,  425, 2,
-+IBUS_KEY_underscore, IBUS_KEY_Cyrillic_ER,  427, 2,
-+IBUS_KEY_grave, IBUS_KEY_Cyrillic_a,  429, 2,
-+IBUS_KEY_grave, IBUS_KEY_Cyrillic_o,  431, 2,
-+IBUS_KEY_grave, IBUS_KEY_Cyrillic_er,  433, 2,
-+IBUS_KEY_grave, IBUS_KEY_Cyrillic_u,  435, 2,
-+IBUS_KEY_grave, IBUS_KEY_Cyrillic_A,  437, 2,
-+IBUS_KEY_grave, IBUS_KEY_Cyrillic_O,  439, 2,
-+IBUS_KEY_grave, IBUS_KEY_Cyrillic_ER,  441, 2,
-+IBUS_KEY_grave, IBUS_KEY_Cyrillic_U,  443, 2,
-+IBUS_KEY_j, IBUS_KEY_apostrophe,  445, 2,
-+IBUS_KEY_j, IBUS_KEY_acute,  447, 2,
-+IBUS_KEY_macron, IBUS_KEY_Cyrillic_a,  449, 2,
-+IBUS_KEY_macron, IBUS_KEY_Cyrillic_ie,  451, 2,
-+IBUS_KEY_macron, IBUS_KEY_Cyrillic_o,  453, 2,
-+IBUS_KEY_macron, IBUS_KEY_Cyrillic_er,  455, 2,
-+IBUS_KEY_macron, IBUS_KEY_Cyrillic_A,  457, 2,
-+IBUS_KEY_macron, IBUS_KEY_Cyrillic_IE,  459, 2,
-+IBUS_KEY_macron, IBUS_KEY_Cyrillic_O,  461, 2,
-+IBUS_KEY_macron, IBUS_KEY_Cyrillic_ER,  463, 2,
-+IBUS_KEY_acute, IBUS_KEY_J,  465, 2,
-+IBUS_KEY_acute, IBUS_KEY_j,  467, 2,
-+IBUS_KEY_acute, IBUS_KEY_Cyrillic_a,  469, 2,
-+IBUS_KEY_acute, IBUS_KEY_Cyrillic_ie,  471, 2,
-+IBUS_KEY_acute, IBUS_KEY_Cyrillic_i,  473, 2,
-+IBUS_KEY_acute, IBUS_KEY_Cyrillic_o,  475, 2,
-+IBUS_KEY_acute, IBUS_KEY_Cyrillic_er,  477, 2,
-+IBUS_KEY_acute, IBUS_KEY_Cyrillic_u,  479, 2,
-+IBUS_KEY_acute, IBUS_KEY_Cyrillic_A,  481, 2,
-+IBUS_KEY_acute, IBUS_KEY_Cyrillic_IE,  483, 2,
-+IBUS_KEY_acute, IBUS_KEY_Cyrillic_I,  485, 2,
-+IBUS_KEY_acute, IBUS_KEY_Cyrillic_O,  487, 2,
-+IBUS_KEY_acute, IBUS_KEY_Cyrillic_ER,  489, 2,
-+IBUS_KEY_acute, IBUS_KEY_Cyrillic_U,  491, 2,
-+IBUS_KEY_backslash, IBUS_KEY_o, IBUS_KEY_slash,  493, 1,
-+IBUS_KEY_grave, IBUS_KEY_grave, IBUS_KEY_Cyrillic_a,  494, 2,
-+IBUS_KEY_grave, IBUS_KEY_grave, IBUS_KEY_Cyrillic_ie,  496, 2,
-+IBUS_KEY_grave, IBUS_KEY_grave, IBUS_KEY_Cyrillic_i,  498, 2,
-+IBUS_KEY_grave, IBUS_KEY_grave, IBUS_KEY_Cyrillic_o,  500, 2,
-+IBUS_KEY_grave, IBUS_KEY_grave, IBUS_KEY_Cyrillic_er,  502, 2,
-+IBUS_KEY_grave, IBUS_KEY_grave, IBUS_KEY_Cyrillic_u,  504, 2,
-+IBUS_KEY_grave, IBUS_KEY_grave, IBUS_KEY_Cyrillic_A,  506, 2,
-+IBUS_KEY_grave, IBUS_KEY_grave, IBUS_KEY_Cyrillic_IE,  508, 2,
-+IBUS_KEY_grave, IBUS_KEY_grave, IBUS_KEY_Cyrillic_I,  510, 2,
-+IBUS_KEY_grave, IBUS_KEY_grave, IBUS_KEY_Cyrillic_O,  512, 2,
-+IBUS_KEY_grave, IBUS_KEY_grave, IBUS_KEY_Cyrillic_ER,  514, 2,
-+IBUS_KEY_grave, IBUS_KEY_grave, IBUS_KEY_Cyrillic_U,  516, 2,
-+IBUS_KEY_p, IBUS_KEY_o, IBUS_KEY_o,  518, 1,
-+IBUS_KEY_L, IBUS_KEY_L, IBUS_KEY_A, IBUS_KEY_P,  519, 1,
-+};
-+
-+static const guint32 gtk_compose_seqs_compact_32bit_second[] = {
-+0x004D, 0x0300, 
-+0x006D, 0x0300, 
-+0x0186, 0x0300, 
-+0x018E, 0x0300, 
-+0x0190, 0x0300, 
-+0x0196, 0x0300, 
-+0x01B1, 0x0300, 
-+0x01B2, 0x0300, 
-+0x01DD, 0x0300, 
-+0x0254, 0x0300, 
-+0x025B, 0x0300, 
-+0x0269, 0x0300, 
-+0x028A, 0x0300, 
-+0x028B, 0x0300, 
-+0x014A, 0x0300, 
-+0x0430, 0x0300, 
-+0x043E, 0x0300, 
-+0x0440, 0x0300, 
-+0x0443, 0x0300, 
-+0x0410, 0x0300, 
-+0x041E, 0x0300, 
-+0x0420, 0x0300, 
-+0x0423, 0x0300, 
-+0x0041, 0x0303, 0x0300, 
-+0x0045, 0x0303, 0x0300, 
-+0x0049, 0x0303, 0x0300, 
-+0x004F, 0x0303, 0x0300, 
-+0x0055, 0x0303, 0x0300, 
-+0x0061, 0x0303, 0x0300, 
-+0x0065, 0x0303, 0x0300, 
-+0x0069, 0x0303, 0x0300, 
-+0x006F, 0x0303, 0x0300, 
-+0x0075, 0x0303, 0x0300, 
-+0x0186, 0x0303, 0x0300, 
-+0x018E, 0x0303, 0x0300, 
-+0x0190, 0x0303, 0x0300, 
-+0x01DD, 0x0303, 0x0300, 
-+0x0254, 0x0303, 0x0300, 
-+0x025B, 0x0303, 0x0300, 
-+0x004A, 0x0301, 
-+0x006A, 0x0301, 
-+0x0186, 0x0301, 
-+0x018E, 0x0301, 
-+0x0190, 0x0301, 
-+0x0196, 0x0301, 
-+0x01B1, 0x0301, 
-+0x01B2, 0x0301, 
-+0x01DD, 0x0301, 
-+0x0254, 0x0301, 
-+0x025B, 0x0301, 
-+0x0269, 0x0301, 
-+0x028A, 0x0301, 
-+0x028B, 0x0301, 
-+0x014A, 0x0301, 
-+0x0430, 0x0301, 
-+0x0435, 0x0301, 
-+0x0438, 0x0301, 
-+0x043E, 0x0301, 
-+0x0440, 0x0301, 
-+0x0443, 0x0301, 
-+0x0410, 0x0301, 
-+0x0415, 0x0301, 
-+0x0418, 0x0301, 
-+0x041E, 0x0301, 
-+0x0420, 0x0301, 
-+0x0423, 0x0301, 
-+0x0041, 0x0303, 0x0301, 
-+0x0045, 0x0303, 0x0301, 
-+0x0049, 0x0303, 0x0301, 
-+0x0061, 0x0303, 0x0301, 
-+0x0065, 0x0303, 0x0301, 
-+0x0069, 0x0303, 0x0301, 
-+0x0186, 0x0303, 0x0301, 
-+0x018E, 0x0303, 0x0301, 
-+0x0190, 0x0303, 0x0301, 
-+0x01DD, 0x0303, 0x0301, 
-+0x0254, 0x0303, 0x0301, 
-+0x025B, 0x0303, 0x0301, 
-+0x0186, 0x0302, 
-+0x018E, 0x0302, 
-+0x0190, 0x0302, 
-+0x0196, 0x0302, 
-+0x01B1, 0x0302, 
-+0x01B2, 0x0302, 
-+0x01DD, 0x0302, 
-+0x0254, 0x0302, 
-+0x025B, 0x0302, 
-+0x0269, 0x0302, 
-+0x028A, 0x0302, 
-+0x028B, 0x0302, 
-+0x0430, 0x0302, 
-+0x0435, 0x0302, 
-+0x0438, 0x0302, 
-+0x043E, 0x0302, 
-+0x0440, 0x0302, 
-+0x0443, 0x0302, 
-+0x0410, 0x0302, 
-+0x0415, 0x0302, 
-+0x0418, 0x0302, 
-+0x041E, 0x0302, 
-+0x0420, 0x0302, 
-+0x0423, 0x0302, 
-+0x0186, 0x0303, 
-+0x018E, 0x0303, 
-+0x0190, 0x0303, 
-+0x01DD, 0x0303, 
-+0x0254, 0x0303, 
-+0x025B, 0x0303, 
-+0x0186, 0x0304, 
-+0x018E, 0x0304, 
-+0x0190, 0x0304, 
-+0x0196, 0x0304, 
-+0x01B1, 0x0304, 
-+0x01B2, 0x0304, 
-+0x01DD, 0x0304, 
-+0x0254, 0x0304, 
-+0x025B, 0x0304, 
-+0x0269, 0x0304, 
-+0x028A, 0x0304, 
-+0x028B, 0x0304, 
-+0x0430, 0x0304, 
-+0x0435, 0x0304, 
-+0x043E, 0x0304, 
-+0x0440, 0x0304, 
-+0x0410, 0x0304, 
-+0x0415, 0x0304, 
-+0x041E, 0x0304, 
-+0x0420, 0x0304, 
-+0x0186, 0x030C, 
-+0x018E, 0x030C, 
-+0x0190, 0x030C, 
-+0x0196, 0x030C, 
-+0x01B1, 0x030C, 
-+0x01B2, 0x030C, 
-+0x01DD, 0x030C, 
-+0x0254, 0x030C, 
-+0x025B, 0x030C, 
-+0x0269, 0x030C, 
-+0x028A, 0x030C, 
-+0x028B, 0x030C, 
-+0x0430, 0x030F, 
-+0x0435, 0x030F, 
-+0x0438, 0x030F, 
-+0x043E, 0x030F, 
-+0x0440, 0x030F, 
-+0x0443, 0x030F, 
-+0x0410, 0x030F, 
-+0x0415, 0x030F, 
-+0x0418, 0x030F, 
-+0x041E, 0x030F, 
-+0x0420, 0x030F, 
-+0x0423, 0x030F, 
-+0x0430, 0x0311, 
-+0x0435, 0x0311, 
-+0x0438, 0x0311, 
-+0x043E, 0x0311, 
-+0x0440, 0x0311, 
-+0x0443, 0x0311, 
-+0x0410, 0x0311, 
-+0x0415, 0x0311, 
-+0x0418, 0x0311, 
-+0x041E, 0x0311, 
-+0x0420, 0x0311, 
-+0x0423, 0x0311, 
-+0x004A, 0x0301, 
-+0x006A, 0x0301, 
-+0x0430, 0x0301, 
-+0x0435, 0x0301, 
-+0x0438, 0x0301, 
-+0x043E, 0x0301, 
-+0x0440, 0x0301, 
-+0x0443, 0x0301, 
-+0x0410, 0x0301, 
-+0x0415, 0x0301, 
-+0x0418, 0x0301, 
-+0x041E, 0x0301, 
-+0x0420, 0x0301, 
-+0x0423, 0x0301, 
-+0x1F595, 
-+0x004A, 0x0301, 
-+0x004A, 0x0301, 
-+0x0430, 0x0302, 
-+0x0435, 0x0302, 
-+0x0438, 0x0302, 
-+0x043E, 0x0302, 
-+0x0440, 0x0302, 
-+0x0443, 0x0302, 
-+0x0410, 0x0302, 
-+0x0415, 0x0302, 
-+0x0418, 0x0302, 
-+0x041E, 0x0302, 
-+0x0420, 0x0302, 
-+0x0423, 0x0302, 
-+0x0430, 0x0304, 
-+0x0435, 0x0304, 
-+0x043E, 0x0304, 
-+0x0440, 0x0304, 
-+0x0410, 0x0304, 
-+0x0415, 0x0304, 
-+0x041E, 0x0304, 
-+0x0420, 0x0304, 
-+0x0430, 0x0300, 
-+0x043E, 0x0300, 
-+0x0440, 0x0300, 
-+0x0443, 0x0300, 
-+0x0410, 0x0300, 
-+0x041E, 0x0300, 
-+0x0420, 0x0300, 
-+0x0423, 0x0300, 
-+0x006A, 0x0301, 
-+0x006A, 0x0301, 
-+0x0430, 0x0304, 
-+0x0435, 0x0304, 
-+0x043E, 0x0304, 
-+0x0440, 0x0304, 
-+0x0410, 0x0304, 
-+0x0415, 0x0304, 
-+0x041E, 0x0304, 
-+0x0420, 0x0304, 
-+0x004A, 0x0301, 
-+0x006A, 0x0301, 
-+0x0430, 0x0301, 
-+0x0435, 0x0301, 
-+0x0438, 0x0301, 
-+0x043E, 0x0301, 
-+0x0440, 0x0301, 
-+0x0443, 0x0301, 
-+0x0410, 0x0301, 
-+0x0415, 0x0301, 
-+0x0418, 0x0301, 
-+0x041E, 0x0301, 
-+0x0420, 0x0301, 
-+0x0423, 0x0301, 
-+0x1F64C, 
-+0x0430, 0x030F, 
-+0x0435, 0x030F, 
-+0x0438, 0x030F, 
-+0x043E, 0x030F, 
-+0x0440, 0x030F, 
-+0x0443, 0x030F, 
-+0x0410, 0x030F, 
-+0x0415, 0x030F, 
-+0x0418, 0x030F, 
-+0x041E, 0x030F, 
-+0x0420, 0x030F, 
-+0x0423, 0x030F, 
-+0x1F4A9, 
-+0x1F596, 
- };
- 
- #endif /* __GTK_IM_CONTEXT_SIMPLE_SEQS_H__ */
-diff --git a/src/ibuscomposetable.h b/src/ibuscomposetable.h
-index 8346df6d..4bf89211 100644
---- a/src/ibuscomposetable.h
-+++ b/src/ibuscomposetable.h
-@@ -2,7 +2,7 @@
- /* vim:set et sts=4: */
- /* ibus - The Input Bus
-  * Copyright (C) 2013-2014 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright (C) 2013-2016 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2013-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
-  *
-  * This library is free software; you can redistribute it and/or
-  * modify it under the terms of the GNU Lesser General Public
-@@ -30,6 +30,8 @@ G_BEGIN_DECLS
- 
- typedef struct _IBusComposeTable IBusComposeTable;
- typedef struct _IBusComposeTableCompact IBusComposeTableCompact;
-+typedef struct _IBusComposeTableCompactEx IBusComposeTableCompactEx;
-+typedef struct _IBusComposeTableCompactPrivate IBusComposeTableCompactPrivate;
- 
- struct _IBusComposeTable
- {
-@@ -47,6 +49,15 @@ struct _IBusComposeTableCompact
-     gint n_index_stride;
- };
- 
-+struct _IBusComposeTableCompactEx
-+{
-+    const guint16 *data;
-+    gint max_seq_len;
-+    gint n_index_size;
-+    gint n_index_stride;
-+    IBusComposeTableCompactPrivate *priv;
-+};
-+
- IBusComposeTable *ibus_compose_table_new_with_file (const gchar *compose_file);
- GSList           *ibus_compose_table_list_add_array
-                                                    (GSList
-diff --git a/src/ibusenginesimple.c b/src/ibusenginesimple.c
-index 7615f121..fa4ddf5f 100644
---- a/src/ibusenginesimple.c
-+++ b/src/ibusenginesimple.c
-@@ -2,7 +2,7 @@
- /* vim:set et sts=4: */
- /* ibus - The Input Bus
-  * Copyright (C) 2014 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright (C) 2015-2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2015-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
-  * Copyright (C) 2014-2017 Red Hat, Inc.
-  *
-  * This library is free software; you can redistribute it and/or
-@@ -89,16 +89,36 @@ struct _IBusEngineSimplePrivate {
-     gboolean            lookup_table_visible;
- };
- 
-+struct _IBusComposeTableCompactPrivate
-+{
-+    const guint32 *data2;
-+};
-+
- /* From the values below, the value 30 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).
-+ * Assign the value of "Number of different first items" of compose-parse.py
-+ * to n_seqs in IBusComposeTableCompact
-  */
--const IBusComposeTableCompact ibus_compose_table_compact = {
-+const IBusComposeTableCompactPrivate ibus_compose_table_compact_32bit_priv = {
-+    gtk_compose_seqs_compact_32bit_second
-+};
-+
-+const IBusComposeTableCompactEx ibus_compose_table_compact = {
-     gtk_compose_seqs_compact,
-     5,
-     30,
--    6
-+    6,
-+    NULL
-+};
-+
-+const IBusComposeTableCompactEx ibus_compose_table_compact_32bit = {
-+    gtk_compose_seqs_compact_32bit_first,
-+    5,
-+    9,
-+    6,
-+    &ibus_compose_table_compact_32bit_priv 
- };
- 
- static GSList *global_tables;
-@@ -320,12 +340,10 @@ ibus_engine_simple_commit_str (IBusEngineSimple *simple,
-         priv->in_hex_sequence = FALSE;
-         priv->tentative_match = 0;
-         priv->tentative_match_len = 0;
--        ibus_engine_simple_update_preedit_text (simple);
-     }
-     if (priv->tentative_emoji || priv->in_emoji_sequence) {
-         priv->in_emoji_sequence = FALSE;
-         g_clear_pointer (&priv->tentative_emoji, g_free);
--        ibus_engine_simple_update_preedit_text (simple);
-     }
- 
-     ibus_engine_commit_text ((IBusEngine *)simple,
-@@ -680,11 +698,11 @@ check_table (IBusEngineSimple       *simple,
- }
- 
- gboolean
--ibus_check_compact_table (const IBusComposeTableCompact *table,
--                          guint16                       *compose_buffer,
--                          gint                           n_compose,
--                          gboolean                      *compose_finish,
--                          gunichar                      *output_char)
-+ibus_check_compact_table (const IBusComposeTableCompactEx *table,
-+                          guint16                         *compose_buffer,
-+                          gint                             n_compose,
-+                          gboolean                        *compose_finish,
-+                          gunichar                       **output_chars)
- {
-     gint row_stride;
-     guint16 *seq_index;
-@@ -693,8 +711,8 @@ ibus_check_compact_table (const IBusComposeTableCompact *table,
- 
-     if (compose_finish)
-         *compose_finish = FALSE;
--    if (output_char)
--        *output_char = 0;
-+    if (output_chars)
-+        *output_chars = NULL;
- 
-     CHECK_COMPOSE_BUFFER_LENGTH (n_compose);
- 
-@@ -730,41 +748,81 @@ ibus_check_compact_table (const IBusComposeTableCompact *table,
-     // g_debug ("compact: %04x ", *seq_index);
-     seq = NULL;
- 
--    for (i = n_compose - 1; i < table->max_seq_len; i++) {
--        row_stride = i + 1;
-+    if (table->priv) {
-+        for (i = n_compose - 1; i < table->max_seq_len; i++) {
-+            row_stride = i + 2;
- 
--        if (seq_index[i + 1] - seq_index[i] > 0) {
--            seq = bsearch (compose_buffer + 1,
-+            if (seq_index[i + 1] - seq_index[i] > 0) {
-+                seq = bsearch (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
-+                        return TRUE;
-+                }
-+            }
-+        }
-+        if (!seq) {
-+            return FALSE;
-+        } else {
-+            int index = seq[row_stride - 2];
-+            int length = seq[row_stride - 1];
-+            int j;
-+            if (compose_finish)
-+                *compose_finish = TRUE;
-+            if (output_chars) {
-+                *output_chars = g_new (gunichar, length + 1);
-+                for (j = 0; j < length; j++)
-+                    (*output_chars)[j] = table->priv->data2[index + j];
-+                (*output_chars)[length] = 0;
-+            }
- 
--            if (seq) {
--                if (i == n_compose - 1)
--                    break;
--                else
--                    return TRUE;
-+            // g_debug ("U+%04X\n", value);
-+            return TRUE;
-+        }
-+    } else {
-+        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 (compose_buffer + 1,
-+                               table->data + seq_index[i],
-+                               (seq_index[i + 1] - seq_index[i]) / row_stride,
-+                               sizeof (guint16) * row_stride,
-+                               compare_seq);
-+
-+                if (seq) {
-+                    if (i == n_compose - 1)
-+                        break;
-+                    else
-+                        return TRUE;
-+                }
-             }
-         }
--    }
-+        if (!seq) {
-+            return FALSE;
-+        } else {
-+            if (compose_finish)
-+                *compose_finish = TRUE;
-+            if (output_chars) {
-+                *output_chars = g_new (gunichar, 2);
-+                (*output_chars)[0] = seq[row_stride - 1];
-+                (*output_chars)[1] = 0;
-+            }
- 
--    if (!seq) {
--        // g_debug ("no\n");
--        return FALSE;
-+            // g_debug ("U+%04X\n", value);
-+            return TRUE;
-+        }
-     }
--    else {
--        if (compose_finish)
--            *compose_finish = TRUE;
--        if (output_char)
--            *output_char = seq[row_stride - 1];
- 
--        // g_debug ("U+%04X\n", value);
--        return TRUE;
--    }
-+    g_assert_not_reached ();
- }
- 
-+
- /* 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.
-@@ -949,8 +1007,8 @@ no_sequence_matches (IBusEngineSimple *simple,
-                 (IBusEngine *)simple, keyval, keycode, modifiers);
-     } else if (priv->tentative_emoji && *priv->tentative_emoji) {
-         ibus_engine_simple_commit_str (simple, priv->tentative_emoji);
--        g_clear_pointer (&priv->tentative_emoji, g_free);
-         priv->compose_buffer[0] = 0;
-+        ibus_engine_simple_update_preedit_text (simple);
-     } else {
-         priv->compose_buffer[0] = 0;
-         if (n_compose > 1) {
-@@ -1083,6 +1141,9 @@ ibus_engine_simple_check_all_compose_table (IBusEngineSimple *simple,
-     IBusEngineSimplePrivate *priv = simple->priv;
-     gboolean compose_finish;
-     gunichar output_char;
-+    gunichar *output_chars = NULL;
-+    gchar *output_str = NULL;
-+    GError *error = NULL;
-     GSList *list = global_tables;
- 
-     while (list) {
-@@ -1098,15 +1159,37 @@ ibus_engine_simple_check_all_compose_table (IBusEngineSimple *simple,
-                                   priv->compose_buffer,
-                                   n_compose,
-                                   &compose_finish,
--                                  &output_char)) {
-+                                  &output_chars)) {
-         if (compose_finish) {
--            ibus_engine_simple_commit_char (simple, output_char);
-+            ibus_engine_simple_commit_char (simple, *output_chars);
-+            g_free (output_chars);
-             priv->compose_buffer[0] = 0;
-         }
-         ibus_engine_simple_update_preedit_text (simple);
-         return TRUE;
-     }
--
-+    if (ibus_check_compact_table (&ibus_compose_table_compact_32bit,
-+                                  priv->compose_buffer,
-+                                  n_compose,
-+                                  &compose_finish,
-+                                  &output_chars)) {
-+        if (compose_finish) {
-+            output_str = g_ucs4_to_utf8 (output_chars, -1, NULL, NULL, &error);
-+            if (output_str) {
-+                ibus_engine_simple_commit_str (simple, output_str);
-+                g_free (output_str);
-+                g_free (output_chars);
-+            } else {
-+                g_warning ("Failed to output multiple characters: %s",
-+                           error->message);
-+                g_error_free (error);
-+            }
-+            priv->compose_buffer[0] = 0;
-+        }
-+        
-+        ibus_engine_simple_update_preedit_text (simple);
-+        return TRUE;
-+    }
-     if (ibus_check_algorithmically (priv->compose_buffer,
-                                     n_compose,
-                                     &output_char)) {
-@@ -1177,7 +1260,8 @@ ibus_engine_simple_process_key_event (IBusEngine *engine,
-             (keyval == IBUS_KEY_Control_L || keyval == IBUS_KEY_Control_R)) {
-             if (priv->tentative_emoji && *priv->tentative_emoji) {
-                 ibus_engine_simple_commit_str (simple, priv->tentative_emoji);
--                g_clear_pointer (&priv->tentative_emoji, g_free);
-+                priv->compose_buffer[0] = 0;
-+                ibus_engine_simple_update_preedit_text (simple);
-             } else if (n_compose == 0) {
-                 priv->modifiers_dropped = TRUE;
-             } else {
-@@ -1335,7 +1419,8 @@ ibus_engine_simple_process_key_event (IBusEngine *engine,
-     if (priv->in_emoji_sequence && have_hex_mods && is_emoji_start) {
-         if (priv->tentative_emoji && *priv->tentative_emoji) {
-             ibus_engine_simple_commit_str (simple, priv->tentative_emoji);
--            g_clear_pointer (&priv->tentative_emoji, g_free);
-+            priv->compose_buffer[0] = 0;
-+            ibus_engine_simple_update_preedit_text (simple);
-         }
-         else {
-             if (n_compose > 0) {
-@@ -1531,6 +1616,7 @@ ibus_engine_simple_process_key_event (IBusEngine *engine,
-                     ibus_engine_simple_commit_str (simple,
-                             priv->tentative_emoji);
-                     priv->compose_buffer[0] = 0;
-+                    ibus_engine_simple_update_preedit_text (simple);
-                 } else {
-                     g_clear_pointer (&priv->tentative_emoji, g_free);
-                     priv->in_emoji_sequence = FALSE;
-diff --git a/src/ibusenginesimpleprivate.h b/src/ibusenginesimpleprivate.h
-index cac404b1..c86c5324 100644
---- a/src/ibusenginesimpleprivate.h
-+++ b/src/ibusenginesimpleprivate.h
-@@ -1,7 +1,7 @@
- /* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
- /* vim:set et sts=4: */
- /* ibus - The Input Bus
-- * Copyright (C) 2016 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2016-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
-  * Copyright (C) 2016 Red Hat, Inc.
-  *
-  * This library is free software; you can redistribute it and/or
-@@ -26,17 +26,17 @@
- 
- G_BEGIN_DECLS
- 
--extern const IBusComposeTableCompact ibus_compose_table_compact;
-+extern const IBusComposeTableCompactEx ibus_compose_table_compact;
- 
- gboolean ibus_check_algorithmically (const guint16              *compose_buffer,
-                                      gint                        n_compose,
-                                      gunichar                   *output);
--gboolean ibus_check_compact_table   (const IBusComposeTableCompact
-+gboolean ibus_check_compact_table   (const IBusComposeTableCompactEx
-                                                                 *table,
-                                      guint16                    *compose_buffer,
-                                      gint                        n_compose,
-                                      gboolean                   *compose_finish,
--                                     gunichar                   *output_char);
-+                                     gunichar                  **output_chars);
- 
- G_END_DECLS
- 
--- 
-2.21.0
-
-From 5b6ad433f79c2e4781688d4985a15836d81f0a72 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Fri, 24 May 2019 14:34:05 +0900
-Subject: [PATCH 15/27] src: Enable multiple compose output and long key
- sequences in user comopse
-
-Curently the max key sequences of user compose keys depends on the
-max key sequences of system compose keys, IBUS_MAX_COMPOSE_LEN.
-This change will have the max key sequences by user compose table
-and also will separate the user compose table with 16bit compose table
-and 32bit one to follow another change of system compose table to be able
-to output multiple compose outputs and 32bit compose ones likes emoji
-charaters.
-
-BUG=https://github.com/ibus/ibus/issues/1990
----
- src/ibuscomposetable.c        | 639 ++++++++++++++++++++++------------
- src/ibuscomposetable.h        |  20 +-
- src/ibusenginesimple.c        |  87 +++--
- src/ibusenginesimple.h        |   4 +-
- src/ibusenginesimpleprivate.h |   9 +
- 5 files changed, 512 insertions(+), 247 deletions(-)
-
-diff --git a/src/ibuscomposetable.c b/src/ibuscomposetable.c
-index 1c0ece41..4ac54e25 100644
---- a/src/ibuscomposetable.c
-+++ b/src/ibuscomposetable.c
-@@ -35,22 +35,25 @@
- #include "ibusenginesimpleprivate.h"
- 
- #define IBUS_COMPOSE_TABLE_MAGIC "IBusComposeTable"
--#define IBUS_COMPOSE_TABLE_VERSION (2)
-+#define IBUS_COMPOSE_TABLE_VERSION (3)
- 
- typedef struct {
-   gunichar     *sequence;
--  gunichar      value[2];
-+  gunichar     *values;
-   gchar        *comment;
- } IBusComposeData;
- 
-+
- static void
- ibus_compose_data_free (IBusComposeData *compose_data)
- {
-     g_free (compose_data->sequence);
-+    g_free (compose_data->values);
-     g_free (compose_data->comment);
-     g_slice_free (IBusComposeData, compose_data);
- }
- 
-+
- static void
- ibus_compose_list_element_free (IBusComposeData *compose_data,
-                                 gpointer         data)
-@@ -58,6 +61,18 @@ ibus_compose_list_element_free (IBusComposeData *compose_data,
-     ibus_compose_data_free (compose_data);
- }
- 
-+
-+static guint
-+unichar_length (gunichar *uni_array)
-+{
-+    guint i = 0;
-+    g_return_val_if_fail (uni_array, 0);
-+    while (uni_array[i])
-+        ++i;
-+    return i;
-+}
-+
-+
- static gboolean
- is_codepoint (const gchar *str)
- {
-@@ -75,63 +90,85 @@ is_codepoint (const gchar *str)
-     return TRUE;
- }
- 
-+
- static gboolean
- parse_compose_value (IBusComposeData  *compose_data,
-                      const gchar      *val,
-                      const gchar      *line)
- {
--    gchar **words = g_strsplit (val, "\"", 3);
--    gunichar uch;
-+    gchar *head, *end, *p;
-+    gchar *ustr = NULL;
-+    gunichar *uchars = NULL, *up;
-+    GError *error = NULL;
-+    int n_uchars = 0;
- 
--    if (g_strv_length (words) < 3) {
-+    if (!(head = strchr (val, '\"'))) {
-         g_warning ("Need to double-quote the value: %s: %s", val, line);
-         goto fail;
-     }
--
--    uch = g_utf8_get_char (words[1]);
--
--    if (uch == 0) {
--        g_warning ("Invalid value: %s: %s", val, line);
-+    ++head;
-+    p = head;
-+    while ((*p != '\0') && (end = strchr (p, '\"'))) {
-+        if (*(end - 1) == '\\' && *(end - 2) == '\\')
-+            break;
-+        if (*(end - 1) != '\\')
-+            break;
-+        p = end + 1;
-+    }
-+    if (end == NULL || *p == '\0') {
-+        g_warning ("Need to double-quote the value: %s: %s", val, line);
-         goto fail;
-     }
--    else if (uch == '\\') {
--        uch = words[1][1];
--
--        /* The escaped string "\"" is separated with '\\' and '"'. */
--        if (uch == '\0' && words[2][0] == '"') {
--            uch = '"';
--        /* The escaped octal */
--        } else if (uch >= '0' && uch <= '8') {
--            uch = g_ascii_strtoll(words[1] + 1, NULL, 8);
--        /* If we need to handle other escape sequences. */
--        } else if (uch != '\\') {
--            g_warning ("Invalid backslash: %s: %s", val, line);
-+    ustr = g_strndup (head, end - head);
-+    p = ustr + 1;
-+    /* The escaped octal */
-+    if (*ustr == '\\' && *p >= '0' && *p <= '8') {
-+        compose_data->values = g_new (gunichar, 2);
-+        compose_data->values[0] = g_ascii_strtoll(p, NULL, 8);
-+        compose_data->values[1] = 0;
-+    } else {
-+        if (!(uchars = g_utf8_to_ucs4 (ustr, -1, NULL, NULL, &error)) ||
-+            !uchars[0]) {
-+            g_warning ("Invalid Unicode: %s: %s in %s:",
-+                       error->message, ustr, line);
-+            g_error_free (error);
-             goto fail;
-         }
--    }
- 
--    if (g_utf8_get_char (g_utf8_next_char (words[1])) > 0) {
--        g_warning ("GTK+ supports to output one char only: %s: %s", val, line);
--        goto fail;
-+        for (up = uchars; *up; up++) {
-+            if (*up == '\\') {
-+                ++up;
-+                if (*up != '"' && *up != '\\') {
-+                    g_warning ("Invalid backslash: %s: %s", val, line);
-+                    goto fail;
-+                }
-+            }
-+            if (!compose_data->values) {
-+                compose_data->values = g_new (gunichar, 2);
-+            } else {
-+                compose_data->values = g_renew (gunichar,
-+                                                compose_data->values,
-+                                                n_uchars + 1);
-+            }
-+            compose_data->values[n_uchars++] = *up;
-+        }
-+        compose_data->values[n_uchars] = 0;
-     }
- 
--    compose_data->value[1] = uch;
--
--    if (uch == '"')
--        compose_data->comment = g_strdup (g_strstrip (words[2] + 1));
--    else
--        compose_data->comment = g_strdup (g_strstrip (words[2]));
--
--    g_strfreev (words);
-+    g_free (ustr);
-+    g_free (uchars);
-+    compose_data->comment = g_strdup (g_strstrip (end + 1));
- 
-     return TRUE;
- 
- fail:
--    g_strfreev (words);
-+    g_free (ustr);
-+    g_free (uchars);
-     return FALSE;
- }
- 
--static gboolean
-+
-+static int
- parse_compose_sequence (IBusComposeData *compose_data,
-                         const gchar     *seq,
-                         const gchar     *line)
-@@ -161,20 +198,20 @@ parse_compose_sequence (IBusComposeData *compose_data,
- 
-         match = g_strndup (start, end - start);
- 
--        if (compose_data->sequence == NULL)
--            compose_data->sequence = g_malloc (sizeof (gunichar) * 2);
--        else
--            compose_data->sequence = g_realloc (compose_data->sequence,
--                                                sizeof (gunichar) * (n + 2));
-+        if (compose_data->sequence == NULL) {
-+            compose_data->sequence = g_new (gunichar, 2);
-+        } else {
-+            compose_data->sequence = g_renew (gunichar,
-+                                              compose_data->sequence,
-+                                              n + 2);
-+        }
- 
-         if (is_codepoint (match)) {
-             codepoint = (gunichar) g_ascii_strtoll (match + 1, NULL, 16);
-             compose_data->sequence[n] = codepoint;
--            compose_data->sequence[n + 1] = 0;
-         } else {
-             codepoint = (gunichar) ibus_keyval_from_name (match);
-             compose_data->sequence[n] = codepoint;
--            compose_data->sequence[n + 1] = 0;
-         }
- 
-         if (codepoint == IBUS_KEY_VoidSymbol)
-@@ -182,27 +219,35 @@ parse_compose_sequence (IBusComposeData *compose_data,
-         g_free (match);
-         n++;
-     }
-+    if (compose_data->sequence)
-+        compose_data->sequence[n] = 0;
- 
-     g_strfreev (words);
-     if (0 == n || n >= IBUS_MAX_COMPOSE_LEN) {
-         g_warning ("The max number of sequences is %d: %s",
-                    IBUS_MAX_COMPOSE_LEN, line);
--        return FALSE;
-+        return -1;
-     }
- 
--    return TRUE;
-+    return n;
- 
- fail:
-     g_strfreev (words);
--    return FALSE;
-+    return -1;
- }
- 
-+
- static void
- parse_compose_line (GList       **compose_list,
--                    const gchar  *line)
-+                    const gchar  *line,
-+                    int          *compose_len)
- {
-     gchar **components = NULL;
-     IBusComposeData *compose_data = NULL;
-+    int l;
-+
-+    g_assert (compose_len);
-+    *compose_len = 0;
- 
-     if (line[0] == '\0' || line[0] == '#')
-         return;
-@@ -219,11 +264,12 @@ parse_compose_line (GList       **compose_list,
- 
-     compose_data = g_slice_new0 (IBusComposeData);
- 
--    if (!parse_compose_sequence (compose_data,
--                                 g_strstrip (components[0]),
--                                 line)) {
-+    if ((l = parse_compose_sequence (compose_data,
-+                                     g_strstrip (components[0]),
-+                                     line)) < 1) {
-         goto fail;
-     }
-+    *compose_len = l;
- 
-     if (!parse_compose_value (compose_data, g_strstrip (components[1]), line))
-         goto fail;
-@@ -240,16 +286,21 @@ fail:
-         ibus_compose_data_free (compose_data);
- }
- 
-+
- static GList *
--ibus_compose_list_parse_file (const gchar *compose_file)
-+ibus_compose_list_parse_file (const gchar *compose_file,
-+                              int         *max_compose_len)
- {
-     gchar *contents = NULL;
-     gchar **lines = NULL;
-     gsize length = 0;
-     GError *error = NULL;
-     GList *compose_list = NULL;
-+    int compose_len = 0;
-     int i;
- 
-+    g_assert (max_compose_len);
-+
-     if (!g_file_get_contents (compose_file, &contents, &length, &error)) {
-         g_error ("%s", error->message);
-         g_error_free (error);
-@@ -258,33 +309,43 @@ ibus_compose_list_parse_file (const gchar *compose_file)
- 
-     lines = g_strsplit (contents, "\n", -1);
-     g_free (contents);
--    for (i = 0; lines[i] != NULL; i++)
--        parse_compose_line (&compose_list, lines[i]);
-+    for (i = 0; lines[i] != NULL; i++) {
-+        parse_compose_line (&compose_list, lines[i], &compose_len);
-+        if (*max_compose_len < compose_len)
-+            *max_compose_len = compose_len;
-+    }
-     g_strfreev (lines);
- 
-     return compose_list;
- }
- 
-+
- static GList *
--ibus_compose_list_check_duplicated (GList *compose_list)
-+ibus_compose_list_check_duplicated (GList *compose_list,
-+                                    int    max_compose_len)
- {
-     GList *list;
-+    static guint16 *keysyms;
-     GList *removed_list = NULL;
-     IBusComposeData *compose_data;
-+    gboolean is_32bit;
-+
-+    keysyms = g_new (guint16, max_compose_len + 1);
- 
-     for (list = compose_list; list != NULL; list = list->next) {
--        static guint16 keysyms[IBUS_MAX_COMPOSE_LEN + 1];
-         int i;
-         int n_compose = 0;
-         gboolean compose_finish;
--        gunichar output_char;
-+        gunichar *output_chars = NULL;
-+        gunichar output_char = 0;
-+        guint n_outputs;
- 
-         compose_data = list->data;
- 
--        for (i = 0; i < IBUS_MAX_COMPOSE_LEN + 1; i++)
-+        for (i = 0; i < max_compose_len + 1; i++)
-             keysyms[i] = 0;
- 
--        for (i = 0; i < IBUS_MAX_COMPOSE_LEN + 1; i++) {
-+        for (i = 0; i < max_compose_len + 1; i++) {
-             gunichar codepoint = compose_data->sequence[i];
-             keysyms[i] = (guint16) codepoint;
- 
-@@ -294,18 +355,41 @@ ibus_compose_list_check_duplicated (GList *compose_list)
-             n_compose++;
-         }
- 
--        if (ibus_check_compact_table (&ibus_compose_table_compact,
-+        n_outputs = unichar_length (compose_data->values);
-+        is_32bit = (n_outputs > 1) ? TRUE :
-+                (compose_data->values[0] >= 0xFFFF) ? TRUE : FALSE;
-+        if (!is_32bit &&
-+            ibus_check_compact_table (&ibus_compose_table_compact,
-                                       keysyms,
-                                       n_compose,
-                                       &compose_finish,
--                                      &output_char) && compose_finish) {
--            if (compose_data->value[1] == output_char)
-+                                      &output_chars) && compose_finish) {
-+            if (compose_data->values[0] == *output_chars)
-                 removed_list = g_list_append (removed_list, compose_data);
-+            g_free (output_chars);
-+        } else if (is_32bit &&
-+                   ibus_check_compact_table (&ibus_compose_table_compact_32bit,
-+                                             keysyms,
-+                                             n_compose,
-+                                             &compose_finish,
-+                                             &output_chars) && compose_finish) {
-+            
-+            if (n_outputs == unichar_length (output_chars)) {
-+                int j = 0;
-+                while (compose_data->values[j] && j < n_outputs) {
-+                    if (compose_data->values[j] != output_chars[j])
-+                        break;
-+                    ++j;
-+                }
-+                if (j == n_outputs)
-+                    removed_list = g_list_append (removed_list, compose_data);
-+            }
-+            g_free (output_chars);
- 
-         } else if (ibus_check_algorithmically (keysyms,
-                                                n_compose,
-                                                &output_char)) {
--            if (compose_data->value[1] == output_char)
-+            if (compose_data->values[0] == output_char)
-                 removed_list = g_list_append (removed_list, compose_data);
-         }
-     }
-@@ -317,85 +401,11 @@ ibus_compose_list_check_duplicated (GList *compose_list)
-     }
- 
-     g_list_free (removed_list);
-+    g_free (keysyms);
- 
-     return compose_list;
- }
- 
--static GList *
--ibus_compose_list_check_uint16 (GList *compose_list)
--{
--    GList *list;
--    GList *removed_list = NULL;
--    IBusComposeData *compose_data;
--
--    for (list = compose_list; list != NULL; list = list->next) {
--        int i;
--
--        compose_data = list->data;
--        for (i = 0; i < IBUS_MAX_COMPOSE_LEN; i++) {
--            gunichar codepoint = compose_data->sequence[i];
--
--            if (codepoint == 0)
--                break;
--
--            if (codepoint > 0xffff) {
--                removed_list = g_list_append (removed_list, compose_data);
--                break;
--            }
--        }
--    }
--
--    for (list = removed_list; list != NULL; list = list->next) {
--        compose_data = list->data;
--        compose_list = g_list_remove (compose_list, compose_data);
--        ibus_compose_data_free (compose_data);
--    }
--
--    g_list_free (removed_list);
--
--    return compose_list;
--}
--
--static GList *
--ibus_compose_list_format_for_gtk (GList *compose_list,
--                                  int   *p_max_compose_len,
--                                  int   *p_n_index_stride)
--{
--    GList *list;
--    IBusComposeData *compose_data;
--    int max_compose_len = 0;
--    int i;
--    gunichar codepoint;
--
--    for (list = compose_list; list != NULL; list = list->next) {
--        compose_data = list->data;
--
--        for (i = 0; i < IBUS_MAX_COMPOSE_LEN + 1; i++) {
--            codepoint = compose_data->sequence[i];
--            if (codepoint == 0) {
--                if (max_compose_len < i)
--                    max_compose_len = i;
--                break;
--            }
--        }
--    }
--
--    if (p_max_compose_len)
--        *p_max_compose_len = max_compose_len;
--    if (p_n_index_stride)
--        *p_n_index_stride = max_compose_len + 2;
--
--    for (list = compose_list; list != NULL; list = list->next) {
--        compose_data = list->data;
--        codepoint = compose_data->value[1];
--        if (codepoint > 0xffff) {
--            compose_data->value[0] = codepoint / 0x10000;
--            compose_data->value[1] = codepoint - codepoint / 0x10000 * 0x10000;
--        }
--    }
--
--    return compose_list;
--}
- 
- static gint
- ibus_compose_data_compare (gpointer a,
-@@ -416,6 +426,7 @@ ibus_compose_data_compare (gpointer a,
-     return 0;
- }
- 
-+
- static void
- ibus_compose_list_print (GList *compose_list,
-                          int    max_compose_len,
-@@ -425,9 +436,6 @@ ibus_compose_list_print (GList *compose_list,
-     int i, j;
-     IBusComposeData *compose_data;
-     int total_size = 0;
--    gunichar upper;
--    gunichar lower;
--    const gchar *comment;
-     const gchar *keyval;
- 
-     for (list = compose_list; list != NULL; list = list->next) {
-@@ -452,14 +460,10 @@ ibus_compose_list_print (GList *compose_list,
-             else
-                 g_printf ("%s, ", keyval ? keyval : "(null)");
-         }
--        upper = compose_data->value[0];
--        lower = compose_data->value[1];
--        comment = compose_data->comment;
--
--        if (list == g_list_last (compose_list))
--            g_printf ("    %#06X, %#06X  /* %s */\n", upper, lower, comment);
--        else
--            g_printf ("    %#06X, %#06X, /* %s */\n", upper, lower, comment);
-+        g_printf ("    ");
-+        for (i = 0; compose_data->values[i]; ++i)
-+            g_printf ("%#06X, ", compose_data->values[i]);
-+        g_printf (" /* %s */,\n", compose_data->comment);
- 
-         total_size += n_index_stride;
-     }
-@@ -468,6 +472,7 @@ ibus_compose_list_print (GList *compose_list,
-                 total_size, max_compose_len, n_index_stride);
- }
- 
-+
- /* Implemented from g_str_hash() */
- static guint32
- ibus_compose_table_data_hash (gconstpointer v,
-@@ -487,6 +492,7 @@ ibus_compose_table_data_hash (gconstpointer v,
-     return h;
- }
- 
-+
- static gchar *
- ibus_compose_hash_get_cache_path (guint32 hash)
- {
-@@ -511,67 +517,151 @@ ibus_compose_hash_get_cache_path (guint32 hash)
-     return path;
- }
- 
-+
- static GVariant *
--ibus_compose_table_serialize (IBusComposeTable *compose_table)
-+ibus_compose_table_serialize (IBusComposeTableEx *compose_table)
- {
-     const gchar *header = IBUS_COMPOSE_TABLE_MAGIC;
-     const guint16 version = IBUS_COMPOSE_TABLE_VERSION;
-     guint16 max_seq_len;
-     guint16 index_stride;
-     guint16 n_seqs;
--    GVariant *variant_data;
-+    guint16 n_seqs_32bit = 0;
-+    guint16 second_size = 0;
-+    GVariant *variant_data = NULL;
-+    GVariant *variant_data_32bit_first = NULL;
-+    GVariant *variant_data_32bit_second = NULL;
-     GVariant *variant_table;
- 
-     g_return_val_if_fail (compose_table != NULL, NULL);
--    g_return_val_if_fail (compose_table->data != NULL, NULL);
- 
-     max_seq_len = compose_table->max_seq_len;
-     index_stride = max_seq_len + 2;
-     n_seqs = compose_table->n_seqs;
- 
--    g_return_val_if_fail (max_seq_len > 0, NULL);
--    g_return_val_if_fail (n_seqs > 0, NULL);
-+    g_return_val_if_fail (max_seq_len, NULL);
- 
--    variant_data = g_variant_new_fixed_array (G_VARIANT_TYPE_UINT16,
--                                              compose_table->data,
--                                              (gsize)index_stride * n_seqs,
--                                              sizeof (guint16));
--    if (variant_data == NULL) {
--        g_warning ("Could not change compose data to GVariant.");
--        return NULL;
-+    if (n_seqs) {
-+        g_return_val_if_fail (compose_table->data, NULL);
-+
-+        variant_data = g_variant_new_fixed_array (G_VARIANT_TYPE_UINT16,
-+                                                  compose_table->data,
-+                                                  (gsize)index_stride * n_seqs,
-+                                                  sizeof (guint16));
-+        if (!variant_data) {
-+            g_warning ("Could not change compose data to GVariant.");
-+            return NULL;
-+        }
-+    } else {
-+        variant_data = g_variant_new_fixed_array (
-+                G_VARIANT_TYPE_UINT16,
-+                NULL,
-+                0,
-+                sizeof (guint16));
-+        g_assert (variant_data);
-+    }
-+    if (compose_table->priv) {
-+        n_seqs_32bit = compose_table->priv->first_n_seqs;
-+        second_size = compose_table->priv->second_size;
-+    }
-+    if (!n_seqs && !n_seqs_32bit) {
-+        g_warning ("ComposeTable has not key sequences.");
-+        goto out_serialize;
-+    } else if (n_seqs_32bit && !second_size) {
-+        g_warning ("Compose key sequences are loaded but the values could " \
-+                   "not be loaded.");
-+        goto out_serialize;
-+    } else if (!n_seqs_32bit && second_size) {
-+        g_warning ("Compose values are loaded but the key sequences could " \
-+                   "not be loaded.");
-+        goto out_serialize;
-+    } else if (n_seqs_32bit && second_size) {
-+        if (!compose_table->priv->data_first) {
-+            g_warning ("data_first is NULL");
-+            goto out_serialize;
-+        }
-+        if (!compose_table->priv->data_second) {
-+            g_warning ("data_second is NULL");
-+            goto out_serialize;
-+        }
-+        variant_data_32bit_first = g_variant_new_fixed_array (
-+                G_VARIANT_TYPE_UINT16,
-+                compose_table->priv->data_first,
-+                (gsize)index_stride * n_seqs_32bit,
-+                sizeof (guint16));
-+        variant_data_32bit_second = g_variant_new_fixed_array (
-+                G_VARIANT_TYPE_UINT32,
-+                compose_table->priv->data_second,
-+                compose_table->priv->second_size,
-+                sizeof (guint32));
-+        if (!variant_data_32bit_first || !variant_data_32bit_second) {
-+            g_warning ("Could not change 32bit compose data to GVariant.");
-+            goto out_serialize;
-+        }
-+    } else {
-+        variant_data_32bit_first = g_variant_new_fixed_array (
-+                G_VARIANT_TYPE_UINT16,
-+                NULL,
-+                0,
-+                sizeof (guint16));
-+        variant_data_32bit_second = g_variant_new_fixed_array (
-+                G_VARIANT_TYPE_UINT32,
-+                NULL,
-+                0,
-+                sizeof (guint32));
-+        g_assert (variant_data_32bit_first && variant_data_32bit_second);
-     }
--    variant_table = g_variant_new ("(sqqqv)",
-+    variant_table = g_variant_new ("(sqqqqqvvv)",
-                                    header,
-                                    version,
-                                    max_seq_len,
-                                    n_seqs,
--                                   variant_data);
-+                                   n_seqs_32bit,
-+                                   second_size,
-+                                   variant_data,
-+                                   variant_data_32bit_first,
-+                                   variant_data_32bit_second);
-     return g_variant_ref_sink (variant_table);
-+
-+out_serialize:
-+    g_clear_pointer (&variant_data, g_variant_unref);
-+    g_clear_pointer (&variant_data_32bit_first, g_variant_unref);
-+    g_clear_pointer (&variant_data_32bit_second, g_variant_unref);
-+    return NULL;
- }
- 
-+
- static gint
- ibus_compose_table_find (gconstpointer data1,
-                          gconstpointer data2)
- {
--    const IBusComposeTable *compose_table = (const IBusComposeTable *) data1;
-+    const IBusComposeTableEx *compose_table =
-+            (const IBusComposeTableEx *) data1;
-     guint32 hash = (guint32) GPOINTER_TO_INT (data2);
-     return compose_table->id != hash;
- }
- 
--static IBusComposeTable *
-+
-+static IBusComposeTableEx *
- ibus_compose_table_deserialize (const gchar *contents,
-                                 gsize        length)
- {
--    IBusComposeTable *retval = NULL;
-+    IBusComposeTableEx *retval = NULL;
-     GVariantType *type;
-     GVariant *variant_data = NULL;
-+    GVariant *variant_data_32bit_first = NULL;
-+    GVariant *variant_data_32bit_second = NULL;
-     GVariant *variant_table = NULL;
-     const gchar *header = NULL;
-     guint16 version = 0;
-     guint16 max_seq_len = 0;
-     guint16 n_seqs = 0;
-+    guint16 n_seqs_32bit = 0;
-+    guint16 second_size = 0;
-     guint16 index_stride;
-     gconstpointer data = NULL;
-+    gconstpointer data_32bit_first = NULL;
-+    gconstpointer data_32bit_second = NULL;
-     gsize data_length = 0;
- 
-     g_return_val_if_fail (contents != NULL, NULL);
-@@ -587,7 +677,7 @@ ibus_compose_table_deserialize (const gchar *contents,
-                                              NULL);
-     g_variant_type_free (type);
- 
--    if (variant_table == NULL) {
-+    if (!variant_table) {
-         g_warning ("cache is broken.");
-         goto out_load_cache;
-     }
-@@ -611,7 +701,7 @@ ibus_compose_table_deserialize (const gchar *contents,
-     g_variant_unref (variant_table);
-     variant_table = NULL;
- 
--    type = g_variant_type_new ("(sqqqv)");
-+    type = g_variant_type_new ("(sqqqqqvvv)");
-     variant_table = g_variant_new_from_data (type,
-                                              contents,
-                                              length,
-@@ -620,58 +710,117 @@ ibus_compose_table_deserialize (const gchar *contents,
-                                              NULL);
-     g_variant_type_free (type);
- 
--    if (variant_table == NULL) {
-+    if (!variant_table) {
-         g_warning ("cache is broken.");
-         goto out_load_cache;
-     }
- 
-     g_variant_ref_sink (variant_table);
--    g_variant_get (variant_table, "(&sqqqv)",
-+    g_variant_get (variant_table, "(&sqqqqqvvv)",
-                    NULL,
-                    NULL,
-                    &max_seq_len,
-                    &n_seqs,
--                   &variant_data);
--
--    if (max_seq_len == 0 || n_seqs == 0) {
--        g_warning ("cache size is not correct %d %d", max_seq_len, n_seqs);
-+                   &n_seqs_32bit,
-+                   &second_size,
-+                   &variant_data,
-+                   &variant_data_32bit_first,
-+                   &variant_data_32bit_second);
-+
-+    if (max_seq_len == 0 || (n_seqs == 0 && n_seqs_32bit == 0)) {
-+        g_warning ("cache size is not correct %d %d %d",
-+                   max_seq_len, n_seqs, n_seqs_32bit);
-         goto out_load_cache;
-     }
- 
--    data = g_variant_get_fixed_array (variant_data,
--                                      &data_length,
--                                      sizeof (guint16));
-+    if (n_seqs && variant_data) {
-+        data = g_variant_get_fixed_array (variant_data,
-+                                          &data_length,
-+                                          sizeof (guint16));
-+    }
-     index_stride = max_seq_len + 2;
- 
--    if (data == NULL) {
--        g_warning ("cache data is null.");
--        goto out_load_cache;
--    }
--    if (data_length != (gsize) index_stride * n_seqs) {
-+    if (data_length != (gsize)index_stride * n_seqs) {
-         g_warning ("cache size is not correct %d %d %lu",
-                    max_seq_len, n_seqs, data_length);
-         goto out_load_cache;
-     }
- 
--    retval = g_new0 (IBusComposeTable, 1);
--    retval->data = g_new (guint16, data_length);
--    memcpy (retval->data, data, data_length * sizeof (guint16));
-+    retval = g_new0 (IBusComposeTableEx, 1);
-+    if (data_length) {
-+        retval->data = g_new (guint16, data_length);
-+        memcpy (retval->data, data, data_length * sizeof (guint16));
-+    }
-     retval->max_seq_len = max_seq_len;
-     retval->n_seqs = n_seqs;
- 
-+    if (n_seqs_32bit && !second_size) {
-+        g_warning ("32bit key sequences are loaded but the values " \
-+                   "could not be loaded.");
-+        goto out_load_cache;
-+    }
-+    if (!n_seqs_32bit && second_size) {
-+        g_warning ("32bit key sequences could not loaded but the values " \
-+                   "are loaded.");
-+        goto out_load_cache;
-+    }
-+
-+    data_length = 0;
-+    if (n_seqs_32bit && variant_data_32bit_first) {
-+        data_32bit_first = g_variant_get_fixed_array (variant_data_32bit_first,
-+                                                      &data_length,
-+                                                      sizeof (guint16));
-+        if (data_length != (gsize) index_stride * n_seqs_32bit) {
-+            g_warning ("32bit cache size is not correct %d %d %lu",
-+                       max_seq_len, n_seqs_32bit, data_length);
-+            goto out_load_cache;
-+        }
-+    }
-+    if (!data && !data_32bit_first) {
-+        g_warning ("cache data is null.");
-+        goto out_load_cache;
-+    }
-+    if (data_length) {
-+        retval->priv = g_new0 (IBusComposeTablePrivate, 1);
-+        retval->priv->data_first = g_new (guint16, data_length);
-+        memcpy (retval->priv->data_first,
-+                data_32bit_first, data_length * sizeof (guint16));
-+        retval->priv->first_n_seqs = n_seqs_32bit;
-+    }
-+
-+    data_length = 0;
-+    if (second_size && variant_data_32bit_second) {
-+        data_32bit_second = g_variant_get_fixed_array (
-+                variant_data_32bit_second,
-+                &data_length,
-+                sizeof (guint32));
-+        if (data_length != (gsize) second_size) {
-+            g_warning ("32bit cache size is not correct %d %d",
-+                       max_seq_len, second_size);
-+            goto out_load_cache;
-+        }
-+    }
-+    if (data_length) {
-+        retval->priv->data_second = g_new (guint32, data_length);
-+        memcpy (retval->priv->data_second,
-+                data_32bit_second, data_length * sizeof (guint32));
-+        retval->priv->second_size = second_size;
-+    }
-+
- 
- out_load_cache:
--    if (variant_data)
--        g_variant_unref (variant_data);
--    if (variant_table)
--        g_variant_unref (variant_table);
-+    g_clear_pointer (&variant_data, g_variant_unref);
-+    g_clear_pointer (&variant_data_32bit_first, g_variant_unref);
-+    g_clear_pointer (&variant_data_32bit_second, g_variant_unref);
-+    g_clear_pointer (&variant_table, g_variant_unref);
-     return retval;
- }
- 
--static IBusComposeTable *
-+
-+static IBusComposeTableEx *
- ibus_compose_table_load_cache (const gchar *compose_file)
- {
--    IBusComposeTable *retval = NULL;
-+    IBusComposeTableEx *retval = NULL;
-     guint32 hash;
-     gchar *path = NULL;
-     gchar *contents = NULL;
-@@ -712,8 +861,9 @@ ibus_compose_table_load_cache (const gchar *compose_file)
-     return retval;
- }
- 
-+
- static void
--ibus_compose_table_save_cache (IBusComposeTable *compose_table)
-+ibus_compose_table_save_cache (IBusComposeTableEx *compose_table)
- {
-     gchar *path = NULL;
-     GVariant *variant_table = NULL;
-@@ -742,67 +892,119 @@ out_save_cache:
-     g_free (path);
- }
- 
--static IBusComposeTable *
-+
-+static IBusComposeTableEx *
- ibus_compose_table_new_with_list (GList   *compose_list,
-                                   int      max_compose_len,
-                                   int      n_index_stride,
-                                   guint32  hash)
- {
--    guint length;
--    guint n = 0;
-+    gsize s_size_total, s_size_16bit, v_size_32bit, v_index_32bit;
-+    guint n = 0, m = 0;
-     int i, j;
-     guint16 *ibus_compose_seqs = NULL;
-+    guint16 *ibus_compose_seqs_32bit_first = NULL;
-+    guint32 *ibus_compose_seqs_32bit_second = NULL;
-     GList *list;
--    IBusComposeData *compose_data;
--    IBusComposeTable *retval = NULL;
-+    IBusComposeData *compose_data = NULL;
-+    IBusComposeTableEx *retval = NULL;
- 
-     g_return_val_if_fail (compose_list != NULL, NULL);
- 
--    length = g_list_length (compose_list);
-+    s_size_total = g_list_length (compose_list);
-+    s_size_16bit = s_size_total;
-+    v_size_32bit = 0;
-+
-+    for (list = compose_list; list != NULL; list = list->next) {
-+        compose_data = list->data;
-+        if (unichar_length (compose_data->values) > 1 ||
-+            compose_data->values[0] >= 0xFFFF) {
-+            --s_size_16bit;
-+            v_size_32bit += unichar_length (compose_data->values);
-+        }
-+    }
- 
--    ibus_compose_seqs = g_new0 (guint16, length * n_index_stride);
-+    if (s_size_16bit)
-+        ibus_compose_seqs = g_new (guint16, s_size_16bit * n_index_stride);
-+    if (s_size_total > s_size_16bit) {
-+        ibus_compose_seqs_32bit_first =
-+                g_new (guint16,
-+                       (s_size_total - s_size_16bit) * n_index_stride);
-+        ibus_compose_seqs_32bit_second = g_new (guint32, v_size_32bit);
-+    }
- 
-+    v_index_32bit = 0;
-     for (list = compose_list; list != NULL; list = list->next) {
-+        gboolean is_32bit = FALSE;
-         compose_data = list->data;
-+
-+        is_32bit = unichar_length (compose_data->values) > 1 ? TRUE :
-+                compose_data->values[0] >= 0xFFFF ? TRUE : FALSE;
-         for (i = 0; i < max_compose_len; i++) {
-             if (compose_data->sequence[i] == 0) {
--                for (j = i; j < max_compose_len; j++)
--                    ibus_compose_seqs[n++] = 0;
-+                for (j = i; j < max_compose_len; j++) {
-+                    if (is_32bit)
-+                        ibus_compose_seqs_32bit_first[m++] = 0;
-+                    else
-+                        ibus_compose_seqs[n++] = 0;
-+                }
-                 break;
-             }
--            ibus_compose_seqs[n++] = (guint16) compose_data->sequence[i];
-+            if (is_32bit) {
-+                ibus_compose_seqs_32bit_first[m++] =
-+                        (guint16) compose_data->sequence[i];
-+            } else {
-+                ibus_compose_seqs[n++] = (guint16) compose_data->sequence[i];
-+            }
-+        }
-+        if (is_32bit) {
-+            for (j = 0; compose_data->values[j]; j++) {
-+                ibus_compose_seqs_32bit_second[v_index_32bit + j] =
-+                        compose_data->values[j];
-+            }
-+            ibus_compose_seqs_32bit_first[m++] = j;
-+            ibus_compose_seqs_32bit_first[m++] = v_index_32bit;
-+            v_index_32bit += j;
-+        } else {
-+            ibus_compose_seqs[n++] = (guint16) compose_data->values[0];
-+            ibus_compose_seqs[n++] = 0;
-         }
--        ibus_compose_seqs[n++] = (guint16) compose_data->value[0];
--        ibus_compose_seqs[n++] = (guint16) compose_data->value[1];
-     }
- 
--    retval = g_new0 (IBusComposeTable, 1);
-+    retval = g_new0 (IBusComposeTableEx, 1);
-     retval->data = ibus_compose_seqs;
-     retval->max_seq_len = max_compose_len;
--    retval->n_seqs = length;
-+    retval->n_seqs = s_size_16bit;
-     retval->id = hash;
-+    if (s_size_total > s_size_16bit) {
-+        retval->priv = g_new0 (IBusComposeTablePrivate, 1);
-+        retval->priv->data_first = ibus_compose_seqs_32bit_first;
-+        retval->priv->data_second = ibus_compose_seqs_32bit_second;
-+        retval->priv->first_n_seqs = s_size_total - s_size_16bit;
-+        retval->priv->second_size = v_size_32bit;
-+    }
- 
-     return retval;
- }
- 
--IBusComposeTable *
-+
-+IBusComposeTableEx *
- ibus_compose_table_new_with_file (const gchar *compose_file)
- {
-     GList *compose_list = NULL;
--    IBusComposeTable *compose_table;
-+    IBusComposeTableEx *compose_table;
-     int max_compose_len = 0;
-     int n_index_stride = 0;
- 
-     g_assert (compose_file != NULL);
- 
--    compose_list = ibus_compose_list_parse_file (compose_file);
-+    compose_list = ibus_compose_list_parse_file (compose_file,
-+                                                 &max_compose_len);
-     if (compose_list == NULL)
-         return NULL;
--    compose_list = ibus_compose_list_check_duplicated (compose_list);
--    compose_list = ibus_compose_list_check_uint16 (compose_list);
--    compose_list = ibus_compose_list_format_for_gtk (compose_list,
--                                                     &max_compose_len,
--                                                     &n_index_stride);
-+    n_index_stride = max_compose_len + 2;
-+    compose_list = ibus_compose_list_check_duplicated (compose_list,
-+                                                       max_compose_len);
-     compose_list = g_list_sort_with_data (
-             compose_list,
-             (GCompareDataFunc) ibus_compose_data_compare,
-@@ -814,9 +1016,8 @@ ibus_compose_table_new_with_file (const gchar *compose_file)
-         return NULL;
-     }
- 
--    if (g_getenv ("IBUS_COMPOSE_TABLE_PRINT") != NULL) {
-+    if (g_getenv ("IBUS_COMPOSE_TABLE_PRINT") != NULL)
-         ibus_compose_list_print (compose_list, max_compose_len, n_index_stride);
--    }
- 
-     compose_table = ibus_compose_table_new_with_list (
-             compose_list,
-@@ -830,6 +1031,7 @@ ibus_compose_table_new_with_file (const gchar *compose_file)
-     return compose_table;
- }
- 
-+
- /* if ibus_compose_seqs[N - 1] is an outputed compose character,
-  * ibus_compose_seqs[N * 2 - 1] is also an outputed compose character.
-  * and ibus_compose_seqs[0] to ibus_compose_seqs[0 + N - 3] are the
-@@ -845,7 +1047,7 @@ ibus_compose_table_list_add_array (GSList        *compose_tables,
-                                    gint           n_seqs)
- {
-     guint32 hash;
--    IBusComposeTable *compose_table;
-+    IBusComposeTableEx *compose_table;
-     int n_index_stride = max_seq_len + 2;
-     int length = n_index_stride * n_seqs;
-     int i;
-@@ -866,7 +1068,7 @@ ibus_compose_table_list_add_array (GSList        *compose_tables,
-     for (i = 0; i < length; i++)
-         ibus_compose_seqs[i] = data[i];
- 
--    compose_table = g_new (IBusComposeTable, 1);
-+    compose_table = g_new (IBusComposeTableEx, 1);
-     compose_table->data = ibus_compose_seqs;
-     compose_table->max_seq_len = max_seq_len;
-     compose_table->n_seqs = n_seqs;
-@@ -875,12 +1077,13 @@ ibus_compose_table_list_add_array (GSList        *compose_tables,
-     return g_slist_prepend (compose_tables, compose_table);
- }
- 
-+
- GSList *
- ibus_compose_table_list_add_file (GSList      *compose_tables,
-                                   const gchar *compose_file)
- {
-     guint32 hash;
--    IBusComposeTable *compose_table;
-+    IBusComposeTableEx *compose_table;
- 
-     g_return_val_if_fail (compose_file != NULL, compose_tables);
- 
-diff --git a/src/ibuscomposetable.h b/src/ibuscomposetable.h
-index 4bf89211..777c5f42 100644
---- a/src/ibuscomposetable.h
-+++ b/src/ibuscomposetable.h
-@@ -29,6 +29,8 @@
- G_BEGIN_DECLS
- 
- typedef struct _IBusComposeTable IBusComposeTable;
-+typedef struct _IBusComposeTableEx IBusComposeTableEx;
-+typedef struct _IBusComposeTablePrivate IBusComposeTablePrivate;
- typedef struct _IBusComposeTableCompact IBusComposeTableCompact;
- typedef struct _IBusComposeTableCompactEx IBusComposeTableCompactEx;
- typedef struct _IBusComposeTableCompactPrivate IBusComposeTableCompactPrivate;
-@@ -41,6 +43,15 @@ struct _IBusComposeTable
-     guint32 id;
- };
- 
-+struct _IBusComposeTableEx
-+{
-+    IBusComposeTablePrivate *priv;
-+    guint16 *data;
-+    gint max_seq_len;
-+    gint n_seqs;
-+    guint32 id;
-+};
-+
- struct _IBusComposeTableCompact
- {
-     const guint16 *data;
-@@ -51,22 +62,23 @@ struct _IBusComposeTableCompact
- 
- struct _IBusComposeTableCompactEx
- {
-+    IBusComposeTableCompactPrivate *priv;
-     const guint16 *data;
-     gint max_seq_len;
-     gint n_index_size;
-     gint n_index_stride;
--    IBusComposeTableCompactPrivate *priv;
- };
- 
--IBusComposeTable *ibus_compose_table_new_with_file (const gchar *compose_file);
--GSList           *ibus_compose_table_list_add_array
-+IBusComposeTableEx *
-+                  ibus_compose_table_new_with_file (const gchar *compose_file);
-+GSList *          ibus_compose_table_list_add_array
-                                                    (GSList
-                                                                 *compose_tables,
-                                                     const guint16
-                                                                 *data,
-                                                     gint         max_seq_len,
-                                                     gint         n_seqs);
--GSList           *ibus_compose_table_list_add_file (GSList
-+GSList *          ibus_compose_table_list_add_file (GSList
-                                                                 *compose_tables,
-                                                     const gchar *compose_file);
- 
-diff --git a/src/ibusenginesimple.c b/src/ibusenginesimple.c
-index fa4ddf5f..2242203c 100644
---- a/src/ibusenginesimple.c
-+++ b/src/ibusenginesimple.c
-@@ -101,24 +101,24 @@ struct _IBusComposeTableCompactPrivate
-  * Assign the value of "Number of different first items" of compose-parse.py
-  * to n_seqs in IBusComposeTableCompact
-  */
--const IBusComposeTableCompactPrivate ibus_compose_table_compact_32bit_priv = {
-+IBusComposeTableCompactPrivate ibus_compose_table_compact_32bit_priv = {
-     gtk_compose_seqs_compact_32bit_second
- };
- 
- const IBusComposeTableCompactEx ibus_compose_table_compact = {
-+    NULL,
-     gtk_compose_seqs_compact,
-     5,
-     30,
--    6,
--    NULL
-+    6
- };
- 
- const IBusComposeTableCompactEx ibus_compose_table_compact_32bit = {
-+    &ibus_compose_table_compact_32bit_priv,
-     gtk_compose_seqs_compact_32bit_first,
-     5,
-     9,
--    6,
--    &ibus_compose_table_compact_32bit_priv 
-+    6
- };
- 
- static GSList *global_tables;
-@@ -630,13 +630,15 @@ compare_seq (const void *key, const void *value)
- 
- 
- static gboolean
--check_table (IBusEngineSimple       *simple,
--             const IBusComposeTable *table,
--             gint                    n_compose)
-+check_table (IBusEngineSimple         *simple,
-+             const IBusComposeTableEx *table,
-+             gint                      n_compose,
-+             gboolean                  is_32bit)
- {
--    // g_debug("check_table");
-     IBusEngineSimplePrivate *priv = simple->priv;
-     gint row_stride = table->max_seq_len + 2;
-+    guint16 *data_first;
-+    int n_seqs;
-     guint16 *seq;
- 
-     g_assert (IBUS_IS_ENGINE_SIMPLE (simple));
-@@ -645,8 +647,17 @@ check_table (IBusEngineSimple       *simple,
-     if (n_compose > table->max_seq_len)
-         return FALSE;
- 
-+    if (is_32bit) {
-+        if (!table->priv)
-+            return FALSE;
-+        data_first = table->priv->data_first;
-+        n_seqs = table->priv->first_n_seqs;
-+    } else {
-+        data_first = table->data;
-+        n_seqs = table->n_seqs;
-+    }
-     seq = bsearch (priv->compose_buffer,
--                   table->data, table->n_seqs,
-+                   data_first, n_seqs,
-                    sizeof (guint16) * row_stride,
-                    compare_seq);
- 
-@@ -660,7 +671,7 @@ check_table (IBusEngineSimple       *simple,
-     /* Back up to the first sequence that matches to make sure
-      * we find the exact match if their is one.
-      */
--    while (seq > table->data) {
-+    while (seq > data_first) {
-         prev_seq = seq - row_stride;
-         if (compare_seq (priv->compose_buffer, prev_seq) != 0) {
-             break;
-@@ -671,14 +682,25 @@ check_table (IBusEngineSimple       *simple,
-     /* complete sequence */
-     if (n_compose == table->max_seq_len || seq[n_compose] == 0) {
-         guint16 *next_seq;
--        gunichar value =
--            0x10000 * seq[table->max_seq_len] + seq[table->max_seq_len + 1];
-+        gunichar value = 0;
-+        int num = 0;
-+        int index = 0;
-+        gchar *output_str = NULL;
-+        GError *error = NULL;
-+
-+        if (is_32bit) {
-+            num = seq[table->max_seq_len];
-+            index = seq[table->max_seq_len + 1];
-+            value =  table->priv->data_second[index];
-+        } else {
-+            value = seq[table->max_seq_len];
-+        }
- 
-         /* We found a tentative match. See if there are any longer
-          * sequences containing this subsequence
-          */
-         next_seq = seq + row_stride;
--        if (next_seq < table->data + row_stride * table->n_seqs) {
-+        if (next_seq < data_first + row_stride * n_seqs) {
-             if (compare_seq (priv->compose_buffer, next_seq) == 0) {
-                 priv->tentative_match = value;
-                 priv->tentative_match_len = n_compose;
-@@ -689,9 +711,21 @@ check_table (IBusEngineSimple       *simple,
-             }
-         }
- 
--        ibus_engine_simple_commit_char (simple, value);
-+        if (is_32bit) {
-+            output_str = g_ucs4_to_utf8 (table->priv->data_second + index,
-+                                         num, NULL, NULL, &error);
-+            if (output_str) {
-+                ibus_engine_simple_commit_str(simple, output_str);
-+                g_free (output_str);
-+            } else {
-+                g_warning ("Failed to output multiple characters: %s",
-+                           error->message);
-+                g_error_free (error);
-+            }
-+        } else {
-+            ibus_engine_simple_commit_char (simple, value);
-+        }
-         priv->compose_buffer[0] = 0;
--        // g_debug ("U+%04X\n", value);
-     }
-     ibus_engine_simple_update_preedit_text (simple);
-     return TRUE;
-@@ -754,10 +788,10 @@ ibus_check_compact_table (const IBusComposeTableCompactEx *table,
- 
-             if (seq_index[i + 1] - seq_index[i] > 0) {
-                 seq = bsearch (compose_buffer + 1,
--                           table->data + seq_index[i],
--                           (seq_index[i + 1] - seq_index[i]) / row_stride,
--                           sizeof (guint16) * row_stride,
--                           compare_seq);
-+                               table->data + seq_index[i],
-+                               (seq_index[i + 1] - seq_index[i]) / row_stride,
-+                               sizeof (guint16) * row_stride,
-+                               compare_seq);
-                 if (seq) {
-                     if (i == n_compose - 1)
-                         break;
-@@ -1148,8 +1182,15 @@ ibus_engine_simple_check_all_compose_table (IBusEngineSimple *simple,
- 
-     while (list) {
-         if (check_table (simple,
--            (IBusComposeTable *)list->data,
--            n_compose)) {
-+            (IBusComposeTableEx *)list->data,
-+            n_compose,
-+            FALSE)) {
-+            return TRUE;
-+        }
-+        if (check_table (simple,
-+            (IBusComposeTableEx *)list->data,
-+            n_compose,
-+            TRUE)) {
-             return TRUE;
-         }
-         list = list->next;
-@@ -1178,12 +1219,12 @@ ibus_engine_simple_check_all_compose_table (IBusEngineSimple *simple,
-             if (output_str) {
-                 ibus_engine_simple_commit_str (simple, output_str);
-                 g_free (output_str);
--                g_free (output_chars);
-             } else {
-                 g_warning ("Failed to output multiple characters: %s",
-                            error->message);
-                 g_error_free (error);
-             }
-+            g_free (output_chars);
-             priv->compose_buffer[0] = 0;
-         }
-         
-diff --git a/src/ibusenginesimple.h b/src/ibusenginesimple.h
-index a5ef34fb..bd385e5b 100644
---- a/src/ibusenginesimple.h
-+++ b/src/ibusenginesimple.h
-@@ -2,7 +2,7 @@
- /* vim:set et sts=4: */
- /* ibus - The Input Bus
-  * Copyright (C) 2008-2015 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright (C) 2015-2017 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2015-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
-  * Copyright (C) 2008-2017 Red Hat, Inc.
-  *
-  * This library is free software; you can redistribute it and/or
-@@ -44,7 +44,7 @@
- 
- G_BEGIN_DECLS
- 
--#define IBUS_MAX_COMPOSE_LEN 7
-+#define IBUS_MAX_COMPOSE_LEN 0xFF
- 
- /*
-  * Type macros.
-diff --git a/src/ibusenginesimpleprivate.h b/src/ibusenginesimpleprivate.h
-index c86c5324..508d9344 100644
---- a/src/ibusenginesimpleprivate.h
-+++ b/src/ibusenginesimpleprivate.h
-@@ -27,6 +27,15 @@
- G_BEGIN_DECLS
- 
- extern const IBusComposeTableCompactEx ibus_compose_table_compact;
-+extern const IBusComposeTableCompactEx ibus_compose_table_compact_32bit;
-+
-+struct _IBusComposeTablePrivate
-+{
-+    guint16 *data_first;
-+    guint32 *data_second;
-+    gsize first_n_seqs;
-+    gsize second_size;
-+};
- 
- gboolean ibus_check_algorithmically (const guint16              *compose_buffer,
-                                      gint                        n_compose,
--- 
-2.21.0
-
-From 82a728de97308f6ce36c814e30a292f96e76cc13 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Wed, 29 May 2019 17:37:35 +0900
-Subject: [PATCH 16/27] src: Change a fixed compose buffer to a variable one
-
-Now the long key sequence of the compose key is supported in both
-system compose and user compose but the internal compose buffer is
-still a fixed size. The compose buffer size will be a variable size
-and the initial size will be 20 with this change.
----
- src/ibusenginesimple.c | 48 ++++++++++++++++++++++--------------------
- 1 file changed, 25 insertions(+), 23 deletions(-)
-
-diff --git a/src/ibusenginesimple.c b/src/ibusenginesimple.c
-index 2242203c..0604693d 100644
---- a/src/ibusenginesimple.c
-+++ b/src/ibusenginesimple.c
-@@ -44,29 +44,31 @@
- #include <stdlib.h>
- 
- #define X11_DATADIR X11_DATA_PREFIX "/share/X11/locale"
--#define EMOJI_SOURCE_LEN 100
- #define IBUS_ENGINE_SIMPLE_GET_PRIVATE(o)  \
-    (G_TYPE_INSTANCE_GET_PRIVATE ((o), IBUS_TYPE_ENGINE_SIMPLE, IBusEngineSimplePrivate))
- 
- #define SET_COMPOSE_BUFFER_ELEMENT_NEXT(buffer, index, value) {         \
--    if ((index) < EMOJI_SOURCE_LEN) {                                   \
-+    if ((index) >= COMPOSE_BUFFER_SIZE &&                               \
-+        COMPOSE_BUFFER_SIZE < IBUS_MAX_COMPOSE_LEN) {                   \
-+        COMPOSE_BUFFER_SIZE = ((index) + 10) < IBUS_MAX_COMPOSE_LEN     \
-+                              ? ((index) + 10) : IBUS_MAX_COMPOSE_LEN;  \
-+        (buffer) = g_renew (guint16, (buffer), COMPOSE_BUFFER_SIZE + 1);\
-+    }                                                                   \
-+    if ((index) < COMPOSE_BUFFER_SIZE) {                                \
-         (buffer)[(index)] = (value);                                    \
-         (index) += 1;                                                   \
-     }                                                                   \
- }
- 
- #define SET_COMPOSE_BUFFER_ELEMENT_END(buffer, index, value) {          \
--    if ((index) >= EMOJI_SOURCE_LEN) {                                  \
--        (index) = EMOJI_SOURCE_LEN;                                     \
--        (buffer)[EMOJI_SOURCE_LEN - 1] = (value);                       \
--    } else {                                                            \
--        (buffer)[(index)] = (value);                                    \
--    }                                                                   \
-+    if ((index) > COMPOSE_BUFFER_SIZE)                                  \
-+        (index) = COMPOSE_BUFFER_SIZE;                                  \
-+    (buffer)[(index)] = (value);                                        \
- }
- 
- #define CHECK_COMPOSE_BUFFER_LENGTH(index) {                            \
--    if ((index) > EMOJI_SOURCE_LEN)                                     \
--        (index) = EMOJI_SOURCE_LEN;                                     \
-+    if ((index) > COMPOSE_BUFFER_SIZE)                                  \
-+        (index) = COMPOSE_BUFFER_SIZE;                                  \
- }
- 
- typedef struct {
-@@ -75,7 +77,7 @@ typedef struct {
- } IBusEngineDict;
- 
- struct _IBusEngineSimplePrivate {
--    guint16             compose_buffer[EMOJI_SOURCE_LEN];
-+    guint16            *compose_buffer;
-     gunichar            tentative_match;
-     gchar              *tentative_emoji;
-     gint                tentative_match_len;
-@@ -121,6 +123,7 @@ const IBusComposeTableCompactEx ibus_compose_table_compact_32bit = {
-     6
- };
- 
-+guint COMPOSE_BUFFER_SIZE = 20;
- static GSList *global_tables;
- 
- /* functions prototype */
-@@ -175,6 +178,7 @@ static void
- ibus_engine_simple_init (IBusEngineSimple *simple)
- {
-     simple->priv = IBUS_ENGINE_SIMPLE_GET_PRIVATE (simple);
-+    simple->priv->compose_buffer = g_new (guint16, COMPOSE_BUFFER_SIZE + 1);
-     simple->priv->hex_mode_enabled =
-         g_getenv("IBUS_ENABLE_CTRL_SHIFT_U") != NULL ||
-         g_getenv("IBUS_ENABLE_CONTROL_SHIFT_U") != NULL;
-@@ -193,7 +197,8 @@ ibus_engine_simple_destroy (IBusEngineSimple *simple)
-         priv->emoji_dict = NULL;
-     }
- 
--    g_clear_pointer (&priv->lookup_table, g_object_unref);
-+    g_clear_object (&priv->lookup_table);
-+    g_clear_pointer (&priv->compose_buffer, g_free);
-     g_clear_pointer (&priv->tentative_emoji, g_free);
- 
-     IBUS_OBJECT_CLASS(ibus_engine_simple_parent_class)->destroy (
-@@ -356,7 +361,7 @@ ibus_engine_simple_update_preedit_text (IBusEngineSimple *simple)
- {
-     IBusEngineSimplePrivate *priv = simple->priv;
- 
--    gunichar outbuf[EMOJI_SOURCE_LEN + 1];
-+    gunichar outbuf[COMPOSE_BUFFER_SIZE + 1];
-     int len = 0;
- 
-     if (priv->in_hex_sequence || priv->in_emoji_sequence) {
-@@ -376,10 +381,7 @@ ibus_engine_simple_update_preedit_text (IBusEngineSimple *simple)
-             ++hexchars;
-         }
- 
--        if (priv->in_hex_sequence)
--            g_assert (len <= IBUS_MAX_COMPOSE_LEN + 1);
--        else
--            g_assert (len <= EMOJI_SOURCE_LEN + 1);
-+        g_assert (len <= COMPOSE_BUFFER_SIZE);
-     } else if (priv->tentative_match) {
-         outbuf[len++] = priv->tentative_match;
-     } else if (priv->tentative_emoji && *priv->tentative_emoji) {
-@@ -406,7 +408,7 @@ ibus_engine_simple_update_preedit_text (IBusEngineSimple *simple)
-             ++len;
-             ++hexchars;
-         }
--        g_assert (len <= IBUS_MAX_COMPOSE_LEN + 1);
-+        g_assert (len <= IBUS_MAX_COMPOSE_LEN);
-     }
- 
-     outbuf[len] = L'\0';
-@@ -1265,11 +1267,11 @@ ibus_engine_simple_process_key_event (IBusEngine *engine,
-     guint printable_keyval;
-     gint i;
- 
--    while (n_compose < EMOJI_SOURCE_LEN && priv->compose_buffer[n_compose] != 0)
-+    while (n_compose <= COMPOSE_BUFFER_SIZE && priv->compose_buffer[n_compose] != 0)
-         n_compose++;
--    if (n_compose >= EMOJI_SOURCE_LEN) {
-+    if (n_compose > COMPOSE_BUFFER_SIZE) {
-         g_warning ("copmose table buffer is full.");
--        n_compose = EMOJI_SOURCE_LEN - 1;
-+        n_compose = COMPOSE_BUFFER_SIZE;
-     }
- 
-     if (modifiers & IBUS_RELEASE_MASK) {
-@@ -1348,8 +1350,8 @@ ibus_engine_simple_process_key_event (IBusEngine *engine,
-     /* gtkimcontextsimple causes a buffer overflow in priv->compose_buffer.
-      * Add the check code here.
-      */
--    if ((n_compose >= IBUS_MAX_COMPOSE_LEN && priv->in_hex_sequence) ||
--        (n_compose >= EMOJI_SOURCE_LEN && priv->in_emoji_sequence)) {
-+    if (n_compose > COMPOSE_BUFFER_SIZE &&
-+        (priv->in_hex_sequence || priv->in_emoji_sequence)) {
-         if (is_backspace) {
-             priv->compose_buffer[--n_compose] = 0;
-         }
--- 
-2.21.0
-
-From 80254484071eb57e1152579b60ec8a95522ebc22 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Mon, 24 Jun 2019 17:28:55 +0900
-Subject: [PATCH 17/27] src: s/iso_639-3/iso_639_3/ in ibus_get_language_name()
-
-iso-codes 3.66 has iso_639_3.xml only but 3.67 has both iso_639_3.xml
-and iso_639-3.xml. RHEL 7 uses iso-codes 3.46.
-
-BUG=https://github.com/ibus/ibus/issues/2101
----
- ibus/lang.py   |  6 +++---
- src/ibusutil.c | 10 +++++-----
- 2 files changed, 8 insertions(+), 8 deletions(-)
-
-diff --git a/ibus/lang.py b/ibus/lang.py
-index 64324bd8..238a9172 100644
---- a/ibus/lang.py
-+++ b/ibus/lang.py
-@@ -3,7 +3,7 @@
- # ibus - The Input Bus
- #
- # Copyright (c) 2007-2010 Peng Huang <shawn.p.huang@gmail.com>
--# Copyright (c) 2007-2010 Red Hat, Inc.
-+# Copyright (c) 2007-2019 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
-@@ -36,7 +36,7 @@ def get_language_name(_locale):
-     lang = lang.lower()
-     if lang in __languages_dict:
-         lang = __languages_dict[lang]
--        lang = gettext.dgettext("iso_639-3", lang)
-+        lang = gettext.dgettext("iso_639_3", lang)
-     else:
-         lang = _(u"Other")
-         lang = gettext.dgettext("ibus", lang)
-@@ -62,7 +62,7 @@ def __char_data(data):
- def __load_lang():
-     import os
-     import _config
--    iso_639_3_xml = os.path.join(_config.ISOCODES_PREFIX, "share/xml/iso-codes/iso_639-3.xml")
-+    iso_639_3_xml = os.path.join(_config.ISOCODES_PREFIX, "share/xml/iso-codes/iso_639_3.xml")
-     p = xml.parsers.expat.ParserCreate()
-     p.StartElementHandler = __start_element
-     p.EndElementHandler = __end_element
-diff --git a/src/ibusutil.c b/src/ibusutil.c
-index 9d003e2e..88c054a2 100644
---- a/src/ibusutil.c
-+++ b/src/ibusutil.c
-@@ -2,7 +2,7 @@
- /* vim:set et sts=4: */
- /* bus - The Input Bus
-  * Copyright (C) 2008-2015 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright (C) 2010-2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2010-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
-  * Copyright (C) 2008-2016 Red Hat, Inc.
-  *
-  * This library is free software; you can redistribute it and/or
-@@ -99,14 +99,14 @@ _load_lang()
-     struct stat buf;
- 
- #ifdef ENABLE_NLS
--    bindtextdomain ("iso_639-3", LOCALEDIR);
--    bind_textdomain_codeset ("iso_639-3", "UTF-8");
-+    bindtextdomain ("iso_639_3", LOCALEDIR);
-+    bind_textdomain_codeset ("iso_639_3", "UTF-8");
- #endif
- 
-     __languages_dict = g_hash_table_new_full (g_str_hash,
-             g_str_equal, g_free, g_free);
-     filename = g_build_filename (ISOCODES_PREFIX,
--                                 "share/xml/iso-codes/iso_639-3.xml",
-+                                 "share/xml/iso-codes/iso_639_3.xml",
-                                  NULL);
-     if (g_stat (filename, &buf) != 0) {
-         g_warning ("Can not get stat of file %s", filename);
-@@ -197,7 +197,7 @@ ibus_get_language_name (const gchar *_locale)
-     if (g_strcmp0 (raw, "Other") == 0)
-         return g_strdup (dgettext (GETTEXT_PACKAGE, N_("Other")));
-     else
--        translation = dgettext ("iso_639-3", raw);
-+        translation = dgettext ("iso_639_3", raw);
- #else
-     translation = raw;
- #endif
--- 
-2.21.0
-
-From 69e443c07f944b3137aada31dcdbcb49728ff805 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Fri, 28 Jun 2019 20:43:36 +0900
-Subject: [PATCH 18/27] bus: Disable panel extension for gnome-initial-setup
- user
-
-gnome-initial-setup user is executed before the post setup is finished
-after the installation is finished.
----
- bus/main.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/bus/main.c b/bus/main.c
-index 6f1f39ca..3223d541 100644
---- a/bus/main.c
-+++ b/bus/main.c
-@@ -49,6 +49,7 @@ static gchar *desktop = "gnome";
- 
- static gchar *panel_extension_disable_users[] = {
-     "gdm",
-+    "gnome-initial-setup",
-     "liveuser"
- };
- 
--- 
-2.21.0
-
-From c360cbd830943a4bfb0ece9cc07b99a426dc2121 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Mon, 9 Apr 2018 11:57:09 +0900
-Subject: [PATCH] src/tests: Add ibus-compose.env
-
----
- src/tests/ibus-compose.env | 3 +++
- 1 file changed, 3 insertions(+)
- create mode 100644 src/tests/ibus-compose.env
-
-diff --git a/src/tests/ibus-compose.env b/src/tests/ibus-compose.env
-new file mode 100644
-index 00000000..734ab8fa
---- /dev/null
-+++ b/src/tests/ibus-compose.env
-@@ -0,0 +1,3 @@
-+LANG=el_GR.UTF-8
-+LANG=fi_FI.UTF-8
-+LANG=pt_BR.UTF-8
--- 
-2.21.0
-
-From ac492f31b435b9464d591094d470bc94027168e8 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Fri, 28 Jun 2019 21:15:07 +0900
-Subject: [PATCH 19/27] src/tests: Fix ibus-compose for IBusComposeTableEx
-
-Recently IBusComposeTablEx has been integrated and the return value of
-ibus_compose_table_new_with_file() is also changed and ibus-compose
-needs to be updated.
-
-Clear IBusComposeTablePrivate in ibus_compose_table_list_add_array()
-for the ibus-compose testing.
-
-Clear compose_buffer in IBusEngineSimple.
-
-Use g_get_language_names_with_category instead() of g_get_locale_variants().
-
-Add ibus-compose.emoji for the tests of long compose sequences and
-multiple compose output characters.
-
-IBUS_COMPOSE_CACHE_DIR variable is added for the temporary caches.
----
- src/ibuscomposetable.c       |  15 ++--
- src/ibuscomposetable.h       |   4 +
- src/ibusenginesimple.c       |  14 ++-
- src/tests/Makefile.am        |   2 +-
- src/tests/ibus-compose.c     | 163 +++++++++++++++++++++++++++--------
- src/tests/ibus-compose.emoji |  11 +++
- src/tests/ibus-compose.env   |   1 +
- src/tests/runtest            |   4 +-
- 8 files changed, 174 insertions(+), 47 deletions(-)
- create mode 100644 src/tests/ibus-compose.emoji
-
-diff --git a/src/ibuscomposetable.c b/src/ibuscomposetable.c
-index 4ac54e25..5fd37f10 100644
---- a/src/ibuscomposetable.c
-+++ b/src/ibuscomposetable.c
-@@ -497,13 +497,18 @@ static gchar *
- ibus_compose_hash_get_cache_path (guint32 hash)
- {
-     gchar *basename = NULL;
-+    const gchar *cache_dir;
-     gchar *dir = NULL;
-     gchar *path = NULL;
- 
-     basename = g_strdup_printf ("%08x.cache", hash);
- 
--    dir = g_build_filename (g_get_user_cache_dir (),
--                            "ibus", "compose", NULL);
-+    if ((cache_dir = g_getenv ("IBUS_COMPOSE_CACHE_DIR"))) {
-+        dir = g_strdup (cache_dir);
-+    } else {
-+        dir = g_build_filename (g_get_user_cache_dir (),
-+                                "ibus", "compose", NULL);
-+    }
-     path = g_build_filename (dir, basename, NULL);
-     if (g_mkdir_with_parents (dir, 0755) != 0) {
-         g_warning ("Failed to mkdir %s", dir);
-@@ -817,7 +822,7 @@ out_load_cache:
- }
- 
- 
--static IBusComposeTableEx *
-+IBusComposeTableEx *
- ibus_compose_table_load_cache (const gchar *compose_file)
- {
-     IBusComposeTableEx *retval = NULL;
-@@ -862,7 +867,7 @@ ibus_compose_table_load_cache (const gchar *compose_file)
- }
- 
- 
--static void
-+void
- ibus_compose_table_save_cache (IBusComposeTableEx *compose_table)
- {
-     gchar *path = NULL;
-@@ -1068,7 +1073,7 @@ ibus_compose_table_list_add_array (GSList        *compose_tables,
-     for (i = 0; i < length; i++)
-         ibus_compose_seqs[i] = data[i];
- 
--    compose_table = g_new (IBusComposeTableEx, 1);
-+    compose_table = g_new0 (IBusComposeTableEx, 1);
-     compose_table->data = ibus_compose_seqs;
-     compose_table->max_seq_len = max_seq_len;
-     compose_table->n_seqs = n_seqs;
-diff --git a/src/ibuscomposetable.h b/src/ibuscomposetable.h
-index 777c5f42..b60e53fe 100644
---- a/src/ibuscomposetable.h
-+++ b/src/ibuscomposetable.h
-@@ -71,6 +71,10 @@ struct _IBusComposeTableCompactEx
- 
- IBusComposeTableEx *
-                   ibus_compose_table_new_with_file (const gchar *compose_file);
-+IBusComposeTableEx *
-+                  ibus_compose_table_load_cache    (const gchar *compose_file);
-+void              ibus_compose_table_save_cache    (IBusComposeTableEx
-+                                                                *compose_table);
- GSList *          ibus_compose_table_list_add_array
-                                                    (GSList
-                                                                 *compose_tables,
-diff --git a/src/ibusenginesimple.c b/src/ibusenginesimple.c
-index 0604693d..b623e149 100644
---- a/src/ibusenginesimple.c
-+++ b/src/ibusenginesimple.c
-@@ -178,7 +178,7 @@ static void
- ibus_engine_simple_init (IBusEngineSimple *simple)
- {
-     simple->priv = IBUS_ENGINE_SIMPLE_GET_PRIVATE (simple);
--    simple->priv->compose_buffer = g_new (guint16, COMPOSE_BUFFER_SIZE + 1);
-+    simple->priv->compose_buffer = g_new0(guint16, COMPOSE_BUFFER_SIZE + 1);
-     simple->priv->hex_mode_enabled =
-         g_getenv("IBUS_ENABLE_CTRL_SHIFT_U") != NULL ||
-         g_getenv("IBUS_ENABLE_CONTROL_SHIFT_U") != NULL;
-@@ -1747,9 +1747,14 @@ ibus_engine_simple_add_table_by_locale (IBusEngineSimple *simple,
-     gboolean retval = TRUE;
-     gchar *path = NULL;
-     const gchar *home;
-+#if GLIB_CHECK_VERSION (2, 58, 0)
-+    const gchar * const *langs;
-+    const gchar * const *lang = NULL;
-+#else
-     const gchar *_locale;
-     gchar **langs = NULL;
-     gchar **lang = NULL;
-+#endif
-     gchar * const sys_langs[] = { "el_gr", "fi_fi", "pt_br", NULL };
-     gchar * const *sys_lang = NULL;
- 
-@@ -1787,6 +1792,9 @@ ibus_engine_simple_add_table_by_locale (IBusEngineSimple *simple,
-         g_free (path);
-         path = NULL;
- 
-+#if GLIB_CHECK_VERSION (2, 58, 0)
-+        langs = g_get_language_names_with_category ("LC_CTYPE");
-+#else
-         _locale = g_getenv ("LC_CTYPE");
-         if (_locale == NULL)
-             _locale = g_getenv ("LANG");
-@@ -1795,6 +1803,7 @@ ibus_engine_simple_add_table_by_locale (IBusEngineSimple *simple,
- 
-         /* FIXME: https://bugzilla.gnome.org/show_bug.cgi?id=751826 */
-         langs = g_get_locale_variants (_locale);
-+#endif
- 
-         for (lang = langs; *lang; lang++) {
-             if (g_str_has_prefix (*lang, "en_US"))
-@@ -1821,7 +1830,9 @@ ibus_engine_simple_add_table_by_locale (IBusEngineSimple *simple,
-             path = NULL;
-         }
- 
-+#if !GLIB_CHECK_VERSION (2, 58, 0)
-         g_strfreev (langs);
-+#endif
- 
-         if (path != NULL)
-             ibus_engine_simple_add_compose_file (simple, path);
-@@ -1853,3 +1864,4 @@ ibus_engine_simple_add_compose_file (IBusEngineSimple *simple,
-                                                       compose_file);
-     return TRUE;
- }
-+
-diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am
-index e2ff5ea7..a58504a3 100644
---- a/src/tests/Makefile.am
-+++ b/src/tests/Makefile.am
-@@ -78,7 +78,7 @@ TESTS_ENVIRONMENT = \
- 
- LOG_COMPILER = $(srcdir)/runtest
- 
--EXTRA_DIST = runtest ibus-compose.env
-+EXTRA_DIST = runtest ibus-compose.emoji ibus-compose.env
- 
- ibus_bus_SOURCES = ibus-bus.c
- ibus_bus_LDADD = $(prog_ldadd)
-diff --git a/src/tests/ibus-compose.c b/src/tests/ibus-compose.c
-index aabb36ac..e1911b32 100644
---- a/src/tests/ibus-compose.c
-+++ b/src/tests/ibus-compose.c
-@@ -1,37 +1,36 @@
- #include <gtk/gtk.h>
- #include "ibus.h"
- #include "ibuscomposetable.h"
-+#include "ibusenginesimpleprivate.h"
- 
- #define GREEN "\033[0;32m"
- #define RED   "\033[0;31m"
- #define NC    "\033[0m"
- 
- IBusBus *m_bus;
--IBusComposeTable *m_compose_table;
-+gchar *m_compose_file;
-+IBusComposeTableEx *m_compose_table;
- IBusEngine *m_engine;
-+gchar *m_srcdir;
- int m_retval;
- 
- static gboolean window_focus_in_event_cb (GtkWidget     *entry,
-                                           GdkEventFocus *event,
-                                           gpointer       data);
- 
--static IBusEngine *
--create_engine_cb (IBusFactory *factory, const gchar *name, gpointer data)
-+
-+static gchar *
-+get_compose_path ()
- {
--    static int i = 1;
--    gchar *engine_path =
--            g_strdup_printf ("/org/freedesktop/IBus/engine/simpletest/%d",
--                             i++);
--    gchar *compose_path = NULL;
-     const gchar * const *langs;
-     const gchar * const *l;
-+    gchar *compose_path = NULL;
- 
--    m_engine = ibus_engine_new_with_type (IBUS_TYPE_ENGINE_SIMPLE,
--                                          name,
--                                          engine_path,
--                                          ibus_bus_get_connection (m_bus));
--    g_free (engine_path);
-+#if GLIB_CHECK_VERSION (2, 58, 0)
-+    langs = g_get_language_names_with_category ("LC_CTYPE");
-+#else
-     langs = g_get_language_names ();
-+#endif
-     for (l = langs; *l; l++) {
-         if (g_str_has_prefix (*l, "en_US"))
-             break;
-@@ -46,18 +45,39 @@ create_engine_cb (IBusFactory *factory, const gchar *name, gpointer data)
-         g_free (compose_path);
-         compose_path = NULL;
-     }
-+
-+    return compose_path;
-+}
-+
-+
-+static IBusEngine *
-+create_engine_cb (IBusFactory *factory,
-+                  const gchar *name,
-+                  gpointer     data)
-+{
-+    static int i = 1;
-+    gchar *engine_path =
-+            g_strdup_printf ("/org/freedesktop/IBus/engine/simpletest/%d",
-+                             i++);
-+    gchar *compose_path;
-+
-+    m_engine = ibus_engine_new_with_type (IBUS_TYPE_ENGINE_SIMPLE,
-+                                          name,
-+                                          engine_path,
-+                                          ibus_bus_get_connection (m_bus));
-+    g_free (engine_path);
-+    if (m_compose_file)
-+        compose_path = g_build_filename (m_srcdir, m_compose_file, NULL);
-+    else
-+        compose_path = get_compose_path ();
-     if (compose_path != NULL) {
--        m_compose_table = ibus_compose_table_new_with_file (compose_path);
-+        ibus_engine_simple_add_compose_file (IBUS_ENGINE_SIMPLE (m_engine),
-+                                             compose_path);
-+        m_compose_table = ibus_compose_table_load_cache (compose_path);
-         if (m_compose_table == NULL)
-             g_warning ("Your locale uses en_US compose table.");
--        else
--            ibus_engine_simple_add_table (IBUS_ENGINE_SIMPLE (m_engine),
--                                          m_compose_table->data,
--                                          m_compose_table->max_seq_len,
--                                          m_compose_table->n_seqs);
--    } else {
--        g_warning ("Your locale uses en_US compose file.");
-     }
-+    g_free (compose_path);
-     return m_engine;
- }
- 
-@@ -118,6 +138,7 @@ set_engine_cb (GObject *object, GAsyncResult *res, gpointer data)
-     GError *error = NULL;
-     int i, j;
-     int index_stride;
-+    IBusComposeTablePrivate *priv;
- 
-     if (!ibus_bus_set_global_engine_async_finish (bus, res, &error)) {
-         g_warning ("set engine failed: %s", error->message);
-@@ -149,6 +170,27 @@ set_engine_cb (GObject *object, GAsyncResult *res, gpointer data)
-                                    keyval, keycode, modifiers, &retval);
-         }
-     }
-+    priv = m_compose_table->priv;
-+    if (priv) {
-+        for (i = 0;
-+             i < (priv->first_n_seqs * index_stride);
-+             i += index_stride) {
-+            for (j = i; j < i + (index_stride - 1); j++) {
-+                guint keyval = priv->data_first[j];
-+                guint keycode = 0;
-+                guint modifiers = 0;
-+                gboolean retval;
-+
-+                if (keyval == 0)
-+                    break;
-+                g_signal_emit_by_name (m_engine, "process-key-event",
-+                                       keyval, keycode, modifiers, &retval);
-+                modifiers |= IBUS_RELEASE_MASK;
-+                g_signal_emit_by_name (m_engine, "process-key-event",
-+                                       keyval, keycode, modifiers, &retval);
-+            }
-+        }
-+    }
- 
-     g_signal_handlers_disconnect_by_func (entry, 
-                                           G_CALLBACK (window_focus_in_event_cb),
-@@ -183,41 +225,87 @@ window_inserted_text_cb (GtkEntryBuffer *buffer,
-     static int n_loop = 0;
- #endif
-     static guint stride = 0;
-+    static gboolean enable_32bit = FALSE;
-     guint i;
-     int seq;
-     gunichar code = g_utf8_get_char (chars);
-     const gchar *test;
-     GtkEntry *entry = GTK_ENTRY (data);
-+    IBusComposeTablePrivate *priv;
- 
-     g_assert (m_compose_table != NULL);
- 
-+    priv = m_compose_table->priv;
-+
- #if !GTK_CHECK_VERSION (3, 22, 16)
-     if (n_loop % 2 == 1) {
-         n_loop = 0;
-         return;
-     }
- #endif
--    i = stride + (m_compose_table->max_seq_len + 2) - 1;
--    seq = (i + 1) / (m_compose_table->max_seq_len + 2);
--    if (m_compose_table->data[i] == code) {
--        test = GREEN "PASS" NC;
-+    i = stride + (m_compose_table->max_seq_len + 2) - 2;
-+    seq = (i + 2) / (m_compose_table->max_seq_len + 2);
-+    if (!enable_32bit) {
-+        if (m_compose_table->data[i] == code) {
-+            test = GREEN "PASS" NC;
-+        } else {
-+            test = RED "FAIL" NC;
-+            m_retval = -1;
-+        }
-+        g_print ("%05d/%05d %s expected: %04X typed: %04X\n",
-+                 seq,
-+                 m_compose_table->n_seqs,
-+                 test,
-+                 m_compose_table->data[i],
-+                 code);
-     } else {
--        test = RED "FAIL" NC;
--        m_retval = -1;
-+        const gchar *p = chars;
-+        guint num = priv->data_first[i];
-+        guint index = priv->data_first[i + 1];
-+        guint j = 0;
-+        gboolean valid_output = TRUE;
-+        if (seq == 2)
-+            g_print ("test\n");
-+        for (j = 0; j < num; j++) {
-+            if (priv->data_second[index + j] != code) {
-+                valid_output = FALSE;
-+                break;
-+            }
-+            p = g_utf8_next_char (p);
-+            code = g_utf8_get_char (p);
-+        }
-+        if (valid_output) {
-+            test = GREEN "PASS" NC;
-+        } else {
-+            test = RED "FAIL" NC;
-+            m_retval = -1;
-+        }
-+        g_print ("%05d/%05ld %s expected: %04X[%d] typed: %04X\n",
-+                 seq,
-+                 priv->first_n_seqs,
-+                 test,
-+                 valid_output ? priv->data_second[index]
-+                         : priv->data_second[index + j],
-+                 valid_output ? index + num : index + j,
-+                 valid_output ? g_utf8_get_char (chars) : code);
-     }
--    g_print ("%05d/%05d %s expected: %04X typed: %04X\n",
--             seq,
--             m_compose_table->n_seqs,
--             test,
--             m_compose_table->data[i],
--             code);
--
--    if (seq == m_compose_table->n_seqs) {
-+
-+    stride += m_compose_table->max_seq_len + 2;
-+
-+    if (!enable_32bit && seq == m_compose_table->n_seqs) {
-+        if (priv) {
-+            enable_32bit = TRUE;
-+            stride = 0;
-+        } else {
-+            gtk_main_quit ();
-+            return;
-+        }
-+    }
-+    if (enable_32bit && seq == priv->first_n_seqs) {
-         gtk_main_quit ();
-         return;
-     }
- 
--    stride += m_compose_table->max_seq_len + 2;
- #if !GTK_CHECK_VERSION (3, 22, 16)
-     n_loop++;
- #endif
-@@ -248,6 +336,9 @@ main (int argc, char *argv[])
-     ibus_init ();
-     gtk_init (&argc, &argv);
- 
-+    m_srcdir = argc > 1 ? g_strdup (argv[1]) : g_strdup (".");
-+    m_compose_file = g_strdup (g_getenv ("COMPOSE_FILE"));
-+
-     if (!register_ibus_engine ())
-         return -1;
- 
-diff --git a/src/tests/ibus-compose.emoji b/src/tests/ibus-compose.emoji
-new file mode 100644
-index 00000000..7fbf82cf
---- /dev/null
-+++ b/src/tests/ibus-compose.emoji
-@@ -0,0 +1,11 @@
-+<Multi_key> <Multi_key> <l> <e> <o>             : "♌"  U264C   # LEO
-+<Multi_key> <Multi_key> <v> <i> <r> <g> <o>     : "♍"  U264D   # VIRGO
-+<Multi_key> <Multi_key> <I> <n> <t>             : "∫"
-+<Multi_key> <Multi_key> <I> <I> <n> <t>         : "∬"
-+<Multi_key> <Multi_key> <I> <I> <n> <o>         : "🗼"
-+<Multi_key> <Multi_key> <I> <I> <n> <p>         : "(゜∀゜)"
-+<Multi_key> <Multi_key> <I> <I> <n> <q>         : "*・゜゜・*:.。..。.:*・゜(n‘Д‘)η゜・*:.。. .。.:*・ ゜゜・* !!!!!"
-+<Multi_key> <Multi_key> <I> <I> <I> <n> <t>     : "∭"
-+<Multi_key> <Multi_key> <o> <I> <n> <t>         : "∮"
-+<Multi_key> <Multi_key> <o> <I> <I> <n> <t>     : "∯"
-+<Multi_key> <Multi_key> <o> <I> <I> <I> <n> <t> : "∰"
-diff --git a/src/tests/ibus-compose.env b/src/tests/ibus-compose.env
-index 734ab8fa..a9e289e4 100644
---- a/src/tests/ibus-compose.env
-+++ b/src/tests/ibus-compose.env
-@@ -1,3 +1,4 @@
- LANG=el_GR.UTF-8
- LANG=fi_FI.UTF-8
- LANG=pt_BR.UTF-8
-+LANG=en_US.UTF-8 COMPOSE_FILE=ibus-compose.emoji
-diff --git a/src/tests/runtest b/src/tests/runtest
-index 4e980c71..35ccc5a0 100755
---- a/src/tests/runtest
-+++ b/src/tests/runtest
-@@ -184,7 +184,9 @@ run_test_case()
-         export GTK_IM_MODULE=ibus
-     fi
- 
--    "../$tst" ${1+"$@"}
-+    export IBUS_COMPOSE_CACHE_DIR=$PWD
-+
-+    "../$tst" ../$top_srcdir/src/tests ${1+"$@"}
- 
-     retval=`expr $retval \| $?`
- 
--- 
-2.21.0
-
-From 76dec798d5cf6cdaa96c3373f9c0e1cd13eb31f5 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Fri, 28 Jun 2019 21:28:32 +0900
-Subject: [PATCH 20/27] src/tests: Use GTest for ibus-compose
-
----
- src/tests/ibus-compose.c | 45 ++++++++++++++++++++++++++++------------
- 1 file changed, 32 insertions(+), 13 deletions(-)
-
-diff --git a/src/tests/ibus-compose.c b/src/tests/ibus-compose.c
-index e1911b32..09c687c2 100644
---- a/src/tests/ibus-compose.c
-+++ b/src/tests/ibus-compose.c
-@@ -12,7 +12,6 @@ gchar *m_compose_file;
- IBusComposeTableEx *m_compose_table;
- IBusEngine *m_engine;
- gchar *m_srcdir;
--int m_retval;
- 
- static gboolean window_focus_in_event_cb (GtkWidget     *entry,
-                                           GdkEventFocus *event,
-@@ -124,8 +123,7 @@ register_ibus_engine ()
- static gboolean
- finit (gpointer data)
- {
--    m_retval = -1;
--    g_warning ("time out");
-+    g_test_incomplete ("time out");
-     gtk_main_quit ();
-     return FALSE;
- }
-@@ -141,7 +139,9 @@ set_engine_cb (GObject *object, GAsyncResult *res, gpointer data)
-     IBusComposeTablePrivate *priv;
- 
-     if (!ibus_bus_set_global_engine_async_finish (bus, res, &error)) {
--        g_warning ("set engine failed: %s", error->message);
-+        gchar *msg = g_strdup_printf ("set engine failed: %s", error->message);
-+        g_test_incomplete (msg);
-+        g_free (msg);
-         g_error_free (error);
-         return;
-     }
-@@ -250,7 +250,7 @@ window_inserted_text_cb (GtkEntryBuffer *buffer,
-             test = GREEN "PASS" NC;
-         } else {
-             test = RED "FAIL" NC;
--            m_retval = -1;
-+            g_test_fail ();
-         }
-         g_print ("%05d/%05d %s expected: %04X typed: %04X\n",
-                  seq,
-@@ -278,7 +278,7 @@ window_inserted_text_cb (GtkEntryBuffer *buffer,
-             test = GREEN "PASS" NC;
-         } else {
-             test = RED "FAIL" NC;
--            m_retval = -1;
-+            g_test_fail ();
-         }
-         g_print ("%05d/%05ld %s expected: %04X[%d] typed: %04X\n",
-                  seq,
-@@ -330,20 +330,39 @@ create_window ()
-     gtk_widget_show_all (window);
- }
- 
-+static void
-+test_compose (void)
-+{
-+    if (!register_ibus_engine ()) {
-+        g_test_fail ();
-+        return;
-+    }
-+
-+    create_window ();
-+    gtk_main ();
-+
-+}
-+
- int
- main (int argc, char *argv[])
- {
-+    const gchar *test_name;
-+    gchar *test_path;
-+
-     ibus_init ();
-+    g_test_init (&argc, &argv, NULL);
-     gtk_init (&argc, &argv);
- 
-     m_srcdir = argc > 1 ? g_strdup (argv[1]) : g_strdup (".");
-     m_compose_file = g_strdup (g_getenv ("COMPOSE_FILE"));
-+#if GLIB_CHECK_VERSION (2, 58, 0)
-+    test_name = g_get_language_names_with_category ("LC_CTYPE")[0];
-+#else
-+    test_name = g_getenv ("LANG");
-+#endif
-+    test_path = g_build_filename ("/ibus-compose", test_name, NULL);
-+    g_test_add_func (test_path, test_compose);
-+    g_free (test_path);
- 
--    if (!register_ibus_engine ())
--        return -1;
--
--    create_window ();
--    gtk_main ();
--
--    return m_retval;
-+    return g_test_run ();
- }
--- 
-2.21.0
-
-From 6bdc692e0dc72a9afae5407983859e88c16b4971 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Wed, 10 Jul 2019 18:18:04 +0900
-Subject: [PATCH 21/27] src: Support common_name in ISO 639
-
-Nowadays "Bangla" is preferred to "Bengali" for BN language code
-and iso_639*.xml describes it in "common_name" tag.
-
-BUG=https://github.com/ibus/ibus/issues/2104
----
- src/ibusutil.c | 21 ++++++++++++++++-----
- 1 file changed, 16 insertions(+), 5 deletions(-)
-
-diff --git a/src/ibusutil.c b/src/ibusutil.c
-index 88c054a2..701984c7 100644
---- a/src/ibusutil.c
-+++ b/src/ibusutil.c
-@@ -53,6 +53,7 @@ _iso_codes_parse_xml_node (XMLNode          *node)
-         XMLNode *sub_node = (XMLNode *)p->data;
-         gchar **attributes = NULL;
-         int i, j;
-+        gboolean has_common_name = FALSE;
-         struct {
-             const gchar *key;
-             gchar *value;
-@@ -68,14 +69,24 @@ _iso_codes_parse_xml_node (XMLNode          *node)
- 
-         attributes = sub_node->attributes;
-         for (i = 0; attributes[i]; i += 2) {
--            if (g_strcmp0 (attributes[i], "name") == 0) {
-+            if (!g_strcmp0 (attributes[i], "common_name")) {
-                 for (j = 0; j < G_N_ELEMENTS (entries); j++) {
-                     if (entries[j].value == NULL)
-                         continue;
--                    g_hash_table_insert (__languages_dict,
--                                         (gpointer) g_strdup (entries[j].value),
--                                         (gpointer) g_strdup (attributes[i + 1]));
--                    entries[j].value = NULL;
-+                    g_hash_table_replace (__languages_dict,
-+                                          g_strdup (entries[j].value),
-+                                          g_strdup (attributes[i + 1]));
-+                }
-+                has_common_name = TRUE;
-+            } else if (!g_strcmp0 (attributes[i], "name")) {
-+                if (has_common_name)
-+                    continue;
-+                for (j = 0; j < G_N_ELEMENTS (entries); j++) {
-+                    if (entries[j].value == NULL)
-+                        continue;
-+                    g_hash_table_replace (__languages_dict,
-+                                          g_strdup (entries[j].value),
-+                                          g_strdup (attributes[i + 1]));
-                 }
-             } else {
-                 for (j = 0; j < G_N_ELEMENTS (entries); j++) {
--- 
-2.21.0
-
-From af00f4156b5c79c526eab18c49da80affd41ebee Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Fri, 12 Jul 2019 21:12:38 +0900
-Subject: [PATCH 22/27] src/tests: Install IBus tests into
- gnome-desktop-testing
-
----
- configure.ac                      | 13 +++++++++++
- src/tests/Makefile.am             | 39 ++++++++++++++++++++++++++++++-
- src/tests/ibus-compose-locales.in | 23 ++++++++++++++++++
- src/tests/ibus-compose.c          | 10 ++++++--
- src/tests/meta.test.in            |  4 ++++
- src/tests/runtest                 |  4 ++--
- 6 files changed, 88 insertions(+), 5 deletions(-)
- create mode 100755 src/tests/ibus-compose-locales.in
- create mode 100644 src/tests/meta.test.in
-
-diff --git a/configure.ac b/configure.ac
-index b5a87b56..f1df3ac1 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -595,6 +595,18 @@ PKG_CHECK_MODULES(XTEST,
- )
- AM_CONDITIONAL([ENABLE_XTEST], [test x"$enable_xtest" = x"yes"])
- 
-+# --enable-install-tests
-+AC_ARG_ENABLE(install-tests,
-+    AS_HELP_STRING([--enable-install-tests],
-+                   [Enable to install tests]),
-+    [enable_install_tests=$enableval],
-+    [enable_install_tests=no]
-+)
-+AM_CONDITIONAL([ENABLE_INSTALL_TESTS], [test x"$enable_install_tests" = x"yes"])
-+if test x"$enable_install_tests" = x"no"; then
-+    enable_install_tests="no (disabled, use --enable-install-tests to enable)"
-+fi
-+
- 
- # --disable-emoji-dict option.
- AC_ARG_ENABLE(emoji-dict,
-@@ -773,5 +785,6 @@ Build options:
-   Enable Unicode dict           $enable_unicode_dict
-   UCD directory                 $UCD_DIR
-   Run test cases                $enable_tests
-+  Install tests                 $enable_install_tests
- ])
- 
-diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am
-index a58504a3..ff31111b 100644
---- a/src/tests/Makefile.am
-+++ b/src/tests/Makefile.am
-@@ -78,7 +78,44 @@ TESTS_ENVIRONMENT = \
- 
- LOG_COMPILER = $(srcdir)/runtest
- 
--EXTRA_DIST = runtest ibus-compose.emoji ibus-compose.env
-+if ENABLE_INSTALL_TESTS
-+test_metas_in = meta.test.in
-+test_execs = $(TESTS:ibus-compose=ibus-compose-locales)
-+test_metas = $(addsuffix .test, $(test_execs))
-+test_sources_DATA = \
-+    $(test_metas) \
-+    ibus-compose.emoji \
-+    ibus-compose.env \
-+    $(NULL)
-+test_sourcesdir = $(datadir)/installed-tests/ibus
-+
-+test_execs_PROGRAMS = $(TESTS)
-+if ENABLE_GTK3
-+test_execs_SCRIPTS = ibus-compose-locales
-+endif
-+test_execsdir = $(libexecdir)/installed-tests/ibus
-+endif
-+
-+$(test_metas): $(test_metas_in) $(test_programs)
-+	f=`echo $@ | sed -e 's/\.test//'`; \
-+	TEST_EXEC=$(test_execsdir)/$$f; \
-+	sed -e "s|@TEST_EXEC[@]|$$TEST_EXEC|g" $(test_metas_in) > $@.tmp; \
-+	mv $@.tmp $@; \
-+	$(NULL)
-+
-+ibus-compose-locales: ibus-compose-locales.in
-+	SRCDIR=$(test_sourcesdir); \
-+	sed -e "s|@SRCDIR[@]|$$SRCDIR|g" $< > $@.tmp; \
-+	mv $@.tmp $@; \
-+	$(NULL)
-+
-+EXTRA_DIST = \
-+    $(test_metas_in) \
-+    runtest \
-+    ibus-compose.emoji \
-+    ibus-compose.env \
-+    ibus-compose-locales.in \
-+    $(NULL)
- 
- ibus_bus_SOURCES = ibus-bus.c
- ibus_bus_LDADD = $(prog_ldadd)
-diff --git a/src/tests/ibus-compose-locales.in b/src/tests/ibus-compose-locales.in
-new file mode 100755
-index 00000000..8d2384d1
---- /dev/null
-+++ b/src/tests/ibus-compose-locales.in
-@@ -0,0 +1,23 @@
-+#!/bin/sh
-+
-+SRCDIR=@SRCDIR@
-+BUILDDIR=`dirname $0`
-+
-+
-+export IBUS_COMPOSE_CACHE_DIR=$PWD
-+
-+for var in `cat $SRCDIR/ibus-compose.env`
-+do
-+    IS_COMMENT=`echo "$var" | grep "^#"`
-+    if [ "x$IS_COMMENT" != x ] ; then
-+        continue
-+    fi
-+    env $var $BUILDDIR/ibus-compose $SRCDIR $@
-+
-+    CACHE_FILES=`ls *.cache`
-+    if [ x"$CACHE_FILES" != x ] ; then
-+        echo "Clean $CACHE_FILES"
-+        rm $CACHE_FILES
-+    fi
-+done
-+
-diff --git a/src/tests/ibus-compose.c b/src/tests/ibus-compose.c
-index 09c687c2..c8d3c126 100644
---- a/src/tests/ibus-compose.c
-+++ b/src/tests/ibus-compose.c
-@@ -264,8 +264,6 @@ window_inserted_text_cb (GtkEntryBuffer *buffer,
-         guint index = priv->data_first[i + 1];
-         guint j = 0;
-         gboolean valid_output = TRUE;
--        if (seq == 2)
--            g_print ("test\n");
-         for (j = 0; j < num; j++) {
-             if (priv->data_second[index + j] != code) {
-                 valid_output = FALSE;
-@@ -351,6 +349,14 @@ main (int argc, char *argv[])
- 
-     ibus_init ();
-     g_test_init (&argc, &argv, NULL);
-+    /* FIXME:
-+     * IBusIMContext opens GtkIMContextSimple as the slave and
-+     * GtkIMContextSimple opens the compose table on el_GR.UTF-8, and the
-+     * multiple outputs in el_GR's compose causes a warning in gtkcomposetable 
-+     * and the warning always causes a fatal in GTest:
-+     " "GTK+ supports to output one char only: "
-+     */
-+    g_log_set_always_fatal (G_LOG_LEVEL_CRITICAL);
-     gtk_init (&argc, &argv);
- 
-     m_srcdir = argc > 1 ? g_strdup (argv[1]) : g_strdup (".");
-diff --git a/src/tests/meta.test.in b/src/tests/meta.test.in
-new file mode 100644
-index 00000000..ae2b2991
---- /dev/null
-+++ b/src/tests/meta.test.in
-@@ -0,0 +1,4 @@
-+[Test]
-+Type=session
-+Exec=@TEST_EXEC@ --tap
-+Output=TAP
-diff --git a/src/tests/runtest b/src/tests/runtest
-index 35ccc5a0..1fcc9283 100755
---- a/src/tests/runtest
-+++ b/src/tests/runtest
-@@ -200,7 +200,7 @@ if test -f $envfile ; then
-     ENVS="`cat $envfile`"
- fi;
- if test x"$ENVS" = x ; then
--    run_test_case
-+    run_test_case $@
- else
-     LANG_backup=$LANG
-     i=1
-@@ -212,7 +212,7 @@ else
-         export $e
-         echo "Run `func_basename $tst` on $e"
-         echo "======================="
--        run_test_case
-+        run_test_case $@
-         echo ""
-         i=`expr $i + 1`
-     done
--- 
-2.21.0
-
-From 2a4f9518d42b618d8111fa5f9f885757524758a0 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Fri, 12 Jul 2019 21:12:40 +0900
-Subject: [PATCH 23/27] src/tests: Rename test-console.sh to
- ibus-desktop-testing-runner
-
----
- src/tests/Makefile.am                                    | 9 +++++++++
- .../tests/ibus-desktop-testing-runner.in                 | 0
- 2 files changed, 9 insertions(+)
- create mode 100755 .../tests/ibus-desktop-testing-runner.in
-
-diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am
-index ff31111b..b9aad29a 100644
---- a/src/tests/Makefile.am
-+++ b/src/tests/Makefile.am
-@@ -79,6 +79,7 @@ TESTS_ENVIRONMENT = \
- LOG_COMPILER = $(srcdir)/runtest
- 
- if ENABLE_INSTALL_TESTS
-+bin_SCRIPTS = ibus-desktop-testing-runner
- test_metas_in = meta.test.in
- test_execs = $(TESTS:ibus-compose=ibus-compose-locales)
- test_metas = $(addsuffix .test, $(test_execs))
-@@ -109,12 +110,20 @@ ibus-compose-locales: ibus-compose-locales.in
- 	mv $@.tmp $@; \
- 	$(NULL)
- 
-+    ibus-desktop-testing-runner.in \
-+ibus-desktop-testing-runner: ibus-desktop-testing-runner.in
-+	SRCDIR=$(test_sourcesdir); \
-+	sed -e "s|@SRCDIR[@]|$$SRCDIR|g" $< > $@.tmp; \
-+	mv $@.tmp $@; \
-+	$(NULL)
-+
- EXTRA_DIST = \
-     $(test_metas_in) \
-     runtest \
-     ibus-compose.emoji \
-     ibus-compose.env \
-     ibus-compose-locales.in \
-+    ibus-desktop-testing-runner.in \
-     $(NULL)
- 
- ibus_bus_SOURCES = ibus-bus.c
-diff --git a/src/tests/ibus-desktop-testing-runner.in b/src/tests/ibus-desktop-testing-runner.in
-new file mode 100755
-index 00000000..07c8a96d
---- /dev/null
-+++ b/src/tests/ibus-desktop-testing-runner.in
-@@ -0,0 +1,255 @@
-+#!/bin/sh
-+# -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*-
-+# vim:set noet ts=4:
-+#
-+# ibus-anthy - The Anthy engine for IBus
-+#
-+# Copyright (c) 2018-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+# Copyright (c) 2018 Red Hat, Inc.
-+#
-+# This program is free software; you can redistribute it and/or modify
-+# it under the terms of the GNU General Public License as published by
-+# the Free Software Foundation; either version 2 of the License, or
-+# (at your option) any later version.
-+#
-+# This program 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 General Public License for more details.
-+#
-+# You should have received a copy of the GNU General Public License along
-+# with this program; if not, write to the Free Software Foundation, Inc.,
-+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-+
-+# This test runs /usr/bin/ibus-daemon after install ibus
-+#
-+# # init 3
-+# Login as root
-+# # /root/ibus/tests/test-console.sh --tests ibus-compose \
-+#   --builddir /root/ibus/src/tests --srcdir /root/ibus/src/tests
-+
-+PROGNAME=`basename $0`
-+VERSION=0.1
-+DISPLAY=:99.0
-+BUILDDIR="."
-+SRCDIR="."
-+TEST_LOG=test-suite.log
-+HAVE_GRAPHICS=1
-+DESKTOP_COMMAND="gnome-session"
-+PID_XORG=0
-+PID_GNOME_SESSION=0
-+TESTS=""
-+GREEN='\033[0;32m'
-+RED='\033[0;31m'
-+NC='\033[0m'
-+
-+usage()
-+{
-+    echo -e \
-+"This test runs /usr/bin/ibus-daemon after install ibus\n"                     \
-+"$PROGNAME [OPTIONS…]\n"                                                       \
-+"\n"                                                                           \
-+"OPTIONS:\n"                                                                   \
-+"-h, --help                       This help\n"                                 \
-+"-v, --version                    Show version\n"                              \
-+"-b, --builddir=BUILDDIR          Set the BUILDDIR\n"                          \
-+"-s, --srcdir=SOURCEDIR           Set the SOURCEDIR\n"                         \
-+"-c, --no-graphics                Use Xvfb instead of Xorg\n"                  \
-+"-d, --desktop=DESKTOP            Run DESTKTOP. The default is gnome-session\n" \
-+"-t, --tests=\"TESTS...\"           Run TESTS programs which is separated by space\n" \
-+""
-+}
-+
-+parse_args()
-+{
-+    # This is GNU getopt. "sudo port getopt" in BSD?
-+    ARGS=`getopt -o hvb:s:cd:t: --long help,version,builddir:,srcdir:,no-graphics,desktop:,tests:\
-+        -- "$@"`;
-+    eval set -- "$ARGS"
-+    while [ 1 ] ; do
-+        case "$1" in
-+        -h | --help )        usage; exit 0;;
-+        -v | --version )     echo -e "$VERSION"; exit 0;;
-+        -b | --builddir )    BUILDDIR="$2"; shift 2;;
-+        -s | --srcdir )      SRCDIR="$2"; shift 2;;
-+        -c | --no-graphics ) HAVE_GRAPHICS=0; shift;;
-+        -d | --desktop )     DESKTOP_COMMAND="$2"; shift 2;;
-+        -t | --tests )       TESTS="$2"; shift 2;;
-+        -- )                 shift; break;;
-+        * )                  usage; exit 1;;
-+        esac
-+    done
-+}
-+
-+init_desktop()
-+{
-+    if test x$FORCE_TEST != x ; then
-+        RUN_ARGS="$RUN_ARGS --force"
-+    fi
-+
-+    if test ! -f $HOME/.config/gnome-initial-setup-done ; then
-+        if test ! -f /var/lib/AccountsService/users/$USER ; then
-+            mkdir -p /var/lib/AccountsService/users
-+            cat >> /var/lib/AccountsService/users/$USER << _EOF
-+[User]
-+Language=ja_JP.UTF-8
-+XSession=gnome
-+SystemAccount=false
-+_EOF
-+        fi
-+        mkdir -p $HOME/.config
-+        touch $HOME/.config/gnome-initial-setup-done
-+    fi
-+
-+    # Prevent from launching a XDG dialog
-+    XDG_LOCALE_FILE="$HOME/.config/user-dirs.locale"
-+    if test -f $XDG_LOCALE_FILE ; then
-+        XDG_LANG_ORIG=`cat $XDG_LOCALE_FILE`
-+        XDG_LANG_NEW=`echo $LANG | sed -e 's/\(.*\)\..*/\1/'`
-+        if [ "$XDG_LANG_ORIG" != "$XDG_LANG_NEW" ] ; then
-+            echo "Overriding XDG locale $XDG_LANG_ORIG with $XDG_LANG_NEW"
-+            echo "$XDG_LANG_NEW" > $XDG_LOCALE_FILE
-+        fi
-+    fi
-+}
-+
-+run_dbus_daemon()
-+{
-+    a=`ps -ef | grep dbus-daemon | grep "\-\-system" | grep -v session | grep -v grep`
-+    if test x"$a" = x ; then
-+        eval `dbus-launch --sh-syntax`
-+    fi
-+    SUSER=`echo "$USER" | cut -c 1-7`
-+    a=`ps -ef | grep dbus-daemon | grep "$SUSER" | grep -v gdm | grep session | grep -v grep`
-+    if test x"$a" = x ; then
-+        systemctl --user start dbus
-+        export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$UID/bus
-+    fi
-+    systemctl --user status dbus | col -b
-+    ps -ef | grep dbus-daemon | grep "$SUSER" | grep -v gdm | egrep 'session|system' | grep -v grep
-+    systemctl --user show-environment | col -b
-+}
-+
-+run_desktop()
-+{
-+    if test $HAVE_GRAPHICS -eq 1 ; then
-+        /usr/libexec/Xorg.wrap -noreset +extension GLX +extension RANDR +extension RENDER -logfile ./xorg.log -config ./xorg.conf -configdir . $DISPLAY &
-+    else
-+        /usr/bin/Xvfb $DISPLAY -noreset +extension GLX +extension RANDR +extension RENDER -screen 0 1280x1024x24 &
-+    fi
-+    PID_XORG=$!
-+    sleep 1
-+    export DISPLAY=$DISPLAY
-+    $DESKTOP_COMMAND &
-+    PID_GNOME_SESSION=$!
-+    sleep 30
-+    if test "$DESKTOP_COMMAND" != "gnome-session" ; then
-+        ibus-daemon --daemonize --verbose
-+        sleep 1
-+    fi
-+}
-+
-+count_case_result()
-+{
-+    retval=$1
-+    pass=$2
-+    fail=$3
-+
-+    if test $retval -eq  0 ; then
-+        pass=`expr $pass + 1`
-+    else
-+        fail=`expr $fail + 1`
-+    fi
-+    echo $pass $fail
-+}
-+
-+echo_case_result()
-+{
-+    retval=$1
-+    tst=$2
-+    log=$3
-+    subtst=${4:-''}
-+
-+    if test $retval -eq  0 ; then
-+        echo -e "${GREEN}PASS${NC}: $tst $subtst"
-+    else
-+        echo -e "${RED}FAIL${NC}: $tst $subtst"
-+        echo "FAIL: $tst $subtst" >> $TEST_LOG
-+        echo "======================" >> $TEST_LOG
-+        echo "" >> $TEST_LOG
-+        cat "$log" >> $TEST_LOG
-+        echo "" >> $TEST_LOG
-+    fi
-+}
-+
-+run_test_suite()
-+{
-+    cd `dirname $0`
-+    pass=0
-+    fail=0
-+
-+    export GTK_IM_MODULE=ibus
-+    export IBUS_COMPOSE_CACHE_DIR=$PWD
-+    if test -f $TEST_LOG ; then
-+        rm $TEST_LOG
-+    fi
-+    for tst in $TESTS; do
-+        ENVS=
-+        if test -f $SRCDIR/${tst}.env ; then
-+            ENVS="`cat $SRCDIR/${tst}.env`"
-+        fi
-+        if test x"$ENVS" = x ; then
-+            $BUILDDIR/$tst $SRCDIR >&${tst}.log
-+            retval=$?
-+            read pass fail << EOF
-+            `count_case_result $retval $pass $fail`
-+EOF
-+            echo_case_result $retval $tst ${tst}.log
-+        else
-+            LANG_backup=$LANG
-+            i=1
-+            for e in $ENVS; do
-+                first=`echo "$e" | cut -c1-1`
-+                if test x"$first" = x"#" ; then
-+                    continue
-+                fi
-+                export $e
-+                $BUILDDIR/$tst $SRCDIR >&${tst}.${i}.log
-+                retval=$?
-+                read pass fail << EOF
-+                `count_case_result $retval $pass $fail`
-+EOF
-+                echo_case_result $retval $tst ${tst}.${i}.log $e
-+                i=`expr $i + 1`
-+            done
-+            export LANG=$LANG_backup
-+        fi
-+    done
-+    echo ""
-+    echo -e "# ${GREEN}PASS${NC}: $pass"
-+    echo -e "# ${RED}FAIL${NC}: $fail"
-+    if test -f ${TEST_LOG} ; then
-+        echo ""
-+        echo -e "${RED}See ${TEST_LOG}$NC"
-+    fi
-+}
-+
-+finit()
-+{
-+    if test "$DESKTOP_COMMAND" != "gnome-session" ; then
-+        ibus exit
-+    fi
-+    kill $PID_GNOME_SESSION $PID_XORG
-+}
-+
-+main()
-+{
-+    parse_args $@
-+    init_desktop
-+    run_dbus_daemon
-+    run_desktop
-+    run_test_suite
-+    finit
-+}
-+
-+main $@
--- 
-2.21.0
-
-From fa081ac8ea37d2feb7c7f395ad66e7381b4cb65b Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Fri, 12 Jul 2019 21:20:32 +0900
-Subject: [PATCH 24/27] src/tests: Use gnome-desktop-testing-runner
-
----
- src/tests/Makefile.am                    |   4 +-
- src/tests/ibus-desktop-testing-runner.in | 154 ++++++++++++++++++-----
- 2 files changed, 123 insertions(+), 35 deletions(-)
-
-diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am
-index b9aad29a..913e42fb 100644
---- a/src/tests/Makefile.am
-+++ b/src/tests/Makefile.am
-@@ -105,8 +105,8 @@ $(test_metas): $(test_metas_in) $(test_programs)
- 	$(NULL)
- 
- ibus-compose-locales: ibus-compose-locales.in
--	SRCDIR=$(test_sourcesdir); \
--	sed -e "s|@SRCDIR[@]|$$SRCDIR|g" $< > $@.tmp; \
-+	INSTALLEDDIR=$(datadir)/installed-tests; \
-+	sed -e "s|@INSTALLEDDIR[@]|$$INSTALLEDDIR|g" $< > $@.tmp; \
- 	mv $@.tmp $@; \
- 	$(NULL)
- 
-diff --git a/src/tests/ibus-desktop-testing-runner.in b/src/tests/ibus-desktop-testing-runner.in
-index 9e689634..a90c1378 100755
---- a/src/tests/ibus-desktop-testing-runner.in
-+++ b/src/tests/ibus-desktop-testing-runner.in
-@@ -2,7 +2,7 @@
- # -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*-
- # vim:set noet ts=4:
- #
--# ibus-anthy - The Anthy engine for IBus
-+# ibus - The Input Bus
- #
- # Copyright (c) 2018-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
- # Copyright (c) 2018 Red Hat, Inc.
-@@ -33,16 +33,32 @@ VERSION=0.1
- DISPLAY=:99.0
- BUILDDIR="."
- SRCDIR="."
--TEST_LOG=test-suite.log
-+TEST_LOG="test-suite.log"
-+RESULT_LOG=""
- HAVE_GRAPHICS=1
- DESKTOP_COMMAND="gnome-session"
- PID_XORG=0
- PID_GNOME_SESSION=0
-+TESTING_RUNNER="default"
- TESTS=""
- GREEN='\033[0;32m'
- RED='\033[0;31m'
- NC='\033[0m'
- 
-+print_log()
-+{
-+    if [ x"$RESULT_LOG" != x ] ; then
-+        # avoid 'echo -e' before call 'sed'.
-+        if [ x"$1" = x'-e' ] ; then
-+            shift
-+        fi
-+        NO_ESCAPE=`echo $@ | sed -e 's/\\\033\\[0;3.m//g' -e 's/\\\033\\[0m//g'`
-+        echo $NO_ESCAPE >> $RESULT_LOG
-+    else
-+        echo $@
-+    fi
-+}
-+
- usage()
- {
-     echo -e \
-@@ -57,13 +73,19 @@ usage()
- "-c, --no-graphics                Use Xvfb instead of Xorg\n"                  \
- "-d, --desktop=DESKTOP            Run DESTKTOP. The default is gnome-session\n" \
- "-t, --tests=\"TESTS...\"           Run TESTS programs which is separated by space\n" \
-+"-r, --runner=RUNNER              Run TESTS programs with a test RUNNER.\n"    \
-+"                                 RUNNDER = gnome or default.\n"               \
-+"                                 default is an embedded runner.\n"            \
-+"-o, --output=OUTPUT_FILE         OUtput the log to OUTPUT_FILE\n"             \
-+"-O, --result=RESULT_FILE         OUtput the result to RESULT_FILE\n"          \
- ""
- }
- 
- parse_args()
- {
-     # This is GNU getopt. "sudo port getopt" in BSD?
--    ARGS=`getopt -o hvb:s:cd:t: --long help,version,builddir:,srcdir:,no-graphics,desktop:,tests:\
-+    ARGS=`getopt -o hvb:s:cd:t:r:o:O: --long \
-+          help,version,builddir:,srcdir:,no-graphics,desktop:,tests:,runner:,output:,result:\
-         -- "$@"`;
-     eval set -- "$ARGS"
-     while [ 1 ] ; do
-@@ -75,6 +97,9 @@ parse_args()
-         -c | --no-graphics ) HAVE_GRAPHICS=0; shift;;
-         -d | --desktop )     DESKTOP_COMMAND="$2"; shift 2;;
-         -t | --tests )       TESTS="$2"; shift 2;;
-+        -r | --runner )      TESTING_RUNNER="$2"; shift 2;;
-+        -o | --output )      TEST_LOG="$2"; shift 2;;
-+        -O | --result )      RESULT_LOG="$2"; shift 2;;
-         -- )                 shift; break;;
-         * )                  usage; exit 1;;
-         esac
-@@ -83,18 +108,31 @@ parse_args()
- 
- init_desktop()
- {
-+    if [ "$RESULT_LOG" != "" ] ; then
-+        rm $RESULT_LOG
-+    fi
-+    if [ "$TEST_LOG" = "" ] ; then
-+        print_log -e "${RED}FAIL${NC}: ${RED}ERROR${NC}: a log file is required to get return value with 'read' command"
-+        abrt
-+    else
-+        rm $TEST_LOG
-+    fi
-     if test x$FORCE_TEST != x ; then
-         RUN_ARGS="$RUN_ARGS --force"
-     fi
- 
-     if test ! -f $HOME/.config/gnome-initial-setup-done ; then
-+        IS_SYSTEM_ACCOUNT=false
-+        if [ "$USER" = "root" ] ; then
-+            IS_SYSTEM_ACCOUNT=true
-+        fi
-         if test ! -f /var/lib/AccountsService/users/$USER ; then
-             mkdir -p /var/lib/AccountsService/users
-             cat >> /var/lib/AccountsService/users/$USER << _EOF
- [User]
- Language=ja_JP.UTF-8
- XSession=gnome
--SystemAccount=false
-+SystemAccount=$IS_SYSTEM_ACCOUNT
- _EOF
-         fi
-         mkdir -p $HOME/.config
-@@ -167,71 +205,120 @@ echo_case_result()
- {
-     retval=$1
-     tst=$2
--    log=$3
--    subtst=${4:-''}
-+    subtst=${3:-''}
- 
-     if test $retval -eq  0 ; then
--        echo -e "${GREEN}PASS${NC}: $tst $subtst"
-+        print_log -e "${GREEN}PASS${NC}: $tst $subtst"
-     else
--        echo -e "${RED}FAIL${NC}: $tst $subtst"
--        echo "FAIL: $tst $subtst" >> $TEST_LOG
--        echo "======================" >> $TEST_LOG
--        echo "" >> $TEST_LOG
--        cat "$log" >> $TEST_LOG
--        echo "" >> $TEST_LOG
-+        print_log -e "${RED}FAIL${NC}: $tst $subtst"
-+        print_log "======================"
-+        print_log ""
-     fi
- }
- 
--run_test_suite()
-+run_direct_test_cases()
- {
--    cd `dirname $0`
-     pass=0
-     fail=0
--
--    export GTK_IM_MODULE=ibus
--    export IBUS_COMPOSE_CACHE_DIR=$PWD
--    if test -f $TEST_LOG ; then
--        rm $TEST_LOG
--    fi
-     for tst in $TESTS; do
-         ENVS=
-         if test -f $SRCDIR/${tst}.env ; then
-             ENVS="`cat $SRCDIR/${tst}.env`"
-         fi
-         if test x"$ENVS" = x ; then
--            $BUILDDIR/$tst $SRCDIR >&${tst}.log
-+            $BUILDDIR/$tst $SRCDIR 2>>$TEST_LOG 1>>$TEST_LOG
-             retval=$?
-             read pass fail << EOF
-             `count_case_result $retval $pass $fail`
- EOF
--            echo_case_result $retval $tst ${tst}.log
-+            echo_case_result $retval $tst
-+            CACHE_FILES=`ls *.cache`
-+            if [ x"$CACHE_FILES" != x ] ; then
-+                print_log "Clean $CACHE_FILES"
-+                rm $CACHE_FILES
-+            fi
-         else
-             LANG_backup=$LANG
-             i=1
-             for e in $ENVS; do
--                first=`echo "$e" | cut -c1-1`
-+                first=`echo "$e" | grep '^#'`
-                 if test x"$first" = x"#" ; then
-                     continue
-                 fi
-                 export $e
--                $BUILDDIR/$tst $SRCDIR >&${tst}.${i}.log
-+                $BUILDDIR/$tst $SRCDIR 2>>$TEST_LOG 1>>$TEST_LOG
-                 retval=$?
-                 read pass fail << EOF
-                 `count_case_result $retval $pass $fail`
- EOF
--                echo_case_result $retval $tst ${tst}.${i}.log $e
-+                echo_case_result $retval $tst $e
-+                CACHE_FILES=`ls *.cache`
-+                if [ x"$CACHE_FILES" != x ] ; then
-+                    print_log "Clean $CACHE_FILES"
-+                    rm $CACHE_FILES
-+                fi
-                 i=`expr $i + 1`
-             done
-             export LANG=$LANG_backup
-         fi
-     done
-+    echo $pass $fail
-+}
-+
-+run_gnome_desktop_testing_runner()
-+{
-+    pass=0
-+    fail=0
-+    if [ x"$TESTS" = x ] ; then
-+        TESTS='ibus'
-+    fi
-+    for tst in $TESTS; do
-+        tst_dir="@INSTALLEDDIR@/$tst"
-+        if [ ! -d "$tst_dir" ] ; then
-+            print_log -e "${RED}FAIL${NC}: Not found %tst_dir"
-+            fail=1
-+            continue
-+        fi
-+        gnome-desktop-testing-runner $tst 2>>$TEST_LOG 1>>$TEST_LOG
-+        retval=$?
-+        read pass fail << EOF
-+        `count_case_result $retval $pass $fail`
-+EOF
-+    done
-+    echo $pass $fail
-+}
-+
-+run_test_suite()
-+{
-+    pass=0
-+    fail=0
-+    export GTK_IM_MODULE=ibus
-+    export IBUS_COMPOSE_CACHE_DIR=$PWD
-+    if [ x"$TESTING_RUNNER" = x ] ; then
-+        TESTING_RUNNER="default"
-+    fi
-+    case $TESTING_RUNNER in
-+    default)
-+        # Get only the last value with do-while.
-+        read pass fail << EOF_RUNNER
-+        `run_direct_test_cases`
-+EOF_RUNNER
-+        ;;
-+    gnome)
-+        read pass fail << EOF_RUNNER
-+        `run_gnome_desktop_testing_runner`
-+EOF_RUNNER
-+        ;;
-+    esac
-     echo ""
--    echo -e "# ${GREEN}PASS${NC}: $pass"
--    echo -e "# ${RED}FAIL${NC}: $fail"
--    if test -f ${TEST_LOG} ; then
--        echo ""
--        echo -e "${RED}See ${TEST_LOG}$NC"
-+    if [ $pass -ne 0 ] ; then
-+        print_log -e "${GREEN}PASS${NC}: $pass"
-     fi
-+    if [ $fail -ne 0 ] ; then
-+        print_log -e "${RED}FAIL${NC}: $fail"
-+    fi
-+    echo ""
-+    echo "See ${TEST_LOG}"
- }
- 
- finit()
-@@ -240,14 +327,15 @@ finit()
-         ibus exit
-     fi
-     kill $PID_GNOME_SESSION $PID_XORG
-+    echo "Finished $PROGNAME testing"
- }
- 
- main()
- {
-     parse_args $@
-     init_desktop
--    run_dbus_daemon
--    run_desktop
-+    run_dbus_daemon 2>>$TEST_LOG 1>>$TEST_LOG
-+    run_desktop 2>>$TEST_LOG 1>>$TEST_LOG
-     run_test_suite
-     finit
- }
--- 
-2.21.0
-
-From 85b647a1c57c206779eb0b4b15a734c1b1f29c10 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Wed, 24 Jul 2019 17:27:37 +0900
-Subject: [PATCH 25/27] src/tests: Fix IBus test cases for
- gnome-desktop-testing
-
-- dconf/config.c: Replaced dconf_client_write_fast() with
-  dconf_client_write_sync() because
-  dconf_client_write_fast() does not syn the data when
-  ibus_config_get_values() is called immediately after
-  ibus_config_set_value() is called.
-
-- ibus-compose-locales.in returns the return value of ibus-compose
-
-- ibus-compose: Set $NO_AT_BRIDGE to suppress a AT_SPI warning
-  and call g_log_set_always_fatal() because GtkIMContextSimple
-  does not support multiple compose outputs yet and the API can
-  suppress a warning.
-
-- ibus-config: Delete async watch testings which causes several errors
-  with gnome-shell testing and the testing is now deprecated and
-  GSettings is recommended.
-
-- ibus-desktop-testing-runner.in: Support --output=log:stdout to
-  cat the log to stdout and Use dbus-launch --exit-with-session instead of
-  --sh-syntax and count PASS of test cases instead of PASS of
-  gnome-desktop-testing and always run ibus exit and kill
-  gnome-shell-calendar-server
-
-- ibus-engine-switch.c: Set xkb:jp::jpn if gnome-shell sets xkb:us::eng
-
-- ibus-inputcontext.c: Use ibus_bus_get_global_engine() instead of
-  ibus_bus_list_active_engines() since ibus_bus_list_active_engines()
-  does not work with gnome-shell and the API is now deprecated.
-
-- ibus-keypress.c: Set $NO_AT_BRIDGE to suppress a AT_SPI warning
----
- conf/dconf/config.c                      |  14 +-
- src/tests/Makefile.am                    |  19 +-
- src/tests/ibus-compose-locales.in        |   4 +-
- src/tests/ibus-compose.c                 |  10 +-
- src/tests/ibus-config.c                  | 283 -----------------------
- src/tests/ibus-desktop-testing-runner.in |  77 +++---
- src/tests/ibus-engine-switch.c           |  34 ++-
- src/tests/ibus-inputcontext.c            |  29 +--
- src/tests/ibus-keypress.c                |   4 +
- 9 files changed, 126 insertions(+), 348 deletions(-)
-
-diff --git a/conf/dconf/config.c b/conf/dconf/config.c
-index 500ea1d8..30ac137d 100644
---- a/conf/dconf/config.c
-+++ b/conf/dconf/config.c
-@@ -335,7 +335,19 @@ ibus_config_dconf_set_value (IBusConfigService *config,
-     }
- 
- #ifdef DCONF_0_13_4
--    retval = dconf_client_write_fast (client, gkey, value, error);
-+    /* Use dconf_client_write_sync() instead of dconf_client_write_fast()
-+     * because dconf_client_write_fast() does not sync the data when
-+     * ibus_config_get_values() is called immediately after
-+     * ibus_config_set_value() is called.
-+     * We won't add a new API for the sync only since IBusConfig is
-+     * now deprecated and GSettings is recommended.
-+     */
-+    retval = dconf_client_write_sync (client,
-+                                      gkey,
-+                                      value,
-+                                      NULL,
-+                                      NULL,
-+                                      error);
- #else
-     retval = dconf_client_write (client,
-                                  gkey,
-diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am
-index 913e42fb..2e75932c 100644
---- a/src/tests/Makefile.am
-+++ b/src/tests/Makefile.am
-@@ -55,6 +55,8 @@ TESTS = \
-     ibus-util                       \
-     $(NULL)
- 
-+CLEANFILES =
-+
- if ENABLE_ENGINE
- TESTS += ibus-engine-switch
- endif
-@@ -90,9 +92,17 @@ test_sources_DATA = \
-     $(NULL)
- test_sourcesdir = $(datadir)/installed-tests/ibus
- 
-+CLEANFILES += \
-+    $(test_metas) \
-+    ibus-desktop-testing-runner \
-+    $(NULL)
-+
- test_execs_PROGRAMS = $(TESTS)
- if ENABLE_GTK3
- test_execs_SCRIPTS = ibus-compose-locales
-+CLEANFILES += \
-+    ibus-compose-locales \
-+    $(NULL)
- endif
- test_execsdir = $(libexecdir)/installed-tests/ibus
- endif
-@@ -105,15 +115,14 @@ $(test_metas): $(test_metas_in) $(test_programs)
- 	$(NULL)
- 
- ibus-compose-locales: ibus-compose-locales.in
--	INSTALLEDDIR=$(datadir)/installed-tests; \
--	sed -e "s|@INSTALLEDDIR[@]|$$INSTALLEDDIR|g" $< > $@.tmp; \
-+	SRCDIR=$(test_sourcesdir); \
-+	sed -e "s|@SRCDIR[@]|$$SRCDIR|g" $< > $@.tmp; \
- 	mv $@.tmp $@; \
- 	$(NULL)
- 
--    ibus-desktop-testing-runner.in \
- ibus-desktop-testing-runner: ibus-desktop-testing-runner.in
--	SRCDIR=$(test_sourcesdir); \
--	sed -e "s|@SRCDIR[@]|$$SRCDIR|g" $< > $@.tmp; \
-+	INSTALLEDDIR=$(datadir)/installed-tests; \
-+	sed -e "s|@INSTALLEDDIR[@]|$$INSTALLEDDIR|g" $< > $@.tmp; \
- 	mv $@.tmp $@; \
- 	$(NULL)
- 
-diff --git a/src/tests/ibus-compose-locales.in b/src/tests/ibus-compose-locales.in
-index 8d2384d1..fad02965 100755
---- a/src/tests/ibus-compose-locales.in
-+++ b/src/tests/ibus-compose-locales.in
-@@ -6,6 +6,7 @@ BUILDDIR=`dirname $0`
- 
- export IBUS_COMPOSE_CACHE_DIR=$PWD
- 
-+retval=0
- for var in `cat $SRCDIR/ibus-compose.env`
- do
-     IS_COMMENT=`echo "$var" | grep "^#"`
-@@ -13,6 +14,7 @@ do
-         continue
-     fi
-     env $var $BUILDDIR/ibus-compose $SRCDIR $@
-+    retval=`expr $retval + $?`
- 
-     CACHE_FILES=`ls *.cache`
-     if [ x"$CACHE_FILES" != x ] ; then
-@@ -20,4 +22,4 @@ do
-         rm $CACHE_FILES
-     fi
- done
--
-+exit $retval
-diff --git a/src/tests/ibus-compose.c b/src/tests/ibus-compose.c
-index c8d3c126..db359477 100644
---- a/src/tests/ibus-compose.c
-+++ b/src/tests/ibus-compose.c
-@@ -344,20 +344,26 @@ test_compose (void)
- int
- main (int argc, char *argv[])
- {
-+    GLogLevelFlags flags;
-     const gchar *test_name;
-     gchar *test_path;
- 
-     ibus_init ();
-+    /* Avoid a warning of "AT-SPI: Could not obtain desktop path or name"
-+     * with gtk_main().
-+     */
-+    g_setenv ("NO_AT_BRIDGE", "1", TRUE);
-     g_test_init (&argc, &argv, NULL);
-     /* FIXME:
-      * IBusIMContext opens GtkIMContextSimple as the slave and
-      * GtkIMContextSimple opens the compose table on el_GR.UTF-8, and the
--     * multiple outputs in el_GR's compose causes a warning in gtkcomposetable 
-+     * multiple outputs in el_GR's compose causes a warning in gtkcomposetable
-      * and the warning always causes a fatal in GTest:
-      " "GTK+ supports to output one char only: "
-      */
--    g_log_set_always_fatal (G_LOG_LEVEL_CRITICAL);
-+    flags = g_log_set_always_fatal (G_LOG_LEVEL_CRITICAL);
-     gtk_init (&argc, &argv);
-+    g_log_set_always_fatal (flags);
- 
-     m_srcdir = argc > 1 ? g_strdup (argv[1]) : g_strdup (".");
-     m_compose_file = g_strdup (g_getenv ("COMPOSE_FILE"));
-diff --git a/src/tests/ibus-config.c b/src/tests/ibus-config.c
-index c6141ab5..9b925ad9 100644
---- a/src/tests/ibus-config.c
-+++ b/src/tests/ibus-config.c
-@@ -133,254 +133,6 @@ test_config_set_get (void)
-     g_object_unref (config);
- }
- 
--typedef struct {
--    GMainLoop *loop;
--    guint timeout_id;
--    gchar *section;
--    gchar *name;
--} WatchData;
--
--typedef struct {
--    gchar *section;
--    gchar *name;
--} WatchKey;
--
--typedef struct {
--    WatchKey *watched;          /* watched keys (null-terminated) */
--    WatchKey *changed;          /* changed keys (null-terminated) */
--    WatchKey *notified;         /* notified keys (same length as
--                                   changed, not null-terminated) */
--} WatchTestData;
--
--static WatchKey default_watched[] = {
--    { NULL }
--};
--static WatchKey default_changed[] = {
--    { "test/s1", "n1" },
--    { "test/s1", "n2" },
--    { "test/s2", "n1" },
--    { "test/s2", "n2" },
--    { NULL }
--};
--static WatchKey default_notified[] = {
--    { "test/s1", "n1" },
--    { "test/s1", "n2" },
--    { "test/s2", "n1" },
--    { "test/s2", "n2" }
--};
--static WatchTestData default_data = {
--    default_watched,
--    default_changed,
--    default_notified
--};
--
--static WatchKey section_watched[] = {
--    { "test/s1", NULL },
--    { NULL }
--};
--static WatchKey section_notified[] = {
--    { "test/s1", "n1" },
--    { "test/s1", "n2" },
--    { NULL, NULL },
--    { NULL, NULL },
--};
--static WatchTestData section_data = {
--    section_watched,
--    default_changed,
--    section_notified
--};
--
--static WatchKey section_multiple_watched[] = {
--    { "test/s1", NULL },
--    { "test/s2", NULL },
--    { NULL }
--};
--static WatchKey section_multiple_notified[] = {
--    { "test/s1", "n1" },
--    { "test/s1", "n2" },
--    { "test/s2", "n1" },
--    { "test/s2", "n2" },
--};
--static WatchTestData section_multiple_data = {
--    section_multiple_watched,
--    default_changed,
--    section_multiple_notified
--};
--
--static WatchKey section_name_watched[] = {
--    { "test/s1", "n1" },
--    { NULL }
--};
--static WatchKey section_name_notified[] = {
--    { "test/s1", "n1" },
--    { NULL, NULL },
--    { NULL, NULL },
--    { NULL, NULL },
--};
--static WatchTestData section_name_data = {
--    section_name_watched,
--    default_changed,
--    section_name_notified
--};
--
--static WatchKey section_name_multiple_watched[] = {
--    { "test/s1", "n1" },
--    { "test/s2", "n2" },
--    { NULL }
--};
--static WatchKey section_name_multiple_notified[] = {
--    { "test/s1", "n1" },
--    { NULL, NULL },
--    { NULL, NULL },
--    { "test/s2", "n2" },
--};
--static WatchTestData section_name_multiple_data = {
--    section_name_multiple_watched,
--    default_changed,
--    section_name_multiple_notified
--};
--
--typedef struct {
--    IBusConfig *config;
--    WatchData data;
--} WatchFixture;
--
--static void
--value_changed_cb (IBusConfig  *config,
--                  const gchar *section,
--                  const gchar *name,
--                  GVariant    *value,
--                  gpointer     user_data)
--{
--    WatchData *data = (WatchData *) user_data;
--
--    data->section = g_strdup (section);
--    data->name = g_strdup (name);
--
--    g_main_loop_quit (data->loop);
--}
--
--static gboolean
--timeout_cb (gpointer user_data)
--{
--    WatchData *data = (WatchData *) user_data;
--    g_main_loop_quit (data->loop);
--    data->timeout_id = 0;
--    return FALSE;
--}
--
--static void
--change_and_test (IBusConfig  *config,
--                 const gchar *section,
--                 const gchar *name,
--                 const gchar *expected_section,
--                 const gchar *expected_name,
--                 WatchData   *data)
--{
--    gboolean retval;
--    GVariant *var;
--
--    data->section = NULL;
--    data->name = NULL;
--
--    /* Unset won't notify value-changed signal. */
--    var = ibus_config_get_values (config, section);
--    if (var != NULL) {
--        GVariant *value = g_variant_lookup_value (var, name,
--                                                  G_VARIANT_TYPE_VARIANT);
--        if (value != NULL) {
--            ibus_config_unset (config, section, name);
--            g_variant_unref (value);
--        }
--        g_variant_unref (var);
--    }
--
--    data->timeout_id = g_timeout_add (1, timeout_cb, data);
--    g_main_loop_run (data->loop);
--    if (data->timeout_id != 0) {
--        g_source_remove (data->timeout_id);
--    }
--
--    retval = ibus_config_set_value (config, section, name,
--                                    g_variant_new_int32 (1));
--    g_assert (retval);
--
--    data->timeout_id = g_timeout_add (1, timeout_cb, data);
--    g_main_loop_run (data->loop);
--    if (data->timeout_id != 0) {
--        g_source_remove (data->timeout_id);
--    }
--
--    g_assert_cmpstr (data->section, ==, expected_section);
--    g_assert_cmpstr (data->name, ==, expected_name);
--
--    g_free (data->section);
--    g_free (data->name);
--}
--
--static void
--watch_fixture_setup (WatchFixture *fixture, gconstpointer user_data)
--{
--    fixture->config = ibus_config_new (ibus_bus_get_connection (bus),
--                                       NULL,
--                                       NULL);
--    g_assert (fixture->config);
--
--    fixture->data.loop = g_main_loop_new (NULL, FALSE);
--    g_signal_connect (fixture->config, "value-changed",
--                      G_CALLBACK (value_changed_cb), &fixture->data);
--}
--
--static void
--watch_fixture_teardown (WatchFixture *fixture, gconstpointer user_data)
--{
--    g_main_loop_unref (fixture->data.loop);
--
--    ibus_proxy_destroy (IBUS_PROXY (fixture->config));
--    g_object_unref (fixture->config);
--}
--
--static void
--test_config_watch (WatchFixture *fixture, gconstpointer user_data)
--{
--    const WatchTestData *data = user_data;
--    gint i;
--
--    for (i = 0; data->watched[i].section != NULL; i++) {
--        ibus_config_watch (fixture->config,
--                           data->watched[i].section,
--                           data->watched[i].name);
--    }
--    for (i = 0; data->changed[i].section != NULL; i++) {
--        change_and_test (fixture->config,
--                         data->changed[i].section,
--                         data->changed[i].name,
--                         data->notified[i].section,
--                         data->notified[i].name,
--                         &fixture->data);
--    }
--    for (i = 0; data->watched[i].section != NULL; i++) {
--        ibus_config_unwatch (fixture->config,
--                             data->watched[i].section,
--                             data->watched[i].name);
--    }
--    if (i > 0) {
--        /* Check if the above unwatch takes effect. */
--        for (i = 0; data->changed[i].section != NULL; i++) {
--            change_and_test (fixture->config,
--                             data->changed[i].section,
--                             data->changed[i].name,
--                             NULL,
--                             NULL,
--                             &fixture->data);
--        }
--    } else {
--        /* Since we reuse single D-Bus connection, we need to remove the
--           default match rule for the next ibus_config_new() call.  */
--        ibus_config_unwatch (fixture->config, NULL, NULL);
--    }
--}
--
- gint
- main (gint    argc,
-       gchar **argv)
-@@ -390,41 +142,6 @@ main (gint    argc,
-     g_test_init (&argc, &argv, NULL);
-     bus = ibus_bus_new ();
- 
--    g_test_add ("/ibus/config-watch/default",
--                WatchFixture,
--                &default_data,
--                watch_fixture_setup,
--                test_config_watch,
--                watch_fixture_teardown);
--
--    g_test_add ("/ibus/config-watch/section",
--                WatchFixture,
--                &section_data,
--                watch_fixture_setup,
--                test_config_watch,
--                watch_fixture_teardown);
--
--    g_test_add ("/ibus/config-watch/section-multiple",
--                WatchFixture,
--                &section_multiple_data,
--                watch_fixture_setup,
--                test_config_watch,
--                watch_fixture_teardown);
--
--    g_test_add ("/ibus/config-watch/section-name",
--                WatchFixture,
--                &section_name_data,
--                watch_fixture_setup,
--                test_config_watch,
--                watch_fixture_teardown);
--
--    g_test_add ("/ibus/config-watch/section-name-multiple",
--                WatchFixture,
--                &section_name_multiple_data,
--                watch_fixture_setup,
--                test_config_watch,
--                watch_fixture_teardown);
--
-     g_test_add_func ("/ibus/create-config-async", test_create_config_async);
-     g_test_add_func ("/ibus/config-set-get", test_config_set_get);
- 
-diff --git a/src/tests/ibus-desktop-testing-runner.in b/src/tests/ibus-desktop-testing-runner.in
-index a90c1378..b7a72285 100755
---- a/src/tests/ibus-desktop-testing-runner.in
-+++ b/src/tests/ibus-desktop-testing-runner.in
-@@ -34,9 +34,10 @@ DISPLAY=:99.0
- BUILDDIR="."
- SRCDIR="."
- TEST_LOG="test-suite.log"
-+TEST_LOG_STDOUT=0
- RESULT_LOG=""
- HAVE_GRAPHICS=1
--DESKTOP_COMMAND="gnome-session"
-+DESKTOP_COMMAND="dbus-launch --exit-with-session gnome-session"
- PID_XORG=0
- PID_GNOME_SESSION=0
- TESTING_RUNNER="default"
-@@ -109,19 +110,26 @@ parse_args()
- init_desktop()
- {
-     if [ "$RESULT_LOG" != "" ] ; then
--        rm $RESULT_LOG
-+        if [ -f $RESULT_LOG ] ; then
-+            rm $RESULT_LOG
-+        fi
-+    fi
-+    HAS_STDOUT=`echo "$TEST_LOG" | grep ':stdout'`
-+    if [ x"$HAS_STDOUT" != x ] ; then
-+        TEST_LOG=`echo "$TEST_LOG" | sed -e 's|:stdout||'`
-+        TEST_LOG_STDOUT=1
-     fi
-     if [ "$TEST_LOG" = "" ] ; then
-         print_log -e "${RED}FAIL${NC}: ${RED}ERROR${NC}: a log file is required to get return value with 'read' command"
--        abrt
--    else
-+        exit -1
-+    elif [ -f $TEST_LOG ] ; then
-         rm $TEST_LOG
-     fi
--    if test x$FORCE_TEST != x ; then
-+    if [ x$FORCE_TEST != x ] ; then
-         RUN_ARGS="$RUN_ARGS --force"
-     fi
- 
--    if test ! -f $HOME/.config/gnome-initial-setup-done ; then
-+    if [ ! -f $HOME/.config/gnome-initial-setup-done ] ; then
-         IS_SYSTEM_ACCOUNT=false
-         if [ "$USER" = "root" ] ; then
-             IS_SYSTEM_ACCOUNT=true
-@@ -141,7 +149,7 @@ _EOF
- 
-     # Prevent from launching a XDG dialog
-     XDG_LOCALE_FILE="$HOME/.config/user-dirs.locale"
--    if test -f $XDG_LOCALE_FILE ; then
-+    if [ -f $XDG_LOCALE_FILE ] ; then
-         XDG_LANG_ORIG=`cat $XDG_LOCALE_FILE`
-         XDG_LANG_NEW=`echo $LANG | sed -e 's/\(.*\)\..*/\1/'`
-         if [ "$XDG_LANG_ORIG" != "$XDG_LANG_NEW" ] ; then
-@@ -153,19 +161,8 @@ _EOF
- 
- run_dbus_daemon()
- {
--    a=`ps -ef | grep dbus-daemon | grep "\-\-system" | grep -v session | grep -v grep`
--    if test x"$a" = x ; then
--        eval `dbus-launch --sh-syntax`
--    fi
--    SUSER=`echo "$USER" | cut -c 1-7`
--    a=`ps -ef | grep dbus-daemon | grep "$SUSER" | grep -v gdm | grep session | grep -v grep`
--    if test x"$a" = x ; then
--        systemctl --user start dbus
--        export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$UID/bus
--    fi
--    systemctl --user status dbus | col -b
--    ps -ef | grep dbus-daemon | grep "$SUSER" | grep -v gdm | egrep 'session|system' | grep -v grep
--    systemctl --user show-environment | col -b
-+    # Use dbus-launch --exit-with-session later instead of --sh-syntax
-+    export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$UID/bus
- }
- 
- run_desktop()
-@@ -181,7 +178,8 @@ run_desktop()
-     $DESKTOP_COMMAND &
-     PID_GNOME_SESSION=$!
-     sleep 30
--    if test "$DESKTOP_COMMAND" != "gnome-session" ; then
-+    HAS_GNOME=`echo $DESKTOP_COMMAND | grep gnome-session`
-+    if [ x"$HAS_GNOME" = x ] ; then
-         ibus-daemon --daemonize --verbose
-         sleep 1
-     fi
-@@ -285,6 +283,16 @@ run_gnome_desktop_testing_runner()
-         `count_case_result $retval $pass $fail`
- EOF
-     done
-+    child_pass=`grep '^PASS:' $TEST_LOG | wc -l`
-+    child_fail=`grep '^FAIL:' $TEST_LOG | wc -l`
-+    if [ $child_pass -ne 0 -o $child_fail -ne 0 ] ; then
-+        pass=$child_pass
-+        if [ $child_fail -ne 0 ] ; then
-+            fail=`expr $child_fail / 2`
-+        else
-+            fail=0
-+        fi
-+    fi
-     echo $pass $fail
- }
- 
-@@ -311,22 +319,29 @@ EOF_RUNNER
-         ;;
-     esac
-     echo ""
--    if [ $pass -ne 0 ] ; then
--        print_log -e "${GREEN}PASS${NC}: $pass"
--    fi
--    if [ $fail -ne 0 ] ; then
--        print_log -e "${RED}FAIL${NC}: $fail"
--    fi
-+    print_log -e "${GREEN}PASS${NC}: $pass"
-+    print_log -e "${RED}FAIL${NC}: $fail"
-     echo ""
--    echo "See ${TEST_LOG}"
-+    if [ $TEST_LOG_STDOUT -eq 1 ] ; then
-+        cat $TEST_LOG
-+    else
-+        echo "See $TEST_LOG"
-+    fi
- }
- 
- finit()
- {
--    if test "$DESKTOP_COMMAND" != "gnome-session" ; then
--        ibus exit
--    fi
-+    echo "Killing left gnome-session and Xorg"
-     kill $PID_GNOME_SESSION $PID_XORG
-+    ibus exit
-+    SUSER=`echo "$USER" | cut -c 1-7`
-+    LEFT_CALENDAR=`ps -ef | grep gnome-shell-calendar-server | grep $SUSER | grep -v grep`
-+    if [ x"$LEFT_CALENDAR" != x ] ; then
-+        echo "Killing left gnome-shell-calendar-server"
-+        echo "$LEFT_CALENDAR"
-+        echo "$LEFT_CALENDAR" | awk '{print $2}' | xargs kill
-+    fi
-+
-     echo "Finished $PROGNAME testing"
- }
- 
-diff --git a/src/tests/ibus-engine-switch.c b/src/tests/ibus-engine-switch.c
-index 5c2bd516..a1eeba2a 100644
---- a/src/tests/ibus-engine-switch.c
-+++ b/src/tests/ibus-engine-switch.c
-@@ -13,17 +13,25 @@ static const gchar *engine_names[] = {
-     AFTER_ENGINE
- };
- 
-+static const gchar *engine_names2[] = {
-+    AFTER_ENGINE,
-+    BEFORE_ENGINE
-+};
-+
- static void
--change_global_engine (void)
-+change_global_engine (gboolean reverse)
- {
-     gint i;
- 
-     for (i = 0; i < G_N_ELEMENTS (engine_names); i++) {
--        ibus_bus_set_global_engine (bus, engine_names[i]);
-+        const gchar *engine_name = engine_names[i];
-+        if (reverse)
-+            engine_name = engine_names2[i];
-+        ibus_bus_set_global_engine (bus, engine_name);
-         IBusEngineDesc *engine_desc = ibus_bus_get_global_engine (bus);
-         g_assert_cmpstr (ibus_engine_desc_get_name (engine_desc),
-                          ==,
--                         engine_names[i]);
-+                         engine_name);
-         g_object_unref (G_OBJECT (engine_desc));
-     }
- }
-@@ -46,6 +54,7 @@ typedef struct {
-     gint count;
-     guint timeout_id;
-     guint idle_id;
-+    gboolean reverse;
- } GlobalEngineChangedData;
- 
- static void
-@@ -70,7 +79,7 @@ static gboolean
- change_global_engine_cb (gpointer user_data)
- {
-     GlobalEngineChangedData *data = (GlobalEngineChangedData *) user_data;
--    change_global_engine ();
-+    change_global_engine (data->reverse);
-     data->idle_id = 0;
-     return FALSE;
- }
-@@ -78,12 +87,25 @@ change_global_engine_cb (gpointer user_data)
- static void
- test_global_engine (void)
- {
-+    GLogLevelFlags flags;
-+    IBusEngineDesc *desc;
-     GlobalEngineChangedData data;
-     guint handler_id;
- 
-     if (!ibus_bus_get_use_global_engine (bus))
-         return;
- 
-+    /* "No global engine." warning is not critical message. */
-+    flags = g_log_set_always_fatal (G_LOG_LEVEL_CRITICAL);
-+    desc = ibus_bus_get_global_engine (bus);
-+    g_log_set_always_fatal (flags);
-+    if (desc &&
-+        !g_strcmp0 (BEFORE_ENGINE, ibus_engine_desc_get_name (desc))) {
-+        data.reverse = TRUE;
-+    } else {
-+        data.reverse = FALSE;
-+    }
-+
-     data.count = 0;
- 
-     handler_id = g_signal_connect (bus,
-@@ -141,7 +163,7 @@ test_context_engine_set_by_global (void)
-     /* ibus_bus_set_global_engine() changes focused context engine. */
-     ibus_input_context_focus_in (context);
- 
--    change_global_engine ();
-+    change_global_engine (FALSE);
- 
-     /* ibus_input_context_set_engine() does not take effect when
-        global engine is used. */
-@@ -170,7 +192,7 @@ test_context_engine_set_by_focus (void)
- 
-     ibus_input_context_focus_in (context);
- 
--    change_global_engine ();
-+    change_global_engine (FALSE);
- 
-     /* When focus is lost, context engine is set to "dummy". */
-     ibus_input_context_focus_in (another_context);
-diff --git a/src/tests/ibus-inputcontext.c b/src/tests/ibus-inputcontext.c
-index fab183aa..ed04bd64 100644
---- a/src/tests/ibus-inputcontext.c
-+++ b/src/tests/ibus-inputcontext.c
-@@ -37,18 +37,6 @@ fatal_handler(const gchar *log_domain,
-     return TRUE;
- }
- 
--static gchar *
--get_last_engine_id (const GList *engines)
--{
--    const char *result = NULL;
--    for (; engines; engines = g_list_next (engines)) {
--        IBusEngineDesc *engine_desc = IBUS_ENGINE_DESC (engines->data);
--        g_assert (engine_desc);
--        result = ibus_engine_desc_get_name (engine_desc);
--    }
--    return g_strdup (result);
--}
--
- static void
- call_basic_ipcs (IBusInputContext *context)
- {
-@@ -68,18 +56,23 @@ call_basic_ipcs (IBusInputContext *context)
- static void
- test_input_context (void)
- {
--    GList *engines;
--    gchar *active_engine_name = NULL;
-     IBusInputContext *context;
-+    GLogLevelFlags flags;
-     IBusEngineDesc *engine_desc;
-+    gchar *active_engine_name = NULL;
-     gchar *current_ic;
- 
-     context = ibus_bus_create_input_context (bus, "test");
-     call_basic_ipcs (context);
- 
--    engines = ibus_bus_list_active_engines (bus);
--    if (engines != NULL) {
--        active_engine_name = get_last_engine_id (engines);
-+    /* "No global engine." warning is not critical message. */
-+    flags = g_log_set_always_fatal (G_LOG_LEVEL_CRITICAL);
-+    engine_desc = ibus_bus_get_global_engine (bus);
-+    g_log_set_always_fatal (flags);
-+    if (engine_desc != NULL) {
-+        active_engine_name = g_strdup (ibus_engine_desc_get_name(engine_desc));
-+        g_object_unref (engine_desc);
-+        engine_desc = NULL;
-     } else {
-         active_engine_name = g_strdup ("dummy");
-     }
-@@ -111,8 +104,6 @@ test_input_context (void)
-     g_object_unref (context);
- 
-     g_free (active_engine_name);
--    g_list_foreach (engines, (GFunc) g_object_unref, NULL);
--    g_list_free (engines);
- }
- 
- static void
-diff --git a/src/tests/ibus-keypress.c b/src/tests/ibus-keypress.c
-index 17920226..dd1b0042 100644
---- a/src/tests/ibus-keypress.c
-+++ b/src/tests/ibus-keypress.c
-@@ -288,6 +288,10 @@ int
- main (int argc, char *argv[])
- {
-     ibus_init ();
-+    /* Avoid a warning of "AT-SPI: Could not obtain desktop path or name"
-+     * with gtk_main().
-+     */
-+    g_setenv ("NO_AT_BRIDGE", "1", TRUE);
-     g_test_init (&argc, &argv, NULL);
-     gtk_init (&argc, &argv);
- 
--- 
-2.21.0
-
-From 0c89a7ee33bfe5b403c798e0ddb39e4c05d0d971 Mon Sep 17 00:00:00 2001
-From: Hodong Kim <cogniti@gmail.com>
-Date: Thu, 25 Jul 2019 14:37:52 +0900
-Subject: [PATCH 27/27] client/x11: Update LOCALES_STRING
-
-Update LOCALES_STRING in locales.h from /usr/share/i18n/SUPPORTED on
-Debian Buster.
-
-BUG=https://github.com/ibus/ibus/pull/2110
----
- client/x11/locales.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/client/x11/locales.h b/client/x11/locales.h
-index 0155e22a..61af74fb 100644
---- a/client/x11/locales.h
-+++ b/client/x11/locales.h
-@@ -1,2 +1,2 @@
- /* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
--#define LOCALES_STRING "aa,af,am,an,ar,as,ast,az,be,ber,bg,bn,bo,br,bs,byn,C,ca,crh,cs,csb,cy,da,de,dz,el,en,es,et,eu,fa,fi,fil,fo,fr,fur,fy,ga,gd,gez,gl,gu,gv,ha,he,hi,hne,hr,hsb,ht,hu,hy,id,ig,ik,is,it,iu,iw,ja,ka,kk,kl,km,kn,ko,ks,ku,kw,ky,lg,li,lo,lt,lv,mai,mg,mi,mk,ml,mn,mr,ms,mt,nan,nb,nds,ne,nl,nn,no,nr,nso,oc,om,or,pa,pa,pap,pl,pt,ro,ru,rw,sa,sc,sd,se,shs,si,sid,sk,sl,so,sq,sr,ss,st,sv,ta,te,tg,th,ti,tig,tk,tl,tn,tr,ts,tt,ug,uk,ur,uz,ve,vi,wa,wo,xh,yi,yo,zh,zu"
-+#define LOCALES_STRING "aa,af,agr,ak,am,an,anp,ar,ayc,az,as,ast,be,bem,ber,bg,bhb,bho,bi,bn,bo,br,brx,bs,byn,C,ca,ce,chr,cmn,crh,cs,csb,cv,cy,da,de,doi,dsb,dv,dz,el,en,eo,es,et,eu,fa,ff,fi,fil,fo,fr,fur,fy,ga,gd,gez,gl,gu,gv,ha,hak,he,hi,hif,hne,hr,hsb,ht,hu,hy,ia,id,ig,ik,is,it,iu,ja,ka,kab,kk,kl,km,kn,ko,kok,ks,ku,kw,ky,lb,lg,li,lij,ln,lo,lt,lv,lzh,mag,mai,mfe,mg,mhr,mi,miq,mjw,mk,ml,mn,mni,mr,ms,mt,my,nan,nb,nds,ne,nhn,niu,nl,nn,no,nr,nso,oc,om,or,os,pa,pap,pl,ps,pt,quz,raj,ro,ru,rw,sa,sah,sat,sc,sd,se,sgs,shn,shs,si,sid,sk,sl,sm,so,sq,sr,ss,st,sv,sw,szl,ta,tcy,te,tg,th,the,ti,tig,tk,tl,tn,to,tpi,tr,ts,tt,ug,uk,unm,ur,uz,ve,vi,wa,wae,wal,wo,xh,yi,yo,yue,yuw,zh,zu"
--- 
-2.21.0
-
-From f4463c0433c5f48a4fb2830e8c2ae9619fbb18d1 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Mon, 29 Jul 2019 19:05:43 +0900
-Subject: [PATCH] src/tests: Fix a fatal error with g_warning
-
-I set g_log_set_always_fatal() before gtk_init() in ibus-compose for
-a compose warning of GtkIMContextSimple but actually the warning is
-output during gtk_main() due to GtkIMContextSimple.set_client_window()
-so I moved g_log_set_always_fatal() before gtk_main() in ibus-compose.c.
-
-Also set IFS in ibus-compose-locales to set the delimiter to '\n' for
-for-loop arguments.
----
- src/tests/ibus-compose-locales.in |  8 ++++++++
- src/tests/ibus-compose.c          | 21 ++++++++++-----------
- 2 files changed, 18 insertions(+), 11 deletions(-)
-
-diff --git a/src/tests/ibus-compose-locales.in b/src/tests/ibus-compose-locales.in
-index fad02965..f650b584 100755
---- a/src/tests/ibus-compose-locales.in
-+++ b/src/tests/ibus-compose-locales.in
-@@ -7,19 +7,27 @@ BUILDDIR=`dirname $0`
- export IBUS_COMPOSE_CACHE_DIR=$PWD
- 
- retval=0
-+# Let for-loop notice '\n' as a delimiter
-+IFS=$'\n'
- for var in `cat $SRCDIR/ibus-compose.env`
- do
-+    # Revert IFS to recognize env a=foo b=foo
-+    IFS=' '
-     IS_COMMENT=`echo "$var" | grep "^#"`
-     if [ "x$IS_COMMENT" != x ] ; then
-         continue
-     fi
-+    echo "# Starting $var $BUILDDIR/ibus-compose $SRCDIR $@"
-     env $var $BUILDDIR/ibus-compose $SRCDIR $@
-     retval=`expr $retval + $?`
-+    echo "# Finished $var $BUILDDIR/ibus-compose $SRCDIR $@ with $retval"
- 
-     CACHE_FILES=`ls *.cache`
-     if [ x"$CACHE_FILES" != x ] ; then
-         echo "Clean $CACHE_FILES"
-         rm $CACHE_FILES
-     fi
-+    IFS=$'\n'
- done
-+IFS=' '
- exit $retval
-diff --git a/src/tests/ibus-compose.c b/src/tests/ibus-compose.c
-index db359477..4b4c56e7 100644
---- a/src/tests/ibus-compose.c
-+++ b/src/tests/ibus-compose.c
-@@ -331,20 +331,28 @@ create_window ()
- static void
- test_compose (void)
- {
-+    GLogLevelFlags flags;
-     if (!register_ibus_engine ()) {
-         g_test_fail ();
-         return;
-     }
- 
-     create_window ();
-+    /* FIXME:
-+     * IBusIMContext opens GtkIMContextSimple as the slave and
-+     * GtkIMContextSimple opens the compose table on el_GR.UTF-8, and the
-+     * multiple outputs in el_GR's compose causes a warning in gtkcomposetable
-+     * and the warning always causes a fatal in GTest:
-+     " "GTK+ supports to output one char only: "
-+     */
-+    flags = g_log_set_always_fatal (G_LOG_LEVEL_CRITICAL);
-     gtk_main ();
--
-+    g_log_set_always_fatal (flags);
- }
- 
- int
- main (int argc, char *argv[])
- {
--    GLogLevelFlags flags;
-     const gchar *test_name;
-     gchar *test_path;
- 
-@@ -354,16 +362,7 @@ main (int argc, char *argv[])
-      */
-     g_setenv ("NO_AT_BRIDGE", "1", TRUE);
-     g_test_init (&argc, &argv, NULL);
--    /* FIXME:
--     * IBusIMContext opens GtkIMContextSimple as the slave and
--     * GtkIMContextSimple opens the compose table on el_GR.UTF-8, and the
--     * multiple outputs in el_GR's compose causes a warning in gtkcomposetable
--     * and the warning always causes a fatal in GTest:
--     " "GTK+ supports to output one char only: "
--     */
--    flags = g_log_set_always_fatal (G_LOG_LEVEL_CRITICAL);
-     gtk_init (&argc, &argv);
--    g_log_set_always_fatal (flags);
- 
-     m_srcdir = argc > 1 ? g_strdup (argv[1]) : g_strdup (".");
-     m_compose_file = g_strdup (g_getenv ("COMPOSE_FILE"));
--- 
-2.21.0
-
-From 7dde99600777f195da614130950ecbd339439d35 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Wed, 31 Jul 2019 16:27:49 +0900
-Subject: [PATCH] src/tests: Fix wrong echo with direct runner in
- ibus-desktop-testing-runner
-
-The wrong echo prevent from counting the test results in the direct
-testing runner.
----
- src/tests/ibus-desktop-testing-runner.in | 33 +++++++++++++-----------
- 1 file changed, 18 insertions(+), 15 deletions(-)
-
-diff --git a/src/tests/ibus-desktop-testing-runner.in b/src/tests/ibus-desktop-testing-runner.in
-index b7a72285..3045d601 100755
---- a/src/tests/ibus-desktop-testing-runner.in
-+++ b/src/tests/ibus-desktop-testing-runner.in
-@@ -153,7 +153,7 @@ _EOF
-         XDG_LANG_ORIG=`cat $XDG_LOCALE_FILE`
-         XDG_LANG_NEW=`echo $LANG | sed -e 's/\(.*\)\..*/\1/'`
-         if [ "$XDG_LANG_ORIG" != "$XDG_LANG_NEW" ] ; then
--            echo "Overriding XDG locale $XDG_LANG_ORIG with $XDG_LANG_NEW"
-+            echo "# Overriding XDG locale $XDG_LANG_ORIG with $XDG_LANG_NEW"
-             echo "$XDG_LANG_NEW" > $XDG_LOCALE_FILE
-         fi
-     fi
-@@ -206,11 +206,9 @@ echo_case_result()
-     subtst=${3:-''}
- 
-     if test $retval -eq  0 ; then
--        print_log -e "${GREEN}PASS${NC}: $tst $subtst"
-+        echo "PASS: $tst $subtst" >>$TEST_LOG
-     else
--        print_log -e "${RED}FAIL${NC}: $tst $subtst"
--        print_log "======================"
--        print_log ""
-+        echo "FAIL: $tst $subtst" >>$TEST_LOG
-     fi
- }
- 
-@@ -232,32 +230,37 @@ EOF
-             echo_case_result $retval $tst
-             CACHE_FILES=`ls *.cache`
-             if [ x"$CACHE_FILES" != x ] ; then
--                print_log "Clean $CACHE_FILES"
-+                echo "# Clean $CACHE_FILES" >>$TEST_LOG
-                 rm $CACHE_FILES
-             fi
-         else
--            LANG_backup=$LANG
-             i=1
-+            # Let for-loop notice '\n' as a delimiter
-+            IFS=$'\n'
-             for e in $ENVS; do
-+                # Revert IFS to recognize env a=foo b=foo
-+                IFS=' '
-                 first=`echo "$e" | grep '^#'`
-                 if test x"$first" = x"#" ; then
-                     continue
-                 fi
--                export $e
--                $BUILDDIR/$tst $SRCDIR 2>>$TEST_LOG 1>>$TEST_LOG
-+                echo "# Starting $e $BUILDDIR/$tst $SRCDIR" >>$TEST_LOG
-+                env $e $BUILDDIR/$tst $SRCDIR 2>>$TEST_LOG 1>>$TEST_LOG
-                 retval=$?
-+                echo "# Finished $e $BUILDDIR/$tst $SRCDIR with $retval" >>$TEST_LOG
-                 read pass fail << EOF
-                 `count_case_result $retval $pass $fail`
- EOF
-                 echo_case_result $retval $tst $e
-                 CACHE_FILES=`ls *.cache`
-                 if [ x"$CACHE_FILES" != x ] ; then
--                    print_log "Clean $CACHE_FILES"
-+                    echo "# Clean $CACHE_FILES" >>$TEST_LOG
-                     rm $CACHE_FILES
-                 fi
-                 i=`expr $i + 1`
-+                IFS=$'\n'
-             done
--            export LANG=$LANG_backup
-+            IFS=' '
-         fi
-     done
-     echo $pass $fail
-@@ -325,24 +328,24 @@ EOF_RUNNER
-     if [ $TEST_LOG_STDOUT -eq 1 ] ; then
-         cat $TEST_LOG
-     else
--        echo "See $TEST_LOG"
-+        echo "# See $TEST_LOG"
-     fi
- }
- 
- finit()
- {
--    echo "Killing left gnome-session and Xorg"
-+    echo "# Killing left gnome-session and Xorg"
-     kill $PID_GNOME_SESSION $PID_XORG
-     ibus exit
-     SUSER=`echo "$USER" | cut -c 1-7`
-     LEFT_CALENDAR=`ps -ef | grep gnome-shell-calendar-server | grep $SUSER | grep -v grep`
-     if [ x"$LEFT_CALENDAR" != x ] ; then
--        echo "Killing left gnome-shell-calendar-server"
-+        echo "# Killing left gnome-shell-calendar-server"
-         echo "$LEFT_CALENDAR"
-         echo "$LEFT_CALENDAR" | awk '{print $2}' | xargs kill
-     fi
- 
--    echo "Finished $PROGNAME testing"
-+    echo "# Finished $PROGNAME testing"
- }
- 
- main()
--- 
-2.21.0
-
-From 32572618cdcc36162b5769eb4c71964db9734061 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Tue, 6 Aug 2019 18:55:14 +0900
-Subject: [PATCH] bus: Exit ibus-daemon with parent's death
-
-ibus-daemon can be restarted unexpectedly during logging out the session
-and double ibus-x11 prevent from enabling XIM in XGetSelectionOwner()
-for the "ibus" atom.
-ibus-daemon always will exit the process when the parent process dies
-to avoid this problem.
----
- bus/main.c   | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++-
- configure.ac |  3 +++
- 2 files changed, 58 insertions(+), 1 deletion(-)
-
-diff --git a/bus/main.c b/bus/main.c
-index 3223d541..e11a5ebd 100644
---- a/bus/main.c
-+++ b/bus/main.c
-@@ -33,6 +33,10 @@
- #include <sys/stat.h>
- #include <unistd.h>
- 
-+#ifdef HAVE_SYS_PRCTL_H
-+#include <sys/prctl.h>
-+#endif
-+
- #include "global.h"
- #include "ibusimpl.h"
- #include "server.h"
-@@ -161,6 +165,15 @@ daemon (gint nochdir, gint noclose)
- }
- #endif
- 
-+#ifdef HAVE_SYS_PRCTL_H
-+static void
-+_sig_usr1_handler (int sig)
-+{
-+    g_warning ("The parent process died.");
-+    bus_server_quit (FALSE);
-+}
-+#endif
-+
- gint
- main (gint argc, gchar **argv)
- {
-@@ -201,7 +214,7 @@ main (gint argc, gchar **argv)
-     /* daemonize process */
-     if (daemonize) {
-         if (daemon (1, 0) != 0) {
--            g_printerr ("Can not daemonize ibus.\n");
-+            g_printerr ("Cannot daemonize ibus.\n");
-             exit (-1);
-         }
-     }
-@@ -299,6 +312,47 @@ main (gint argc, gchar **argv)
-             exit (-1);
-     }
- 
-+    if (!daemonize) {
-+        if (getppid () == 1) {
-+            g_warning ("The parent process died.");
-+            exit (0);
-+        }
-+#ifdef HAVE_SYS_PRCTL_H
-+       /* Currently ibus-x11 detects XIOError and assume the error as the
-+        * desktop session is closed and ibus-x11 calls Exit D-Bus method to
-+        * exit ibus-daemon. But a few desktop sessions cause XError before
-+        * XIOError and GTK does not allow to bind XError by applications and
-+        * GTK calls gdk_x_error() with XError.
-+        *
-+        * E.g. GdkX11Screen calls XGetSelectionOwner() for "_XSETTINGS_S?"
-+        * atoms during the logout but the selection owner already becomes
-+        * NULL and the NULL window causes XError with
-+        * gdk_x11_window_foreign_new_for_display().
-+        *
-+        * Since ibus-x11 exits with XError before XIOError, gnome-shell
-+        * can detects the exit of ibus-daemon a little earlier and
-+        * gnome-shell restarts ibus-daemon but gnome-shell dies soon.
-+        * Then gnome-shell dies but ibus-daemon is alive, it's a problem.
-+        * Because it causes double ibus-x11 of GDM and a login user
-+        * and double XSetSelectionOwner() is not allowed for the unique
-+        * "ibus" atom and the user cannot use XIM but not GtkIMModule.
-+        *
-+        * Probably we could fix the ibus process problem if we would fix
-+        * XError about the X selection owner or stop to restart ibus-daemon
-+        * in gonme-shell when the session is logging out.
-+        * Maybe using SessionManager.LogoutRemote() or
-+        * global.screen.get_display().get_xdisplay()
-+        * But I assume thereare other scenarios to causes the problem.
-+        *
-+        * And I decided ibus-daemon always exits with the parent's death here
-+        * to avoid unexpected ibus restarts during the logout.
-+        */
-+        if (prctl (PR_SET_PDEATHSIG, SIGUSR1))
-+            g_printerr ("Cannot bind SIGUSR1 for parent death\n");
-+        else
-+            signal (SIGUSR1, _sig_usr1_handler);
-+#endif
-+    }
-     bus_server_run ();
-     return 0;
- }
-diff --git a/configure.ac b/configure.ac
-index f1df3ac1..fdd316a9 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -140,6 +140,9 @@ AC_ISC_POSIX
- AC_HEADER_STDC
- LT_INIT
- 
-+# Check header filess.
-+AC_CHECK_HEADERS([sys/prctl.h])
-+
- # Check functions.
- AC_CHECK_FUNCS(daemon)
- 
--- 
-2.21.0
-
-From 28c10d64d282fa9fbc35a7bc44a096f6137d5e46 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Tue, 13 Aug 2019 20:06:51 +0900
-Subject: [PATCH] src/tests: Set XDG_SESSION_TYPE in
- ibus-desktop-testing-runner
-
-mutter 3.33.90 or later exits the session without loginctl.
-Now ibus-desktop-testing-runner has XDG_SESSION_TYPE forcibly
-not to exit gnome-shell.
----
- src/tests/ibus-desktop-testing-runner.in | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/src/tests/ibus-desktop-testing-runner.in b/src/tests/ibus-desktop-testing-runner.in
-index 3045d601..141e9b5b 100755
---- a/src/tests/ibus-desktop-testing-runner.in
-+++ b/src/tests/ibus-desktop-testing-runner.in
-@@ -157,6 +157,8 @@ _EOF
-             echo "$XDG_LANG_NEW" > $XDG_LOCALE_FILE
-         fi
-     fi
-+    # `su` command does not run loginctl
-+    export XDG_SESSION_TYPE='x11'
- }
- 
- run_dbus_daemon()
-@@ -175,6 +177,7 @@ run_desktop()
-     PID_XORG=$!
-     sleep 1
-     export DISPLAY=$DISPLAY
-+    echo "Running $DESKTOP_COMMAND with $USER in `tty`"
-     $DESKTOP_COMMAND &
-     PID_GNOME_SESSION=$!
-     sleep 30
--- 
-2.21.0
-

^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2026-05-31  2:09 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-05-31  2:08 [rpms/ibus] autotool: Delete upstreamed ibus-HEAD.patch Takao Fujiwara
  -- strict thread matches above, loose matches on Subject: below --
2026-05-31  2:09 Takao Fujiwara
2026-05-31  2:09 Takao Fujiwara
2026-05-31  2:08 Takao Fujiwara
2026-05-31  2:08 Takao Fujiwara
2026-05-31  2:07 Takao Fujiwara
2026-05-31  2:07 Takao Fujiwara
2026-05-31  2:07 Takao Fujiwara

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