Merge branch 'better-dead-keys' into 'master'

Better dead keys

See merge request GNOME/gtk!3329
This commit is contained in:
Matthias Clasen 2021-03-22 02:37:14 +00:00
commit 60325df7db
5 changed files with 312 additions and 116 deletions

View File

@ -1,4 +1,4 @@
#!/usr/bin/env python
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
#
# compose-parse.py, version 1.4
@ -26,6 +26,7 @@ URL_KEYSYMSTXT = "http://www.cl.cam.ac.uk/~mgk25/ucs/keysyms.txt"
URL_GDKKEYSYMSH = "http://git.gnome.org/browse/gtk%2B/plain/gdk/gdkkeysyms.h"
URL_UNICODEDATATXT = 'http://www.unicode.org/Public/6.0.0/ucd/UnicodeData.txt'
FILENAME_COMPOSE_SUPPLEMENTARY = 'gtk-compose-lookaside.txt'
FILENAME_COMPOSE_NEGATIVE_SUPPLEMENTARY = 'gtk-compose-remove.txt'
# We currently support keysyms of size 2; once upstream xorg gets sorted,
# we might produce some tables with size 2 and some with size 4.
@ -448,6 +449,18 @@ xorg_compose_sequences_raw = []
for seq in composefile.readlines():
xorg_compose_sequences_raw.append(seq)
try:
composefile_lookaside = open(FILENAME_COMPOSE_NEGATIVE_SUPPLEMENTARY, 'r')
for seq in composefile_lookaside.readlines():
xorg_compose_sequences_raw.remove(seq)
except IOError, (errno, strerror):
if opt_verbose:
print "I/O error(%s): %s" % (errno, strerror)
print "Did not find negative lookaside compose file. Continuing..."
except:
print "Unexpected error: ", sys.exc_info()[0]
sys.exit(-1)
try:
composefile_lookaside = open(FILENAME_COMPOSE_SUPPLEMENTARY, 'r')
for seq in composefile_lookaside.readlines():

View File

@ -403,3 +403,7 @@
<Multi_key> <Greek_omicron> <apostrophe> : "ό" U03CC
<Multi_key> <Greek_upsilon> <apostrophe> : "ύ" U03CD
<Multi_key> <Greek_omega> <apostrophe> : "ώ" U03CE
# This sequence matches our handling of dead keys better.
# We remove the xorg sequence that maps this to '
<dead_acute> <space> : "´" acute # ACUTE ACCENT

View File

@ -0,0 +1,14 @@
<dead_tilde> <dead_tilde> : "~" asciitilde # TILDE
<dead_acute> <space> : "'" apostrophe # APOSTROPHE
<dead_acute> <dead_acute> : "´" acute # ACUTE ACCENT
<dead_grave> <dead_grave> : "`" grave # GRAVE ACCENT
<dead_abovering> <dead_abovering> : "°" degree # DEGREE SIGN
<dead_macron> <dead_macron> : "¯" macron # MACRON
<dead_breve> <dead_breve> : "˘" breve # BREVE
<dead_abovedot> <dead_abovedot> : "˙" abovedot # DOT ABOVE
<dead_diaeresis> <dead_diaeresis> : "¨" diaeresis # DIAERESIS
<dead_doubleacute> <dead_doubleacute> : "˝" U2dd # DOUBLE ACUTE ACCENT
<dead_caron> <dead_caron> : "ˇ" caron # CARON
<dead_cedilla> <dead_cedilla> : "¸" cedilla # CEDILLA
<dead_ogonek> <dead_ogonek> : "˛" ogonek # OGONEK
<dead_iota> <dead_iota> : "ͺ" U37a # GREEK YPOGEGRAMMENI

View File

@ -433,6 +433,79 @@ beep_surface (GdkSurface *surface)
gdk_surface_beep (surface);
}
static inline gboolean
is_dead_key (guint keysym)
{
return GDK_KEY_dead_grave <= keysym && keysym <= GDK_KEY_dead_greek;
}
static gunichar
dead_key_to_unicode (guint keysym,
gboolean *need_space)
{
/* Sadly, not all the dead keysyms have spacing mark equivalents
* in Unicode. For those that don't, we use space + the non-spacing
* mark as an approximation
*/
switch (keysym)
{
#define CASE(keysym, unicode, sp) \
case GDK_KEY_dead_##keysym: *need_space = sp; return unicode;
CASE (grave, 0x60, 0);
CASE (acute, 0xb4, 0);
CASE (circumflex, 0x5e, 0);
CASE (tilde, 0x7e, 0);
CASE (macron, 0xaf, 0);
CASE (breve, 0x2d8, 0);
CASE (abovedot, 0x307, 1);
CASE (diaeresis, 0xa8, 0);
CASE (abovering, 0x2da, 0);
CASE (hook, 0x2c0, 0);
CASE (doubleacute, 0x2dd, 0);
CASE (caron, 0x2c7, 0);
CASE (cedilla, 0xb8, 0);
CASE (ogonek, 0x2db, 0);
CASE (iota, 0x37a, 0);
CASE (voiced_sound, 0x3099, 1);
CASE (semivoiced_sound, 0x309a, 1);
CASE (belowdot, 0x323, 1);
CASE (horn, 0x31b, 1);
CASE (stroke, 0x335, 1);
CASE (abovecomma, 0x2bc, 0);
CASE (abovereversedcomma, 0x2bd, 1);
CASE (doublegrave, 0x30f, 1);
CASE (belowring, 0x2f3, 0);
CASE (belowmacron, 0x2cd, 0);
CASE (belowcircumflex, 0x32d, 1);
CASE (belowtilde, 0x330, 1);
CASE (belowbreve, 0x32e, 1);
CASE (belowdiaeresis, 0x324, 1);
CASE (invertedbreve, 0x32f, 1);
CASE (belowcomma, 0x326, 1);
CASE (lowline, 0x5f, 0);
CASE (aboveverticalline, 0x2c8, 0);
CASE (belowverticalline, 0x2cc, 0);
CASE (longsolidusoverlay, 0x338, 1);
CASE (a, 0x363, 1);
CASE (A, 0x363, 1);
CASE (e, 0x364, 1);
CASE (E, 0x364, 1);
CASE (i, 0x365, 1);
CASE (I, 0x365, 1);
CASE (o, 0x366, 1);
CASE (O, 0x366, 1);
CASE (u, 0x367, 1);
CASE (U, 0x367, 1);
CASE (small_schwa, 0x1dea, 1);
CASE (capital_schwa, 0x1dea, 1);
#undef CASE
default:
*need_space = FALSE;
return gdk_keyval_to_unicode (keysym);
}
}
static gboolean
no_sequence_matches (GtkIMContextSimple *context_simple,
int n_compose,
@ -492,6 +565,31 @@ no_sequence_matches (GtkIMContextSimple *context_simple,
{
keyval = gdk_key_event_get_keyval (event);
if (n_compose == 2 && is_dead_key (priv->compose_buffer[0]))
{
gboolean need_space;
GString *s;
s = g_string_new ("");
/* dead keys are never *really* dead */
ch = dead_key_to_unicode (priv->compose_buffer[0], &need_space);
if (ch)
{
if (need_space)
g_string_append_c (s, ' ');
g_string_append_unichar (s, ch);
}
ch = gdk_keyval_to_unicode (priv->compose_buffer[1]);
if (ch != 0 && !g_unichar_iscntrl (ch))
g_string_append_unichar (s, ch);
gtk_im_context_simple_commit_string (context_simple, s->str);
g_string_free (s, TRUE);
return TRUE;
}
priv->compose_buffer[0] = 0;
if (n_compose > 1) /* Invalid sequence */
{
@ -824,6 +922,39 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context,
output = g_string_new ("");
if (n_compose == 2)
{
/* Special-case deadkey-deadkey sequences.
* We are not doing chained deadkeys, so we
* want to commit the first key, and contine
* preediting with second.
*/
if (is_dead_key (priv->compose_buffer[0]) &&
is_dead_key (priv->compose_buffer[1]))
{
gunichar ch;
gboolean need_space;
guint next;
next = priv->compose_buffer[1];
ch = dead_key_to_unicode (priv->compose_buffer[0], &need_space);
if (ch)
{
if (need_space)
g_string_append_c (output, ' ');
g_string_append_unichar (output, ch);
gtk_im_context_simple_commit_string (context_simple, output->str);
g_string_set_size (output, 0);
priv->compose_buffer[0] = next;
priv->compose_buffer[1] = 0;
n_compose = 1;
}
}
}
G_LOCK (global_tables);
tmp_list = global_tables;
@ -982,70 +1113,9 @@ gtk_im_context_simple_get_preedit_string (GtkIMContext *context,
gunichar ch;
gboolean need_space;
if (GDK_KEY_dead_grave <= priv->compose_buffer[i] && priv->compose_buffer[i] <= GDK_KEY_dead_greek)
if (is_dead_key (priv->compose_buffer[i]))
{
/* Sadly, not all the dead keysyms have spacing mark equivalents
* in Unicode. For those that don't, we use space + the non-spacing
* mark as an approximation
*/
switch (priv->compose_buffer[i])
{
#define CASE(keysym, unicode, sp) \
case GDK_KEY_dead_##keysym: ch = unicode; need_space = sp; break
CASE (grave, 0x60, 0);
CASE (acute, 0xb4, 0);
CASE (circumflex, 0x5e, 0);
CASE (tilde, 0x7e, 0);
CASE (macron, 0xaf, 0);
CASE (breve, 0x2d8, 0);
CASE (abovedot, 0x307, 1);
CASE (diaeresis, 0xa8, 0);
CASE (abovering, 0x2da, 0);
CASE (hook, 0x2c0, 0);
CASE (doubleacute, 0x2dd, 0);
CASE (caron, 0x2c7, 0);
CASE (cedilla, 0xb8, 0);
CASE (ogonek, 0x2db, 0);
CASE (iota, 0x37a, 0);
CASE (voiced_sound, 0x3099, 1);
CASE (semivoiced_sound, 0x309a, 1);
CASE (belowdot, 0x323, 1);
CASE (horn, 0x31b, 1);
CASE (stroke, 0x335, 1);
CASE (abovecomma, 0x2bc, 0);
CASE (abovereversedcomma, 0x2bd, 1);
CASE (doublegrave, 0x30f, 1);
CASE (belowring, 0x2f3, 0);
CASE (belowmacron, 0x2cd, 0);
CASE (belowcircumflex, 0x32d, 1);
CASE (belowtilde, 0x330, 1);
CASE (belowbreve, 0x32e, 1);
CASE (belowdiaeresis, 0x324, 1);
CASE (invertedbreve, 0x32f, 1);
CASE (belowcomma, 0x326, 1);
CASE (lowline, 0x5f, 0);
CASE (aboveverticalline, 0x2c8, 0);
CASE (belowverticalline, 0x2cc, 0);
CASE (longsolidusoverlay, 0x338, 1);
CASE (a, 0x363, 1);
CASE (A, 0x363, 1);
CASE (e, 0x364, 1);
CASE (E, 0x364, 1);
CASE (i, 0x365, 1);
CASE (I, 0x365, 1);
CASE (o, 0x366, 1);
CASE (O, 0x366, 1);
CASE (u, 0x367, 1);
CASE (U, 0x367, 1);
CASE (small_schwa, 0x1dea, 1);
CASE (capital_schwa, 0x1dea, 1);
#undef CASE
default:
need_space = FALSE;
ch = gdk_keyval_to_unicode (priv->compose_buffer[i]);
break;
}
ch = dead_key_to_unicode (priv->compose_buffer[i], &need_space);
if (ch)
{
if (need_space)

View File

@ -66,35 +66,35 @@
static const guint16 gtk_compose_seqs_compact[] = {
GDK_KEY_Greek_accentdieresis, 180, 184, 184, 184, 184,
GDK_KEY_dead_grave, 184, 246, 333, 545, 545,
GDK_KEY_dead_acute, 545, 609, 705, 981, 981,
GDK_KEY_dead_circumflex, 981, 1105, 1105, 1305, 1305,
GDK_KEY_dead_tilde, 1305, 1389, 1452, 1592, 1592,
GDK_KEY_dead_macron, 1592, 1638, 1656, 1728, 1728,
GDK_KEY_dead_breve, 1728, 1778, 1778, 1802, 1802,
GDK_KEY_dead_abovedot, 1802, 1832, 1835, 1871, 1871,
GDK_KEY_dead_diaeresis, 1871, 1959, 1971, 1995, 1995,
GDK_KEY_dead_abovering, 1995, 2005, 2005, 2005, 2005,
GDK_KEY_dead_doubleacute, 2005, 2015, 2015, 2015, 2015,
GDK_KEY_dead_caron, 2015, 2057, 2057, 2065, 2065,
GDK_KEY_dead_cedilla, 2065, 2077, 2083, 2083, 2083,
GDK_KEY_dead_ogonek, 2083, 2093, 2093, 2093, 2093,
GDK_KEY_dead_iota, 2093, 2115, 2214, 2646, 3306,
GDK_KEY_dead_voiced_sound, 3306, 3352, 3352, 3352, 3352,
GDK_KEY_dead_semivoiced_sound, 3352, 3362, 3362, 3362, 3362,
GDK_KEY_dead_belowdot, 3362, 3378, 3378, 3394, 3394,
GDK_KEY_dead_hook, 3394, 3472, 3475, 3531, 3531,
GDK_KEY_dead_horn, 3531, 3541, 3541, 3541, 3541,
GDK_KEY_dead_stroke, 3541, 3629, 3641, 3641, 3641,
GDK_KEY_dead_psili, 3641, 3669, 3669, 3669, 3669,
GDK_KEY_dead_dasia, 3669, 3701, 3701, 3701, 3701,
GDK_KEY_dead_belowring, 3701, 3703, 3703, 3703, 3703,
GDK_KEY_dead_belowtilde, 3703, 3705, 3705, 3705, 3705,
GDK_KEY_dead_belowdiaeresis, 3705, 3705, 3708, 3708, 3708,
GDK_KEY_dead_belowcomma, 3708, 3722, 3722, 3722, 3722,
GDK_KEY_dead_currency, 3722, 3820, 3826, 3826, 3826,
GDK_KEY_dead_greek, 3826, 3928, 3952, 3952, 3952,
GDK_KEY_Multi_key, 3952, 3952, 10348, 14044, 15919,
GDK_KEY_dead_grave, 184, 244, 331, 543, 543,
GDK_KEY_dead_acute, 543, 605, 701, 977, 977,
GDK_KEY_dead_circumflex, 977, 1101, 1101, 1301, 1301,
GDK_KEY_dead_tilde, 1301, 1383, 1446, 1586, 1586,
GDK_KEY_dead_macron, 1586, 1630, 1648, 1720, 1720,
GDK_KEY_dead_breve, 1720, 1768, 1768, 1792, 1792,
GDK_KEY_dead_abovedot, 1792, 1820, 1823, 1859, 1859,
GDK_KEY_dead_diaeresis, 1859, 1945, 1957, 1981, 1981,
GDK_KEY_dead_abovering, 1981, 1989, 1989, 1989, 1989,
GDK_KEY_dead_doubleacute, 1989, 1997, 1997, 1997, 1997,
GDK_KEY_dead_caron, 1997, 2037, 2037, 2045, 2045,
GDK_KEY_dead_cedilla, 2045, 2055, 2061, 2061, 2061,
GDK_KEY_dead_ogonek, 2061, 2069, 2069, 2069, 2069,
GDK_KEY_dead_iota, 2069, 2089, 2188, 2620, 3280,
GDK_KEY_dead_voiced_sound, 3280, 3326, 3326, 3326, 3326,
GDK_KEY_dead_semivoiced_sound, 3326, 3336, 3336, 3336, 3336,
GDK_KEY_dead_belowdot, 3336, 3352, 3352, 3368, 3368,
GDK_KEY_dead_hook, 3368, 3446, 3449, 3505, 3505,
GDK_KEY_dead_horn, 3505, 3515, 3515, 3515, 3515,
GDK_KEY_dead_stroke, 3515, 3603, 3615, 3615, 3615,
GDK_KEY_dead_psili, 3615, 3643, 3643, 3643, 3643,
GDK_KEY_dead_dasia, 3643, 3675, 3675, 3675, 3675,
GDK_KEY_dead_belowring, 3675, 3677, 3677, 3677, 3677,
GDK_KEY_dead_belowtilde, 3677, 3679, 3679, 3679, 3679,
GDK_KEY_dead_belowdiaeresis, 3679, 3679, 3682, 3682, 3682,
GDK_KEY_dead_belowcomma, 3682, 3696, 3696, 3696, 3696,
GDK_KEY_dead_currency, 3696, 3794, 3800, 3800, 3800,
GDK_KEY_dead_greek, 3800, 3902, 3926, 3926, 3926,
GDK_KEY_Multi_key, 3926, 3926, 10637, 14345, 16220,
GDK_KEY_Greek_iota, 0x0390,
GDK_KEY_Greek_upsilon, 0x03B0,
GDK_KEY_space, 0x0060,
@ -127,7 +127,6 @@ GDK_KEY_Greek_iota, 0x1F76,
GDK_KEY_Greek_omicron, 0x1F78,
GDK_KEY_Greek_upsilon, 0x1F7A,
GDK_KEY_Greek_omega, 0x1F7C,
GDK_KEY_dead_grave, 0x0060,
GDK_KEY_dead_diaeresis, GDK_KEY_Greek_iota, 0x1FD2,
GDK_KEY_dead_diaeresis, GDK_KEY_Greek_upsilon, 0x1FE2,
GDK_KEY_dead_psili, GDK_KEY_Greek_ALPHA, 0x1F0A,
@ -210,7 +209,7 @@ GDK_KEY_Multi_key, GDK_KEY_macron, GDK_KEY_E, 0x1E14,
GDK_KEY_Multi_key, GDK_KEY_macron, GDK_KEY_O, 0x1E50,
GDK_KEY_Multi_key, GDK_KEY_macron, GDK_KEY_e, 0x1E15,
GDK_KEY_Multi_key, GDK_KEY_macron, GDK_KEY_o, 0x1E51,
GDK_KEY_space, 0x0027,
GDK_KEY_space, 0x00B4,
GDK_KEY_V, 0x01D7,
GDK_KEY_v, 0x01D8,
GDK_KEY_nobreakspace, 0x0301,
@ -241,7 +240,6 @@ GDK_KEY_Greek_iota, 0x03AF,
GDK_KEY_Greek_omicron, 0x03CC,
GDK_KEY_Greek_upsilon, 0x03CD,
GDK_KEY_Greek_omega, 0x03CE,
GDK_KEY_dead_acute, 0x00B4,
GDK_KEY_dead_diaeresis, GDK_KEY_space, 0x0385,
GDK_KEY_dead_diaeresis, GDK_KEY_Greek_iota, 0x0390,
GDK_KEY_dead_diaeresis, GDK_KEY_Greek_upsilon, 0x03B0,
@ -496,7 +494,6 @@ GDK_KEY_Greek_omega, 0x1FF6,
0x1F61, 0x1F67,
0x1F68, 0x1F6E,
0x1F69, 0x1F6F,
GDK_KEY_dead_tilde, 0x007E,
GDK_KEY_dead_diaeresis, GDK_KEY_Greek_iota, 0x1FD7,
GDK_KEY_dead_diaeresis, GDK_KEY_Greek_upsilon, 0x1FE7,
GDK_KEY_dead_psili, GDK_KEY_Greek_ALPHA, 0x1F0E,
@ -575,7 +572,6 @@ GDK_KEY_Greek_UPSILON, 0x1FE9,
GDK_KEY_Greek_alpha, 0x1FB1,
GDK_KEY_Greek_iota, 0x1FD1,
GDK_KEY_Greek_upsilon, 0x1FE1,
GDK_KEY_dead_macron, 0x00AF,
GDK_KEY_dead_greek, GDK_KEY_A, 0x1FB9,
GDK_KEY_dead_greek, GDK_KEY_I, 0x1FD9,
GDK_KEY_dead_greek, GDK_KEY_U, 0x1FE9,
@ -624,7 +620,6 @@ GDK_KEY_Greek_UPSILON, 0x1FE8,
GDK_KEY_Greek_alpha, 0x1FB0,
GDK_KEY_Greek_iota, 0x1FD0,
GDK_KEY_Greek_upsilon, 0x1FE0,
GDK_KEY_dead_breve, 0x02D8,
GDK_KEY_Multi_key, GDK_KEY_exclam, GDK_KEY_A, 0x1EB6,
GDK_KEY_Multi_key, GDK_KEY_exclam, GDK_KEY_a, 0x1EB7,
GDK_KEY_Multi_key, GDK_KEY_comma, GDK_KEY_E, 0x1E1C,
@ -645,7 +640,6 @@ GDK_KEY_Amacron, 0x01E0,
GDK_KEY_Omacron, 0x0230,
GDK_KEY_amacron, 0x01E1,
GDK_KEY_omacron, 0x0231,
GDK_KEY_dead_abovedot, 0x02D9,
GDK_KEY_dead_stroke, GDK_KEY_j, 0x025F,
GDK_KEY_Multi_key, GDK_KEY_exclam, GDK_KEY_S, 0x1E68,
GDK_KEY_Multi_key, GDK_KEY_exclam, GDK_KEY_s, 0x1E69,
@ -699,7 +693,6 @@ GDK_KEY_Greek_IOTA, 0x03AA,
GDK_KEY_Greek_UPSILON, 0x03AB,
GDK_KEY_Greek_iota, 0x03CA,
GDK_KEY_Greek_upsilon, 0x03CB,
GDK_KEY_dead_diaeresis, 0x00A8,
GDK_KEY_dead_acute, GDK_KEY_space, 0x0385,
GDK_KEY_dead_acute, GDK_KEY_Greek_iota, 0x0390,
GDK_KEY_dead_acute, GDK_KEY_Greek_upsilon, 0x03B0,
@ -714,12 +707,10 @@ GDK_KEY_space, 0x00B0,
GDK_KEY_nobreakspace, 0x030A,
GDK_KEY_Aacute, 0x01FA,
GDK_KEY_aacute, 0x01FB,
GDK_KEY_dead_abovering, 0x00B0,
GDK_KEY_space, 0x02DD,
GDK_KEY_nobreakspace, 0x030B,
GDK_KEY_Cyrillic_u, 0x04F3,
GDK_KEY_Cyrillic_U, 0x04F2,
GDK_KEY_dead_doubleacute, 0x02DD,
GDK_KEY_space, 0x02C7,
GDK_KEY_parenleft, 0x208D,
GDK_KEY_parenright, 0x208E,
@ -740,7 +731,6 @@ GDK_KEY_V, 0x01D9,
GDK_KEY_v, 0x01DA,
GDK_KEY_nobreakspace, 0x030C,
0x01F2, 0x01C5,
GDK_KEY_dead_caron, 0x02C7,
GDK_KEY_Multi_key, GDK_KEY_quotedbl, GDK_KEY_U, 0x01D9,
GDK_KEY_Multi_key, GDK_KEY_quotedbl, GDK_KEY_u, 0x01DA,
GDK_KEY_space, 0x00B8,
@ -748,14 +738,12 @@ GDK_KEY_nobreakspace, 0x0327,
GDK_KEY_cent, 0x20B5,
GDK_KEY_Cacute, 0x1E08,
GDK_KEY_cacute, 0x1E09,
GDK_KEY_dead_cedilla, 0x00B8,
GDK_KEY_dead_currency, GDK_KEY_C, 0x20B5,
GDK_KEY_dead_currency, GDK_KEY_c, 0x20B5,
GDK_KEY_space, 0x02DB,
GDK_KEY_nobreakspace, 0x0328,
GDK_KEY_Omacron, 0x01EC,
GDK_KEY_omacron, 0x01ED,
GDK_KEY_dead_ogonek, 0x02DB,
GDK_KEY_space, 0x037A,
GDK_KEY_Greek_alphaaccent, 0x1FB4,
GDK_KEY_Greek_etaaccent, 0x1FC4,
@ -766,7 +754,6 @@ GDK_KEY_Greek_OMEGA, 0x1FFC,
GDK_KEY_Greek_alpha, 0x1FB3,
GDK_KEY_Greek_eta, 0x1FC3,
GDK_KEY_Greek_omega, 0x1FF3,
GDK_KEY_dead_iota, 0x037A,
GDK_KEY_dead_grave, GDK_KEY_Greek_alpha, 0x1FB2,
GDK_KEY_dead_grave, GDK_KEY_Greek_eta, 0x1FC2,
GDK_KEY_dead_grave, GDK_KEY_Greek_omega, 0x1FF2,
@ -1361,6 +1348,7 @@ GDK_KEY_exclam, GDK_KEY_L, 0x1E36,
GDK_KEY_exclam, GDK_KEY_M, 0x1E42,
GDK_KEY_exclam, GDK_KEY_N, 0x1E46,
GDK_KEY_exclam, GDK_KEY_O, 0x1ECC,
GDK_KEY_exclam, GDK_KEY_P, 0x00B6,
GDK_KEY_exclam, GDK_KEY_R, 0x1E5A,
GDK_KEY_exclam, GDK_KEY_S, 0x1E62,
GDK_KEY_exclam, GDK_KEY_T, 0x1E6C,
@ -1381,6 +1369,7 @@ GDK_KEY_exclam, GDK_KEY_l, 0x1E37,
GDK_KEY_exclam, GDK_KEY_m, 0x1E43,
GDK_KEY_exclam, GDK_KEY_n, 0x1E47,
GDK_KEY_exclam, GDK_KEY_o, 0x1ECD,
GDK_KEY_exclam, GDK_KEY_p, 0x00B6,
GDK_KEY_exclam, GDK_KEY_r, 0x1E5B,
GDK_KEY_exclam, GDK_KEY_s, 0x1E63,
GDK_KEY_exclam, GDK_KEY_t, 0x1E6D,
@ -1576,6 +1565,12 @@ GDK_KEY_apostrophe, 0x2395, 0x235E,
GDK_KEY_parenleft, GDK_KEY_space, 0x02D8,
GDK_KEY_parenleft, GDK_KEY_parenleft, 0x005B,
GDK_KEY_parenleft, GDK_KEY_minus, 0x007B,
GDK_KEY_parenleft, GDK_KEY_A, 0x0102,
GDK_KEY_parenleft, GDK_KEY_G, 0x011E,
GDK_KEY_parenleft, GDK_KEY_a, 0x0103,
GDK_KEY_parenleft, GDK_KEY_c, 0x00A9,
GDK_KEY_parenleft, GDK_KEY_g, 0x011F,
GDK_KEY_parenleft, GDK_KEY_r, 0x00AE,
GDK_KEY_parenleft, GDK_KEY_Greek_ALPHA, 0x1F09,
GDK_KEY_parenleft, GDK_KEY_Greek_EPSILON, 0x1F19,
GDK_KEY_parenleft, GDK_KEY_Greek_ETA, 0x1F29,
@ -1664,12 +1659,13 @@ GDK_KEY_minus, GDK_KEY_comma, 0x00AC,
GDK_KEY_minus, GDK_KEY_slash, 0x233F,
GDK_KEY_minus, GDK_KEY_colon, 0x00F7,
GDK_KEY_minus, GDK_KEY_greater, 0x2192,
GDK_KEY_minus, GDK_KEY_A, 0x0100,
GDK_KEY_minus, GDK_KEY_A, 0x00C3,
GDK_KEY_minus, GDK_KEY_D, 0x0110,
GDK_KEY_minus, GDK_KEY_E, 0x0112,
GDK_KEY_minus, GDK_KEY_I, 0x012A,
GDK_KEY_minus, GDK_KEY_L, 0x00A3,
GDK_KEY_minus, GDK_KEY_O, 0x014C,
GDK_KEY_minus, GDK_KEY_N, 0x00D1,
GDK_KEY_minus, GDK_KEY_O, 0x00D5,
GDK_KEY_minus, GDK_KEY_U, 0x016A,
GDK_KEY_minus, GDK_KEY_Y, 0x00A5,
GDK_KEY_minus, GDK_KEY_backslash, 0x2340,
@ -1679,6 +1675,7 @@ GDK_KEY_minus, GDK_KEY_d, 0x0111,
GDK_KEY_minus, GDK_KEY_e, 0x0113,
GDK_KEY_minus, GDK_KEY_i, 0x012B,
GDK_KEY_minus, GDK_KEY_l, 0x00A3,
GDK_KEY_minus, GDK_KEY_n, 0x00F1,
GDK_KEY_minus, GDK_KEY_o, 0x014D,
GDK_KEY_minus, GDK_KEY_u, 0x016B,
GDK_KEY_minus, GDK_KEY_y, 0x00A5,
@ -1752,6 +1749,7 @@ GDK_KEY_slash, GDK_KEY_I, 0x0197,
GDK_KEY_slash, GDK_KEY_L, 0x0141,
GDK_KEY_slash, GDK_KEY_O, 0x00D8,
GDK_KEY_slash, GDK_KEY_T, 0x0166,
GDK_KEY_slash, GDK_KEY_U, 0x00B5,
GDK_KEY_slash, GDK_KEY_Z, 0x01B5,
GDK_KEY_slash, GDK_KEY_asciicircum, 0x007C,
GDK_KEY_slash, GDK_KEY_b, 0x0180,
@ -1780,6 +1778,13 @@ GDK_KEY_slash, 0x2194, 0x21AE,
GDK_KEY_slash, 0x2395, 0x2341,
GDK_KEY_0, GDK_KEY_asterisk, 0x00B0,
GDK_KEY_0, GDK_KEY_3, 0x2189,
GDK_KEY_0, GDK_KEY_C, 0x00A9,
GDK_KEY_0, GDK_KEY_S, 0x00A7,
GDK_KEY_0, GDK_KEY_X, 0x00A4,
GDK_KEY_0, GDK_KEY_asciicircum, 0x00B0,
GDK_KEY_0, GDK_KEY_c, 0x00A9,
GDK_KEY_0, GDK_KEY_s, 0x00A7,
GDK_KEY_0, GDK_KEY_x, 0x00A4,
GDK_KEY_0, GDK_KEY_asciitilde, 0x236C,
GDK_KEY_1, GDK_KEY_2, 0x00BD,
GDK_KEY_1, GDK_KEY_3, 0x2153,
@ -1789,14 +1794,20 @@ GDK_KEY_1, GDK_KEY_6, 0x2159,
GDK_KEY_1, GDK_KEY_7, 0x2150,
GDK_KEY_1, GDK_KEY_8, 0x215B,
GDK_KEY_1, GDK_KEY_9, 0x2151,
GDK_KEY_1, GDK_KEY_S, 0x00B9,
GDK_KEY_1, GDK_KEY_asciicircum, 0x00B9,
GDK_KEY_1, GDK_KEY_s, 0x00B9,
GDK_KEY_2, GDK_KEY_3, 0x2154,
GDK_KEY_2, GDK_KEY_5, 0x2156,
GDK_KEY_2, GDK_KEY_S, 0x00B2,
GDK_KEY_2, GDK_KEY_asciicircum, 0x00B2,
GDK_KEY_2, GDK_KEY_s, 0x00B2,
GDK_KEY_3, GDK_KEY_4, 0x00BE,
GDK_KEY_3, GDK_KEY_5, 0x2157,
GDK_KEY_3, GDK_KEY_8, 0x215C,
GDK_KEY_3, GDK_KEY_S, 0x00B3,
GDK_KEY_3, GDK_KEY_asciicircum, 0x00B3,
GDK_KEY_3, GDK_KEY_s, 0x00B3,
GDK_KEY_4, GDK_KEY_5, 0x2158,
GDK_KEY_5, GDK_KEY_6, 0x215A,
GDK_KEY_5, GDK_KEY_8, 0x215D,
@ -1859,6 +1870,8 @@ GDK_KEY_equal, GDK_KEY_E, 0x20AC,
GDK_KEY_equal, GDK_KEY_L, 0x20A4,
GDK_KEY_equal, GDK_KEY_N, 0x20A6,
GDK_KEY_equal, GDK_KEY_O, 0x0150,
GDK_KEY_equal, GDK_KEY_P, 0x20BD,
GDK_KEY_equal, GDK_KEY_R, 0x20B9,
GDK_KEY_equal, GDK_KEY_U, 0x0170,
GDK_KEY_equal, GDK_KEY_W, 0x20A9,
GDK_KEY_equal, GDK_KEY_Y, 0x00A5,
@ -1866,14 +1879,19 @@ GDK_KEY_equal, GDK_KEY_underscore, 0x2261,
GDK_KEY_equal, GDK_KEY_c, 0x20AC,
GDK_KEY_equal, GDK_KEY_d, 0x20AB,
GDK_KEY_equal, GDK_KEY_e, 0x20AC,
GDK_KEY_equal, GDK_KEY_l, 0x00A3,
GDK_KEY_equal, GDK_KEY_o, 0x0151,
GDK_KEY_equal, GDK_KEY_p, 0x20BD,
GDK_KEY_equal, GDK_KEY_r, 0x20B9,
GDK_KEY_equal, GDK_KEY_u, 0x0171,
GDK_KEY_equal, GDK_KEY_y, 0x00A5,
GDK_KEY_equal, 0x0338, 0x2260,
GDK_KEY_equal, GDK_KEY_Cyrillic_u, 0x04F3,
GDK_KEY_equal, GDK_KEY_Cyrillic_ze, 0x20BD,
GDK_KEY_equal, GDK_KEY_Cyrillic_IE, 0x20AC,
GDK_KEY_equal, GDK_KEY_Cyrillic_ES, 0x20AC,
GDK_KEY_equal, GDK_KEY_Cyrillic_U, 0x04F2,
GDK_KEY_equal, GDK_KEY_Cyrillic_ZE, 0x20BD,
GDK_KEY_equal, 0x2395, 0x2338,
GDK_KEY_greater, GDK_KEY_space, 0x005E,
GDK_KEY_greater, GDK_KEY_quotedbl, 0x201D,
@ -1923,14 +1941,14 @@ GDK_KEY_A, GDK_KEY_apostrophe, 0x00C1,
GDK_KEY_A, GDK_KEY_parenleft, 0x0102,
GDK_KEY_A, GDK_KEY_asterisk, 0x00C5,
GDK_KEY_A, GDK_KEY_comma, 0x0104,
GDK_KEY_A, GDK_KEY_minus, 0x0100,
GDK_KEY_A, GDK_KEY_minus, 0x00C3,
GDK_KEY_A, GDK_KEY_semicolon, 0x0104,
GDK_KEY_A, GDK_KEY_greater, 0x00C2,
GDK_KEY_A, GDK_KEY_A, 0x00C5,
GDK_KEY_A, GDK_KEY_E, 0x00C6,
GDK_KEY_A, GDK_KEY_T, 0x0040,
GDK_KEY_A, GDK_KEY_asciicircum, 0x00C2,
GDK_KEY_A, GDK_KEY_underscore, 0x0100,
GDK_KEY_A, GDK_KEY_underscore, 0x00AA,
GDK_KEY_A, GDK_KEY_grave, 0x00C0,
GDK_KEY_A, GDK_KEY_asciitilde, 0x00C3,
GDK_KEY_A, GDK_KEY_diaeresis, 0x00C4,
@ -1940,6 +1958,7 @@ GDK_KEY_C, GDK_KEY_apostrophe, 0x0106,
GDK_KEY_C, GDK_KEY_comma, 0x00C7,
GDK_KEY_C, GDK_KEY_period, 0x010A,
GDK_KEY_C, GDK_KEY_slash, 0x20A1,
GDK_KEY_C, GDK_KEY_0, 0x00A9,
GDK_KEY_C, GDK_KEY_less, 0x010C,
GDK_KEY_C, GDK_KEY_equal, 0x20AC,
GDK_KEY_C, GDK_KEY_E, 0x20A0,
@ -1973,7 +1992,9 @@ GDK_KEY_F, GDK_KEY_r, 0x20A3,
GDK_KEY_G, GDK_KEY_parenleft, 0x011E,
GDK_KEY_G, GDK_KEY_comma, 0x0122,
GDK_KEY_G, GDK_KEY_period, 0x0120,
GDK_KEY_G, GDK_KEY_T, 0x003E,
GDK_KEY_G, GDK_KEY_U, 0x011E,
GDK_KEY_G, GDK_KEY_u, 0x011E,
GDK_KEY_G, GDK_KEY_breve, 0x011E,
GDK_KEY_H, GDK_KEY_comma, 0x1E28,
GDK_KEY_I, GDK_KEY_quotedbl, 0x00CF,
@ -1997,11 +2018,13 @@ GDK_KEY_L, GDK_KEY_comma, 0x013B,
GDK_KEY_L, GDK_KEY_minus, 0x00A3,
GDK_KEY_L, GDK_KEY_slash, 0x0141,
GDK_KEY_L, GDK_KEY_less, 0x013D,
GDK_KEY_L, GDK_KEY_equal, 0x20A4,
GDK_KEY_L, GDK_KEY_equal, 0x00A3,
GDK_KEY_L, GDK_KEY_T, 0x003C,
GDK_KEY_L, GDK_KEY_V, 0x007C,
GDK_KEY_M, GDK_KEY_period, 0x1E40,
GDK_KEY_N, GDK_KEY_apostrophe, 0x0143,
GDK_KEY_N, GDK_KEY_comma, 0x0145,
GDK_KEY_N, GDK_KEY_minus, 0x00D1,
GDK_KEY_N, GDK_KEY_less, 0x0147,
GDK_KEY_N, GDK_KEY_equal, 0x20A6,
GDK_KEY_N, GDK_KEY_G, 0x014A,
@ -2011,7 +2034,7 @@ GDK_KEY_N, GDK_KEY_asciitilde, 0x00D1,
GDK_KEY_O, GDK_KEY_quotedbl, 0x00D6,
GDK_KEY_O, GDK_KEY_apostrophe, 0x00D3,
GDK_KEY_O, GDK_KEY_comma, 0x01EA,
GDK_KEY_O, GDK_KEY_minus, 0x014C,
GDK_KEY_O, GDK_KEY_minus, 0x00D5,
GDK_KEY_O, GDK_KEY_slash, 0x00D8,
GDK_KEY_O, GDK_KEY_semicolon, 0x01EA,
GDK_KEY_O, GDK_KEY_greater, 0x00D4,
@ -2022,7 +2045,7 @@ GDK_KEY_O, GDK_KEY_R, 0x00AE,
GDK_KEY_O, GDK_KEY_S, 0x00A7,
GDK_KEY_O, GDK_KEY_X, 0x00A4,
GDK_KEY_O, GDK_KEY_asciicircum, 0x00D4,
GDK_KEY_O, GDK_KEY_underscore, 0x014C,
GDK_KEY_O, GDK_KEY_underscore, 0x00BA,
GDK_KEY_O, GDK_KEY_grave, 0x00D2,
GDK_KEY_O, GDK_KEY_c, 0x00A9,
GDK_KEY_O, GDK_KEY_r, 0x00AE,
@ -2032,23 +2055,31 @@ GDK_KEY_O, GDK_KEY_diaeresis, 0x00D6,
GDK_KEY_O, GDK_KEY_acute, 0x00D3,
GDK_KEY_P, GDK_KEY_exclam, 0x00B6,
GDK_KEY_P, GDK_KEY_period, 0x1E56,
GDK_KEY_P, GDK_KEY_equal, 0x20BD,
GDK_KEY_P, GDK_KEY_P, 0x00B6,
GDK_KEY_P, GDK_KEY_t, 0x20A7,
GDK_KEY_R, GDK_KEY_apostrophe, 0x0154,
GDK_KEY_R, GDK_KEY_comma, 0x0156,
GDK_KEY_R, GDK_KEY_less, 0x0158,
GDK_KEY_R, GDK_KEY_equal, 0x20B9,
GDK_KEY_R, GDK_KEY_O, 0x00AE,
GDK_KEY_R, GDK_KEY_o, 0x00AE,
GDK_KEY_R, GDK_KEY_s, 0x20A8,
GDK_KEY_S, GDK_KEY_exclam, 0x00A7,
GDK_KEY_S, GDK_KEY_apostrophe, 0x015A,
GDK_KEY_S, GDK_KEY_comma, 0x015E,
GDK_KEY_S, GDK_KEY_period, 0x1E60,
GDK_KEY_S, GDK_KEY_0, 0x00A7,
GDK_KEY_S, GDK_KEY_1, 0x00B9,
GDK_KEY_S, GDK_KEY_2, 0x00B2,
GDK_KEY_S, GDK_KEY_3, 0x00B3,
GDK_KEY_S, GDK_KEY_semicolon, 0x0218,
GDK_KEY_S, GDK_KEY_less, 0x0160,
GDK_KEY_S, GDK_KEY_M, 0x2120,
GDK_KEY_S, GDK_KEY_O, 0x00A7,
GDK_KEY_S, GDK_KEY_S, 0x1E9E,
GDK_KEY_S, GDK_KEY_m, 0x2120,
GDK_KEY_S, GDK_KEY_cedilla, 0x015E,
GDK_KEY_T, GDK_KEY_comma, 0x0162,
GDK_KEY_T, GDK_KEY_minus, 0x0166,
GDK_KEY_T, GDK_KEY_period, 0x1E6A,
@ -2063,6 +2094,7 @@ GDK_KEY_U, GDK_KEY_apostrophe, 0x00DA,
GDK_KEY_U, GDK_KEY_asterisk, 0x016E,
GDK_KEY_U, GDK_KEY_comma, 0x0172,
GDK_KEY_U, GDK_KEY_minus, 0x016A,
GDK_KEY_U, GDK_KEY_slash, 0x00B5,
GDK_KEY_U, GDK_KEY_semicolon, 0x0172,
GDK_KEY_U, GDK_KEY_greater, 0x00DB,
GDK_KEY_U, GDK_KEY_A, 0x0102,
@ -2106,6 +2138,7 @@ GDK_KEY_U, 0x1EA1, 0x1EB7,
GDK_KEY_V, GDK_KEY_L, 0x007C,
GDK_KEY_W, GDK_KEY_equal, 0x20A9,
GDK_KEY_W, GDK_KEY_asciicircum, 0x0174,
GDK_KEY_X, GDK_KEY_0, 0x00A4,
GDK_KEY_X, GDK_KEY_O, 0x00A4,
GDK_KEY_X, GDK_KEY_o, 0x00A4,
GDK_KEY_Y, GDK_KEY_quotedbl, 0x0178,
@ -2154,6 +2187,7 @@ GDK_KEY_asciicircum, GDK_KEY_U, 0x00DB,
GDK_KEY_asciicircum, GDK_KEY_W, 0x0174,
GDK_KEY_asciicircum, GDK_KEY_Y, 0x0176,
GDK_KEY_asciicircum, GDK_KEY_Z, 0x1E90,
GDK_KEY_asciicircum, GDK_KEY_underscore, 0x00AF,
GDK_KEY_asciicircum, GDK_KEY_a, 0x00E2,
GDK_KEY_asciicircum, GDK_KEY_c, 0x0109,
GDK_KEY_asciicircum, GDK_KEY_e, 0x00EA,
@ -2167,6 +2201,7 @@ GDK_KEY_asciicircum, GDK_KEY_u, 0x00FB,
GDK_KEY_asciicircum, GDK_KEY_w, 0x0175,
GDK_KEY_asciicircum, GDK_KEY_y, 0x0177,
GDK_KEY_asciicircum, GDK_KEY_z, 0x1E91,
GDK_KEY_asciicircum, GDK_KEY_bar, 0x2191,
GDK_KEY_asciicircum, 0x1EA0, 0x1EAC,
GDK_KEY_asciicircum, 0x1EA1, 0x1EAD,
GDK_KEY_asciicircum, 0x1EB8, 0x1EC6,
@ -2377,7 +2412,7 @@ GDK_KEY_a, GDK_KEY_minus, 0x0101,
GDK_KEY_a, GDK_KEY_semicolon, 0x0105,
GDK_KEY_a, GDK_KEY_greater, 0x00E2,
GDK_KEY_a, GDK_KEY_asciicircum, 0x00E2,
GDK_KEY_a, GDK_KEY_underscore, 0x0101,
GDK_KEY_a, GDK_KEY_underscore, 0x00AA,
GDK_KEY_a, GDK_KEY_grave, 0x00E0,
GDK_KEY_a, GDK_KEY_a, 0x00E5,
GDK_KEY_a, GDK_KEY_e, 0x00E6,
@ -2421,6 +2456,7 @@ GDK_KEY_c, GDK_KEY_apostrophe, 0x0107,
GDK_KEY_c, GDK_KEY_comma, 0x00E7,
GDK_KEY_c, GDK_KEY_period, 0x010B,
GDK_KEY_c, GDK_KEY_slash, 0x00A2,
GDK_KEY_c, GDK_KEY_0, 0x00A9,
GDK_KEY_c, GDK_KEY_less, 0x010D,
GDK_KEY_c, GDK_KEY_equal, 0x20AC,
GDK_KEY_c, GDK_KEY_A, 0x01CD,
@ -2491,6 +2527,8 @@ GDK_KEY_g, GDK_KEY_parenleft, 0x011F,
GDK_KEY_g, GDK_KEY_comma, 0x0123,
GDK_KEY_g, GDK_KEY_period, 0x0121,
GDK_KEY_g, GDK_KEY_U, 0x011F,
GDK_KEY_g, GDK_KEY_t, 0x003E,
GDK_KEY_g, GDK_KEY_u, 0x011F,
GDK_KEY_g, GDK_KEY_breve, 0x011F,
GDK_KEY_h, GDK_KEY_comma, 0x1E29,
GDK_KEY_i, GDK_KEY_quotedbl, 0x00EF,
@ -2514,12 +2552,15 @@ GDK_KEY_l, GDK_KEY_comma, 0x013C,
GDK_KEY_l, GDK_KEY_minus, 0x00A3,
GDK_KEY_l, GDK_KEY_slash, 0x0142,
GDK_KEY_l, GDK_KEY_less, 0x013E,
GDK_KEY_l, GDK_KEY_equal, 0x00A3,
GDK_KEY_l, GDK_KEY_t, 0x003C,
GDK_KEY_l, GDK_KEY_v, 0x007C,
GDK_KEY_m, GDK_KEY_period, 0x1E41,
GDK_KEY_m, GDK_KEY_slash, 0x20A5,
GDK_KEY_m, GDK_KEY_u, 0x00B5,
GDK_KEY_n, GDK_KEY_apostrophe, 0x0144,
GDK_KEY_n, GDK_KEY_comma, 0x0146,
GDK_KEY_n, GDK_KEY_minus, 0x00F1,
GDK_KEY_n, GDK_KEY_less, 0x0148,
GDK_KEY_n, GDK_KEY_g, 0x014B,
GDK_KEY_n, GDK_KEY_asciitilde, 0x00F1,
@ -2536,7 +2577,7 @@ GDK_KEY_o, GDK_KEY_R, 0x00AE,
GDK_KEY_o, GDK_KEY_U, 0x016E,
GDK_KEY_o, GDK_KEY_X, 0x00A4,
GDK_KEY_o, GDK_KEY_asciicircum, 0x00F4,
GDK_KEY_o, GDK_KEY_underscore, 0x014D,
GDK_KEY_o, GDK_KEY_underscore, 0x00BA,
GDK_KEY_o, GDK_KEY_grave, 0x00F2,
GDK_KEY_o, GDK_KEY_a, 0x00E5,
GDK_KEY_o, GDK_KEY_c, 0x00A9,
@ -2553,13 +2594,19 @@ GDK_KEY_o, GDK_KEY_diaeresis, 0x00F6,
GDK_KEY_o, GDK_KEY_acute, 0x00F3,
GDK_KEY_p, GDK_KEY_exclam, 0x00B6,
GDK_KEY_p, GDK_KEY_period, 0x1E57,
GDK_KEY_p, GDK_KEY_equal, 0x20BD,
GDK_KEY_r, GDK_KEY_apostrophe, 0x0155,
GDK_KEY_r, GDK_KEY_comma, 0x0157,
GDK_KEY_r, GDK_KEY_less, 0x0159,
GDK_KEY_r, GDK_KEY_equal, 0x20B9,
GDK_KEY_s, GDK_KEY_exclam, 0x00A7,
GDK_KEY_s, GDK_KEY_apostrophe, 0x015B,
GDK_KEY_s, GDK_KEY_comma, 0x015F,
GDK_KEY_s, GDK_KEY_period, 0x1E61,
GDK_KEY_s, GDK_KEY_0, 0x00A7,
GDK_KEY_s, GDK_KEY_1, 0x00B9,
GDK_KEY_s, GDK_KEY_2, 0x00B2,
GDK_KEY_s, GDK_KEY_3, 0x00B3,
GDK_KEY_s, GDK_KEY_semicolon, 0x0219,
GDK_KEY_s, GDK_KEY_less, 0x0161,
GDK_KEY_s, GDK_KEY_M, 0x2120,
@ -2585,20 +2632,59 @@ GDK_KEY_u, GDK_KEY_slash, 0x00B5,
GDK_KEY_u, GDK_KEY_semicolon, 0x0173,
GDK_KEY_u, GDK_KEY_greater, 0x00FB,
GDK_KEY_u, GDK_KEY_A, 0x0102,
GDK_KEY_u, GDK_KEY_E, 0x0114,
GDK_KEY_u, GDK_KEY_G, 0x011E,
GDK_KEY_u, GDK_KEY_I, 0x012C,
GDK_KEY_u, GDK_KEY_O, 0x014E,
GDK_KEY_u, GDK_KEY_U, 0x016C,
GDK_KEY_u, GDK_KEY_asciicircum, 0x00FB,
GDK_KEY_u, GDK_KEY_underscore, 0x016B,
GDK_KEY_u, GDK_KEY_grave, 0x00F9,
GDK_KEY_u, GDK_KEY_a, 0x0103,
GDK_KEY_u, GDK_KEY_e, 0x0115,
GDK_KEY_u, GDK_KEY_g, 0x011F,
GDK_KEY_u, GDK_KEY_i, 0x012D,
GDK_KEY_u, GDK_KEY_o, 0x014F,
GDK_KEY_u, GDK_KEY_u, 0x016D,
GDK_KEY_u, GDK_KEY_asciitilde, 0x0169,
GDK_KEY_u, GDK_KEY_diaeresis, 0x00FC,
GDK_KEY_u, GDK_KEY_acute, 0x00FA,
GDK_KEY_v, GDK_KEY_slash, 0x221A,
GDK_KEY_v, GDK_KEY_A, 0x01CD,
GDK_KEY_v, GDK_KEY_C, 0x010C,
GDK_KEY_v, GDK_KEY_D, 0x010E,
GDK_KEY_v, GDK_KEY_E, 0x011A,
GDK_KEY_v, GDK_KEY_G, 0x01E6,
GDK_KEY_v, GDK_KEY_H, 0x021E,
GDK_KEY_v, GDK_KEY_I, 0x01CF,
GDK_KEY_v, GDK_KEY_K, 0x01E8,
GDK_KEY_v, GDK_KEY_N, 0x0147,
GDK_KEY_v, GDK_KEY_O, 0x01D1,
GDK_KEY_v, GDK_KEY_R, 0x0158,
GDK_KEY_v, GDK_KEY_S, 0x0160,
GDK_KEY_v, GDK_KEY_T, 0x0164,
GDK_KEY_v, GDK_KEY_U, 0x01D3,
GDK_KEY_v, GDK_KEY_Z, 0x017D,
GDK_KEY_v, GDK_KEY_a, 0x01CE,
GDK_KEY_v, GDK_KEY_c, 0x010D,
GDK_KEY_v, GDK_KEY_d, 0x010F,
GDK_KEY_v, GDK_KEY_e, 0x011B,
GDK_KEY_v, GDK_KEY_g, 0x01E7,
GDK_KEY_v, GDK_KEY_h, 0x021F,
GDK_KEY_v, GDK_KEY_i, 0x01D0,
GDK_KEY_v, GDK_KEY_j, 0x01F0,
GDK_KEY_v, GDK_KEY_k, 0x01E9,
GDK_KEY_v, GDK_KEY_l, 0x007C,
GDK_KEY_v, GDK_KEY_n, 0x0148,
GDK_KEY_v, GDK_KEY_o, 0x01D2,
GDK_KEY_v, GDK_KEY_r, 0x0159,
GDK_KEY_v, GDK_KEY_s, 0x0161,
GDK_KEY_v, GDK_KEY_t, 0x0165,
GDK_KEY_v, GDK_KEY_u, 0x01D4,
GDK_KEY_v, GDK_KEY_z, 0x017E,
GDK_KEY_v, GDK_KEY_bar, 0x2193,
GDK_KEY_w, GDK_KEY_asciicircum, 0x0175,
GDK_KEY_x, GDK_KEY_0, 0x00A4,
GDK_KEY_x, GDK_KEY_O, 0x00A4,
GDK_KEY_x, GDK_KEY_o, 0x00A4,
GDK_KEY_x, GDK_KEY_x, 0x00D7,
@ -2614,7 +2700,9 @@ GDK_KEY_z, GDK_KEY_period, 0x017C,
GDK_KEY_z, GDK_KEY_less, 0x017E,
GDK_KEY_braceleft, GDK_KEY_braceright, 0x2205,
GDK_KEY_bar, GDK_KEY_C, 0x00A2,
GDK_KEY_bar, GDK_KEY_asciicircum, 0x2191,
GDK_KEY_bar, GDK_KEY_c, 0x00A2,
GDK_KEY_bar, GDK_KEY_v, 0x2193,
GDK_KEY_bar, GDK_KEY_asciitilde, 0x236D,
GDK_KEY_bar, 0x2190, 0x2345,
GDK_KEY_bar, 0x2192, 0x2346,
@ -2642,6 +2730,7 @@ GDK_KEY_asciitilde, GDK_KEY_u, 0x0169,
GDK_KEY_asciitilde, GDK_KEY_v, 0x1E7D,
GDK_KEY_asciitilde, GDK_KEY_y, 0x1EF9,
GDK_KEY_asciitilde, GDK_KEY_bar, 0x236D,
GDK_KEY_asciitilde, GDK_KEY_asciitilde, 0x2248,
GDK_KEY_asciitilde, GDK_KEY_diaeresis, 0x2368,
GDK_KEY_asciitilde, GDK_KEY_Acircumflex, 0x1EAA,
GDK_KEY_asciitilde, GDK_KEY_Ecircumflex, 0x1EC4,
@ -2927,10 +3016,12 @@ GDK_KEY_breve, GDK_KEY_g, 0x011F,
0x0654, 0x06D5, 0x06C0,
0x0655, GDK_KEY_Arabic_alef, 0x0625,
GDK_KEY_Cyrillic_pe, GDK_KEY_Cyrillic_a, 0x00A7,
GDK_KEY_Cyrillic_ze, GDK_KEY_equal, 0x20BD,
GDK_KEY_Cyrillic_IE, GDK_KEY_equal, 0x20AC,
GDK_KEY_Cyrillic_EN, GDK_KEY_Cyrillic_o, 0x2116,
GDK_KEY_Cyrillic_EN, GDK_KEY_Cyrillic_O, 0x2116,
GDK_KEY_Cyrillic_ES, GDK_KEY_equal, 0x20AC,
GDK_KEY_Cyrillic_ZE, GDK_KEY_equal, 0x20BD,
GDK_KEY_Greek_ALPHA, GDK_KEY_apostrophe, 0x0386,
GDK_KEY_Greek_EPSILON, GDK_KEY_apostrophe, 0x0388,
GDK_KEY_Greek_ETA, GDK_KEY_apostrophe, 0x0389,
@ -2944,6 +3035,7 @@ GDK_KEY_Greek_alpha, GDK_KEY_apostrophe, 0x03AC,
GDK_KEY_Greek_epsilon, GDK_KEY_apostrophe, 0x03AD,
GDK_KEY_Greek_eta, GDK_KEY_apostrophe, 0x03AE,
GDK_KEY_Greek_iota, GDK_KEY_quotedbl, 0x03CA,
GDK_KEY_Greek_iota, GDK_KEY_apostrophe, 0x03AF,
GDK_KEY_Greek_iota, GDK_KEY_Greek_alphaaccent, 0x1FB4,
GDK_KEY_Greek_iota, GDK_KEY_Greek_etaaccent, 0x1FC4,
GDK_KEY_Greek_iota, GDK_KEY_Greek_omegaaccent, 0x1FF4,
@ -3477,6 +3569,9 @@ GDK_KEY_exclam, GDK_KEY_dead_horn, GDK_KEY_O, 0x1EE2,
GDK_KEY_exclam, GDK_KEY_dead_horn, GDK_KEY_U, 0x1EF0,
GDK_KEY_exclam, GDK_KEY_dead_horn, GDK_KEY_o, 0x1EE3,
GDK_KEY_exclam, GDK_KEY_dead_horn, GDK_KEY_u, 0x1EF1,
GDK_KEY_quotedbl, GDK_KEY_apostrophe, GDK_KEY_space, 0x0385,
GDK_KEY_quotedbl, GDK_KEY_apostrophe, GDK_KEY_Greek_iota, 0x0390,
GDK_KEY_quotedbl, GDK_KEY_apostrophe, GDK_KEY_Greek_upsilon, 0x03B0,
GDK_KEY_quotedbl, GDK_KEY_underscore, GDK_KEY_U, 0x1E7A,
GDK_KEY_quotedbl, GDK_KEY_underscore, GDK_KEY_u, 0x1E7B,
GDK_KEY_quotedbl, GDK_KEY_asciitilde, GDK_KEY_O, 0x1E4E,