public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
From: Takao Fujiwara <tfujiwar@redhat.com>
To: git-commits@fedoraproject.org
Subject: [rpms/ibus] autotool: Do not use combined characters on preedit for compose keys
Date: Sun, 31 May 2026 02:06:53 GMT	[thread overview]
Message-ID: <178019321372.1.2227273062775465659.rpms-ibus-866e11711f85@fedoraproject.org> (raw)

            A new commit has been pushed.

            Repo   : rpms/ibus
            Branch : autotool
            Commit : 866e11711f85f042e89d6f11ad0fd6197e5a3bde
            Author : Takao Fujiwara <tfujiwar@redhat.com>
            Date   : 2018-06-29T16:50:24+09:00
            Stats  : +268/-4 in 2 file(s)
            URL    : https://src.fedoraproject.org/rpms/ibus/c/866e11711f85f042e89d6f11ad0fd6197e5a3bde?branch=autotool

            Log:
            Do not use combined characters on preedit for compose keys

Fixed an infinite loop of extension preedit with xterm

---
diff --git a/ibus-HEAD.patch b/ibus-HEAD.patch
index c4cba91..ac3a533 100644
--- a/ibus-HEAD.patch
+++ b/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

diff --git a/ibus.spec b/ibus.spec
index 9fa348b..3b2bf11 100644
--- a/ibus.spec
+++ b/ibus.spec
@@ -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

                 reply	other threads:[~2026-05-31  2:06 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=178019321372.1.2227273062775465659.rpms-ibus-866e11711f85@fedoraproject.org \
    --to=tfujiwar@redhat.com \
    --cc=git-commits@fedoraproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox