From 5b67e6817c80caf1282e227eea000c4b98df0621 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 21 Mar 2021 18:17:32 -0400 Subject: [PATCH 1/5] imcontext: Improve dead key handling For sequences like `x, where we don't have a compose sequence, we still want to commit "`x", and not silently eat the keys. --- gtk/gtkimcontextsimple.c | 163 ++++++++++++++++++++++++--------------- 1 file changed, 100 insertions(+), 63 deletions(-) diff --git a/gtk/gtkimcontextsimple.c b/gtk/gtkimcontextsimple.c index f1fa021e73..06ca6ca6bb 100644 --- a/gtk/gtkimcontextsimple.c +++ b/gtk/gtkimcontextsimple.c @@ -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 */ { @@ -982,70 +1080,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) From 8bfc6afe33467a03ea2ab39afbab86052d0dce23 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 21 Mar 2021 18:51:57 -0400 Subject: [PATCH 2/5] imcontext: Improve dead key handling more MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For sequences like ``, we want to commit the first deadkey and then continue preedit with the second. The alternative is to do chained deadkeys, where entering ~~a yields ̃̀̃̃a. But we don't do that, and I think that would be more controversial. --- gtk/gtkimcontextsimple.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/gtk/gtkimcontextsimple.c b/gtk/gtkimcontextsimple.c index 06ca6ca6bb..9c1024e0c3 100644 --- a/gtk/gtkimcontextsimple.c +++ b/gtk/gtkimcontextsimple.c @@ -922,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; From a41cd9b1fa62ffd32d607f0c4120ef4cde89f333 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 21 Mar 2021 20:53:24 -0400 Subject: [PATCH 3/5] compose-parse: Add a negative lookaside Make this script parse gtk-compose-remove.txt for sequences to remove from the xorg Compose file. This will be used for removing some deadkey combinations that we can handle better in code. Also, make this script explicitly python2. I tried porting it to python3, but gave up in the end. --- gtk/compose-parse.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/gtk/compose-parse.py b/gtk/compose-parse.py index 767f2b421e..23444bc1ed 100755 --- a/gtk/compose-parse.py +++ b/gtk/compose-parse.py @@ -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(): From a42a133a181ddaace0a15bc7e0730ad58684c014 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 21 Mar 2021 20:56:17 -0400 Subject: [PATCH 4/5] Move compose related tooling to a subdir This reduces the clutter in gtk/. --- gtk/{ => compose}/compose-parse.py | 0 gtk/{ => compose}/gtk-compose-lookaside.txt | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename gtk/{ => compose}/compose-parse.py (100%) rename gtk/{ => compose}/gtk-compose-lookaside.txt (100%) diff --git a/gtk/compose-parse.py b/gtk/compose/compose-parse.py similarity index 100% rename from gtk/compose-parse.py rename to gtk/compose/compose-parse.py diff --git a/gtk/gtk-compose-lookaside.txt b/gtk/compose/gtk-compose-lookaside.txt similarity index 100% rename from gtk/gtk-compose-lookaside.txt rename to gtk/compose/gtk-compose-lookaside.txt From 64a62ebcfba3327b42abe2c3d44c089fc7470caf Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 21 Mar 2021 21:05:20 -0400 Subject: [PATCH 5/5] Regenerate compose sequence file Update our compose sequences based on the current update xorg Compose.pre file. Beyond that, remove some deadkey sequences that we are now handling (better) in code. --- gtk/compose/gtk-compose-lookaside.txt | 4 + gtk/compose/gtk-compose-remove.txt | 14 ++ gtk/gtkimcontextsimpleseqs.h | 199 +++++++++++++++++++------- 3 files changed, 165 insertions(+), 52 deletions(-) create mode 100644 gtk/compose/gtk-compose-remove.txt diff --git a/gtk/compose/gtk-compose-lookaside.txt b/gtk/compose/gtk-compose-lookaside.txt index 3f3b23c69c..c846cc8121 100644 --- a/gtk/compose/gtk-compose-lookaside.txt +++ b/gtk/compose/gtk-compose-lookaside.txt @@ -403,3 +403,7 @@ : "ό" U03CC : "ύ" U03CD : "ώ" U03CE + +# This sequence matches our handling of dead keys better. +# We remove the xorg sequence that maps this to ' + : "´" acute # ACUTE ACCENT diff --git a/gtk/compose/gtk-compose-remove.txt b/gtk/compose/gtk-compose-remove.txt new file mode 100644 index 0000000000..620df9e9ce --- /dev/null +++ b/gtk/compose/gtk-compose-remove.txt @@ -0,0 +1,14 @@ + : "~" asciitilde # TILDE + : "'" apostrophe # APOSTROPHE + : "´" acute # ACUTE ACCENT + : "`" grave # GRAVE ACCENT + : "°" degree # DEGREE SIGN + : "¯" macron # MACRON + : "˘" breve # BREVE + : "˙" abovedot # DOT ABOVE + : "¨" diaeresis # DIAERESIS + : "˝" U2dd # DOUBLE ACUTE ACCENT + : "ˇ" caron # CARON + : "¸" cedilla # CEDILLA + : "˛" ogonek # OGONEK + : "ͺ" U37a # GREEK YPOGEGRAMMENI diff --git a/gtk/gtkimcontextsimpleseqs.h b/gtk/gtkimcontextsimpleseqs.h index 4ba242c6bf..901d1c4af6 100644 --- a/gtk/gtkimcontextsimpleseqs.h +++ b/gtk/gtkimcontextsimpleseqs.h @@ -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,