composetable: Allow multiple dead keys

Remove the limitation on the number of dead keys
that we match, and allow the result be be multiple
characters.

Regenerate the builtin sequences, since this changes
what dead key sequences we can reproduce algorithmically.

Update tests to match.

Fixes: #10
This commit is contained in:
Matthias Clasen 2021-07-29 16:36:25 -04:00
parent 539391ce6c
commit e67b2cb54b
6 changed files with 110 additions and 212 deletions

Binary file not shown.

View File

@ -3,7 +3,7 @@
#define MAX_SEQ_LEN 5
#define N_INDEX_SIZE 30
#define DATA_SIZE 16521
#define N_CHARS 1572
#define DATA_SIZE 16447
#define N_CHARS 1241
#endif

Binary file not shown.

View File

@ -1462,77 +1462,6 @@ gtk_compose_table_foreach (const GtkComposeTable *table,
#define IS_DEAD_KEY(k) \
((k) >= GDK_KEY_dead_grave && (k) <= GDK_KEY_dead_greek)
/* This function receives a sequence of Unicode characters and tries to
* normalize it (NFC). We check for the case where the resulting string
* has length 1 (single character).
* NFC normalisation normally rearranges diacritic marks, unless these
* belong to the same Canonical Combining Class.
* If they belong to the same canonical combining class, we produce all
* permutations of the diacritic marks, then attempt to normalize.
*/
static gboolean
check_normalize_nfc (gunichar *combination_buffer,
int n_compose)
{
gunichar *combination_buffer_temp;
char *combination_utf8_temp = NULL;
char *nfc_temp = NULL;
int n_combinations;
gunichar temp_swap;
int i;
combination_buffer_temp = g_alloca (n_compose * sizeof (gunichar));
n_combinations = 1;
for (i = 1; i < n_compose; i++)
n_combinations *= i;
/* Xorg reuses dead_tilde for the perispomeni diacritic mark.
* We check if base character belongs to Greek Unicode block,
* and if so, we replace tilde with perispomeni.
*/
if (combination_buffer[0] >= 0x390 && combination_buffer[0] <= 0x3FF)
{
for (i = 1; i < n_compose; i++ )
if (combination_buffer[i] == 0x303)
combination_buffer[i] = 0x342;
}
memcpy (combination_buffer_temp, combination_buffer, n_compose * sizeof (gunichar) );
for (i = 0; i < n_combinations; i++)
{
g_unicode_canonical_ordering (combination_buffer_temp, n_compose);
combination_utf8_temp = g_ucs4_to_utf8 (combination_buffer_temp, n_compose, NULL, NULL, NULL);
nfc_temp = g_utf8_normalize (combination_utf8_temp, -1, G_NORMALIZE_NFC);
if (g_utf8_strlen (nfc_temp, -1) == 1)
{
memcpy (combination_buffer, combination_buffer_temp, n_compose * sizeof (gunichar) );
g_free (combination_utf8_temp);
g_free (nfc_temp);
return TRUE;
}
g_free (combination_utf8_temp);
g_free (nfc_temp);
if (n_compose > 2)
{
temp_swap = combination_buffer_temp[i % (n_compose - 1) + 1];
combination_buffer_temp[i % (n_compose - 1) + 1] = combination_buffer_temp[(i+1) % (n_compose - 1) + 1];
combination_buffer_temp[(i+1) % (n_compose - 1) + 1] = temp_swap;
}
else
break;
}
return FALSE;
}
gboolean
gtk_check_algorithmically (const guint16 *compose_buffer,
int n_compose,
@ -1540,40 +1469,49 @@ gtk_check_algorithmically (const guint16 *compose_buffer,
{
int i;
gunichar *combination_buffer;
char *combination_utf8, *nfc;
combination_buffer = alloca (sizeof (gunichar) * (n_compose + 1));
g_string_set_size (output, 0);
for (i = 0; i < n_compose && IS_DEAD_KEY (compose_buffer[i]); i++)
;
/* Allow at most 2 dead keys */
if (i > 2)
return FALSE;
/* Can't combine if there's no base character */
/* Can't combine if there's no base character: incomplete sequence */
if (i == n_compose)
return TRUE;
if (i > 0 && i == n_compose - 1)
{
combination_buffer[0] = gdk_keyval_to_unicode (compose_buffer[i]);
combination_buffer[n_compose] = 0;
GString *input;
char *nfc;
gunichar ch;
ch = gdk_keyval_to_unicode (compose_buffer[i]);
/* We don't allow combining with non-letters */
if (!g_unichar_isalpha (ch))
return FALSE;
input = g_string_sized_new (4 * n_compose);
g_string_append_unichar (input, ch);
i--;
while (i >= 0)
{
switch (compose_buffer[i])
{
#define CASE(keysym, unicode) \
case GDK_KEY_dead_##keysym: combination_buffer[i+1] = unicode; break
case GDK_KEY_dead_##keysym: g_string_append_unichar (input, unicode); break
CASE (grave, 0x0300);
CASE (acute, 0x0301);
CASE (circumflex, 0x0302);
CASE (tilde, 0x0303); /* Also used with perispomeni, 0x342. */
case GDK_KEY_dead_tilde:
if (g_unichar_get_script (ch) == G_UNICODE_SCRIPT_GREEK)
g_string_append_unichar (input, 0x342); /* combining perispomeni */
else
g_string_append_unichar (input, 0x303); /* combining tilde */
break;
CASE (macron, 0x0304);
CASE (breve, 0x0306);
CASE (abovedot, 0x0307);
@ -1591,7 +1529,7 @@ gtk_check_algorithmically (const guint16 *compose_buffer,
CASE (horn, 0x031B); /* Legacy use for psili, 0x313 (or 0x343). */
CASE (stroke, 0x335);
CASE (abovecomma, 0x0313); /* Equivalent to psili */
CASE (abovereversedcomma, 0x0314); /* Equivalent to dasia */
CASE (abovereversedcomma, 0x0314); /* Equivalent to dasia */
CASE (doublegrave, 0x30F);
CASE (belowring, 0x325);
CASE (belowmacron, 0x331);
@ -1619,26 +1557,20 @@ gtk_check_algorithmically (const guint16 *compose_buffer,
CASE (capital_schwa, 0x1DEA);
#undef CASE
default:
combination_buffer[i+1] = gdk_keyval_to_unicode (compose_buffer[i]);
g_string_append_unichar (input, gdk_keyval_to_unicode (compose_buffer[i]));
}
i--;
}
/* If the buffer normalizes to a single character, then modify the order
* of combination_buffer accordingly, if necessary, and return TRUE.
*/
if (check_normalize_nfc (combination_buffer, n_compose))
{
combination_utf8 = g_ucs4_to_utf8 (combination_buffer, -1, NULL, NULL, NULL);
nfc = g_utf8_normalize (combination_utf8, -1, G_NORMALIZE_NFC);
nfc = g_utf8_normalize (input->str, input->len, G_NORMALIZE_NFC);
g_string_assign (output, nfc);
g_string_assign (output, nfc);
g_free (combination_utf8);
g_free (nfc);
g_free (nfc);
return TRUE;
}
g_string_free (input, TRUE);
return TRUE;
}
return FALSE;

View File

@ -1,14 +1,12 @@
# n_sequences: 4909
# n_sequences: 4874
# max_seq_len: 5
# n_index_size: 30
# data_size: 16521
# n_chars: 1572
# data_size: 16447
# n_chars: 1241
<U7ae> <U7e9> : "ΐ" # U390
<U7ae> <U7f5> : "ΰ" # U3b0
<Ufe50> <U20> : "`" # U60
<Ufe50> <U4d> : "M̀"
<Ufe50> <U56> : "Ǜ" # U1db
<Ufe50> <U6d> : "m̀"
<Ufe50> <U76> : "ǜ" # U1dc
<Ufe50> <Ua0> : "̀" # U300
<Ufe50> <U186> : "Ɔ̀"
@ -23,16 +21,6 @@
<Ufe50> <U269> : "ɩ̀"
<Ufe50> <U28a> : "ʊ̀"
<Ufe50> <U28b> : "ʋ̀"
<Ufe50> <U3bd> : "Ŋ̀"
<Ufe50> <U3bf> : "ŋ̀"
<Ufe50> <U6c1> : "а̀"
<Ufe50> <U6cf> : "о̀"
<Ufe50> <U6d2> : "р̀"
<Ufe50> <U6d5> : "у̀"
<Ufe50> <U6e1> : "А̀"
<Ufe50> <U6ef> : "О̀"
<Ufe50> <U6f2> : "Р̀"
<Ufe50> <U6f5> : "У̀"
<Ufe50> <U1f00> : "ἂ" # U1f02
<Ufe50> <U1f01> : "ἃ" # U1f03
<Ufe50> <U1f08> : "Ἂ" # U1f0a
@ -131,9 +119,7 @@
<Ufe50> <Uff20> <Uaf> <U65> : "ḕ" # U1e15
<Ufe50> <Uff20> <Uaf> <U6f> : "ṑ" # U1e51
<Ufe51> <U20> : "'" # U27
<Ufe51> <U4a> : "J́"
<Ufe51> <U56> : "Ǘ" # U1d7
<Ufe51> <U6a> : "j́"
<Ufe51> <U76> : "ǘ" # U1d8
<Ufe51> <Ua0> : "́" # U301
<Ufe51> <U186> : "Ɔ́"
@ -148,28 +134,7 @@
<Ufe51> <U269> : "ɩ́"
<Ufe51> <U28a> : "ʊ́"
<Ufe51> <U28b> : "ʋ́"
<Ufe51> <U3bd> : "Ŋ́"
<Ufe51> <U3bf> : "ŋ́"
<Ufe51> <U6c0> : "ю́"
<Ufe51> <U6c1> : "а́"
<Ufe51> <U6c5> : "е́"
<Ufe51> <U6c9> : "и́"
<Ufe51> <U6cf> : "о́"
<Ufe51> <U6d1> : "я́"
<Ufe51> <U6d2> : "р́"
<Ufe51> <U6d5> : "у́"
<Ufe51> <U6d9> : "ы́"
<Ufe51> <U6dc> : "э́"
<Ufe51> <U6e0> : "Ю́́"
<Ufe51> <U6e1> : "А́"
<Ufe51> <U6e5> : "Е́"
<Ufe51> <U6e9> : "И́"
<Ufe51> <U6ef> : "О́"
<Ufe51> <U6f1> : "Я́"
<Ufe51> <U6f2> : "Р́"
<Ufe51> <U6f5> : "У́"
<Ufe51> <U6f9> : "Ы́"
<Ufe51> <U6fc> : "Э́"
<Ufe51> <U1f00> : "ἄ" # U1f04
<Ufe51> <U1f01> : "ἅ" # U1f05
<Ufe51> <U1f08> : "Ἄ" # U1f0c
@ -210,6 +175,8 @@
<Ufe51> <Ufe53> <U1dd> : "ǝ̃́"
<Ufe51> <Ufe53> <U254> : "ɔ̃́"
<Ufe51> <Ufe53> <U25b> : "ɛ̃́"
<Ufe51> <Ufe56> <U53> : "Ṥ" # U1e64
<Ufe51> <Ufe56> <U73> : "ṥ" # U1e65
<Ufe51> <Ufe57> <U20> : "΅" # U385
<Ufe51> <Ufe63> <U4f> : "Ǿ" # U1fe
<Ufe51> <Ufe63> <U6f> : "ǿ" # U1ff
@ -327,18 +294,6 @@
<Ufe52> <U269> : "ɩ̂"
<Ufe52> <U28a> : "ʊ̂"
<Ufe52> <U28b> : "ʋ̂"
<Ufe52> <U6c1> : "а̂"
<Ufe52> <U6c5> : "е̂"
<Ufe52> <U6c9> : "и̂"
<Ufe52> <U6cf> : "о̂"
<Ufe52> <U6d2> : "р̂"
<Ufe52> <U6d5> : "у̂"
<Ufe52> <U6e1> : "А̂"
<Ufe52> <U6e5> : "Е̂"
<Ufe52> <U6e9> : "И̂"
<Ufe52> <U6ef> : "О̂"
<Ufe52> <U6f2> : "Р̂"
<Ufe52> <U6f5> : "У̂"
<Ufe52> <U1ea0> : "Ậ" # U1eac
<Ufe52> <U1ea1> : "ậ" # U1ead
<Ufe52> <U1eb8> : "Ệ" # U1ec6
@ -374,6 +329,30 @@
<Ufe52> <Uffb8> : "⁸" # U2078
<Ufe52> <Uffb9> : "⁹" # U2079
<Ufe52> <Uffbd> : "⁼" # U207c
<Ufe52> <Ufe50> <U41> : "Ầ" # U1ea6
<Ufe52> <Ufe50> <U45> : "Ề" # U1ec0
<Ufe52> <Ufe50> <U4f> : "Ồ" # U1ed2
<Ufe52> <Ufe50> <U61> : "ầ" # U1ea7
<Ufe52> <Ufe50> <U65> : "ề" # U1ec1
<Ufe52> <Ufe50> <U6f> : "ồ" # U1ed3
<Ufe52> <Ufe51> <U41> : "Ấ" # U1ea4
<Ufe52> <Ufe51> <U45> : "Ế" # U1ebe
<Ufe52> <Ufe51> <U4f> : "Ố" # U1ed0
<Ufe52> <Ufe51> <U61> : "ấ" # U1ea5
<Ufe52> <Ufe51> <U65> : "ế" # U1ebf
<Ufe52> <Ufe51> <U6f> : "ố" # U1ed1
<Ufe52> <Ufe53> <U41> : "Ẫ" # U1eaa
<Ufe52> <Ufe53> <U45> : "Ễ" # U1ec4
<Ufe52> <Ufe53> <U4f> : "Ỗ" # U1ed6
<Ufe52> <Ufe53> <U61> : "ẫ" # U1eab
<Ufe52> <Ufe53> <U65> : "ễ" # U1ec5
<Ufe52> <Ufe53> <U6f> : "ỗ" # U1ed7
<Ufe52> <Ufe61> <U41> : "Ẩ" # U1ea8
<Ufe52> <Ufe61> <U45> : "Ể" # U1ec2
<Ufe52> <Ufe61> <U4f> : "Ổ" # U1ed4
<Ufe52> <Ufe61> <U61> : "ẩ" # U1ea9
<Ufe52> <Ufe61> <U65> : "ể" # U1ec3
<Ufe52> <Ufe61> <U6f> : "ổ" # U1ed5
<Ufe52> <Uff20> <U21> <U41> : "Ậ" # U1eac
<Ufe52> <Uff20> <U21> <U45> : "Ệ" # U1ec6
<Ufe52> <Uff20> <U21> <U4f> : "Ộ" # U1ed8
@ -463,6 +442,14 @@
<Ufe53> <U1f68> : "Ὦ" # U1f6e
<Ufe53> <U1f69> : "Ὧ" # U1f6f
<Ufe53> <Ufe53> : "~" # U7e
<Ufe53> <Ufe51> <U4f> : "Ṍ" # U1e4c
<Ufe53> <Ufe51> <U55> : "Ṹ" # U1e78
<Ufe53> <Ufe51> <U6f> : "ṍ" # U1e4d
<Ufe53> <Ufe51> <U75> : "ṹ" # U1e79
<Ufe53> <Ufe54> <U4f> : "Ȭ" # U22c
<Ufe53> <Ufe54> <U6f> : "ȭ" # U22d
<Ufe53> <Ufe57> <U4f> : "Ṏ" # U1e4e
<Ufe53> <Ufe57> <U6f> : "ṏ" # U1e4f
<Ufe53> <Uff20> <U22> <U7e9> : "ῗ" # U1fd7
<Ufe53> <Uff20> <U22> <U7f5> : "ῧ" # U1fe7
<Ufe53> <Uff20> <U28> <U7c1> : "Ἇ" # U1f0f
@ -528,21 +515,19 @@
<Ufe54> <U269> : "ɩ̄"
<Ufe54> <U28a> : "ʊ̄"
<Ufe54> <U28b> : "ʋ̄"
<Ufe54> <U6c1> : "а̄"
<Ufe54> <U6c5> : "е̄"
<Ufe54> <U6cf> : "о̄"
<Ufe54> <U6d2> : "р̄"
<Ufe54> <U6e1> : "А̄"
<Ufe54> <U6e5> : "Е̄"
<Ufe54> <U6ef> : "О̄"
<Ufe54> <U6f2> : "Р̄"
<Ufe54> <U1e36> : "Ḹ" # U1e38
<Ufe54> <U1e37> : "ḹ" # U1e39
<Ufe54> <U1e5a> : "Ṝ" # U1e5c
<Ufe54> <U1e5b> : "ṝ" # U1e5d
<Ufe54> <Ufe54> : "¯" # Uaf
<Ufe54> <Ufe57> <U55> : "Ǖ" # U1d5
<Ufe54> <Ufe57> <U75> : "ǖ" # U1d6
<Ufe54> <Ufe50> <U45> : "Ḕ" # U1e14
<Ufe54> <Ufe50> <U4f> : "Ṑ" # U1e50
<Ufe54> <Ufe50> <U65> : "ḕ" # U1e15
<Ufe54> <Ufe50> <U6f> : "ṑ" # U1e51
<Ufe54> <Ufe51> <U45> : "Ḗ" # U1e16
<Ufe54> <Ufe51> <U4f> : "Ṓ" # U1e52
<Ufe54> <Ufe51> <U65> : "ḗ" # U1e17
<Ufe54> <Ufe51> <U6f> : "ṓ" # U1e53
<Ufe54> <Ufe8c> <U41> : "Ᾱ" # U1fb9
<Ufe54> <Ufe8c> <U49> : "Ῑ" # U1fd9
<Ufe54> <Ufe8c> <U55> : "Ῡ" # U1fe9
@ -580,6 +565,14 @@
<Ufe55> <U1ea0> : "Ặ" # U1eb6
<Ufe55> <U1ea1> : "ặ" # U1eb7
<Ufe55> <Ufe55> : "˘" # U2d8
<Ufe55> <Ufe50> <U41> : "Ằ" # U1eb0
<Ufe55> <Ufe50> <U61> : "ằ" # U1eb1
<Ufe55> <Ufe51> <U41> : "Ắ" # U1eae
<Ufe55> <Ufe51> <U61> : "ắ" # U1eaf
<Ufe55> <Ufe53> <U41> : "Ẵ" # U1eb4
<Ufe55> <Ufe53> <U61> : "ẵ" # U1eb5
<Ufe55> <Ufe61> <U41> : "Ẳ" # U1eb2
<Ufe55> <Ufe61> <U61> : "ẳ" # U1eb3
<Ufe55> <Uff20> <U21> <U41> : "Ặ" # U1eb6
<Ufe55> <Uff20> <U21> <U61> : "ặ" # U1eb7
<Ufe55> <Uff20> <U2c> <U45> : "Ḝ" # U1e1c
@ -600,6 +593,10 @@
<Ufe56> <U1e62> : "Ṩ" # U1e68
<Ufe56> <U1e63> : "ṩ" # U1e69
<Ufe56> <Ufe56> : "˙" # U2d9
<Ufe56> <Ufe54> <U41> : "Ǡ" # U1e0
<Ufe56> <Ufe54> <U4f> : "Ȱ" # U230
<Ufe56> <Ufe54> <U61> : "ǡ" # U1e1
<Ufe56> <Ufe54> <U6f> : "ȱ" # U231
<Ufe56> <Ufe63> <U6a> : "ɟ" # U25f
<Ufe56> <Uff20> <U21> <U53> : "Ṩ" # U1e68
<Ufe56> <Uff20> <U21> <U73> : "ṩ" # U1e69
@ -631,9 +628,21 @@
<Ufe57> <U4e8> : "Ӫ" # U4ea
<Ufe57> <U4e9> : "ӫ" # U4eb
<Ufe57> <Ufe57> : "¨" # Ua8
<Ufe57> <Ufe50> <U55> : "Ǜ" # U1db
<Ufe57> <Ufe50> <U75> : "ǜ" # U1dc
<Ufe57> <Ufe51> <U20> : "΅" # U385
<Ufe57> <Ufe54> <U55> : "Ṻ" # U1e7a
<Ufe57> <Ufe54> <U75> : "ṻ" # U1e7b
<Ufe57> <Ufe51> <U49> : "Ḯ" # U1e2e
<Ufe57> <Ufe51> <U55> : "Ǘ" # U1d7
<Ufe57> <Ufe51> <U69> : "ḯ" # U1e2f
<Ufe57> <Ufe51> <U75> : "ǘ" # U1d8
<Ufe57> <Ufe51> <U7e9> : "ΐ" # U390
<Ufe57> <Ufe51> <U7f5> : "ΰ" # U3b0
<Ufe57> <Ufe54> <U41> : "Ǟ" # U1de
<Ufe57> <Ufe54> <U4f> : "Ȫ" # U22a
<Ufe57> <Ufe54> <U61> : "ǟ" # U1df
<Ufe57> <Ufe54> <U6f> : "ȫ" # U22b
<Ufe57> <Ufe5a> <U55> : "Ǚ" # U1d9
<Ufe57> <Ufe5a> <U75> : "ǚ" # U1da
<Ufe57> <Ufe6c> <U3d> : "⩷" # U2a77
<Ufe57> <Uff20> <U5f> <U55> : "Ṻ" # U1e7a
<Ufe57> <Uff20> <U5f> <U75> : "ṻ" # U1e7b
@ -646,6 +655,8 @@
<Ufe58> <Uc1> : "Ǻ" # U1fa
<Ufe58> <Ue1> : "ǻ" # U1fb
<Ufe58> <Ufe58> : "°" # Ub0
<Ufe58> <Ufe51> <U41> : "Ǻ" # U1fa
<Ufe58> <Ufe51> <U61> : "ǻ" # U1fb
<Ufe59> <U20> : "˝" # U2dd
<Ufe59> <Ua0> : "̋" # U30b
<Ufe59> <Ufe59> : "˝" # U2dd
@ -682,6 +693,8 @@
<Ufe5a> <U28a> : "ʊ̌"
<Ufe5a> <U28b> : "ʋ̌"
<Ufe5a> <Ufe5a> : "ˇ" # U2c7
<Ufe5a> <Ufe56> <U53> : "Ṧ" # U1e66
<Ufe5a> <Ufe56> <U73> : "ṧ" # U1e67
<Ufe5a> <Uff20> <U22> <U55> : "Ǚ" # U1d9
<Ufe5a> <Uff20> <U22> <U75> : "ǚ" # U1da
<Ufe5b> <U20> : "¸" # Ub8
@ -787,42 +800,6 @@
<Ufe5d> <Ufe53> <U1f61> : "ᾧ" # U1fa7
<Ufe5d> <Ufe53> <U1f68> : "ᾮ" # U1fae
<Ufe5d> <Ufe53> <U1f69> : "ᾯ" # U1faf
<Ufe5d> <Ufe50> <Ufe64> <U7c1> : "ᾊ" # U1f8a
<Ufe5d> <Ufe50> <Ufe64> <U7c7> : "ᾚ" # U1f9a
<Ufe5d> <Ufe50> <Ufe64> <U7d9> : "ᾪ" # U1faa
<Ufe5d> <Ufe50> <Ufe64> <U7e1> : "ᾂ" # U1f82
<Ufe5d> <Ufe50> <Ufe64> <U7e7> : "ᾒ" # U1f92
<Ufe5d> <Ufe50> <Ufe64> <U7f9> : "ᾢ" # U1fa2
<Ufe5d> <Ufe50> <Ufe65> <U7c1> : "ᾋ" # U1f8b
<Ufe5d> <Ufe50> <Ufe65> <U7c7> : "ᾛ" # U1f9b
<Ufe5d> <Ufe50> <Ufe65> <U7d9> : "ᾫ" # U1fab
<Ufe5d> <Ufe50> <Ufe65> <U7e1> : "ᾃ" # U1f83
<Ufe5d> <Ufe50> <Ufe65> <U7e7> : "ᾓ" # U1f93
<Ufe5d> <Ufe50> <Ufe65> <U7f9> : "ᾣ" # U1fa3
<Ufe5d> <Ufe51> <Ufe64> <U7c1> : "ᾌ" # U1f8c
<Ufe5d> <Ufe51> <Ufe64> <U7c7> : "ᾜ" # U1f9c
<Ufe5d> <Ufe51> <Ufe64> <U7d9> : "ᾬ" # U1fac
<Ufe5d> <Ufe51> <Ufe64> <U7e1> : "ᾄ" # U1f84
<Ufe5d> <Ufe51> <Ufe64> <U7e7> : "ᾔ" # U1f94
<Ufe5d> <Ufe51> <Ufe64> <U7f9> : "ᾤ" # U1fa4
<Ufe5d> <Ufe51> <Ufe65> <U7c1> : "ᾍ" # U1f8d
<Ufe5d> <Ufe51> <Ufe65> <U7c7> : "ᾝ" # U1f9d
<Ufe5d> <Ufe51> <Ufe65> <U7d9> : "ᾭ" # U1fad
<Ufe5d> <Ufe51> <Ufe65> <U7e1> : "ᾅ" # U1f85
<Ufe5d> <Ufe51> <Ufe65> <U7e7> : "ᾕ" # U1f95
<Ufe5d> <Ufe51> <Ufe65> <U7f9> : "ᾥ" # U1fa5
<Ufe5d> <Ufe53> <Ufe64> <U7c1> : "ᾎ" # U1f8e
<Ufe5d> <Ufe53> <Ufe64> <U7c7> : "ᾞ" # U1f9e
<Ufe5d> <Ufe53> <Ufe64> <U7d9> : "ᾮ" # U1fae
<Ufe5d> <Ufe53> <Ufe64> <U7e1> : "ᾆ" # U1f86
<Ufe5d> <Ufe53> <Ufe64> <U7e7> : "ᾖ" # U1f96
<Ufe5d> <Ufe53> <Ufe64> <U7f9> : "ᾦ" # U1fa6
<Ufe5d> <Ufe53> <Ufe65> <U7c1> : "ᾏ" # U1f8f
<Ufe5d> <Ufe53> <Ufe65> <U7c7> : "ᾟ" # U1f9f
<Ufe5d> <Ufe53> <Ufe65> <U7d9> : "ᾯ" # U1faf
<Ufe5d> <Ufe53> <Ufe65> <U7e1> : "ᾇ" # U1f87
<Ufe5d> <Ufe53> <Ufe65> <U7e7> : "ᾗ" # U1f97
<Ufe5d> <Ufe53> <Ufe65> <U7f9> : "ᾧ" # U1fa7
<Ufe5d> <Uff20> <U27> <U7e1> : "ᾴ" # U1fb4
<Ufe5d> <Uff20> <U27> <U7e7> : "ῄ" # U1fc4
<Ufe5d> <Uff20> <U27> <U7f9> : "ῴ" # U1ff4
@ -1175,18 +1152,6 @@
<Ufe63> <Ufe8c> <U72> : "ϼ" # U3fc
<Ufe66> <U474> : "Ѷ" # U476
<Ufe66> <U475> : "ѷ" # U477
<Ufe66> <U6c1> : "а̏"
<Ufe66> <U6c5> : "е̏"
<Ufe66> <U6c9> : "и̏"
<Ufe66> <U6cf> : "о̏"
<Ufe66> <U6d2> : "р̏"
<Ufe66> <U6d5> : "у̏"
<Ufe66> <U6e1> : "А̏"
<Ufe66> <U6e5> : "Е̏"
<Ufe66> <U6e9> : "И̏"
<Ufe66> <U6ef> : "О̏"
<Ufe66> <U6f2> : "Р̏"
<Ufe66> <U6f5> : "У̏"
<Ufe67> <U7c> : "⫰" # U2af0
<Ufe6a> <U2b> : "⨦" # U2a26
<Ufe6c> <Ufe57> <U3d> : "⩷" # U2a77

View File

@ -341,7 +341,7 @@ match_algorithmic (void)
ret = gtk_check_algorithmically (buffer, 3, output);
g_assert_true (ret);
g_assert_cmpstr (output->str, ==, "");
g_assert_cmpstr (output->str, ==, "\xcc\x94");
buffer[0] = GDK_KEY_dead_perispomeni;
buffer[1] = GDK_KEY_dead_dasia;
@ -379,7 +379,8 @@ match_algorithmic (void)
buffer[2] = GDK_KEY_dead_grave;
ret = gtk_check_algorithmically (buffer, 3, output);
g_assert_false (ret);
g_assert_true (ret);
g_assert_cmpstr (output->str, ==, "");
buffer[0] = GDK_KEY_dead_diaeresis;
buffer[1] = GDK_KEY_a;