summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlbert Astals Cid2021-04-09 16:44:49 +0200
committerAlbert Astals Cid2021-04-09 16:46:40 +0200
commit13609f45aa537444f449d56e73062736b7538127 (patch)
tree1ca4588573972f1f0a467eeb38a4cc452653d0ea
parentee9d5f21881975d1a08af3635bb91c428ebe4633 (diff)
downloadaur-13609f45aa537444f449d56e73062736b7538127.tar.gz
new gtk
This sadly reverts a lot more changes to deadkeys because they keep changing things and they broke my patch, so i reverted them too.
-rw-r--r--.SRCINFO20
-rw-r--r--41c3e9873cf2b388d4a91fbd86c360d53b1a00da.patch16
-rw-r--r--58b3145c90a4681bf1ee026f58e12bfb5cafe81a.patch27
-rw-r--r--59397005fa8136dd73079d75b0575b00f114ce35.patch658
-rw-r--r--7b3c387af9e9c6c37c5751258ded6708094d4c73.patch51
-rw-r--r--8c7846733aa5e2bac866d8b8ac9eb4d8d1d6f527.patch141
-rw-r--r--PKGBUILD29
-rw-r--r--a0cdd25bd4274d6ff12162de3d416326ec0429e4.patch57
-rw-r--r--c26525f87c885929eccf248dd8cae2a2cf28b819.patch199
9 files changed, 1191 insertions, 7 deletions
diff --git a/.SRCINFO b/.SRCINFO
index 80d708e94106..2f281edd3b20 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,7 +1,7 @@
pkgbase = gtk3-no_deadkeys_underline
pkgdesc = Like gtk3 in extra but with a patch to disable dead keys having an underline below them while typing
- pkgver = 3.24.27
- pkgrel = 4
+ pkgver = 3.24.28
+ pkgrel = 1
epoch = 1
url = https://www.gtk.org/
install = gtk3.install
@@ -52,12 +52,26 @@ pkgbase = gtk3-no_deadkeys_underline
conflicts = gtk3-print-backends
conflicts = gtk3
replaces = gtk3-print-backends<=3.22.26-1
- source = git+https://gitlab.gnome.org/GNOME/gtk.git#commit=c7df3b9e9790012e6c5fbad6a4f4519bcf75561f
+ source = git+https://gitlab.gnome.org/GNOME/gtk.git#commit=23db3508899f8304482b68e04a181bb081549081
source = gtk-query-immodules-3.0.hook
source = no_deadkeys_underline.patch
+ source = c26525f87c885929eccf248dd8cae2a2cf28b819.patch
+ source = a0cdd25bd4274d6ff12162de3d416326ec0429e4.patch
+ source = 7b3c387af9e9c6c37c5751258ded6708094d4c73.patch
+ source = 41c3e9873cf2b388d4a91fbd86c360d53b1a00da.patch
+ source = 59397005fa8136dd73079d75b0575b00f114ce35.patch
+ source = 58b3145c90a4681bf1ee026f58e12bfb5cafe81a.patch
+ source = 8c7846733aa5e2bac866d8b8ac9eb4d8d1d6f527.patch
sha256sums = SKIP
sha256sums = a0319b6795410f06d38de1e8695a9bf9636ff2169f40701671580e60a108e229
sha256sums = SKIP
+ sha256sums = SKIP
+ sha256sums = SKIP
+ sha256sums = SKIP
+ sha256sums = SKIP
+ sha256sums = SKIP
+ sha256sums = SKIP
+ sha256sums = SKIP
pkgname = gtk3-no_deadkeys_underline
diff --git a/41c3e9873cf2b388d4a91fbd86c360d53b1a00da.patch b/41c3e9873cf2b388d4a91fbd86c360d53b1a00da.patch
new file mode 100644
index 000000000000..9ed252ed5fff
--- /dev/null
+++ b/41c3e9873cf2b388d4a91fbd86c360d53b1a00da.patch
@@ -0,0 +1,16 @@
+commit 41c3e9873cf2b388d4a91fbd86c360d53b1a00da
+Author: Matthias Clasen <mclasen@redhat.com>
+Date: Sun Mar 21 20:56:17 2021 -0400
+
+ Move compose related tooling to a subdir
+
+ This reduces the clutter in gtk/.
+
+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
diff --git a/58b3145c90a4681bf1ee026f58e12bfb5cafe81a.patch b/58b3145c90a4681bf1ee026f58e12bfb5cafe81a.patch
new file mode 100644
index 000000000000..f53529e5ca74
--- /dev/null
+++ b/58b3145c90a4681bf1ee026f58e12bfb5cafe81a.patch
@@ -0,0 +1,27 @@
+commit 58b3145c90a4681bf1ee026f58e12bfb5cafe81a
+Author: Matthias Clasen <mclasen@redhat.com>
+Date: Fri Mar 26 19:48:41 2021 -0400
+
+ composetable: Limit algorithmic checking
+
+ Only check for combinations of up to 2 dead keys with
+ a base character. We don't want to spend ages generating
+ all permutations of long sequences.
+
+diff --git a/gtk/gtkcomposetable.c b/gtk/gtkcomposetable.c
+index 512e35e61d..185f89fefe 100644
+--- a/gtk/gtkcomposetable.c
++++ b/gtk/gtkcomposetable.c
+@@ -1190,6 +1190,12 @@ gtk_check_algorithmically (const guint16 *compose_buffer,
+
+ 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 */
+ if (i == n_compose)
+ return TRUE;
+
diff --git a/59397005fa8136dd73079d75b0575b00f114ce35.patch b/59397005fa8136dd73079d75b0575b00f114ce35.patch
new file mode 100644
index 000000000000..2f86bcef2ec0
--- /dev/null
+++ b/59397005fa8136dd73079d75b0575b00f114ce35.patch
@@ -0,0 +1,658 @@
+commit 59397005fa8136dd73079d75b0575b00f114ce35
+Author: Matthias Clasen <mclasen@redhat.com>
+Date: Sun Mar 21 21:05:20 2021 -0400
+
+ 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.
+
+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 @@
+ <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
+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 @@
++<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
+diff --git a/gtk/gtkimcontextsimpleseqs.h b/gtk/gtkimcontextsimpleseqs.h
+index 9a88b0feca..9cbf37d078 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,
diff --git a/7b3c387af9e9c6c37c5751258ded6708094d4c73.patch b/7b3c387af9e9c6c37c5751258ded6708094d4c73.patch
new file mode 100644
index 000000000000..b2bcf8df374e
--- /dev/null
+++ b/7b3c387af9e9c6c37c5751258ded6708094d4c73.patch
@@ -0,0 +1,51 @@
+commit 7b3c387af9e9c6c37c5751258ded6708094d4c73
+Author: Matthias Clasen <mclasen@redhat.com>
+Date: Sun Mar 21 20:53:24 2021 -0400
+
+ 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.
+
+diff --git a/gtk/compose-parse.py b/gtk/compose-parse.py
+index 9a6513a70a..bf0f5bc953 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():
diff --git a/8c7846733aa5e2bac866d8b8ac9eb4d8d1d6f527.patch b/8c7846733aa5e2bac866d8b8ac9eb4d8d1d6f527.patch
new file mode 100644
index 000000000000..cc0ff2562d21
--- /dev/null
+++ b/8c7846733aa5e2bac866d8b8ac9eb4d8d1d6f527.patch
@@ -0,0 +1,141 @@
+commit 8c7846733aa5e2bac866d8b8ac9eb4d8d1d6f527
+Author: Matthias Clasen <mclasen@redhat.com>
+Date: Fri Mar 26 19:50:05 2021 -0400
+
+ imcontext: Tweak dead key handling
+
+ Reshuffle things to allow for a limited amount of
+ dead key 'chaining'. We keep up to 2 dead keys in
+ the preedit, so you can type
+ <dead_acute> <dead_cedilla> <c>
+ to produce ḉ, while still getting ```c with
+ <dead_grave> <dead_grave> <dead_grave> <c>.
+
+diff --git a/gtk/gtkimcontextsimple.c b/gtk/gtkimcontextsimple.c
+index 204a375535..60ddbc3183 100644
+--- a/gtk/gtkimcontextsimple.c
++++ b/gtk/gtkimcontextsimple.c
+@@ -539,28 +539,62 @@ no_sequence_matches (GtkIMContextSimple *context_simple,
+ }
+ else
+ {
+- if (n_compose == 2 && is_dead_key (priv->compose_buffer[0]))
++ int i;
++
++ for (i = 0; i < n_compose && is_dead_key (priv->compose_buffer[i]); i++)
++ ;
++
++ if (n_compose > 1 && i >= n_compose - 1)
+ {
+ 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 (i == n_compose - 1)
+ {
+- if (need_space)
+- g_string_append_c (s, ' ');
+- g_string_append_unichar (s, ch);
++ /* dead keys are never *really* dead */
++ for (int j = 0; j < i; j++)
++ {
++ ch = dead_key_to_unicode (priv->compose_buffer[j], &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[i]);
++ if (ch != 0 && ch != ' ' && !g_unichar_iscntrl (ch))
++ g_string_append_unichar (s, ch);
++
++ gtk_im_context_simple_commit_string (context_simple, s->str);
+ }
++ else
++ {
++ 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);
++ }
++
++ gtk_im_context_simple_commit_string (context_simple, s->str);
++
++ for (i = 1; i < n_compose; i++)
++ priv->compose_buffer[i - 1] = priv->compose_buffer[i];
++ priv->compose_buffer[n_compose - 1] = 0;
++
++ priv->in_compose_sequence = TRUE;
+
+- ch = gdk_keyval_to_unicode (priv->compose_buffer[1]);
+- if (ch != 0 && !g_unichar_iscntrl (ch))
+- g_string_append_unichar (s, ch);
++ g_signal_emit_by_name (context, "preedit-start");
++ g_signal_emit_by_name (context, "preedit-changed");
++ }
+
+- gtk_im_context_simple_commit_string (context_simple, s->str);
+ g_string_free (s, TRUE);
++
+ return TRUE;
+ }
+
+@@ -895,39 +929,6 @@ 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;
+@@ -1013,6 +1014,9 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context,
+
+ if (output_char)
+ gtk_im_context_simple_commit_char (context_simple, output_char);
++ else
++ g_signal_emit_by_name (context_simple, "preedit-changed");
++
+ return TRUE;
+ }
+ }
diff --git a/PKGBUILD b/PKGBUILD
index b80c4b7baa68..bec7f23374e2 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -3,8 +3,8 @@
# Contributor: Ionut Biru <ibiru@archlinux.org>
pkgname=gtk3-no_deadkeys_underline
-pkgver=3.24.27
-pkgrel=4
+pkgver=3.24.28
+pkgrel=1
epoch=1
pkgdesc="Like gtk3 in extra but with a patch to disable dead keys having an underline below them while typing"
arch=(x86_64)
@@ -21,12 +21,26 @@ conflicts=(gtk3-print-backends gtk3)
replaces=("gtk3-print-backends<=3.22.26-1")
license=(LGPL)
install=gtk3.install
-_commit=c7df3b9e9790012e6c5fbad6a4f4519bcf75561f # tags/3.24.27^0
+_commit=23db3508899f8304482b68e04a181bb081549081 # tags/3.24.28^0
source=("git+https://gitlab.gnome.org/GNOME/gtk.git#commit=$_commit"
gtk-query-immodules-3.0.hook
- no_deadkeys_underline.patch)
+ no_deadkeys_underline.patch
+ c26525f87c885929eccf248dd8cae2a2cf28b819.patch
+ a0cdd25bd4274d6ff12162de3d416326ec0429e4.patch
+ 7b3c387af9e9c6c37c5751258ded6708094d4c73.patch
+ 41c3e9873cf2b388d4a91fbd86c360d53b1a00da.patch
+ 59397005fa8136dd73079d75b0575b00f114ce35.patch
+ 58b3145c90a4681bf1ee026f58e12bfb5cafe81a.patch
+ 8c7846733aa5e2bac866d8b8ac9eb4d8d1d6f527.patch)
sha256sums=('SKIP'
'a0319b6795410f06d38de1e8695a9bf9636ff2169f40701671580e60a108e229'
+ 'SKIP'
+ 'SKIP'
+ 'SKIP'
+ 'SKIP'
+ 'SKIP'
+ 'SKIP'
+ 'SKIP'
'SKIP')
pkgver() {
@@ -36,6 +50,13 @@ pkgver() {
prepare() {
cd gtk
+ patch -p1 -R < ../8c7846733aa5e2bac866d8b8ac9eb4d8d1d6f527.patch
+ patch -p1 -R < ../58b3145c90a4681bf1ee026f58e12bfb5cafe81a.patch
+ patch -p1 -R < ../59397005fa8136dd73079d75b0575b00f114ce35.patch
+ patch -p1 -R < ../41c3e9873cf2b388d4a91fbd86c360d53b1a00da.patch
+ patch -p1 -R < ../7b3c387af9e9c6c37c5751258ded6708094d4c73.patch
+ patch -p1 -R < ../a0cdd25bd4274d6ff12162de3d416326ec0429e4.patch
+ patch -p1 -R < ../c26525f87c885929eccf248dd8cae2a2cf28b819.patch
patch -p1 < ../no_deadkeys_underline.patch
}
diff --git a/a0cdd25bd4274d6ff12162de3d416326ec0429e4.patch b/a0cdd25bd4274d6ff12162de3d416326ec0429e4.patch
new file mode 100644
index 000000000000..76694b8072ce
--- /dev/null
+++ b/a0cdd25bd4274d6ff12162de3d416326ec0429e4.patch
@@ -0,0 +1,57 @@
+commit a0cdd25bd4274d6ff12162de3d416326ec0429e4
+Author: Matthias Clasen <mclasen@redhat.com>
+Date: Sun Mar 21 18:51:57 2021 -0400
+
+ imcontext: Improve dead key handling more
+
+ 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.
+
+diff --git a/gtk/gtkimcontextsimple.c b/gtk/gtkimcontextsimple.c
+index 0e51bc725d..204a375535 100644
+--- a/gtk/gtkimcontextsimple.c
++++ b/gtk/gtkimcontextsimple.c
+@@ -895,6 +895,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;
diff --git a/c26525f87c885929eccf248dd8cae2a2cf28b819.patch b/c26525f87c885929eccf248dd8cae2a2cf28b819.patch
new file mode 100644
index 000000000000..3f224bba1292
--- /dev/null
+++ b/c26525f87c885929eccf248dd8cae2a2cf28b819.patch
@@ -0,0 +1,199 @@
+commit c26525f87c885929eccf248dd8cae2a2cf28b819
+Author: Matthias Clasen <mclasen@redhat.com>
+Date: Sun Mar 21 18:17:32 2021 -0400
+
+ 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.
+
+diff --git a/gtk/gtkimcontextsimple.c b/gtk/gtkimcontextsimple.c
+index cfbaecf3f6..0e51bc725d 100644
+--- a/gtk/gtkimcontextsimple.c
++++ b/gtk/gtkimcontextsimple.c
+@@ -422,6 +422,79 @@ beep_window (GdkWindow *window)
+ gdk_window_beep (window);
+ }
+
++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,
+@@ -466,6 +539,31 @@ no_sequence_matches (GtkIMContextSimple *context_simple,
+ }
+ else
+ {
++ 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 */
+ {
+@@ -954,70 +1052,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)