Fix algorithm dead keys

This commit is contained in:
Takao Fujiwara 2022-03-01 20:32:58 +09:00
parent a902aab7a9
commit 9dd3ddc854
2 changed files with 281 additions and 1 deletions

View File

@ -2343,3 +2343,280 @@ index fa0c9b40..1b815345 100644
--
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 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

View File

@ -39,7 +39,7 @@
Name: ibus
Version: 1.5.25
Release: 11%{?dist}
Release: 12%{?dist}
Summary: Intelligent Input Bus for Linux OS
License: LGPLv2+
URL: https://github.com/ibus/%name/wiki
@ -522,6 +522,9 @@ dconf update || :
%{_datadir}/installed-tests/ibus
%changelog
* Tue Mar 01 2022 Takao Fujiwara <tfujiwar@redhat.com> - 1.5.25-12
- Fix algorithm dead keys
* Mon Feb 21 2022 Takao Fujiwara <tfujiwar@redhat.com> - 1.5.25-11
- Fix forwarding keycode in GTK4