]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkimcontextsimple.c
Translation updated by Ivar Smolin.
[~andy/gtk] / gtk / gtkimcontextsimple.c
index 78c254728ab287f5d465601cd2d1e3b30506697b..f13bbc4550b4d3af24dd688dcb126dc4378d9b26 100644 (file)
  * Boston, MA 02111-1307, USA.
  */
 
+#include <config.h>
 #include <stdlib.h>
 
 #include <gdk/gdkkeysyms.h>
 #include "gtkaccelgroup.h"
-#include "gtksignal.h"
 #include "gtkimcontextsimple.h"
+#include "gtksettings.h"
+#include "gtkwidget.h"
+#include "gtkintl.h"
+#include "gtkalias.h"
 
 typedef struct _GtkComposeTable GtkComposeTable;
 
 struct _GtkComposeTable 
 {
-  guint16 *data;
+  const guint16 *data;
   gint max_seq_len;
   gint n_seqs;
 };
@@ -39,10 +43,10 @@ struct _GtkComposeTable
  *
  * The following compose letter letter sequences confliced
  *   Dstroke/dstroke and ETH/eth; resolved to Dstroke (Croation, Vietnamese, Lappish), over 
- *                                ETH (Icelandic, Faroese, old English, IPA)   [ D- -D d- -d ]
- *   Amacron/amacron and ordfeminine; resolved to ordfeminine                  [ _A A_ a_ _a ]
- *   Amacron/amacron and Atilde/atilde; resolved to atilde                   [ -A A- a- -a ]
- *   Omacron/Omacron and masculine; resolved to masculine                    [ _A A_ a_ _a ]
+ *                                ETH (Icelandic, Faroese, old English, IPA)  [ D- -D d- -d ]
+ *   Amacron/amacron and ordfeminine; resolved to ordfeminine                [ _A A_ a_ _a ]
+ *   Amacron/amacron and Atilde/atilde; resolved to atilde                   [ -A A- a- -a ]
+ *   Omacron/Omacron and masculine; resolved to masculine                    [ _O O_ o_ _o ]
  *   Omacron/omacron and Otilde/atilde; resolved to otilde                   [ -O O- o- -o ]
  *
  * [ Amacron and Omacron are in Latin-4 (Baltic). ordfeminine and masculine are used for
@@ -56,34 +60,67 @@ struct _GtkComposeTable
  * that depend on the locale or selected input method. 
  */
 
-static guint16 gtk_compose_seqs[] = {
+static const guint16 gtk_compose_seqs[] = {
+  GDK_Greek_accentdieresis,    GDK_Greek_iota, 0,      0,      0,      0x0390, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
+  GDK_Greek_accentdieresis,    GDK_Greek_upsilon,      0,      0,      0,      0x03B0, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */
   GDK_dead_grave,      GDK_space,      0,      0,      0,      0x0060, /* GRAVE_ACCENT */
   GDK_dead_grave,      GDK_A,  0,      0,      0,      0x00C0, /* LATIN_CAPITAL_LETTER_A_WITH_GRAVE */
   GDK_dead_grave,      GDK_E,  0,      0,      0,      0x00C8, /* LATIN_CAPITAL_LETTER_E_WITH_GRAVE */
   GDK_dead_grave,      GDK_I,  0,      0,      0,      0x00CC, /* LATIN_CAPITAL_LETTER_I_WITH_GRAVE */
   GDK_dead_grave,      GDK_O,  0,      0,      0,      0x00D2, /* LATIN_CAPITAL_LETTER_O_WITH_GRAVE */
   GDK_dead_grave,      GDK_U,  0,      0,      0,      0x00D9, /* LATIN_CAPITAL_LETTER_U_WITH_GRAVE */
+  GDK_dead_grave,       GDK_grave,      0,      0,      0,      0x0060, /* GRAVE_ACCENT */
   GDK_dead_grave,      GDK_a,  0,      0,      0,      0x00E0, /* LATIN_SMALL_LETTER_A_WITH_GRAVE */
   GDK_dead_grave,      GDK_e,  0,      0,      0,      0x00E8, /* LATIN_SMALL_LETTER_E_WITH_GRAVE */
   GDK_dead_grave,      GDK_i,  0,      0,      0,      0x00EC, /* LATIN_SMALL_LETTER_I_WITH_GRAVE */
   GDK_dead_grave,      GDK_o,  0,      0,      0,      0x00F2, /* LATIN_SMALL_LETTER_O_WITH_GRAVE */
   GDK_dead_grave,      GDK_u,  0,      0,      0,      0x00F9, /* LATIN_SMALL_LETTER_U_WITH_GRAVE */
+  GDK_dead_grave,       GDK_dead_grave, 0,      0,      0,      0x0060, /* GRAVE_ACCENT */  
   GDK_dead_acute,      GDK_space,      0,      0,      0,      0x0027, /* APOSTROPHE */
   GDK_dead_acute,      GDK_apostrophe, 0,      0,      0,      0x00B4, /* ACUTE_ACCENT */
   GDK_dead_acute,      GDK_A,  0,      0,      0,      0x00C1, /* LATIN_CAPITAL_LETTER_A_WITH_ACUTE */
+  GDK_dead_acute,      GDK_C,  0,      0,      0,      0x0106, /* LATIN_CAPITAL_LETTER_C_WITH_ACUTE */
   GDK_dead_acute,      GDK_E,  0,      0,      0,      0x00C9, /* LATIN_CAPITAL_LETTER_E_WITH_ACUTE */
   GDK_dead_acute,      GDK_I,  0,      0,      0,      0x00CD, /* LATIN_CAPITAL_LETTER_I_WITH_ACUTE */
+  GDK_dead_acute,      GDK_L,  0,      0,      0,      0x0139, /* LATIN_CAPITAL_LETTER_L_WITH_ACUTE */
+  GDK_dead_acute,      GDK_N,  0,      0,      0,      0x0143, /* LATIN_CAPITAL_LETTER_N_WITH_ACUTE */
   GDK_dead_acute,      GDK_O,  0,      0,      0,      0x00D3, /* LATIN_CAPITAL_LETTER_O_WITH_ACUTE */
+  GDK_dead_acute,      GDK_R,  0,      0,      0,      0x0154, /* LATIN_CAPITAL_LETTER_R_WITH_ACUTE */
+  GDK_dead_acute,      GDK_S,  0,      0,      0,      0x015A, /* LATIN_CAPITAL_LETTER_S_WITH_ACUTE */
   GDK_dead_acute,      GDK_U,  0,      0,      0,      0x00DA, /* LATIN_CAPITAL_LETTER_U_WITH_ACUTE */
   GDK_dead_acute,      GDK_Y,  0,      0,      0,      0x00DD, /* LATIN_CAPITAL_LETTER_Y_WITH_ACUTE */
+  GDK_dead_acute,      GDK_Z,  0,      0,      0,      0x0179, /* LATIN_CAPITAL_LETTER_Z_WITH_ACUTE */
   GDK_dead_acute,      GDK_a,  0,      0,      0,      0x00E1, /* LATIN_SMALL_LETTER_A_WITH_ACUTE */
+  GDK_dead_acute,      GDK_c,  0,      0,      0,      0x0107, /* LATIN_SMALL_LETTER_C_WITH_ACUTE */
   GDK_dead_acute,      GDK_e,  0,      0,      0,      0x00E9, /* LATIN_SMALL_LETTER_E_WITH_ACUTE */
   GDK_dead_acute,      GDK_i,  0,      0,      0,      0x00ED, /* LATIN_SMALL_LETTER_I_WITH_ACUTE */
+  GDK_dead_acute,      GDK_l,  0,      0,      0,      0x013A, /* LATIN_SMALL_LETTER_L_WITH_ACUTE */
+  GDK_dead_acute,      GDK_n,  0,      0,      0,      0x0144, /* LATIN_SMALL_LETTER_N_WITH_ACUTE */
   GDK_dead_acute,      GDK_o,  0,      0,      0,      0x00F3, /* LATIN_SMALL_LETTER_O_WITH_ACUTE */
+  GDK_dead_acute,      GDK_r,  0,      0,      0,      0x0155, /* LATIN_SMALL_LETTER_R_WITH_ACUTE */
+  GDK_dead_acute,      GDK_s,  0,      0,      0,      0x015B, /* LATIN_SMALL_LETTER_S_WITH_ACUTE */
   GDK_dead_acute,      GDK_u,  0,      0,      0,      0x00FA, /* LATIN_SMALL_LETTER_U_WITH_ACUTE */
   GDK_dead_acute,      GDK_y,  0,      0,      0,      0x00FD, /* LATIN_SMALL_LETTER_Y_WITH_ACUTE */
+  GDK_dead_acute,      GDK_z,  0,      0,      0,      0x017A, /* LATIN_SMALL_LETTER_Z_WITH_ACUTE */
   GDK_dead_acute,      GDK_acute,      0,      0,      0,      0x00B4, /* ACUTE_ACCENT */
+  GDK_dead_acute,      GDK_Greek_ALPHA,        0,      0,      0,      0x0386, /* GREEK CAPITAL LETTER ALPHA WITH TONOS */
+  GDK_dead_acute,      GDK_Greek_EPSILON,      0,      0,      0,      0x0388, /* GREEK CAPITAL LETTER EPSILON WITH TONOS */
+  GDK_dead_acute,      GDK_Greek_ETA,  0,      0,      0,      0x0389, /* GREEK CAPITAL LETTER ETA WITH TONOS */
+  GDK_dead_acute,      GDK_Greek_IOTA, 0,      0,      0,      0x038A, /* GREEK CAPITAL LETTER IOTA WITH TONOS */
+  GDK_dead_acute,      GDK_Greek_OMICRON,      0,      0,      0,      0x038C, /* GREEK CAPITAL LETTER OMICRON WITH TONOS */
+  GDK_dead_acute,      GDK_Greek_UPSILON,      0,      0,      0,      0x038E, /* GREEK CAPITAL LETTER UPSILON WITH TONOS */
+  GDK_dead_acute,      GDK_Greek_OMEGA,        0,      0,      0,      0x038F, /* GREEK CAPITAL LETTER OMEGA WITH TONOS */
+  GDK_dead_acute,      GDK_Greek_alpha,        0,      0,      0,      0x03AC, /* GREEK SMALL LETTER ALPHA WITH TONOS */
+  GDK_dead_acute,      GDK_Greek_epsilon,      0,      0,      0,      0x03AD, /* GREEK SMALL LETTER EPSILON WITH TONOS */
+  GDK_dead_acute,      GDK_Greek_eta,  0,      0,      0,      0x03AE, /* GREEK SMALL LETTER ETA WITH TONOS */
+  GDK_dead_acute,      GDK_Greek_iota, 0,      0,      0,      0x03AF, /* GREEK SMALL LETTER IOTA WITH TONOS */
+  GDK_dead_acute,      GDK_Greek_omicron,      0,      0,      0,      0x03CC, /* GREEK SMALL LETTER OMICRON WITH TONOS */
+  GDK_dead_acute,      GDK_Greek_upsilon,      0,      0,      0,      0x03CD, /* GREEK SMALL LETTER UPSILON WITH TONOS */
+  GDK_dead_acute,      GDK_Greek_omega,        0,      0,      0,      0x03CE, /* GREEK SMALL LETTER OMEGA WITH TONOS */
   GDK_dead_acute,      GDK_dead_acute, 0,      0,      0,      0x00B4, /* ACUTE_ACCENT */
+  GDK_dead_acute,      GDK_dead_diaeresis,     GDK_space,      0,      0,      0x0385, /* GREEK DIALYTIKA TONOS */
+  GDK_dead_acute,      GDK_dead_diaeresis,     GDK_Greek_iota, 0,      0,      0x0390, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
+  GDK_dead_acute,      GDK_dead_diaeresis,     GDK_Greek_upsilon,      0,      0,      0x03B0, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */
   GDK_dead_circumflex, GDK_space,      0,      0,      0,      0x005E, /* CIRCUMFLEX_ACCENT */
   GDK_dead_circumflex, GDK_minus,      0,      0,      0,      0x00AF, /* MACRON */
   GDK_dead_circumflex, GDK_period,     0,      0,      0,      0x00B7, /* MIDDLE_DOT */
@@ -97,12 +134,14 @@ static guint16 gtk_compose_seqs[] = {
   GDK_dead_circumflex, GDK_I,  0,      0,      0,      0x00CE, /* LATIN_CAPITAL_LETTER_I_WITH_CIRCUMFLEX */
   GDK_dead_circumflex, GDK_O,  0,      0,      0,      0x00D4, /* LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX */
   GDK_dead_circumflex, GDK_U,  0,      0,      0,      0x00DB, /* LATIN_CAPITAL_LETTER_U_WITH_CIRCUMFLEX */
+  GDK_dead_circumflex, GDK_asciicircum,        0,      0,      0,      0x005E, /* CIRCUMFLEX_ACCENT */
   GDK_dead_circumflex, GDK_underscore, 0,      0,      0,      0x00AF, /* MACRON */
   GDK_dead_circumflex, GDK_a,  0,      0,      0,      0x00E2, /* LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX */
   GDK_dead_circumflex, GDK_e,  0,      0,      0,      0x00EA, /* LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX */
   GDK_dead_circumflex, GDK_i,  0,      0,      0,      0x00EE, /* LATIN_SMALL_LETTER_I_WITH_CIRCUMFLEX */
   GDK_dead_circumflex, GDK_o,  0,      0,      0,      0x00F4, /* LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX */
   GDK_dead_circumflex, GDK_u,  0,      0,      0,      0x00FB, /* LATIN_SMALL_LETTER_U_WITH_CIRCUMFLEX */
+  GDK_dead_circumflex, GDK_dead_circumflex,    0,      0,      0,      0x005E, /* CIRCUMFLEX_ACCENT */
   GDK_dead_tilde,      GDK_space,      0,      0,      0,      0x007E, /* TILDE */
   GDK_dead_tilde,      GDK_A,  0,      0,      0,      0x00C3, /* LATIN_CAPITAL_LETTER_A_WITH_TILDE */
   GDK_dead_tilde,      GDK_I,  0,      0,      0,      0x0128, /* LATIN_CAPITAL_LETTER_I_WITH_TILDE */
@@ -120,7 +159,7 @@ static guint16 gtk_compose_seqs[] = {
   GDK_dead_macron,     GDK_E,  0,      0,      0,      0x0112, /* LATIN_CAPITAL_LETTER_E_WITH_MACRON */
   GDK_dead_macron,     GDK_I,  0,      0,      0,      0x012A, /* LATIN_CAPITAL_LETTER_I_WITH_MACRON */
   GDK_dead_macron,     GDK_O,  0,      0,      0,      0x014C, /* LATIN_CAPITAL_LETTER_O_WITH_MACRON */
-  GDK_dead_macron,     GDK_U,  0,      0,      0,      0x00D9, /* LATIN_CAPITAL_LETTER_U_WITH_GRAVE */
+  GDK_dead_macron,     GDK_U,  0,      0,      0,      0x016A, /* LATIN_CAPITAL_LETTER_U_WITH_MACRON */
   GDK_dead_macron,     GDK_a,  0,      0,      0,      0x0101, /* LATIN_SMALL_LETTER_A_WITH_MACRON */
   GDK_dead_macron,     GDK_e,  0,      0,      0,      0x0113, /* LATIN_SMALL_LETTER_E_WITH_MACRON */
   GDK_dead_macron,     GDK_i,  0,      0,      0,      0x012B, /* LATIN_SMALL_LETTER_I_WITH_MACRON */
@@ -128,15 +167,22 @@ static guint16 gtk_compose_seqs[] = {
   GDK_dead_macron,     GDK_u,  0,      0,      0,      0x016B, /* LATIN_SMALL_LETTER_U_WITH_MACRON */
   GDK_dead_macron,     GDK_macron,     0,      0,      0,      0x00AF, /* MACRON */
   GDK_dead_macron,     GDK_dead_macron,        0,      0,      0,      0x00AF, /* MACRON */
+  GDK_dead_breve,      GDK_space,      0,      0,      0,      0x02D8, /* BREVE */
+  GDK_dead_breve,      GDK_A,  0,      0,      0,      0x0102, /* LATIN_CAPITAL_LETTER_A_WITH_BREVE */
   GDK_dead_breve,      GDK_G,  0,      0,      0,      0x011E, /* LATIN_CAPITAL_LETTER_G_WITH_BREVE */
+  GDK_dead_breve,      GDK_a,  0,      0,      0,      0x0103, /* LATIN_SMALL_LETTER_A_WITH_BREVE */
   GDK_dead_breve,      GDK_g,  0,      0,      0,      0x011F, /* LATIN_SMALL_LETTER_G_WITH_BREVE */
+  GDK_dead_breve,      GDK_dead_breve, 0,      0,      0,      0x02D8, /* BREVE */
+  GDK_dead_abovedot,   GDK_space,      0,      0,      0,      0x02D9, /* DOT_ABOVE */
   GDK_dead_abovedot,   GDK_E,  0,      0,      0,      0x0116, /* LATIN_CAPITAL_LETTER_E_WITH_DOT_ABOVE */
   GDK_dead_abovedot,   GDK_I,  0,      0,      0,      0x0130, /* LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE */
+  GDK_dead_abovedot,   GDK_Z,  0,      0,      0,      0x017B, /* LATIN_CAPITAL_LETTER_Z_WITH_DOT_ABOVE */
   GDK_dead_abovedot,   GDK_e,  0,      0,      0,      0x0117, /* LATIN_SMALL_LETTER_E_WITH_DOT_ABOVE */
   GDK_dead_abovedot,   GDK_i,  0,      0,      0,      0x0131, /* LATIN_SMALL_LETTER_DOTLESS_I */
+  GDK_dead_abovedot,   GDK_z,  0,      0,      0,      0x017C, /* LATIN_SMALL_LETTER_Z_WITH_DOT_ABOVE */
   GDK_dead_abovedot,   GDK_abovedot,   0,      0,      0,      0x02D9, /* DOT_ABOVE */
   GDK_dead_abovedot,   GDK_dead_abovedot,      0,      0,      0,      0x02D9, /* DOT_ABOVE */
-  GDK_dead_diaeresis,  GDK_space,      0,      0,      0,      0x00A8, /* DIAERESIS */
+  GDK_dead_diaeresis,  GDK_space,      0,      0,      0,      0x0022, /* QUOTATION_MARK */
   GDK_dead_diaeresis,  GDK_quotedbl,   0,      0,      0,      0x00A8, /* DIAERESIS */
   GDK_dead_diaeresis,  GDK_A,  0,      0,      0,      0x00C4, /* LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS */
   GDK_dead_diaeresis,  GDK_E,  0,      0,      0,      0x00CB, /* LATIN_CAPITAL_LETTER_E_WITH_DIAERESIS */
@@ -151,18 +197,48 @@ static guint16 gtk_compose_seqs[] = {
   GDK_dead_diaeresis,  GDK_u,  0,      0,      0,      0x00FC, /* LATIN_SMALL_LETTER_U_WITH_DIAERESIS */
   GDK_dead_diaeresis,  GDK_y,  0,      0,      0,      0x00FF, /* LATIN_SMALL_LETTER_Y_WITH_DIAERESIS */
   GDK_dead_diaeresis,  GDK_diaeresis,  0,      0,      0,      0x00A8, /* DIAERESIS */
+  GDK_dead_diaeresis,  GDK_Greek_IOTA, 0,      0,      0,      0x03AA, /* GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */
+  GDK_dead_diaeresis,  GDK_Greek_UPSILON,      0,      0,      0,      0x03AB, /* GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */
+  GDK_dead_diaeresis,  GDK_Greek_iota, 0,      0,      0,      0x03CA, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA */
+  GDK_dead_diaeresis,  GDK_Greek_upsilon,      0,      0,      0,      0x03CB, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA */
+  GDK_dead_diaeresis,  GDK_dead_acute, GDK_space,      0,      0,      0x0385, /* GREEK DIALYTIKA TONOS */
+  GDK_dead_diaeresis,  GDK_dead_acute, GDK_Greek_iota, 0,      0,      0x0390, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
+  GDK_dead_diaeresis,  GDK_dead_acute, GDK_Greek_upsilon,      0,      0,      0x03B0, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */
   GDK_dead_diaeresis,  GDK_dead_diaeresis,     0,      0,      0,      0x00A8, /* DIAERESIS */
+  GDK_dead_abovering,  GDK_space,      0,      0,      0,      0x02DA, /* RING_ABOVE */
   GDK_dead_abovering,  GDK_A,  0,      0,      0,      0x00C5, /* LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE */
+  GDK_dead_abovering,  GDK_U,  0,      0,      0,      0x016E, /* LATIN_CAPITAL_LETTER_U_WITH_RING_ABOVE */
   GDK_dead_abovering,  GDK_a,  0,      0,      0,      0x00E5, /* LATIN_SMALL_LETTER_A_WITH_RING_ABOVE */
+  GDK_dead_abovering,  GDK_u,  0,      0,      0,      0x016F, /* LATIN_SMALL_LETTER_U_WITH_RING_ABOVE */
   GDK_dead_abovering,  GDK_dead_abovering,     0,      0,      0,      0x02DA, /* RING_ABOVE */
+  GDK_dead_doubleacute,        GDK_space,      0,      0,      0,      0x02DD, /* DOUBLE_ACUTE_ACCENT */
+  GDK_dead_doubleacute,        GDK_O,  0,      0,      0,      0x0150, /* LATIN_CAPITAL_LETTER_O_WITH_DOUBLE_ACUTE */
+  GDK_dead_doubleacute,        GDK_U,  0,      0,      0,      0x0170, /* LATIN_CAPITAL_LETTER_U_WITH_DOUBLE_ACUTE */
+  GDK_dead_doubleacute,        GDK_o,  0,      0,      0,      0x0151, /* LATIN_SMALL_LETTER_O_WITH_DOUBLE_ACUTE */
+  GDK_dead_doubleacute,        GDK_u,  0,      0,      0,      0x0171, /* LATIN_SMALL_LETTER_U_WITH_DOUBLE_ACUTE */
+  GDK_dead_doubleacute,        GDK_dead_doubleacute,   0,      0,      0,      0x02DD, /* DOUBLE_ACUTE_ACCENT */
+  GDK_dead_caron,      GDK_space,      0,      0,      0,      0x02C7, /* CARON */
   GDK_dead_caron,      GDK_C,  0,      0,      0,      0x010C, /* LATIN_CAPITAL_LETTER_C_WITH_CARON */
+  GDK_dead_caron,      GDK_D,  0,      0,      0,      0x010E, /* LATIN_CAPITAL_LETTER_D_WITH_CARON */
+  GDK_dead_caron,      GDK_E,  0,      0,      0,      0x011A, /* LATIN_CAPITAL_LETTER_E_WITH_CARON */
+  GDK_dead_caron,      GDK_L,  0,      0,      0,      0x013D, /* LATIN_CAPITAL_LETTER_L_WITH_CARON */
+  GDK_dead_caron,      GDK_N,  0,      0,      0,      0x0147, /* LATIN_CAPITAL_LETTER_N_WITH_CARON */
+  GDK_dead_caron,      GDK_R,  0,      0,      0,      0x0158, /* LATIN_CAPITAL_LETTER_R_WITH_CARON */
   GDK_dead_caron,      GDK_S,  0,      0,      0,      0x0160, /* LATIN_CAPITAL_LETTER_S_WITH_CARON */
+  GDK_dead_caron,      GDK_T,  0,      0,      0,      0x0164, /* LATIN_CAPITAL_LETTER_T_WITH_CARON */
   GDK_dead_caron,      GDK_Z,  0,      0,      0,      0x017D, /* LATIN_CAPITAL_LETTER_Z_WITH_CARON */
   GDK_dead_caron,      GDK_c,  0,      0,      0,      0x010D, /* LATIN_SMALL_LETTER_C_WITH_CARON */
+  GDK_dead_caron,      GDK_d,  0,      0,      0,      0x010F, /* LATIN_SMALL_LETTER_D_WITH_CARON */
+  GDK_dead_caron,      GDK_e,  0,      0,      0,      0x011B, /* LATIN_SMALL_LETTER_E_WITH_CARON */
+  GDK_dead_caron,      GDK_l,  0,      0,      0,      0x013E, /* LATIN_SMALL_LETTER_L_WITH_CARON */
+  GDK_dead_caron,      GDK_n,  0,      0,      0,      0x0148, /* LATIN_SMALL_LETTER_N_WITH_CARON */
+  GDK_dead_caron,      GDK_r,  0,      0,      0,      0x0159, /* LATIN_SMALL_LETTER_R_WITH_CARON */
   GDK_dead_caron,      GDK_s,  0,      0,      0,      0x0161, /* LATIN_SMALL_LETTER_S_WITH_CARON */
+  GDK_dead_caron,      GDK_t,  0,      0,      0,      0x0165, /* LATIN_SMALL_LETTER_T_WITH_CARON */
   GDK_dead_caron,      GDK_z,  0,      0,      0,      0x017E, /* LATIN_SMALL_LETTER_Z_WITH_CARON */
   GDK_dead_caron,      GDK_caron,      0,      0,      0,      0x02C7, /* CARON */
   GDK_dead_caron,      GDK_dead_caron, 0,      0,      0,      0x02C7, /* CARON */
+  GDK_dead_cedilla,    GDK_space,      0,      0,      0,      0x00B8, /* CEDILLA */
   GDK_dead_cedilla,    GDK_comma,      0,      0,      0,      0x00B8, /* CEDILLA */
   GDK_dead_cedilla,    GDK_minus,      0,      0,      0,      0x00AC, /* NOT_SIGN */
   GDK_dead_cedilla,    GDK_C,  0,      0,      0,      0x00C7, /* LATIN_CAPITAL_LETTER_C_WITH_CEDILLA */
@@ -181,6 +257,7 @@ static guint16 gtk_compose_seqs[] = {
   GDK_dead_cedilla,    GDK_s,  0,      0,      0,      0x015F, /* LATIN_SMALL_LETTER_S_WITH_CEDILLA */
   GDK_dead_cedilla,    GDK_cedilla,    0,      0,      0,      0x00B8, /* CEDILLA */
   GDK_dead_cedilla,    GDK_dead_cedilla,       0,      0,      0,      0x00B8, /* CEDILLA */
+  GDK_dead_ogonek,     GDK_space,      0,      0,      0,      0x02DB, /* OGONEK */
   GDK_dead_ogonek,     GDK_A,  0,      0,      0,      0x0104, /* LATIN_CAPITAL_LETTER_A_WITH_OGONEK */
   GDK_dead_ogonek,     GDK_E,  0,      0,      0,      0x0118, /* LATIN_CAPITAL_LETTER_E_WITH_OGONEK */
   GDK_dead_ogonek,     GDK_I,  0,      0,      0,      0x012E, /* LATIN_CAPITAL_LETTER_I_WITH_OGONEK */
@@ -193,7 +270,9 @@ static guint16 gtk_compose_seqs[] = {
   GDK_dead_ogonek,     GDK_dead_ogonek,        0,      0,      0,      0x02DB, /* OGONEK */
   GDK_Multi_key,       GDK_space,      GDK_space,      0,      0,      0x00A0, /* NOxBREAK_SPACE */
   GDK_Multi_key,       GDK_space,      GDK_apostrophe, 0,      0,      0x0027, /* APOSTROPHE */
+  GDK_Multi_key,       GDK_space,      GDK_parenleft,  0,      0,      0x02D8, /* BREVE */
   GDK_Multi_key,       GDK_space,      GDK_minus,      0,      0,      0x007E, /* TILDE */
+  GDK_Multi_key,       GDK_space,      GDK_less,       0,      0,      0x02C7, /* CARON */
   GDK_Multi_key,       GDK_space,      GDK_greater,    0,      0,      0x005E, /* CIRCUMFLEX_ACCENT */
   GDK_Multi_key,       GDK_space,      GDK_asciicircum,        0,      0,      0x005E, /* CIRCUMFLEX_ACCENT */
   GDK_Multi_key,       GDK_space,      GDK_grave,      0,      0,      0x0060, /* GRAVE_ACCENT */
@@ -204,6 +283,9 @@ static guint16 gtk_compose_seqs[] = {
   GDK_Multi_key,       GDK_exclam,     GDK_p,  0,      0,      0x00B6, /* PILCROW_SIGN */
   GDK_Multi_key,       GDK_exclam,     GDK_s,  0,      0,      0x00A7, /* SECTION_SIGN */
   GDK_Multi_key,       GDK_quotedbl,   GDK_quotedbl,   0,      0,      0x00A8, /* DIAERESIS */
+  GDK_Multi_key,       GDK_quotedbl,   GDK_apostrophe, GDK_space,      0,      0x0385, /* GREEK DIALYTIKA TONOS */
+  GDK_Multi_key,       GDK_quotedbl,   GDK_apostrophe, GDK_Greek_iota, 0,      0x0390, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
+  GDK_Multi_key,       GDK_quotedbl,   GDK_apostrophe, GDK_Greek_upsilon,      0,      0x03B0, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */
   GDK_Multi_key,       GDK_quotedbl,   GDK_A,  0,      0,      0x00C4, /* LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS */
   GDK_Multi_key,       GDK_quotedbl,   GDK_E,  0,      0,      0x00CB, /* LATIN_CAPITAL_LETTER_E_WITH_DIAERESIS */
   GDK_Multi_key,       GDK_quotedbl,   GDK_I,  0,      0,      0x00CF, /* LATIN_CAPITAL_LETTER_I_WITH_DIAERESIS */
@@ -216,23 +298,61 @@ static guint16 gtk_compose_seqs[] = {
   GDK_Multi_key,       GDK_quotedbl,   GDK_o,  0,      0,      0x00F6, /* LATIN_SMALL_LETTER_O_WITH_DIAERESIS */
   GDK_Multi_key,       GDK_quotedbl,   GDK_u,  0,      0,      0x00FC, /* LATIN_SMALL_LETTER_U_WITH_DIAERESIS */
   GDK_Multi_key,       GDK_quotedbl,   GDK_y,  0,      0,      0x00FF, /* LATIN_SMALL_LETTER_Y_WITH_DIAERESIS */
+  GDK_Multi_key,       GDK_quotedbl,   GDK_Greek_IOTA, 0,      0,      0x03AA, /* GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */
+  GDK_Multi_key,       GDK_quotedbl,   GDK_Greek_UPSILON,      0,      0,      0x03AB, /* GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */
+  GDK_Multi_key,       GDK_quotedbl,   GDK_Greek_iota, 0,      0,      0x03CA, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA */
+  GDK_Multi_key,       GDK_quotedbl,   GDK_Greek_upsilon,      0,      0,      0x03CB, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA */
   GDK_Multi_key,       GDK_apostrophe, GDK_space,      0,      0,      0x0027, /* APOSTROPHE */
+  GDK_Multi_key,       GDK_apostrophe, GDK_quotedbl,   GDK_space,      0,      0x0385, /* GREEK DIALYTIKA TONOS */
+  GDK_Multi_key,       GDK_apostrophe, GDK_quotedbl,   GDK_Greek_iota, 0,      0x0390, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
+  GDK_Multi_key,       GDK_apostrophe, GDK_quotedbl,   GDK_Greek_upsilon,      0,      0x03B0, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */
   GDK_Multi_key,       GDK_apostrophe, GDK_apostrophe, 0,      0,      0x00B4, /* ACUTE_ACCENT */
-  GDK_Multi_key,       GDK_apostrophe, GDK_A,  0,      0,      0x00C1, /* LATIN_CAPITAL_LETTER_A_WITH_ACUTE */
-  GDK_Multi_key,       GDK_apostrophe, GDK_E,  0,      0,      0x00C9, /* LATIN_CAPITAL_LETTER_E_WITH_ACUTE */
-  GDK_Multi_key,       GDK_apostrophe, GDK_I,  0,      0,      0x00CD, /* LATIN_CAPITAL_LETTER_I_WITH_ACUTE */
-  GDK_Multi_key,       GDK_apostrophe, GDK_O,  0,      0,      0x00D3, /* LATIN_CAPITAL_LETTER_O_WITH_ACUTE */
-  GDK_Multi_key,       GDK_apostrophe, GDK_U,  0,      0,      0x00DA, /* LATIN_CAPITAL_LETTER_U_WITH_ACUTE */
-  GDK_Multi_key,       GDK_apostrophe, GDK_Y,  0,      0,      0x00DD, /* LATIN_CAPITAL_LETTER_Y_WITH_ACUTE */
-  GDK_Multi_key,       GDK_apostrophe, GDK_a,  0,      0,      0x00E1, /* LATIN_SMALL_LETTER_A_WITH_ACUTE */
-  GDK_Multi_key,       GDK_apostrophe, GDK_e,  0,      0,      0x00E9, /* LATIN_SMALL_LETTER_E_WITH_ACUTE */
-  GDK_Multi_key,       GDK_apostrophe, GDK_i,  0,      0,      0x00ED, /* LATIN_SMALL_LETTER_I_WITH_ACUTE */
-  GDK_Multi_key,       GDK_apostrophe, GDK_o,  0,      0,      0x00F3, /* LATIN_SMALL_LETTER_O_WITH_ACUTE */
-  GDK_Multi_key,       GDK_apostrophe, GDK_u,  0,      0,      0x00FA, /* LATIN_SMALL_LETTER_U_WITH_ACUTE */
-  GDK_Multi_key,       GDK_apostrophe, GDK_y,  0,      0,      0x00FD, /* LATIN_SMALL_LETTER_Y_WITH_ACUTE */
+  GDK_Multi_key,       GDK_apostrophe, GDK_less,       0,      0,      0x2018, /* LEFT SINGLE QUOTATION MARK */
+  GDK_Multi_key,       GDK_apostrophe, GDK_greater,    0,      0,      0x2019, /* RIGHT SINGLE QUOTATION MARK */
+  GDK_Multi_key,       GDK_apostrophe, GDK_A,  0,      0,      0x00C1, /* LATIN_CAPITAL_LETTER_A_WITH_ACUTE */
+  GDK_Multi_key,       GDK_apostrophe, GDK_C,  0,      0,      0x0106, /* LATIN_CAPITAL_LETTER_C_WITH_ACUTE */
+  GDK_Multi_key,       GDK_apostrophe, GDK_E,  0,      0,      0x00C9, /* LATIN_CAPITAL_LETTER_E_WITH_ACUTE */
+  GDK_Multi_key,       GDK_apostrophe, GDK_I,  0,      0,      0x00CD, /* LATIN_CAPITAL_LETTER_I_WITH_ACUTE */
+  GDK_Multi_key,       GDK_apostrophe, GDK_L,  0,      0,      0x0139, /* LATIN_CAPITAL_LETTER_L_WITH_ACUTE */
+  GDK_Multi_key,       GDK_apostrophe, GDK_N,  0,      0,      0x0143, /* LATIN_CAPITAL_LETTER_N_WITH_ACUTE */
+  GDK_Multi_key,       GDK_apostrophe, GDK_O,  0,      0,      0x00D3, /* LATIN_CAPITAL_LETTER_O_WITH_ACUTE */
+  GDK_Multi_key,       GDK_apostrophe, GDK_R,  0,      0,      0x0154, /* LATIN_CAPITAL_LETTER_R_WITH_ACUTE */
+  GDK_Multi_key,       GDK_apostrophe, GDK_S,  0,      0,      0x015A, /* LATIN_CAPITAL_LETTER_S_WITH_ACUTE */
+  GDK_Multi_key,       GDK_apostrophe, GDK_U,  0,      0,      0x00DA, /* LATIN_CAPITAL_LETTER_U_WITH_ACUTE */
+  GDK_Multi_key,       GDK_apostrophe, GDK_Y,  0,      0,      0x00DD, /* LATIN_CAPITAL_LETTER_Y_WITH_ACUTE */
+  GDK_Multi_key,       GDK_apostrophe, GDK_Z,  0,      0,      0x0179, /* LATIN_CAPITAL_LETTER_Z_WITH_ACUTE */
+  GDK_Multi_key,       GDK_apostrophe, GDK_a,  0,      0,      0x00E1, /* LATIN_SMALL_LETTER_A_WITH_ACUTE */
+  GDK_Multi_key,       GDK_apostrophe, GDK_c,  0,      0,      0x0107, /* LATIN_SMALL_LETTER_C_WITH_ACUTE */
+  GDK_Multi_key,       GDK_apostrophe, GDK_e,  0,      0,      0x00E9, /* LATIN_SMALL_LETTER_E_WITH_ACUTE */
+  GDK_Multi_key,       GDK_apostrophe, GDK_i,  0,      0,      0x00ED, /* LATIN_SMALL_LETTER_I_WITH_ACUTE */
+  GDK_Multi_key,       GDK_apostrophe, GDK_l,  0,      0,      0x013A, /* LATIN_SMALL_LETTER_L_WITH_ACUTE */
+  GDK_Multi_key,       GDK_apostrophe, GDK_n,  0,      0,      0x0144, /* LATIN_SMALL_LETTER_N_WITH_ACUTE */
+  GDK_Multi_key,       GDK_apostrophe, GDK_o,  0,      0,      0x00F3, /* LATIN_SMALL_LETTER_O_WITH_ACUTE */
+  GDK_Multi_key,       GDK_apostrophe, GDK_r,  0,      0,      0x0155, /* LATIN_SMALL_LETTER_R_WITH_ACUTE */
+  GDK_Multi_key,       GDK_apostrophe, GDK_s,  0,      0,      0x015B, /* LATIN_SMALL_LETTER_S_WITH_ACUTE */
+  GDK_Multi_key,       GDK_apostrophe, GDK_u,  0,      0,      0x00FA, /* LATIN_SMALL_LETTER_U_WITH_ACUTE */
+  GDK_Multi_key,       GDK_apostrophe, GDK_y,  0,      0,      0x00FD, /* LATIN_SMALL_LETTER_Y_WITH_ACUTE */
+  GDK_Multi_key,       GDK_apostrophe, GDK_z,  0,      0,      0x017A, /* LATIN_SMALL_LETTER_Z_WITH_ACUTE */
+  GDK_Multi_key,       GDK_apostrophe, GDK_Greek_ALPHA,        0,      0,      0x0386, /* GREEK CAPITAL LETTER ALPHA WITH TONOS */
+  GDK_Multi_key,       GDK_apostrophe, GDK_Greek_EPSILON,      0,      0,      0x0388, /* GREEK CAPITAL LETTER EPSILON WITH TONOS */
+  GDK_Multi_key,       GDK_apostrophe, GDK_Greek_ETA,  0,      0,      0x0389, /* GREEK CAPITAL LETTER ETA WITH TONOS */
+  GDK_Multi_key,       GDK_apostrophe, GDK_Greek_IOTA, 0,      0,      0x038A, /* GREEK CAPITAL LETTER IOTA WITH TONOS */
+  GDK_Multi_key,       GDK_apostrophe, GDK_Greek_OMICRON,      0,      0,      0x038C, /* GREEK CAPITAL LETTER OMICRON WITH TONOS */
+  GDK_Multi_key,       GDK_apostrophe, GDK_Greek_UPSILON,      0,      0,      0x038E, /* GREEK CAPITAL LETTER UPSILON WITH TONOS */
+  GDK_Multi_key,       GDK_apostrophe, GDK_Greek_OMEGA,        0,      0,      0x038F, /* GREEK CAPITAL LETTER OMEGA WITH TONOS */
+  GDK_Multi_key,       GDK_apostrophe, GDK_Greek_alpha,        0,      0,      0x03AC, /* GREEK SMALL LETTER ALPHA WITH TONOS */
+  GDK_Multi_key,       GDK_apostrophe, GDK_Greek_epsilon,      0,      0,      0x03AD, /* GREEK SMALL LETTER EPSILON WITH TONOS */
+  GDK_Multi_key,       GDK_apostrophe, GDK_Greek_eta,  0,      0,      0x03AE, /* GREEK SMALL LETTER ETA WITH TONOS */
+  GDK_Multi_key,       GDK_apostrophe, GDK_Greek_iota, 0,      0,      0x03AF, /* GREEK SMALL LETTER IOTA WITH TONOS */
+  GDK_Multi_key,       GDK_apostrophe, GDK_Greek_omicron,      0,      0,      0x03CC, /* GREEK SMALL LETTER OMICRON WITH TONOS */
+  GDK_Multi_key,       GDK_apostrophe, GDK_Greek_upsilon,      0,      0,      0x03CD, /* GREEK SMALL LETTER UPSILON WITH TONOS */
+  GDK_Multi_key,       GDK_apostrophe, GDK_Greek_omega,        0,      0,      0x03CE, /* GREEK SMALL LETTER OMEGA WITH TONOS */
+  GDK_Multi_key,       GDK_parenleft,  GDK_space,      0,      0,      0x02D8, /* BREVE */
   GDK_Multi_key,       GDK_parenleft,  GDK_parenleft,  0,      0,      0x005B, /* LEFT_SQUARE_BRACKET */
   GDK_Multi_key,       GDK_parenleft,  GDK_minus,      0,      0,      0x007B, /* LEFT_CURLY_BRACKET */
+  GDK_Multi_key,       GDK_parenleft,  GDK_A,  0,      0,      0x0102, /* LATIN_CAPITAL_LETTER_A_WITH_BREVE */
   GDK_Multi_key,       GDK_parenleft,  GDK_G,  0,      0,      0x011E, /* LATIN_CAPITAL_LETTER_G_WITH_BREVE */
+  GDK_Multi_key,       GDK_parenleft,  GDK_a,  0,      0,      0x0103, /* LATIN_SMALL_LETTER_A_WITH_BREVE */
   GDK_Multi_key,       GDK_parenleft,  GDK_c,  0,      0,      0x00A9, /* COPYRIGHT_SIGN */
   GDK_Multi_key,       GDK_parenleft,  GDK_g,  0,      0,      0x011F, /* LATIN_SMALL_LETTER_G_WITH_BREVE */
   GDK_Multi_key,       GDK_parenleft,  GDK_r,  0,      0,      0x00AE, /* REGISTERED_SIGN */
@@ -240,7 +360,9 @@ static guint16 gtk_compose_seqs[] = {
   GDK_Multi_key,       GDK_parenright, GDK_minus,      0,      0,      0x007D, /* RIGHT_CURLY_BRACKET */
   GDK_Multi_key,       GDK_asterisk,   GDK_0,  0,      0,      0x00B0, /* DEGREE_SIGN */
   GDK_Multi_key,       GDK_asterisk,   GDK_A,  0,      0,      0x00C5, /* LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE */
+  GDK_Multi_key,       GDK_asterisk,   GDK_U,  0,      0,      0x016E, /* LATIN_CAPITAL_LETTER_U_WITH_RING_ABOVE */
   GDK_Multi_key,       GDK_asterisk,   GDK_a,  0,      0,      0x00E5, /* LATIN_SMALL_LETTER_A_WITH_RING_ABOVE */
+  GDK_Multi_key,       GDK_asterisk,   GDK_u,  0,      0,      0x016F, /* LATIN_SMALL_LETTER_U_WITH_RING_ABOVE */
   GDK_Multi_key,       GDK_plus,       GDK_plus,       0,      0,      0x0023, /* NUMBER_SIGN */
   GDK_Multi_key,       GDK_plus,       GDK_minus,      0,      0,      0x00B1, /* PLUSxMINUS_SIGN */
   GDK_Multi_key,       GDK_comma,      GDK_comma,      0,      0,      0x00B8, /* CEDILLA */
@@ -272,7 +394,9 @@ static guint16 gtk_compose_seqs[] = {
   GDK_Multi_key,       GDK_minus,      GDK_parenright, 0,      0,      0x007D, /* RIGHT_CURLY_BRACKET */
   GDK_Multi_key,       GDK_minus,      GDK_plus,       0,      0,      0x00B1, /* PLUSxMINUS_SIGN */
   GDK_Multi_key,       GDK_minus,      GDK_comma,      0,      0,      0x00AC, /* NOT_SIGN */
-  GDK_Multi_key,       GDK_minus,      GDK_minus,      0,      0,      0x00AD, /* SOFT_HYPHEN */
+  GDK_Multi_key,       GDK_minus,      GDK_minus,      GDK_space,      0,      0x00AD, /* SOFT_HYPHEN */
+  GDK_Multi_key,       GDK_minus,      GDK_minus,      GDK_minus,      0,      0x2014, /* EM DASH */
+  GDK_Multi_key,       GDK_minus,      GDK_minus,      GDK_period,     0,      0x2013, /* EN DASH */
   GDK_Multi_key,       GDK_minus,      GDK_colon,      0,      0,      0x00F7, /* DIVISION_SIGN */
   GDK_Multi_key,       GDK_minus,      GDK_A,  0,      0,      0x00C3, /* LATIN_CAPITAL_LETTER_A_WITH_TILDE */
   GDK_Multi_key,       GDK_minus,      GDK_D,  0,      0,      0x0110, /* LATIN_CAPITAL_LETTER_D_WITH_STROKE */
@@ -281,7 +405,7 @@ static guint16 gtk_compose_seqs[] = {
   GDK_Multi_key,       GDK_minus,      GDK_L,  0,      0,      0x00A3, /* POUND_SIGN */
   GDK_Multi_key,       GDK_minus,      GDK_N,  0,      0,      0x00D1, /* LATIN_CAPITAL_LETTER_N_WITH_TILDE */
   GDK_Multi_key,       GDK_minus,      GDK_O,  0,      0,      0x00D5, /* LATIN_CAPITAL_LETTER_O_WITH_TILDE */
-  GDK_Multi_key,       GDK_minus,      GDK_U,  0,      0,      0x00D9, /* LATIN_CAPITAL_LETTER_U_WITH_GRAVE */
+  GDK_Multi_key,       GDK_minus,      GDK_U,  0,      0,      0x016A, /* LATIN_CAPITAL_LETTER_U_WITH_MACRON */
   GDK_Multi_key,       GDK_minus,      GDK_Y,  0,      0,      0x00A5, /* YEN_SIGN */
   GDK_Multi_key,       GDK_minus,      GDK_asciicircum,        0,      0,      0x00AF, /* MACRON */
   GDK_Multi_key,       GDK_minus,      GDK_a,  0,      0,      0x00E3, /* LATIN_SMALL_LETTER_A_WITH_TILDE */
@@ -305,6 +429,7 @@ static guint16 gtk_compose_seqs[] = {
   GDK_Multi_key,       GDK_period,     GDK_P,  0,      0,      0x1E56, /* LATIN_CAPITAL_LETTER_P_WITH_DOT_ABOVE */
   GDK_Multi_key,       GDK_period,     GDK_S,  0,      0,      0x1E60, /* LATIN_CAPITAL_LETTER_S_WITH_DOT_ABOVE */
   GDK_Multi_key,       GDK_period,     GDK_T,  0,      0,      0x1E6A, /* LATIN_CAPITAL_LETTER_T_WITH_DOT_ABOVE */
+  GDK_Multi_key,       GDK_period,     GDK_Z,  0,      0,      0x017B, /* LATIN_CAPITAL_LETTER_Z_WITH_DOT_ABOVE */
   GDK_Multi_key,       GDK_period,     GDK_asciicircum,        0,      0,      0x00B7, /* MIDDLE_DOT */
   GDK_Multi_key,       GDK_period,     GDK_b,  0,      0,      0x1E03, /* LATIN_SMALL_LETTER_B_WITH_DOT_ABOVE */
   GDK_Multi_key,       GDK_period,     GDK_c,  0,      0,      0x010B, /* LATIN_SMALL_LETTER_C_WITH_DOT_ABOVE */
@@ -317,14 +442,17 @@ static guint16 gtk_compose_seqs[] = {
   GDK_Multi_key,       GDK_period,     GDK_p,  0,      0,      0x1E57, /* LATIN_SMALL_LETTER_P_WITH_DOT_ABOVE */
   GDK_Multi_key,       GDK_period,     GDK_s,  0,      0,      0x1E61, /* LATIN_SMALL_LETTER_S_WITH_DOT_ABOVE */
   GDK_Multi_key,       GDK_period,     GDK_t,  0,      0,      0x1E6B, /* LATIN_SMALL_LETTER_T_WITH_DOT_ABOVE */
+  GDK_Multi_key,       GDK_period,     GDK_z,  0,      0,      0x017C, /* LATIN_SMALL_LETTER_Z_WITH_DOT_ABOVE */
   GDK_Multi_key,       GDK_slash,      GDK_slash,      0,      0,      0x005C, /* REVERSE_SOLIDUS */
   GDK_Multi_key,       GDK_slash,      GDK_less,       0,      0,      0x005C, /* REVERSE_SOLIDUS */
   GDK_Multi_key,       GDK_slash,      GDK_C,  0,      0,      0x00A2, /* CENT_SIGN */
+  GDK_Multi_key,       GDK_slash,      GDK_L,  0,      0,      0x0141, /* LATIN_CAPITAL_LETTER_L_WITH_STROKE */
   GDK_Multi_key,       GDK_slash,      GDK_O,  0,      0,      0x00D8, /* LATIN_CAPITAL_LETTER_O_WITH_STROKE */
   GDK_Multi_key,       GDK_slash,      GDK_T,  0,      0,      0x0166, /* LATIN_CAPITAL_LETTER_T_WITH_STROKE */
   GDK_Multi_key,       GDK_slash,      GDK_U,  0,      0,      0x00B5, /* MICRO_SIGN */
   GDK_Multi_key,       GDK_slash,      GDK_asciicircum,        0,      0,      0x007C, /* VERTICAL_LINE */
   GDK_Multi_key,       GDK_slash,      GDK_c,  0,      0,      0x00A2, /* CENT_SIGN */
+  GDK_Multi_key,       GDK_slash,      GDK_l,  0,      0,      0x0142, /* LATIN_SMALL_LETTER_L_WITH_STROKE */
   GDK_Multi_key,       GDK_slash,      GDK_o,  0,      0,      0x00F8, /* LATIN_SMALL_LETTER_O_WITH_STROKE */
   GDK_Multi_key,       GDK_slash,      GDK_t,  0,      0,      0x0167, /* LATIN_SMALL_LETTER_T_WITH_STROKE */
   GDK_Multi_key,       GDK_slash,      GDK_u,  0,      0,      0x00B5, /* MICRO_SIGN */
@@ -346,13 +474,27 @@ static guint16 gtk_compose_seqs[] = {
   GDK_Multi_key,       GDK_3,  GDK_asciicircum,        0,      0,      0x00B3, /* SUPERSCRIPT_THREE */
   GDK_Multi_key,       GDK_3,  GDK_s,  0,      0,      0x00B3, /* SUPERSCRIPT_THREE */
   GDK_Multi_key,       GDK_colon,      GDK_minus,      0,      0,      0x00F7, /* DIVISION_SIGN */
+  GDK_Multi_key,       GDK_less,       GDK_space,      0,      0,      0x02C7, /* CARON */
+  GDK_Multi_key,       GDK_less,       GDK_apostrophe, 0,      0,      0x2018, /* LEFT SINGLE QUOTATION MARK */
   GDK_Multi_key,       GDK_less,       GDK_slash,      0,      0,      0x005C, /* REVERSE_SOLIDUS */
   GDK_Multi_key,       GDK_less,       GDK_less,       0,      0,      0x00AB, /* LEFTxPOINTING_DOUBLE_ANGLE_QUOTATION_MARK */
   GDK_Multi_key,       GDK_less,       GDK_C,  0,      0,      0x010C, /* LATIN_CAPITAL_LETTER_C_WITH_CARON */
+  GDK_Multi_key,       GDK_less,       GDK_D,  0,      0,      0x010E, /* LATIN_CAPITAL_LETTER_D_WITH_CARON */
+  GDK_Multi_key,       GDK_less,       GDK_E,  0,      0,      0x011A, /* LATIN_CAPITAL_LETTER_E_WITH_CARON */
+  GDK_Multi_key,       GDK_less,       GDK_L,  0,      0,      0x013D, /* LATIN_CAPITAL_LETTER_L_WITH_CARON */
+  GDK_Multi_key,       GDK_less,       GDK_N,  0,      0,      0x0147, /* LATIN_CAPITAL_LETTER_N_WITH_CARON */
+  GDK_Multi_key,       GDK_less,       GDK_R,  0,      0,      0x0158, /* LATIN_CAPITAL_LETTER_R_WITH_CARON */
   GDK_Multi_key,       GDK_less,       GDK_S,  0,      0,      0x0160, /* LATIN_CAPITAL_LETTER_S_WITH_CARON */
+  GDK_Multi_key,       GDK_less,       GDK_T,  0,      0,      0x0164, /* LATIN_CAPITAL_LETTER_T_WITH_CARON */
   GDK_Multi_key,       GDK_less,       GDK_Z,  0,      0,      0x017D, /* LATIN_CAPITAL_LETTER_Z_WITH_CARON */
   GDK_Multi_key,       GDK_less,       GDK_c,  0,      0,      0x010D, /* LATIN_SMALL_LETTER_C_WITH_CARON */
+  GDK_Multi_key,       GDK_less,       GDK_d,  0,      0,      0x010F, /* LATIN_SMALL_LETTER_D_WITH_CARON */
+  GDK_Multi_key,       GDK_less,       GDK_e,  0,      0,      0x011B, /* LATIN_SMALL_LETTER_E_WITH_CARON */
+  GDK_Multi_key,       GDK_less,       GDK_l,  0,      0,      0x013E, /* LATIN_SMALL_LETTER_L_WITH_CARON */
+  GDK_Multi_key,       GDK_less,       GDK_n,  0,      0,      0x0148, /* LATIN_SMALL_LETTER_N_WITH_CARON */
+  GDK_Multi_key,       GDK_less,       GDK_r,  0,      0,      0x0159, /* LATIN_SMALL_LETTER_R_WITH_CARON */
   GDK_Multi_key,       GDK_less,       GDK_s,  0,      0,      0x0161, /* LATIN_SMALL_LETTER_S_WITH_CARON */
+  GDK_Multi_key,       GDK_less,       GDK_t,  0,      0,      0x0165, /* LATIN_SMALL_LETTER_T_WITH_CARON */
   GDK_Multi_key,       GDK_less,       GDK_z,  0,      0,      0x017E, /* LATIN_SMALL_LETTER_Z_WITH_CARON */
   GDK_Multi_key,       GDK_equal,      GDK_C,  0,      0,      0x20AC, /* EURO_SIGN */
   GDK_Multi_key,       GDK_equal,      GDK_L,  0,      0,      0x00A3, /* POUND_SIGN */
@@ -361,6 +503,7 @@ static guint16 gtk_compose_seqs[] = {
   GDK_Multi_key,       GDK_equal,      GDK_l,  0,      0,      0x00A3, /* POUND_SIGN */
   GDK_Multi_key,       GDK_equal,      GDK_y,  0,      0,      0x00A5, /* YEN_SIGN */
   GDK_Multi_key,       GDK_greater,    GDK_space,      0,      0,      0x005E, /* CIRCUMFLEX_ACCENT */
+  GDK_Multi_key,       GDK_greater,    GDK_apostrophe, 0,      0,      0x2019, /* RIGHT SINGLE QUOTATION MARK */
   GDK_Multi_key,       GDK_greater,    GDK_greater,    0,      0,      0x00BB, /* RIGHTxPOINTING_DOUBLE_ANGLE_QUOTATION_MARK */
   GDK_Multi_key,       GDK_greater,    GDK_A,  0,      0,      0x00C2, /* LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX */
   GDK_Multi_key,       GDK_greater,    GDK_E,  0,      0,      0x00CA, /* LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX */
@@ -375,6 +518,7 @@ static guint16 gtk_compose_seqs[] = {
   GDK_Multi_key,       GDK_question,   GDK_question,   0,      0,      0x00BF, /* INVERTED_QUESTION_MARK */
   GDK_Multi_key,       GDK_A,  GDK_quotedbl,   0,      0,      0x00C4, /* LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS */
   GDK_Multi_key,       GDK_A,  GDK_apostrophe, 0,      0,      0x00C1, /* LATIN_CAPITAL_LETTER_A_WITH_ACUTE */
+  GDK_Multi_key,       GDK_A,  GDK_parenleft,  0,      0,      0x0102, /* LATIN_CAPITAL_LETTER_A_WITH_BREVE */
   GDK_Multi_key,       GDK_A,  GDK_asterisk,   0,      0,      0x00C5, /* LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE */
   GDK_Multi_key,       GDK_A,  GDK_comma,      0,      0,      0x0104, /* LATIN_CAPITAL_LETTER_A_WITH_OGONEK */
   GDK_Multi_key,       GDK_A,  GDK_minus,      0,      0,      0x00C3, /* LATIN_CAPITAL_LETTER_A_WITH_TILDE */
@@ -388,6 +532,7 @@ static guint16 gtk_compose_seqs[] = {
   GDK_Multi_key,       GDK_A,  GDK_diaeresis,  0,      0,      0x00C4, /* LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS */
   GDK_Multi_key,       GDK_A,  GDK_acute,      0,      0,      0x00C1, /* LATIN_CAPITAL_LETTER_A_WITH_ACUTE */
   GDK_Multi_key,       GDK_B,  GDK_period,     0,      0,      0x1E02, /* LATIN_CAPITAL_LETTER_B_WITH_DOT_ABOVE */
+  GDK_Multi_key,       GDK_C,  GDK_apostrophe, 0,      0,      0x0106, /* LATIN_CAPITAL_LETTER_C_WITH_ACUTE */
   GDK_Multi_key,       GDK_C,  GDK_comma,      0,      0,      0x00C7, /* LATIN_CAPITAL_LETTER_C_WITH_CEDILLA */
   GDK_Multi_key,       GDK_C,  GDK_period,     0,      0,      0x010A, /* LATIN_CAPITAL_LETTER_C_WITH_DOT_ABOVE */
   GDK_Multi_key,       GDK_C,  GDK_slash,      0,      0,      0x00A2, /* CENT_SIGN */
@@ -399,11 +544,13 @@ static guint16 gtk_compose_seqs[] = {
   GDK_Multi_key,       GDK_C,  GDK_bar,        0,      0,      0x00A2, /* CENT_SIGN */
   GDK_Multi_key,       GDK_D,  GDK_minus,      0,      0,      0x0110, /* LATIN_CAPITAL_LETTER_D_WITH_STROKE */
   GDK_Multi_key,       GDK_D,  GDK_period,     0,      0,      0x1E0A, /* LATIN_CAPITAL_LETTER_D_WITH_DOT_ABOVE */
+  GDK_Multi_key,       GDK_D,  GDK_less,       0,      0,      0x010E, /* LATIN_CAPITAL_LETTER_D_WITH_CARON */
   GDK_Multi_key,       GDK_E,  GDK_quotedbl,   0,      0,      0x00CB, /* LATIN_CAPITAL_LETTER_E_WITH_DIAERESIS */
   GDK_Multi_key,       GDK_E,  GDK_apostrophe, 0,      0,      0x00C9, /* LATIN_CAPITAL_LETTER_E_WITH_ACUTE */
   GDK_Multi_key,       GDK_E,  GDK_comma,      0,      0,      0x0118, /* LATIN_CAPITAL_LETTER_E_WITH_OGONEK */
   GDK_Multi_key,       GDK_E,  GDK_minus,      0,      0,      0x0112, /* LATIN_CAPITAL_LETTER_E_WITH_MACRON */
   GDK_Multi_key,       GDK_E,  GDK_period,     0,      0,      0x0116, /* LATIN_CAPITAL_LETTER_E_WITH_DOT_ABOVE */
+  GDK_Multi_key,       GDK_E,  GDK_less,       0,      0,      0x011A, /* LATIN_CAPITAL_LETTER_E_WITH_CARON */
   GDK_Multi_key,       GDK_E,  GDK_greater,    0,      0,      0x00CA, /* LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX */
   GDK_Multi_key,       GDK_E,  GDK_asciicircum,        0,      0,      0x00CA, /* LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX */
   GDK_Multi_key,       GDK_E,  GDK_underscore, 0,      0,      0x0112, /* LATIN_CAPITAL_LETTER_E_WITH_MACRON */
@@ -429,13 +576,18 @@ static guint16 gtk_compose_seqs[] = {
   GDK_Multi_key,       GDK_I,  GDK_diaeresis,  0,      0,      0x00CF, /* LATIN_CAPITAL_LETTER_I_WITH_DIAERESIS */
   GDK_Multi_key,       GDK_I,  GDK_acute,      0,      0,      0x00CD, /* LATIN_CAPITAL_LETTER_I_WITH_ACUTE */
   GDK_Multi_key,       GDK_K,  GDK_comma,      0,      0,      0x0136, /* LATIN_CAPITAL_LETTER_K_WITH_CEDILLA */
+  GDK_Multi_key,       GDK_L,  GDK_apostrophe, 0,      0,      0x0139, /* LATIN_CAPITAL_LETTER_L_WITH_ACUTE */
   GDK_Multi_key,       GDK_L,  GDK_comma,      0,      0,      0x013B, /* LATIN_CAPITAL_LETTER_L_WITH_CEDILLA */
   GDK_Multi_key,       GDK_L,  GDK_minus,      0,      0,      0x00A3, /* POUND_SIGN */
+  GDK_Multi_key,       GDK_L,  GDK_slash,      0,      0,      0x0141, /* LATIN_CAPITAL_LETTER_L_WITH_STROKE */
+  GDK_Multi_key,       GDK_L,  GDK_less,       0,      0,      0x013D, /* LATIN_CAPITAL_LETTER_L_WITH_CARON */
   GDK_Multi_key,       GDK_L,  GDK_equal,      0,      0,      0x00A3, /* POUND_SIGN */
   GDK_Multi_key,       GDK_L,  GDK_V,  0,      0,      0x007C, /* VERTICAL_LINE */
   GDK_Multi_key,       GDK_M,  GDK_period,     0,      0,      0x1E40, /* LATIN_CAPITAL_LETTER_M_WITH_DOT_ABOVE */
+  GDK_Multi_key,       GDK_N,  GDK_apostrophe, 0,      0,      0x0143, /* LATIN_CAPITAL_LETTER_N_WITH_ACUTE */
   GDK_Multi_key,       GDK_N,  GDK_comma,      0,      0,      0x0145, /* LATIN_CAPITAL_LETTER_N_WITH_CEDILLA */
   GDK_Multi_key,       GDK_N,  GDK_minus,      0,      0,      0x00D1, /* LATIN_CAPITAL_LETTER_N_WITH_TILDE */
+  GDK_Multi_key,       GDK_N,  GDK_less,       0,      0,      0x0147, /* LATIN_CAPITAL_LETTER_N_WITH_CARON */
   GDK_Multi_key,       GDK_N,  GDK_G,  0,      0,      0x014A, /* LATIN_CAPITAL_LETTER_ENG */
   GDK_Multi_key,       GDK_N,  GDK_asciitilde, 0,      0,      0x00D1, /* LATIN_CAPITAL_LETTER_N_WITH_TILDE */
   GDK_Multi_key,       GDK_O,  GDK_quotedbl,   0,      0,      0x00D6, /* LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS */
@@ -458,9 +610,12 @@ static guint16 gtk_compose_seqs[] = {
   GDK_Multi_key,       GDK_O,  GDK_acute,      0,      0,      0x00D3, /* LATIN_CAPITAL_LETTER_O_WITH_ACUTE */
   GDK_Multi_key,       GDK_P,  GDK_exclam,     0,      0,      0x00B6, /* PILCROW_SIGN */
   GDK_Multi_key,       GDK_P,  GDK_period,     0,      0,      0x1E56, /* LATIN_CAPITAL_LETTER_P_WITH_DOT_ABOVE */
+  GDK_Multi_key,       GDK_R,  GDK_apostrophe, 0,      0,      0x0154, /* LATIN_CAPITAL_LETTER_R_WITH_ACUTE */
   GDK_Multi_key,       GDK_R,  GDK_comma,      0,      0,      0x0156, /* LATIN_CAPITAL_LETTER_R_WITH_CEDILLA */
+  GDK_Multi_key,       GDK_R,  GDK_less,       0,      0,      0x0158, /* LATIN_CAPITAL_LETTER_R_WITH_CARON */
   GDK_Multi_key,       GDK_R,  GDK_O,  0,      0,      0x00AE, /* REGISTERED_SIGN */
   GDK_Multi_key,       GDK_S,  GDK_exclam,     0,      0,      0x00A7, /* SECTION_SIGN */
+  GDK_Multi_key,       GDK_S,  GDK_apostrophe, 0,      0,      0x015A, /* LATIN_CAPITAL_LETTER_S_WITH_ACUTE */
   GDK_Multi_key,       GDK_S,  GDK_comma,      0,      0,      0x015E, /* LATIN_CAPITAL_LETTER_S_WITH_CEDILLA */
   GDK_Multi_key,       GDK_S,  GDK_period,     0,      0,      0x1E60, /* LATIN_CAPITAL_LETTER_S_WITH_DOT_ABOVE */
   GDK_Multi_key,       GDK_S,  GDK_0,  0,      0,      0x00A7, /* SECTION_SIGN */
@@ -473,15 +628,17 @@ static guint16 gtk_compose_seqs[] = {
   GDK_Multi_key,       GDK_T,  GDK_minus,      0,      0,      0x0166, /* LATIN_CAPITAL_LETTER_T_WITH_STROKE */
   GDK_Multi_key,       GDK_T,  GDK_period,     0,      0,      0x1E6A, /* LATIN_CAPITAL_LETTER_T_WITH_DOT_ABOVE */
   GDK_Multi_key,       GDK_T,  GDK_slash,      0,      0,      0x0166, /* LATIN_CAPITAL_LETTER_T_WITH_STROKE */
+  GDK_Multi_key,       GDK_T,  GDK_less,       0,      0,      0x0164, /* LATIN_CAPITAL_LETTER_T_WITH_CARON */
   GDK_Multi_key,       GDK_T,  GDK_H,  0,      0,      0x00DE, /* LATIN_CAPITAL_LETTER_THORN */
   GDK_Multi_key,       GDK_U,  GDK_quotedbl,   0,      0,      0x00DC, /* LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS */
   GDK_Multi_key,       GDK_U,  GDK_apostrophe, 0,      0,      0x00DA, /* LATIN_CAPITAL_LETTER_U_WITH_ACUTE */
+  GDK_Multi_key,       GDK_U,  GDK_asterisk,   0,      0,      0x016E, /* LATIN_CAPITAL_LETTER_U_WITH_RING_ABOVE */
   GDK_Multi_key,       GDK_U,  GDK_comma,      0,      0,      0x0172, /* LATIN_CAPITAL_LETTER_U_WITH_OGONEK */
-  GDK_Multi_key,       GDK_U,  GDK_minus,      0,      0,      0x00D9, /* LATIN_CAPITAL_LETTER_U_WITH_GRAVE */
+  GDK_Multi_key,       GDK_U,  GDK_minus,      0,      0,      0x016A, /* LATIN_CAPITAL_LETTER_U_WITH_MACRON */
   GDK_Multi_key,       GDK_U,  GDK_slash,      0,      0,      0x00B5, /* MICRO_SIGN */
   GDK_Multi_key,       GDK_U,  GDK_greater,    0,      0,      0x00DB, /* LATIN_CAPITAL_LETTER_U_WITH_CIRCUMFLEX */
   GDK_Multi_key,       GDK_U,  GDK_asciicircum,        0,      0,      0x00DB, /* LATIN_CAPITAL_LETTER_U_WITH_CIRCUMFLEX */
-  GDK_Multi_key,       GDK_U,  GDK_underscore, 0,      0,      0x00D9, /* LATIN_CAPITAL_LETTER_U_WITH_GRAVE */
+  GDK_Multi_key,       GDK_U,  GDK_underscore, 0,      0,      0x016A, /* LATIN_CAPITAL_LETTER_U_WITH_MACRON */
   GDK_Multi_key,       GDK_U,  GDK_grave,      0,      0,      0x00D9, /* LATIN_CAPITAL_LETTER_U_WITH_GRAVE */
   GDK_Multi_key,       GDK_U,  GDK_asciitilde, 0,      0,      0x0168, /* LATIN_CAPITAL_LETTER_U_WITH_TILDE */
   GDK_Multi_key,       GDK_U,  GDK_diaeresis,  0,      0,      0x00DC, /* LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS */
@@ -498,6 +655,8 @@ static guint16 gtk_compose_seqs[] = {
   GDK_Multi_key,       GDK_Y,  GDK_asciicircum,        0,      0,      0x0176, /* LATIN_CAPITAL_LETTER_Y_WITH_CIRCUMFLEX */
   GDK_Multi_key,       GDK_Y,  GDK_diaeresis,  0,      0,      0x0178, /* LATIN_CAPITAL_LETTER_Y_WITH_DIAERESIS */
   GDK_Multi_key,       GDK_Y,  GDK_acute,      0,      0,      0x00DD, /* LATIN_CAPITAL_LETTER_Y_WITH_ACUTE */
+  GDK_Multi_key,       GDK_Z,  GDK_apostrophe, 0,      0,      0x0179, /* LATIN_CAPITAL_LETTER_Z_WITH_ACUTE */
+  GDK_Multi_key,       GDK_Z,  GDK_period,     0,      0,      0x017B, /* LATIN_CAPITAL_LETTER_Z_WITH_DOT_ABOVE */
   GDK_Multi_key,       GDK_Z,  GDK_less,       0,      0,      0x017D, /* LATIN_CAPITAL_LETTER_Z_WITH_CARON */
   GDK_Multi_key,       GDK_asciicircum,        GDK_space,      0,      0,      0x005E, /* CIRCUMFLEX_ACCENT */
   GDK_Multi_key,       GDK_asciicircum,        GDK_minus,      0,      0,      0x00AF, /* MACRON */
@@ -526,7 +685,7 @@ static guint16 gtk_compose_seqs[] = {
   GDK_Multi_key,       GDK_underscore, GDK_E,  0,      0,      0x0112, /* LATIN_CAPITAL_LETTER_E_WITH_MACRON */
   GDK_Multi_key,       GDK_underscore, GDK_I,  0,      0,      0x012A, /* LATIN_CAPITAL_LETTER_I_WITH_MACRON */
   GDK_Multi_key,       GDK_underscore, GDK_O,  0,      0,      0x00BA, /* MASCULINE_ORDINAL_INDICATOR */
-  GDK_Multi_key,       GDK_underscore, GDK_U,  0,      0,      0x00D9, /* LATIN_CAPITAL_LETTER_U_WITH_GRAVE */
+  GDK_Multi_key,       GDK_underscore, GDK_U,  0,      0,      0x016A, /* LATIN_CAPITAL_LETTER_U_WITH_MACRON */
   GDK_Multi_key,       GDK_underscore, GDK_asciicircum,        0,      0,      0x00AF, /* MACRON */
   GDK_Multi_key,       GDK_underscore, GDK_underscore, 0,      0,      0x00AF, /* MACRON */
   GDK_Multi_key,       GDK_underscore, GDK_a,  0,      0,      0x00AA, /* FEMININE_ORDINAL_INDICATOR */
@@ -547,6 +706,7 @@ static guint16 gtk_compose_seqs[] = {
   GDK_Multi_key,       GDK_grave,      GDK_u,  0,      0,      0x00F9, /* LATIN_SMALL_LETTER_U_WITH_GRAVE */
   GDK_Multi_key,       GDK_a,  GDK_quotedbl,   0,      0,      0x00E4, /* LATIN_SMALL_LETTER_A_WITH_DIAERESIS */
   GDK_Multi_key,       GDK_a,  GDK_apostrophe, 0,      0,      0x00E1, /* LATIN_SMALL_LETTER_A_WITH_ACUTE */
+  GDK_Multi_key,       GDK_a,  GDK_parenleft,  0,      0,      0x0103, /* LATIN_SMALL_LETTER_A_WITH_BREVE */
   GDK_Multi_key,       GDK_a,  GDK_asterisk,   0,      0,      0x00E5, /* LATIN_SMALL_LETTER_A_WITH_RING_ABOVE */
   GDK_Multi_key,       GDK_a,  GDK_comma,      0,      0,      0x0105, /* LATIN_SMALL_LETTER_A_WITH_OGONEK */
   GDK_Multi_key,       GDK_a,  GDK_minus,      0,      0,      0x00E3, /* LATIN_SMALL_LETTER_A_WITH_TILDE */
@@ -560,6 +720,7 @@ static guint16 gtk_compose_seqs[] = {
   GDK_Multi_key,       GDK_a,  GDK_diaeresis,  0,      0,      0x00E4, /* LATIN_SMALL_LETTER_A_WITH_DIAERESIS */
   GDK_Multi_key,       GDK_a,  GDK_acute,      0,      0,      0x00E1, /* LATIN_SMALL_LETTER_A_WITH_ACUTE */
   GDK_Multi_key,       GDK_b,  GDK_period,     0,      0,      0x1E03, /* LATIN_SMALL_LETTER_B_WITH_DOT_ABOVE */
+  GDK_Multi_key,       GDK_c,  GDK_apostrophe, 0,      0,      0x0107, /* LATIN_SMALL_LETTER_C_WITH_ACUTE */
   GDK_Multi_key,       GDK_c,  GDK_comma,      0,      0,      0x00E7, /* LATIN_SMALL_LETTER_C_WITH_CEDILLA */
   GDK_Multi_key,       GDK_c,  GDK_period,     0,      0,      0x010B, /* LATIN_SMALL_LETTER_C_WITH_DOT_ABOVE */
   GDK_Multi_key,       GDK_c,  GDK_slash,      0,      0,      0x00A2, /* CENT_SIGN */
@@ -570,11 +731,13 @@ static guint16 gtk_compose_seqs[] = {
   GDK_Multi_key,       GDK_c,  GDK_bar,        0,      0,      0x00A2, /* CENT_SIGN */
   GDK_Multi_key,       GDK_d,  GDK_minus,      0,      0,      0x0111, /* LATIN_SMALL_LETTER_D_WITH_STROKE */
   GDK_Multi_key,       GDK_d,  GDK_period,     0,      0,      0x1E0B, /* LATIN_SMALL_LETTER_D_WITH_DOT_ABOVE */
+  GDK_Multi_key,       GDK_d,  GDK_less,       0,      0,      0x010F, /* LATIN_SMALL_LETTER_D_WITH_CARON */
   GDK_Multi_key,       GDK_e,  GDK_quotedbl,   0,      0,      0x00EB, /* LATIN_SMALL_LETTER_E_WITH_DIAERESIS */
   GDK_Multi_key,       GDK_e,  GDK_apostrophe, 0,      0,      0x00E9, /* LATIN_SMALL_LETTER_E_WITH_ACUTE */
   GDK_Multi_key,       GDK_e,  GDK_comma,      0,      0,      0x0119, /* LATIN_SMALL_LETTER_E_WITH_OGONEK */
   GDK_Multi_key,       GDK_e,  GDK_minus,      0,      0,      0x0113, /* LATIN_SMALL_LETTER_E_WITH_MACRON */
   GDK_Multi_key,       GDK_e,  GDK_period,     0,      0,      0x0117, /* LATIN_SMALL_LETTER_E_WITH_DOT_ABOVE */
+  GDK_Multi_key,       GDK_e,  GDK_less,       0,      0,      0x011B, /* LATIN_SMALL_LETTER_E_WITH_CARON */
   GDK_Multi_key,       GDK_e,  GDK_equal,      0,      0,      0x20AC, /* EURO_SIGN */
   GDK_Multi_key,       GDK_e,  GDK_greater,    0,      0,      0x00EA, /* LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX */
   GDK_Multi_key,       GDK_e,  GDK_asciicircum,        0,      0,      0x00EA, /* LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX */
@@ -602,13 +765,18 @@ static guint16 gtk_compose_seqs[] = {
   GDK_Multi_key,       GDK_i,  GDK_acute,      0,      0,      0x00ED, /* LATIN_SMALL_LETTER_I_WITH_ACUTE */
   GDK_Multi_key,       GDK_k,  GDK_comma,      0,      0,      0x0137, /* LATIN_SMALL_LETTER_K_WITH_CEDILLA */
   GDK_Multi_key,       GDK_k,  GDK_k,  0,      0,      0x0138, /* LATIN_SMALL_LETTER_KRA */
+  GDK_Multi_key,       GDK_l,  GDK_apostrophe, 0,      0,      0x013A, /* LATIN_SMALL_LETTER_L_WITH_ACUTE */
   GDK_Multi_key,       GDK_l,  GDK_comma,      0,      0,      0x013C, /* LATIN_SMALL_LETTER_L_WITH_CEDILLA */
   GDK_Multi_key,       GDK_l,  GDK_minus,      0,      0,      0x00A3, /* POUND_SIGN */
+  GDK_Multi_key,       GDK_l,  GDK_slash,      0,      0,      0x0142, /* LATIN_SMALL_LETTER_L_WITH_STROKE */
+  GDK_Multi_key,       GDK_l,  GDK_less,       0,      0,      0x013E, /* LATIN_SMALL_LETTER_L_WITH_CARON */
   GDK_Multi_key,       GDK_l,  GDK_equal,      0,      0,      0x00A3, /* POUND_SIGN */
   GDK_Multi_key,       GDK_l,  GDK_v,  0,      0,      0x007C, /* VERTICAL_LINE */
   GDK_Multi_key,       GDK_m,  GDK_period,     0,      0,      0x1E41, /* LATIN_SMALL_LETTER_M_WITH_DOT_ABOVE */
+  GDK_Multi_key,       GDK_n,  GDK_apostrophe, 0,      0,      0x0144, /* LATIN_SMALL_LETTER_N_WITH_ACUTE */
   GDK_Multi_key,       GDK_n,  GDK_comma,      0,      0,      0x0146, /* LATIN_SMALL_LETTER_N_WITH_CEDILLA */
   GDK_Multi_key,       GDK_n,  GDK_minus,      0,      0,      0x00F1, /* LATIN_SMALL_LETTER_N_WITH_TILDE */
+  GDK_Multi_key,       GDK_n,  GDK_less,       0,      0,      0x0148, /* LATIN_SMALL_LETTER_N_WITH_CARON */
   GDK_Multi_key,       GDK_n,  GDK_g,  0,      0,      0x014B, /* LATIN_SMALL_LETTER_ENG */
   GDK_Multi_key,       GDK_n,  GDK_asciitilde, 0,      0,      0x00F1, /* LATIN_SMALL_LETTER_N_WITH_TILDE */
   GDK_Multi_key,       GDK_o,  GDK_quotedbl,   0,      0,      0x00F6, /* LATIN_SMALL_LETTER_O_WITH_DIAERESIS */
@@ -630,8 +798,11 @@ static guint16 gtk_compose_seqs[] = {
   GDK_Multi_key,       GDK_o,  GDK_acute,      0,      0,      0x00F3, /* LATIN_SMALL_LETTER_O_WITH_ACUTE */
   GDK_Multi_key,       GDK_p,  GDK_exclam,     0,      0,      0x00B6, /* PILCROW_SIGN */
   GDK_Multi_key,       GDK_p,  GDK_period,     0,      0,      0x1E57, /* LATIN_SMALL_LETTER_P_WITH_DOT_ABOVE */
+  GDK_Multi_key,       GDK_r,  GDK_apostrophe, 0,      0,      0x0155, /* LATIN_SMALL_LETTER_R_WITH_ACUTE */
   GDK_Multi_key,       GDK_r,  GDK_comma,      0,      0,      0x0157, /* LATIN_SMALL_LETTER_R_WITH_CEDILLA */
+  GDK_Multi_key,       GDK_r,  GDK_less,       0,      0,      0x0159, /* LATIN_SMALL_LETTER_R_WITH_CARON */
   GDK_Multi_key,       GDK_s,  GDK_exclam,     0,      0,      0x00A7, /* SECTION_SIGN */
+  GDK_Multi_key,       GDK_s,  GDK_apostrophe, 0,      0,      0x015B, /* LATIN_SMALL_LETTER_S_WITH_ACUTE */
   GDK_Multi_key,       GDK_s,  GDK_comma,      0,      0,      0x015F, /* LATIN_SMALL_LETTER_S_WITH_CEDILLA */
   GDK_Multi_key,       GDK_s,  GDK_period,     0,      0,      0x1E61, /* LATIN_SMALL_LETTER_S_WITH_DOT_ABOVE */
   GDK_Multi_key,       GDK_s,  GDK_0,  0,      0,      0x00A7, /* SECTION_SIGN */
@@ -645,9 +816,11 @@ static guint16 gtk_compose_seqs[] = {
   GDK_Multi_key,       GDK_t,  GDK_minus,      0,      0,      0x0167, /* LATIN_SMALL_LETTER_T_WITH_STROKE */
   GDK_Multi_key,       GDK_t,  GDK_period,     0,      0,      0x1E6B, /* LATIN_SMALL_LETTER_T_WITH_DOT_ABOVE */
   GDK_Multi_key,       GDK_t,  GDK_slash,      0,      0,      0x0167, /* LATIN_SMALL_LETTER_T_WITH_STROKE */
+  GDK_Multi_key,       GDK_t,  GDK_less,       0,      0,      0x0165, /* LATIN_SMALL_LETTER_T_WITH_CARON */
   GDK_Multi_key,       GDK_t,  GDK_h,  0,      0,      0x00FE, /* LATIN_SMALL_LETTER_THORN */
   GDK_Multi_key,       GDK_u,  GDK_quotedbl,   0,      0,      0x00FC, /* LATIN_SMALL_LETTER_U_WITH_DIAERESIS */
   GDK_Multi_key,       GDK_u,  GDK_apostrophe, 0,      0,      0x00FA, /* LATIN_SMALL_LETTER_U_WITH_ACUTE */
+  GDK_Multi_key,       GDK_u,  GDK_asterisk,   0,      0,      0x016F, /* LATIN_SMALL_LETTER_U_WITH_RING_ABOVE */
   GDK_Multi_key,       GDK_u,  GDK_comma,      0,      0,      0x0173, /* LATIN_SMALL_LETTER_U_WITH_OGONEK */
   GDK_Multi_key,       GDK_u,  GDK_minus,      0,      0,      0x016B, /* LATIN_SMALL_LETTER_U_WITH_MACRON */
   GDK_Multi_key,       GDK_u,  GDK_slash,      0,      0,      0x00B5, /* MICRO_SIGN */
@@ -673,6 +846,8 @@ static guint16 gtk_compose_seqs[] = {
   GDK_Multi_key,       GDK_y,  GDK_asciicircum,        0,      0,      0x0177, /* LATIN_SMALL_LETTER_Y_WITH_CIRCUMFLEX */
   GDK_Multi_key,       GDK_y,  GDK_diaeresis,  0,      0,      0x00FF, /* LATIN_SMALL_LETTER_Y_WITH_DIAERESIS */
   GDK_Multi_key,       GDK_y,  GDK_acute,      0,      0,      0x00FD, /* LATIN_SMALL_LETTER_Y_WITH_ACUTE */
+  GDK_Multi_key,       GDK_z,  GDK_apostrophe, 0,      0,      0x017A, /* LATIN_SMALL_LETTER_Z_WITH_ACUTE */
+  GDK_Multi_key,       GDK_z,  GDK_period,     0,      0,      0x017C, /* LATIN_SMALL_LETTER_Z_WITH_DOT_ABOVE */
   GDK_Multi_key,       GDK_z,  GDK_less,       0,      0,      0x017E, /* LATIN_SMALL_LETTER_Z_WITH_CARON */
   GDK_Multi_key,       GDK_bar,        GDK_C,  0,      0,      0x00A2, /* CENT_SIGN */
   GDK_Multi_key,       GDK_bar,        GDK_c,  0,      0,      0x00A2, /* CENT_SIGN */
@@ -715,6 +890,24 @@ static guint16 gtk_compose_seqs[] = {
   GDK_Multi_key,       GDK_cedilla,    GDK_s,  0,      0,      0x015F, /* LATIN_SMALL_LETTER_S_WITH_CEDILLA */
   GDK_Multi_key,       GDK_breve,      GDK_G,  0,      0,      0x011E, /* LATIN_CAPITAL_LETTER_G_WITH_BREVE */
   GDK_Multi_key,       GDK_breve,      GDK_g,  0,      0,      0x011F, /* LATIN_SMALL_LETTER_G_WITH_BREVE */
+  GDK_Multi_key,       GDK_Greek_ALPHA,        GDK_apostrophe, 0,      0,      0x0386, /* GREEK CAPITAL LETTER ALPHA WITH TONOS */
+  GDK_Multi_key,       GDK_Greek_EPSILON,      GDK_apostrophe, 0,      0,      0x0388, /* GREEK CAPITAL LETTER EPSILON WITH TONOS */
+  GDK_Multi_key,       GDK_Greek_ETA,  GDK_apostrophe, 0,      0,      0x0389, /* GREEK CAPITAL LETTER ETA WITH TONOS */
+  GDK_Multi_key,       GDK_Greek_IOTA, GDK_quotedbl,   0,      0,      0x03AA, /* GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */
+  GDK_Multi_key,       GDK_Greek_IOTA, GDK_apostrophe, 0,      0,      0x038A, /* GREEK CAPITAL LETTER IOTA WITH TONOS */
+  GDK_Multi_key,       GDK_Greek_OMICRON,      GDK_apostrophe, 0,      0,      0x038C, /* GREEK CAPITAL LETTER OMICRON WITH TONOS */
+  GDK_Multi_key,       GDK_Greek_UPSILON,      GDK_quotedbl,   0,      0,      0x03AB, /* GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */
+  GDK_Multi_key,       GDK_Greek_UPSILON,      GDK_apostrophe, 0,      0,      0x038E, /* GREEK CAPITAL LETTER UPSILON WITH TONOS */
+  GDK_Multi_key,       GDK_Greek_OMEGA,        GDK_apostrophe, 0,      0,      0x038F, /* GREEK CAPITAL LETTER OMEGA WITH TONOS */
+  GDK_Multi_key,       GDK_Greek_alpha,        GDK_apostrophe, 0,      0,      0x03AC, /* GREEK SMALL LETTER ALPHA WITH TONOS */
+  GDK_Multi_key,       GDK_Greek_epsilon,      GDK_apostrophe, 0,      0,      0x03AD, /* GREEK SMALL LETTER EPSILON WITH TONOS */
+  GDK_Multi_key,       GDK_Greek_eta,  GDK_apostrophe, 0,      0,      0x03AE, /* GREEK SMALL LETTER ETA WITH TONOS */
+  GDK_Multi_key,       GDK_Greek_iota, GDK_quotedbl,   0,      0,      0x03CA, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA */
+  GDK_Multi_key,       GDK_Greek_iota, GDK_apostrophe, 0,      0,      0x03AF, /* GREEK SMALL LETTER IOTA WITH TONOS */
+  GDK_Multi_key,       GDK_Greek_omicron,      GDK_apostrophe, 0,      0,      0x03CC, /* GREEK SMALL LETTER OMICRON WITH TONOS */
+  GDK_Multi_key,       GDK_Greek_upsilon,      GDK_quotedbl,   0,      0,      0x03CB, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA */
+  GDK_Multi_key,       GDK_Greek_upsilon,      GDK_apostrophe, 0,      0,      0x03CD, /* GREEK SMALL LETTER UPSILON WITH TONOS */
+  GDK_Multi_key,       GDK_Greek_omega,        GDK_apostrophe, 0,      0,      0x03CE, /* GREEK SMALL LETTER OMEGA WITH TONOS */
 };
 
 static const GtkComposeTable gtk_compose_table = {
@@ -723,7 +916,7 @@ static const GtkComposeTable gtk_compose_table = {
   G_N_ELEMENTS (gtk_compose_seqs) / 6
 };
 
-guint16 gtk_compose_ignore[] = {
+static const guint16 gtk_compose_ignore[] = {
   GDK_Shift_L,
   GDK_Shift_R,
   GDK_Control_L,
@@ -737,11 +930,11 @@ guint16 gtk_compose_ignore[] = {
   GDK_Super_L,
   GDK_Super_R,
   GDK_Hyper_L,
-  GDK_Hyper_R 
+  GDK_Hyper_R,
+  GDK_Mode_switch,
+  GDK_ISO_Level3_Shift
 };
 
-static void     gtk_im_context_simple_class_init         (GtkIMContextSimpleClass  *class);
-static void     gtk_im_context_simple_init               (GtkIMContextSimple       *im_context_simple);
 static void     gtk_im_context_simple_finalize           (GObject                  *obj);
 static gboolean gtk_im_context_simple_filter_keypress    (GtkIMContext             *context,
                                                          GdkEventKey              *key);
@@ -751,32 +944,7 @@ static void     gtk_im_context_simple_get_preedit_string (GtkIMContext
                                                          PangoAttrList           **attrs,
                                                          gint                     *cursor_pos);
 
-static GObjectClass *parent_class;
-
-GtkType
-gtk_im_context_simple_get_type (void)
-{
-  static GtkType im_context_simple_type = 0;
-
-  if (!im_context_simple_type)
-    {
-      static const GtkTypeInfo im_context_simple_info =
-      {
-       "GtkIMContextSimple",
-       sizeof (GtkIMContextSimple),
-       sizeof (GtkIMContextSimpleClass),
-       (GtkClassInitFunc) gtk_im_context_simple_class_init,
-       (GtkObjectInitFunc) gtk_im_context_simple_init,
-       /* reserved_1 */ NULL,
-        /* reserved_2 */ NULL,
-        (GtkClassInitFunc) NULL,
-      };
-
-      im_context_simple_type = gtk_type_unique (GTK_TYPE_IM_CONTEXT, &im_context_simple_info);
-    }
-
-  return im_context_simple_type;
-}
+G_DEFINE_TYPE (GtkIMContextSimple, gtk_im_context_simple, GTK_TYPE_IM_CONTEXT)
 
 static void
 gtk_im_context_simple_class_init (GtkIMContextSimpleClass *class)
@@ -784,8 +952,6 @@ gtk_im_context_simple_class_init (GtkIMContextSimpleClass *class)
   GtkIMContextClass *im_context_class = GTK_IM_CONTEXT_CLASS (class);
   GObjectClass *gobject_class = G_OBJECT_CLASS (class);
 
-  parent_class = g_type_class_peek_parent (class);
-
   im_context_class->filter_keypress = gtk_im_context_simple_filter_keypress;
   im_context_class->reset = gtk_im_context_simple_reset;
   im_context_class->get_preedit_string = gtk_im_context_simple_get_preedit_string;
@@ -802,13 +968,28 @@ gtk_im_context_simple_finalize (GObject *obj)
 {
   GtkIMContextSimple *context_simple = GTK_IM_CONTEXT_SIMPLE (obj);
 
-  g_slist_free (context_simple->tables);
+  if (context_simple->tables)
+    {
+      g_slist_foreach (context_simple->tables, (GFunc)g_free, NULL);
+      g_slist_free (context_simple->tables);
+
+      context_simple->tables = NULL;
+    }
+
+  G_OBJECT_CLASS (gtk_im_context_simple_parent_class)->finalize (obj);
 }
 
+/** 
+ * gtk_im_context_simple_new:
+ * 
+ * Creates a new #GtkIMContextSimple.
+ *
+ * Returns: a new #GtkIMContextSimple.
+ **/
 GtkIMContext *
 gtk_im_context_simple_new (void)
 {
-  return GTK_IM_CONTEXT (gtk_type_new (GTK_TYPE_IM_CONTEXT_SIMPLE));
+  return g_object_new (GTK_TYPE_IM_CONTEXT_SIMPLE, NULL);
 }
 
 static void
@@ -819,21 +1000,21 @@ gtk_im_context_simple_commit_char (GtkIMContext *context,
   gint len;
 
   GtkIMContextSimple *context_simple = GTK_IM_CONTEXT_SIMPLE (context);
-      
+
+  g_return_if_fail (g_unichar_validate (ch));
+  
   len = g_unichar_to_utf8 (ch, buf);
   buf[len] = '\0';
 
-  context_simple->in_hex_sequence = FALSE;
-  
-  if (context_simple->tentative_match)
+  if (context_simple->tentative_match || context_simple->in_hex_sequence)
     {
+      context_simple->in_hex_sequence = FALSE;  
       context_simple->tentative_match = 0;
       context_simple->tentative_match_len = 0;
-      gtk_signal_emit_by_name (GTK_OBJECT (context_simple),
-                              "preedit_changed");
+      g_signal_emit_by_name (context_simple, "preedit_changed");
     }
 
-  gtk_signal_emit_by_name (GTK_OBJECT (context), "commit", &buf);
+  g_signal_emit_by_name (context, "commit", &buf);
 }
 
 static int
@@ -862,10 +1043,18 @@ check_table (GtkIMContextSimple    *context_simple,
             gint                   n_compose)
 {
   gint row_stride = table->max_seq_len + 2; 
-  guint16 *seq = bsearch (context_simple->compose_buffer,
-                         table->data, table->n_seqs,
-                         sizeof (guint16) *  row_stride, 
-                         compare_seq);
+  guint16 *seq; 
+  
+  /* Will never match, if the sequence in the compose buffer is longer
+   * than the sequences in the table.  Further, compare_seq (key, val)
+   * will overrun val if key is longer than val. */
+  if (n_compose > table->max_seq_len)
+    return FALSE;
+  
+  seq = bsearch (context_simple->compose_buffer,
+                table->data, table->n_seqs,
+                sizeof (guint16) *  row_stride, 
+                compare_seq);
 
   if (seq)
     {
@@ -900,9 +1089,8 @@ check_table (GtkIMContextSimple    *context_simple,
                {
                  context_simple->tentative_match = value;
                  context_simple->tentative_match_len = n_compose;
-
-                 gtk_signal_emit_by_name (GTK_OBJECT (context_simple),
-                                          "preedit_changed");
+               
+                 g_signal_emit_by_name (context_simple, "preedit_changed");
 
                  return TRUE;
                }
@@ -919,14 +1107,21 @@ check_table (GtkIMContextSimple    *context_simple,
 }
 
 /* In addition to the table-driven sequences, we allow Unicode hex
- * codes entered with Ctrl-Shift held down as specified in ISO
- * 14755. 14755 actually allows a different set of modifiers to be
- * used at our discretion, but for now using Ctrl-Shift as in their
- * examples. While holding Ctrl-Shift, pressing space commits the
- * character, and pressing a non-hex-digit is an error.
+ * codes to be entered. The method chosen here is similar to the
+ * one recommended in ISO 14755, but not exactly the same, since we
+ * don't want to steal 16 valuable key combinations. 
+ * 
+ * A hex Unicode sequence must be started with Ctrl-Shift-U, followed
+ * by a sequence of hex digits entered with Ctrl-Shift still held.
+ * Releasing one of the modifiers or pressing space while the modifiers
+ * are still held commits the character. It is possible to erase
+ * digits using backspace.
+ *
+ * As an extension to the above, we also allow to start the sequence
+ * with Ctrl-Shift-U, then release the modifiers before typing any
+ * digits, and enter the digits without modifiers.
  */
-
-#define ISO_14755_MOD_MASK (GDK_CONTROL_MASK | GDK_SHIFT_MASK)
+#define HEX_MOD_MASK (GDK_CONTROL_MASK | GDK_SHIFT_MASK)
 
 static gboolean
 check_hex (GtkIMContextSimple *context_simple,
@@ -937,14 +1132,17 @@ check_hex (GtkIMContextSimple *context_simple,
   GString *str;
   gulong n;
   gchar *nptr = NULL;
-  
+  gchar buf[7];
+
+  context_simple->tentative_match = 0;
+  context_simple->tentative_match_len = 0;
+
   str = g_string_new (NULL);
   
   i = 0;
   while (i < n_compose)
     {
       gunichar ch;
-      gchar buf[7];
       
       ch = gdk_keyval_to_unicode (context_simple->compose_buffer[i]);
       
@@ -966,29 +1164,48 @@ check_hex (GtkIMContextSimple *context_simple,
   /* if strtoul fails it probably means non-latin digits were used;
    * we should in principle handle that, but we probably don't.
    */
-  if (str->str == nptr)
+  if (nptr - str->str < str->len)
     {
       g_string_free (str, TRUE);
       return FALSE;
     }
   else
     g_string_free (str, TRUE);
-  
-  if (n > 0xFFFF)
-    return FALSE; /* too many digits */
 
-  if (n == 0)
-    return FALSE; /* don't insert nul bytes */
-  
-  context_simple->tentative_match = n;
-  context_simple->tentative_match_len = n_compose;
-  
-  gtk_signal_emit_by_name (GTK_OBJECT (context_simple),
-                           "preedit-changed");
+  if (g_unichar_validate (n))
+    {
+      context_simple->tentative_match = n;
+      context_simple->tentative_match_len = n_compose;
+    }
   
   return TRUE;
 }
 
+static void
+beep_window (GdkWindow *window)
+{
+  GtkWidget *widget;
+
+  gdk_window_get_user_data (window, &widget);
+
+  if (GTK_IS_WIDGET (widget))
+    {
+      gtk_widget_error_bell (widget);
+    }
+  else
+    {
+      GdkScreen *screen = gdk_drawable_get_screen (GDK_DRAWABLE (window));
+      gboolean   beep;
+
+      g_object_get (gtk_settings_get_for_screen (screen),
+                    "gtk-error-bell", &beep,
+                    NULL);
+
+      if (beep)
+        gdk_window_beep (window);
+    }
+}
+
 static gboolean
 no_sequence_matches (GtkIMContextSimple *context_simple,
                      gint                n_compose,
@@ -1012,10 +1229,11 @@ no_sequence_matches (GtkIMContextSimple *context_simple,
       
       for (i=0; i < n_compose - len - 1; i++)
        {
-         GdkEventKey tmp_event = *event;
-         tmp_event.keyval = context_simple->compose_buffer[len + i];
+         GdkEvent *tmp_event = gdk_event_copy ((GdkEvent *)event);
+         tmp_event->key.keyval = context_simple->compose_buffer[len + i];
          
-         gtk_im_context_filter_keypress (context, &tmp_event);
+         gtk_im_context_filter_keypress (context, (GdkEventKey *)tmp_event);
+         gdk_event_free (tmp_event);
        }
 
       return gtk_im_context_filter_keypress (context, event);
@@ -1025,7 +1243,7 @@ no_sequence_matches (GtkIMContextSimple *context_simple,
       context_simple->compose_buffer[0] = 0;
       if (n_compose > 1)               /* Invalid sequence */
        {
-         gdk_beep();
+         beep_window (event->window);
          return TRUE;
        }
   
@@ -1051,6 +1269,7 @@ is_hex_keyval (guint keyval)
 static guint
 canonical_hex_keyval (GdkEventKey *event)
 {
+  GdkKeymap *keymap = gdk_keymap_get_for_display (gdk_drawable_get_display (event->window));
   guint keyval;
   guint *keyvals = NULL;
   gint n_vals = 0;
@@ -1063,9 +1282,10 @@ canonical_hex_keyval (GdkEventKey *event)
   /* See if this key would have generated a hex keyval in
    * any other state, and return that hex keyval if so
    */
-  gdk_keymap_get_entries_for_keycode (NULL,
-                                      event->hardware_keycode, NULL,
-                                      &keyvals, &n_vals);
+  gdk_keymap_get_entries_for_keycode (keymap,
+                                     event->hardware_keycode,
+                                     NULL,
+                                     &keyvals, &n_vals);
 
   keyval = 0;
   i = 0;
@@ -1085,10 +1305,9 @@ canonical_hex_keyval (GdkEventKey *event)
   if (keyval)
     return keyval;
   else
-    /* just return the keyval unchanged, we couldn't figure
-     * out a way to make it a hex digit
+    /* No way to make it a hex digit
      */
-    return event->keyval;
+    return 0;
 }
 
 static gboolean
@@ -1098,42 +1317,163 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context,
   GtkIMContextSimple *context_simple = GTK_IM_CONTEXT_SIMPLE (context);
   GSList *tmp_list;  
   int n_compose = 0;
+  gboolean have_hex_mods;
+  gboolean is_hex_start;
+  gboolean is_hex_end;
+  gboolean is_backspace;
+  gboolean is_escape;
+  guint hex_keyval;
   int i;
 
-  /* FIXME? 14755 says you have to commit the char on release of the shift/control
-   * keys. But instead we wait for the user to type another char, or to lose focus.
-   */
-  
-  /* Ignore modifier key presses
-   */
+  while (context_simple->compose_buffer[n_compose] != 0)
+    n_compose++;
+
+  if (event->type == GDK_KEY_RELEASE)
+    {
+      if (context_simple->in_hex_sequence &&
+         (event->keyval == GDK_Control_L || event->keyval == GDK_Control_R ||
+          event->keyval == GDK_Shift_L || event->keyval == GDK_Shift_R))
+       {
+         if (context_simple->tentative_match &&
+             g_unichar_validate (context_simple->tentative_match))
+           {
+             gtk_im_context_simple_commit_char (context, context_simple->tentative_match);
+             context_simple->compose_buffer[0] = 0;
+
+           }
+         else if (n_compose == 0)
+           {
+             context_simple->modifiers_dropped = TRUE;
+           }
+         else
+           {
+             /* invalid hex sequence */
+             beep_window (event->window);
+             
+             context_simple->tentative_match = 0;
+             context_simple->in_hex_sequence = FALSE;
+             context_simple->compose_buffer[0] = 0;
+             
+             g_signal_emit_by_name (context_simple, "preedit_changed");
+           }
+
+         return TRUE;
+       }
+      else
+       return FALSE;
+    }
+
+  /* Ignore modifier key presses */
   for (i=0; i < G_N_ELEMENTS (gtk_compose_ignore); i++)
     if (event->keyval == gtk_compose_ignore[i])
       return FALSE;
 
-  while (context_simple->compose_buffer[n_compose] != 0)
-    n_compose++;
+  if (context_simple->in_hex_sequence && context_simple->modifiers_dropped)
+    have_hex_mods = TRUE;
+  else
+    have_hex_mods = (event->state & (HEX_MOD_MASK)) == HEX_MOD_MASK;
+  is_hex_start = event->keyval == GDK_U;
+  is_hex_end = (event->keyval == GDK_space || 
+               event->keyval == GDK_KP_Space ||
+               event->keyval == GDK_Return || 
+               event->keyval == GDK_ISO_Enter ||
+               event->keyval == GDK_KP_Enter);
+  is_backspace = event->keyval == GDK_BackSpace;
+  is_escape = event->keyval == GDK_Escape;
+  hex_keyval = canonical_hex_keyval (event);
 
-  /* First key in sequence; decide if it's a 14755 hex sequence */
-  if (n_compose == 0)
-    context_simple->in_hex_sequence =
-      ((event->state & (ISO_14755_MOD_MASK)) == ISO_14755_MOD_MASK);
-  
   /* If we are already in a non-hex sequence, or
-   * the 14755 modifiers are not held down, filter all
+   * this keystroke is not hex modifiers + hex digit, don't filter 
    * key events with accelerator modifiers held down.
    */
-  if (!context_simple->in_hex_sequence ||
-      ((event->state & (ISO_14755_MOD_MASK)) != ISO_14755_MOD_MASK))
+  if (!have_hex_mods ||
+      (n_compose > 0 && !context_simple->in_hex_sequence) || 
+      (n_compose == 0 && !context_simple->in_hex_sequence && !is_hex_start) ||
+      (context_simple->in_hex_sequence && !hex_keyval && 
+       !is_hex_start && !is_hex_end && !is_escape && !is_backspace))
     {
-      if (event->state &
-          (gtk_accelerator_get_default_mod_mask () & ~GDK_SHIFT_MASK))
-        return FALSE;
+      if (event->state & (gtk_accelerator_get_default_mod_mask () & ~GDK_SHIFT_MASK) ||
+         (context_simple->in_hex_sequence && context_simple->modifiers_dropped &&
+          (event->keyval == GDK_Return || 
+           event->keyval == GDK_ISO_Enter ||
+           event->keyval == GDK_KP_Enter)))
+       {
+         return FALSE;
+       }
     }
   
-  /* Then, check for compose sequences
-   */
+  /* Handle backspace */
+  if (context_simple->in_hex_sequence && have_hex_mods && is_backspace)
+    {
+      if (n_compose > 0)
+       {
+         n_compose--;
+         context_simple->compose_buffer[n_compose] = 0;
+          check_hex (context_simple, n_compose);
+       }
+      else
+       {
+         context_simple->in_hex_sequence = FALSE;
+       }
+
+      g_signal_emit_by_name (context_simple, "preedit_changed");
+      
+      return TRUE;
+    }
+
+  /* Check for hex sequence restart */
+  if (context_simple->in_hex_sequence && have_hex_mods && is_hex_start)
+    {
+      if (context_simple->tentative_match &&
+         g_unichar_validate (context_simple->tentative_match))
+       {
+         gtk_im_context_simple_commit_char (context, context_simple->tentative_match);
+         context_simple->compose_buffer[0] = 0;
+       }
+      else 
+       {
+         /* invalid hex sequence */
+         if (n_compose > 0)
+           beep_window (event->window);
+         
+         context_simple->tentative_match = 0;
+         context_simple->in_hex_sequence = FALSE;
+         context_simple->compose_buffer[0] = 0;
+       }
+    }
+  
+  /* Check for hex sequence start */
+  if (!context_simple->in_hex_sequence && have_hex_mods && is_hex_start)
+    {
+      context_simple->compose_buffer[0] = 0;
+      context_simple->in_hex_sequence = TRUE;
+      context_simple->modifiers_dropped = FALSE;
+      context_simple->tentative_match = 0;
+
+      g_signal_emit_by_name (context_simple, "preedit_changed");
+  
+      return TRUE;
+    }
+  
+  /* Then, check for compose sequences */
   if (context_simple->in_hex_sequence)
-    context_simple->compose_buffer[n_compose++] = canonical_hex_keyval (event);
+    {
+      if (hex_keyval)
+       context_simple->compose_buffer[n_compose++] = hex_keyval;
+      else if (is_escape)
+       {
+         gtk_im_context_simple_reset (context);
+         
+         return TRUE;
+       }
+      else if (!is_hex_end)
+       {
+         /* non-hex character in hex sequence */
+         beep_window (event->window);
+         
+         return TRUE;
+       }
+    }
   else
     context_simple->compose_buffer[n_compose++] = event->keyval;
 
@@ -1142,17 +1482,33 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context,
   if (context_simple->in_hex_sequence)
     {
       /* If the modifiers are still held down, consider the sequence again */
-      if ((event->state & (ISO_14755_MOD_MASK)) == ISO_14755_MOD_MASK)
+      if (have_hex_mods)
         {
-          /* space ends the sequence, and we eat the space */
-          if (n_compose > 1 && event->keyval == GDK_space)
+          /* space or return ends the sequence, and we eat the key */
+          if (n_compose > 0 && is_hex_end)
             {
-              gtk_im_context_simple_commit_char (context, context_simple->tentative_match);
-              context_simple->compose_buffer[0] = 0;
-              return TRUE;
+             if (context_simple->tentative_match &&
+                 g_unichar_validate (context_simple->tentative_match))
+               {
+                 gtk_im_context_simple_commit_char (context, context_simple->tentative_match);
+                 context_simple->compose_buffer[0] = 0;
+               }
+             else
+               {
+                 /* invalid hex sequence */
+                 beep_window (event->window);
+
+                 context_simple->tentative_match = 0;
+                 context_simple->in_hex_sequence = FALSE;
+                 context_simple->compose_buffer[0] = 0;
+               }
             }
-          else if (check_hex (context_simple, n_compose))
-            return TRUE;
+          else if (!check_hex (context_simple, n_compose))
+           beep_window (event->window);
+         
+         g_signal_emit_by_name (context_simple, "preedit_changed");
+
+         return TRUE;
         }
     }
   else
@@ -1177,13 +1533,16 @@ static void
 gtk_im_context_simple_reset (GtkIMContext *context)
 {
   GtkIMContextSimple *context_simple = GTK_IM_CONTEXT_SIMPLE (context);
-  
-  context_simple->compose_buffer[0] = 0;
 
-  if (context_simple->tentative_match)
-    gtk_im_context_simple_commit_char (context, context_simple->tentative_match);
+  context_simple->compose_buffer[0] = 0;
 
-  context_simple->in_hex_sequence = FALSE;
+  if (context_simple->tentative_match || context_simple->in_hex_sequence)
+    {
+      context_simple->in_hex_sequence = FALSE;
+      context_simple->tentative_match = 0;
+      context_simple->tentative_match_len = 0;
+      g_signal_emit_by_name (context_simple, "preedit_changed");
+    }
 }
 
 static void     
@@ -1192,39 +1551,38 @@ gtk_im_context_simple_get_preedit_string (GtkIMContext   *context,
                                          PangoAttrList **attrs,
                                          gint           *cursor_pos)
 {
-  char outbuf[25]; /* up to 4 hex digits */
+  char outbuf[37]; /* up to 6 hex digits */
   int len = 0;
   
   GtkIMContextSimple *context_simple = GTK_IM_CONTEXT_SIMPLE (context);
 
-  if (context_simple->tentative_match)
+  if (context_simple->in_hex_sequence)
     {
-      if (context_simple->in_hex_sequence)
-        {
-          int hexchars = 0;
-          
-          while (context_simple->compose_buffer[hexchars] != 0)
-            {
-              len += g_unichar_to_utf8 (gdk_keyval_to_unicode (context_simple->compose_buffer[hexchars]),
-                                        outbuf + len);
-              ++hexchars;
-            }
-        }
-      else
-        {
-          len = g_unichar_to_utf8 (context_simple->tentative_match, outbuf);
-        }
-      
-      g_assert (len <= 25);
-      outbuf[len] = '\0';      
+      int hexchars = 0;
+         
+      outbuf[0] = 'u';
+      len = 1;
+
+      while (context_simple->compose_buffer[hexchars] != 0)
+       {
+         len += g_unichar_to_utf8 (gdk_keyval_to_unicode (context_simple->compose_buffer[hexchars]),
+                                   outbuf + len);
+         ++hexchars;
+       }
+
+      g_assert (len < 25);
     }
-  
+  else if (context_simple->tentative_match)
+    len = g_unichar_to_utf8 (context_simple->tentative_match, outbuf);
+      
+  outbuf[len] = '\0';      
+
   if (str)
     *str = g_strdup (outbuf);
 
   if (attrs)
     {
-      *attrs = pango_attr_list_new();
+      *attrs = pango_attr_list_new ();
       
       if (len)
        {
@@ -1236,7 +1594,7 @@ gtk_im_context_simple_get_preedit_string (GtkIMContext   *context,
     }
 
   if (cursor_pos)
-    *cursor_pos = (context_simple->tentative_match ? len : 0);
+    *cursor_pos = len;
 }
 
 /**
@@ -1244,17 +1602,17 @@ gtk_im_context_simple_get_preedit_string (GtkIMContext   *context,
  * @context_simple: A #GtkIMContextSimple
  * @data: the table 
  * @max_seq_len: Maximum length of a sequence in the table
- *               (cannot be greater than 7)
+ *               (cannot be greater than #GTK_MAX_COMPOSE_LEN)
  * @n_seqs: number of sequences in the table
  * 
- * Add an additional table to search to the input context.
- * Each row of the table consists of max_seq_len key symbols
- * followed by two guint16 interpreted as the high and low
- * words of a gunicode value. Tables are searched starting
+ * Adds an additional table to search to the input context.
+ * Each row of the table consists of @max_seq_len key symbols
+ * followed by two #guint16 interpreted as the high and low
+ * words of a #gunicode value. Tables are searched starting
  * from the last added.
  *
  * The table must be sorted in dictionary order on the
- * by numeric value of the key symbol fields. (Values beyond
+ * numeric value of the key symbol fields. (Values beyond
  * the length of the sequence should be zero.)
  **/
 void
@@ -1277,3 +1635,5 @@ gtk_im_context_simple_add_table (GtkIMContextSimple *context_simple,
   context_simple->tables = g_slist_prepend (context_simple->tables, table);
 }
 
+#define __GTK_IM_CONTEXT_SIMPLE_C__
+#include "gtkaliasdef.c"