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>[ '<Control>period' ]</default>
-+ <default>[ '<Control>period', '<Control>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"><big><b>IBus</b></big>
--<small>The intelligent input bus</small>
--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"><b>Startup</b></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"><b>Fonts</b></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,
-- §ion_data,
-- watch_fixture_setup,
-- test_config_watch,
-- watch_fixture_teardown);
--
-- g_test_add ("/ibus/config-watch/section-multiple",
-- WatchFixture,
-- §ion_multiple_data,
-- watch_fixture_setup,
-- test_config_watch,
-- watch_fixture_teardown);
--
-- g_test_add ("/ibus/config-watch/section-name",
-- WatchFixture,
-- §ion_name_data,
-- watch_fixture_setup,
-- test_config_watch,
-- watch_fixture_teardown);
--
-- g_test_add ("/ibus/config-watch/section-name-multiple",
-- WatchFixture,
-- §ion_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