Do not use combined characters on preedit for compose keys
Fixed an infinite loop of extension preedit with xterm
This commit is contained in:
parent
c082e5d25c
commit
866e11711f
266
ibus-HEAD.patch
266
ibus-HEAD.patch
@ -9288,21 +9288,281 @@ index 94ce53b7..61dfb89f 100644
|
||||
--
|
||||
2.14.3
|
||||
|
||||
From 9b26a4b46fa2635033d315e8babb8c4ca9869898 Mon Sep 17 00:00:00 2001
|
||||
From 3a68ded197b3ad2e45ac08fe52c0514aff987367 Mon Sep 17 00:00:00 2001
|
||||
From: fujiwarat <takao.fujiwara1@gmail.com>
|
||||
Date: Wed, 27 Jun 2018 12:18:26 +0900
|
||||
Date: Fri, 29 Jun 2018 16:02:32 +0900
|
||||
Subject: [PATCH] ibusenginesimple: Do not show combined character on
|
||||
compose preedit
|
||||
|
||||
Some applications could combine their committed string with compose
|
||||
character on preedit. E.g. dead_grave after 'e' on firefox
|
||||
|
||||
BUG=https://github.com/ibus/ibus/issues/1935
|
||||
---
|
||||
src/ibusenginesimple.c | 119 ++++++++++++++++++++++++++-----------------------
|
||||
1 file changed, 63 insertions(+), 56 deletions(-)
|
||||
|
||||
diff --git a/src/ibusenginesimple.c b/src/ibusenginesimple.c
|
||||
index 61dfb89f..68d6fb1e 100644
|
||||
--- a/src/ibusenginesimple.c
|
||||
+++ b/src/ibusenginesimple.c
|
||||
@@ -219,67 +219,73 @@ ibus_engine_simple_commit_char (IBusEngineSimple *simple,
|
||||
ibus_text_new_from_unichar (ch));
|
||||
}
|
||||
|
||||
-#define COMPOSE_KEYSYM_TO_UNICHAR(keysym, unichar) { \
|
||||
-
|
||||
static gunichar
|
||||
-ibus_keysym_to_unicode (guint16 keysym) {
|
||||
-#define CASE(keysym_suffix, unicode) \
|
||||
+ibus_keysym_to_unicode (guint16 keysym,
|
||||
+ gboolean combining) {
|
||||
+#define CASE(keysym_suffix, unicode) \
|
||||
case IBUS_KEY_dead_##keysym_suffix: return unicode
|
||||
+#define CASE_COMBINE(keysym_suffix, combined_unicode, isolated_unicode) \
|
||||
+ case IBUS_KEY_dead_##keysym_suffix: \
|
||||
+ if (combining) \
|
||||
+ return combined_unicode; \
|
||||
+ else \
|
||||
+ return isolated_unicode
|
||||
switch (keysym) {
|
||||
- CASE(a, 0x03041);
|
||||
- CASE(A, 0x03042);
|
||||
- CASE(i, 0x03043);
|
||||
- CASE(I, 0x03044);
|
||||
- CASE(u, 0x03045);
|
||||
- CASE(U, 0x03046);
|
||||
- CASE(e, 0x03047);
|
||||
- CASE(E, 0x03048);
|
||||
- CASE(o, 0x03049);
|
||||
- CASE(O, 0x0304a);
|
||||
- CASE(abovecomma, 0x0313);
|
||||
- CASE(abovedot, 0x0307);
|
||||
- CASE(abovereversedcomma, 0x0314);
|
||||
- CASE(abovering, 0x030a);
|
||||
- CASE(acute, 0x0301);
|
||||
- CASE(belowbreve, 0x032e);
|
||||
- CASE(belowcircumflex, 0x032d);
|
||||
- CASE(belowcomma, 0x0326);
|
||||
- CASE(belowdiaeresis, 0x0324);
|
||||
- CASE(belowdot, 0x0323);
|
||||
- CASE(belowmacron, 0x0331);
|
||||
- CASE(belowring, 0x030a);
|
||||
- CASE(belowtilde, 0x0330);
|
||||
- CASE(breve, 0x0306);
|
||||
- CASE(capital_schwa, 0x018f);
|
||||
- CASE(caron, 0x030c);
|
||||
- CASE(cedilla, 0x0327);
|
||||
- CASE(circumflex, 0x0302);
|
||||
- CASE(currency, 0x00a4);
|
||||
+ CASE (a, 0x03041);
|
||||
+ CASE (A, 0x03042);
|
||||
+ CASE (i, 0x03043);
|
||||
+ CASE (I, 0x03044);
|
||||
+ CASE (u, 0x03045);
|
||||
+ CASE (U, 0x03046);
|
||||
+ CASE (e, 0x03047);
|
||||
+ CASE (E, 0x03048);
|
||||
+ CASE (o, 0x03049);
|
||||
+ CASE (O, 0x0304A);
|
||||
+ CASE (abovecomma, 0x0313);
|
||||
+ CASE_COMBINE (abovedot, 0x0307, 0x02D9);
|
||||
+ CASE (abovereversedcomma, 0x0314);
|
||||
+ CASE_COMBINE (abovering, 0x030A, 0x02DA);
|
||||
+ CASE_COMBINE (acute, 0x0301, 0x00B4);
|
||||
+ CASE (belowbreve, 0x032E);
|
||||
+ CASE_COMBINE (belowcircumflex, 0x032D, 0xA788);
|
||||
+ CASE_COMBINE (belowcomma, 0x0326, 0x002C);
|
||||
+ CASE (belowdiaeresis, 0x0324);
|
||||
+ CASE_COMBINE (belowdot, 0x0323, 0x002E);
|
||||
+ CASE_COMBINE (belowmacron, 0x0331, 0x02CD);
|
||||
+ CASE_COMBINE (belowring, 0x030A, 0x02F3);
|
||||
+ CASE_COMBINE (belowtilde, 0x0330, 0x02F7);
|
||||
+ CASE_COMBINE (breve, 0x0306, 0x02D8);
|
||||
+ CASE_COMBINE (capital_schwa, 0x018F, 0x04D8);
|
||||
+ CASE_COMBINE (caron, 0x030C, 0x02C7);
|
||||
+ CASE_COMBINE (cedilla, 0x0327, 0x00B8);
|
||||
+ CASE_COMBINE (circumflex, 0x0302, 0x005E);
|
||||
+ CASE (currency, 0x00A4);
|
||||
// IBUS_KEY_dead_dasia == IBUS_KEY_dead_abovereversedcomma
|
||||
- CASE(diaeresis, 0x0308);
|
||||
- CASE(doubleacute, 0x030b);
|
||||
- CASE(doublegrave, 0x030f);
|
||||
- CASE(grave, 0x0300);
|
||||
- CASE(greek, 0x03b1);
|
||||
- CASE(hook, 0x0309);
|
||||
- CASE(horn, 0x031b);
|
||||
- CASE(invertedbreve, 0x032f);
|
||||
- CASE(iota, 0x0345);
|
||||
- CASE(macron, 0x0304);
|
||||
- CASE(ogonek, 0x0328);
|
||||
+ CASE_COMBINE (diaeresis, 0x0308, 0x00A8);
|
||||
+ CASE_COMBINE (doubleacute, 0x030B, 0x02DD);
|
||||
+ CASE_COMBINE (doublegrave, 0x030F, 0x02F5);
|
||||
+ CASE_COMBINE (grave, 0x0300, 0x0060);
|
||||
+ CASE (greek, 0x03BC);
|
||||
+ CASE (hook, 0x0309);
|
||||
+ CASE (horn, 0x031B);
|
||||
+ CASE (invertedbreve, 0x032F);
|
||||
+ CASE_COMBINE (iota, 0x0345, 0x037A);
|
||||
+ CASE_COMBINE (macron, 0x0304, 0x00AF);
|
||||
+ CASE_COMBINE (ogonek, 0x0328, 0x02DB);
|
||||
// IBUS_KEY_dead_perispomeni == IBUS_KEY_dead_tilde
|
||||
// IBUS_KEY_dead_psili == IBUS_KEY_dead_abovecomma
|
||||
- CASE(semivoiced_sound, 0x309a);
|
||||
- CASE(small_schwa, 0x1d4a);
|
||||
- CASE(stroke, 0x29f8);
|
||||
- CASE(tilde, 0x0303);
|
||||
- CASE(voiced_sound, 0x3099);
|
||||
+ CASE_COMBINE (semivoiced_sound, 0x309A, 0x309C);
|
||||
+ CASE_COMBINE (small_schwa, 0x1D4A, 0x04D9);
|
||||
+ CASE (stroke, 0x002F);
|
||||
+ CASE_COMBINE (tilde, 0x0303, 0x007E);
|
||||
+ CASE_COMBINE (voiced_sound, 0x3099, 0x309B);
|
||||
case IBUS_KEY_Multi_key:
|
||||
return 0x2384;
|
||||
default:;
|
||||
}
|
||||
return 0x0;
|
||||
#undef CASE
|
||||
+#undef CASE_COMBINE
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -352,7 +358,7 @@ ibus_engine_simple_update_preedit_text (IBusEngineSimple *simple)
|
||||
int hexchars = 0;
|
||||
while (priv->compose_buffer[hexchars] != 0) {
|
||||
guint16 keysym= priv->compose_buffer[hexchars];
|
||||
- gunichar unichar = ibus_keysym_to_unicode (keysym);
|
||||
+ gunichar unichar = ibus_keysym_to_unicode (keysym, FALSE);
|
||||
if (unichar > 0)
|
||||
outbuf[len] = unichar;
|
||||
else
|
||||
@@ -847,13 +853,14 @@ ibus_check_algorithmically (const guint16 *compose_buffer,
|
||||
combination_buffer[n_compose] = 0;
|
||||
i--;
|
||||
while (i >= 0) {
|
||||
- combination_buffer[i+1] = ibus_keysym_to_unicode (compose_buffer[i]);
|
||||
- if (!combination_buffer[i+1]) {
|
||||
- combination_buffer[i+1] =
|
||||
- ibus_keyval_to_unicode (compose_buffer[i]);
|
||||
+ combination_buffer[i+1] = ibus_keysym_to_unicode (compose_buffer[i],
|
||||
+ TRUE);
|
||||
+ if (!combination_buffer[i+1]) {
|
||||
+ combination_buffer[i+1] =
|
||||
+ ibus_keyval_to_unicode (compose_buffer[i]);
|
||||
+ }
|
||||
+ i--;
|
||||
}
|
||||
- i--;
|
||||
- }
|
||||
|
||||
/* If the buffer normalizes to a single character,
|
||||
* then modify the order of combination_buffer accordingly, if necessary,
|
||||
--
|
||||
2.14.3
|
||||
|
||||
From caffeaeee5be121713104fba331b9cf30726aa91 Mon Sep 17 00:00:00 2001
|
||||
From: fujiwarat <takao.fujiwara1@gmail.com>
|
||||
Date: Fri, 29 Jun 2018 16:06:52 +0900
|
||||
Subject: [PATCH] panelbinding: Fix SEGV in panel_binding_parse_accelerator
|
||||
|
||||
panel_binding_parse_accelerator() could return NULL of the unowned
|
||||
IBus.ProcessKeyEventData with gcc optimization.
|
||||
Since Vala does not provice a static local variable, the variable is
|
||||
moved to the class member to fix this SEGV.
|
||||
Also fixed an infinite loop to show a compose preedit in xterm.
|
||||
Also a NULL preedit is fixed in the first emoji candidate from the
|
||||
emoji category window.
|
||||
---
|
||||
bus/inputcontext.c | 9 +++++++++
|
||||
bus/panelproxy.c | 38 ++++++++++++++++++++++++++++++++++++--
|
||||
ui/gtk3/panelbinding.vala | 28 ++++++++++++++++------------
|
||||
1 file changed, 16 insertions(+), 12 deletions(-)
|
||||
3 files changed, 61 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/bus/inputcontext.c b/bus/inputcontext.c
|
||||
index bf9eafcf..98639a24 100644
|
||||
--- a/bus/inputcontext.c
|
||||
+++ b/bus/inputcontext.c
|
||||
@@ -1730,6 +1730,15 @@ bus_input_context_hide_auxiliary_text (BusInputContext *context)
|
||||
}
|
||||
}
|
||||
|
||||
+/**
|
||||
+ * bus_input_context_update_lookup_table:
|
||||
+ * @context: #BusInputContext
|
||||
+ * @table: #IBusLookupTable
|
||||
+ * @visible: %TRUE if the lookup table is visible, otherwise %FALSE.
|
||||
+ * @is_extension: %TRUE if the lookup table is called by a panel extension.
|
||||
+ * %FALSE if it's called by an engine.
|
||||
+ * I.e. is_extension_lookup_table means the owner of the lookup table.
|
||||
+ */
|
||||
void
|
||||
bus_input_context_update_lookup_table (BusInputContext *context,
|
||||
IBusLookupTable *table,
|
||||
diff --git a/bus/panelproxy.c b/bus/panelproxy.c
|
||||
index 1c0fcca2..3e6d5be2 100644
|
||||
--- a/bus/panelproxy.c
|
||||
+++ b/bus/panelproxy.c
|
||||
@@ -743,6 +743,16 @@ _context_update_preedit_text_cb (BusInputContext *context,
|
||||
|
||||
g_return_if_fail (panel->focused_context == context);
|
||||
|
||||
+ /* The callback is called with X11 applications but
|
||||
+ * the callback is not called for extensions and panel
|
||||
+ * extensions are always calls by
|
||||
+ * bus_panel_proxy_update_preedit_text() directly
|
||||
+ * because panel extensions foward UpdatePreeditText to
|
||||
+ * UpdatePreeditTextReceived and it can be an infinite
|
||||
+ * loop.
|
||||
+ */
|
||||
+ if (panel->panel_type != PANEL_TYPE_PANEL)
|
||||
+ return;
|
||||
bus_panel_proxy_update_preedit_text (panel,
|
||||
text,
|
||||
cursor_pos,
|
||||
@@ -847,8 +857,31 @@ _context_set_content_type_cb (BusInputContext *context,
|
||||
bus_panel_proxy_##name (panel); \
|
||||
}
|
||||
|
||||
-DEFINE_FUNCTION (show_preedit_text)
|
||||
-DEFINE_FUNCTION (hide_preedit_text)
|
||||
+#define DEFINE_FUNCTION_NO_EXTENSION(name) \
|
||||
+ static void _context_##name##_cb (BusInputContext *context, \
|
||||
+ BusPanelProxy *panel) \
|
||||
+ { \
|
||||
+ g_assert (BUS_IS_INPUT_CONTEXT (context)); \
|
||||
+ g_assert (BUS_IS_PANEL_PROXY (panel)); \
|
||||
+ \
|
||||
+ g_return_if_fail (panel->focused_context == context); \
|
||||
+ \
|
||||
+ /* The callback is called with X11 applications but \
|
||||
+ * the callback is not called for extensions and panel \
|
||||
+ * extensions are always calls by \
|
||||
+ * bus_panel_proxy_update_preedit_text() directly \
|
||||
+ * because panel extensions foward UpdatePreeditText to \
|
||||
+ * UpdatePreeditTextReceived and it can be an infinite \
|
||||
+ * loop. \
|
||||
+ */ \
|
||||
+ if (panel->panel_type != PANEL_TYPE_PANEL) \
|
||||
+ return; \
|
||||
+ bus_panel_proxy_##name (panel); \
|
||||
+ }
|
||||
+
|
||||
+
|
||||
+DEFINE_FUNCTION_NO_EXTENSION (show_preedit_text)
|
||||
+DEFINE_FUNCTION_NO_EXTENSION (hide_preedit_text)
|
||||
DEFINE_FUNCTION (show_auxiliary_text)
|
||||
DEFINE_FUNCTION (hide_auxiliary_text)
|
||||
DEFINE_FUNCTION (show_lookup_table)
|
||||
@@ -860,6 +893,7 @@ DEFINE_FUNCTION (cursor_down_lookup_table)
|
||||
DEFINE_FUNCTION (state_changed)
|
||||
|
||||
#undef DEFINE_FUNCTION
|
||||
+#undef DEFINE_FUNCTION_NO_EXTENSION
|
||||
|
||||
static const struct {
|
||||
gchar *name;
|
||||
diff --git a/ui/gtk3/panelbinding.vala b/ui/gtk3/panelbinding.vala
|
||||
index 52b78c17..95115b13 100644
|
||||
--- a/ui/gtk3/panelbinding.vala
|
||||
|
@ -39,7 +39,7 @@
|
||||
|
||||
Name: ibus
|
||||
Version: 1.5.18
|
||||
Release: 8%{?dist}
|
||||
Release: 9%{?dist}
|
||||
Summary: Intelligent Input Bus for Linux OS
|
||||
License: LGPLv2+
|
||||
Group: System Environment/Libraries
|
||||
@ -435,6 +435,10 @@ dconf update || :
|
||||
%{_datadir}/gtk-doc/html/*
|
||||
|
||||
%changelog
|
||||
* Fri Jun 29 2018 Takao Fujiwara <tfujiwar@redhat.com> - 1.5.18-9
|
||||
- Do not use combined characters on preedit for compose keys
|
||||
- Fixed an infinite loop of extension preedit with xterm
|
||||
|
||||
* Wed Jun 27 2018 Takao Fujiwara <tfujiwar@redhat.com> - 1.5.18-8
|
||||
- Enable preedit for compose keys
|
||||
- Fix SEGV in panel_binding_parse_accelerator
|
||||
|
Loading…
Reference in New Issue
Block a user