diff -Nur gtk+.ori/gdk/x11/gdkevents-x11.c gtk+/gdk/x11/gdkevents-x11.c
--- gtk+.ori/gdk/x11/gdkevents-x11.c	2004-09-17 17:23:24.000000000 +0200
+++ gtk+/gdk/x11/gdkevents-x11.c	2004-10-10 02:46:54.000000000 +0200
@@ -2699,6 +2699,7 @@
   { "Gtk/FontName", "gtk-font-name" },
   { "Gtk/IconSizes", "gtk-icon-sizes" },
   { "Gtk/KeyThemeName", "gtk-key-theme-name" },
+  { "Gtk/ComposeThemeName", "gtk-compose-theme-name" },
   { "Gtk/ToolbarStyle", "gtk-toolbar-style" },
   { "Gtk/ToolbarIconSize", "gtk-toolbar-icon-size" },
   { "Gtk/IMPreeditStyle", "gtk-im-preedit-style" },
diff -Nur gtk+.ori/gtk/gtkcompose.c gtk+/gtk/gtkcompose.c
--- gtk+.ori/gtk/gtkcompose.c	1970-01-01 01:00:00.000000000 +0100
+++ gtk+/gtk/gtkcompose.c	2004-10-10 12:48:04.000000000 +0200
@@ -0,0 +1,363 @@
+/* GTK - The GIMP Toolkit
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * GtkComposeTable: Keycompose manager for GtkObjects.
+ * Copyright (C) 2004 Leonard Michlmayr
+ *
+ * Uses parts of GtkBinding:
+ * Copyright (C) 1998 Tim Janik
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
+ * file for a list of people on the GTK+ Team.  See the ChangeLog
+ * files for a list of changes.  These files are distributed with
+ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
+ */
+
+#include <glib.h>
+#include <config.h>
+#include <string.h>
+#include <stdarg.h>
+#include <gdk/gdkkeys.h>
+#include <gdk/gdkkeysyms.h>
+#include "gtkcompose.h"
+#include "gtkrc.h"
+
+#define GTK_COMPOSE_MAX_SEQ_LEN 32
+
+typedef struct _GtkComposeEntry GtkComposeEntry;
+
+struct _GtkComposeEntry
+{
+  guint16 *seq;
+  gunichar result;
+  gint seq_len;
+};
+
+/* --- variables --- */
+GSList *gtk_compose_table_list = NULL;
+
+/* --- functions --- */
+static GtkComposeEntry *
+compose_entry_new (void)
+{
+  GtkComposeEntry *entry;
+  entry = g_new0 (GtkComposeEntry, 1);
+  return entry;
+}
+
+static void
+compose_entry_free (GtkComposeEntry * entry)
+{
+  g_free (entry->seq);
+  g_free (entry);
+}
+
+static gint
+compare_prio (gconstpointer a, gconstpointer b)
+{
+  GtkComposeTable const *ta = a, *tb = b;
+  return tb->priority - ta->priority;
+}
+
+static gint
+compare_seqs (gconstpointer a, gconstpointer b, gpointer max_len)
+{
+  guint16 const *ad = (guint16 const *) a;
+  guint16 const *bd = (guint16 const *) b;
+  gint i;
+  for (i = 0; i < GPOINTER_TO_INT (max_len); i++)
+    {
+      if (ad[i] != bd[i])
+	return (ad[i] > bd[i]) - (ad[i] < bd[i]);
+    }
+  return 0;
+}
+
+GtkComposeTable *
+gtk_compose_table_new (gchar const *name, GtkPathPriorityType priority)
+{
+  GtkComposeTable *compose_table;
+
+  compose_table = g_new0 (GtkComposeTable, 1);
+  compose_table->table_name = g_strdup (name);
+  compose_table->priority = priority;
+  compose_table->parsed = FALSE;
+
+  gtk_compose_table_list = g_slist_insert_sorted (gtk_compose_table_list,
+						  compose_table,
+						  compare_prio);
+  return compose_table;
+}
+
+GtkComposeTable *
+gtk_compose_table_find (gchar const *name)
+{
+  GSList *slist;
+
+  g_return_val_if_fail (name != NULL, NULL);
+
+  for (slist = gtk_compose_table_list; slist; slist = slist->next)
+    {
+      GtkComposeTable *compose_table = slist->data;
+      if (g_str_equal (compose_table->table_name, name))
+	return compose_table;
+    }
+  return NULL;
+}
+
+void
+gtk_compose_table_delete (GtkComposeTable * compose_table)
+{
+  gtk_compose_table_list = g_slist_remove (gtk_compose_table_list,
+					   compose_table);
+  g_free (compose_table->data);
+  g_free (compose_table->table_name);
+  g_free (compose_table);
+}
+
+static inline guint
+gtk_compose_parse_compose (GScanner * scanner, GtkComposeEntry * entry)
+{
+  gint n;
+  gunichar unichar;
+  guint keyval;
+  guint16 seq[GTK_COMPOSE_MAX_SEQ_LEN];
+
+  g_return_val_if_fail (scanner != NULL, G_TOKEN_ERROR);
+
+  if (g_scanner_get_next_token (scanner) != GTK_RC_TOKEN_COMPOSE)
+    return GTK_RC_TOKEN_COMPOSE;
+
+  if (g_scanner_get_next_token (scanner) != '{')
+    return '{';
+
+  for (n = 0; g_scanner_get_next_token (scanner) != '}'; n++)
+    {
+      if (n >= GTK_COMPOSE_MAX_SEQ_LEN)
+	return '}';
+
+      switch (scanner->token)
+	{
+	case G_TOKEN_IDENTIFIER:
+	case G_TOKEN_STRING:
+	  /* First try if we have a keyname. */
+	  keyval = gdk_keyval_from_name (scanner->value.v_string);
+
+	  /* Maybe it is just the utf8 representation of the key. */
+	  if ((keyval == GDK_VoidSymbol || keyval == 0)
+	      && g_utf8_strlen (scanner->value.v_string, -1) == 1)
+	    {
+	      /* Convert to ucs4 */
+	      unichar =
+		g_utf8_get_char_validated (scanner->value.v_string, -1);
+	      if (!g_unichar_validate (unichar))
+		return G_TOKEN_ERROR;
+
+	      keyval = gdk_unicode_to_keyval (unichar);
+	    }
+	  break;
+
+	case G_TOKEN_INT:
+	  /* This is expected to be a keyval. (Not a unichar) */
+	  keyval = scanner->value.v_int;
+	  break;
+
+	default:
+	  return G_TOKEN_STRING;
+	}
+      /* Only 16bit keyvals are supported. */
+      if (keyval > 0xFFFF || keyval == 0)
+	return G_TOKEN_ERROR;
+      seq[n] = keyval;
+    }
+
+  entry->seq_len = n;
+  entry->seq = g_new (guint16, n);
+
+  g_memmove (entry->seq, seq, sizeof (guint16) * n);
+
+  switch (g_scanner_get_next_token (scanner))
+    {
+    case G_TOKEN_IDENTIFIER:
+    case G_TOKEN_STRING:
+      /* Expect utf8 representation of a single character */
+      if (g_utf8_strlen (scanner->value.v_string, -1) > 1)
+	return G_TOKEN_ERROR;
+      /* Convert to ucs4 */
+      entry->result = g_utf8_get_char_validated (scanner->value.v_string, -1);
+      break;
+
+    case G_TOKEN_INT:
+      /* This is expected to be a unichar. (Not a keyval) */
+      entry->result = scanner->value.v_int;
+      break;
+
+    default:
+      return G_TOKEN_INT;
+    }
+  if (!g_unichar_validate (entry->result))
+    return G_TOKEN_ERROR;
+
+  return G_TOKEN_NONE;
+}
+
+guint
+gtk_compose_parse_compose_table (GScanner * scanner,
+				 GtkPathPriorityType default_priority)
+{
+  GtkPathPriorityType priority;
+  GtkComposeTable *table;
+  GtkComposeEntry *entry;
+  GSList *slist, *sl_entries;
+  guint expected_token;
+  gchar *name;
+  gint n, max_seq_len;
+  gboolean skip = FALSE;
+
+  g_return_val_if_fail (scanner != NULL, G_TOKEN_ERROR);
+
+  priority = default_priority;
+
+  if (g_scanner_get_next_token (scanner) != GTK_RC_TOKEN_COMPOSE_TABLE)
+    return GTK_RC_TOKEN_COMPOSE_TABLE;
+
+  /* Optional table name */
+  if (g_scanner_peek_next_token (scanner) == G_TOKEN_STRING)
+    {
+      g_scanner_get_next_token (scanner);
+      name = g_strdup (scanner->value.v_string);
+      g_scanner_peek_next_token (scanner);
+    }
+  else
+    name = NULL;
+
+  /* Optional priority */
+  if (scanner->next_token == ':')
+    {
+      expected_token = gtk_rc_parse_priority (scanner, &priority);
+      if (expected_token != G_TOKEN_NONE)
+	return expected_token;
+    }
+
+  if (g_scanner_get_next_token (scanner) != '{')
+    return '{';
+
+  if (name)
+    table = gtk_compose_table_find (name);
+  else
+    table = NULL;
+
+  if (table)
+    {
+      /* Don't replace a table with higher priority. */
+      /* Built-in tables cannot be replaced. */
+      if (table->priority > priority || !table->parsed)
+	skip = TRUE;
+      else
+	gtk_compose_table_delete (table);
+    }
+
+  if (!skip)
+    {
+      table = gtk_compose_table_new (name, priority);
+      table->parsed = 1;
+    }
+  g_free (name);
+
+  sl_entries = NULL;
+  max_seq_len = 0;
+  g_scanner_peek_next_token (scanner);
+  while (scanner->next_token != '}')
+    {
+      switch (scanner->next_token)
+	{
+	case GTK_RC_TOKEN_COMPOSE:
+	  entry = compose_entry_new ();
+	  sl_entries = g_slist_prepend (sl_entries, entry);
+	  expected_token = gtk_compose_parse_compose (scanner, entry);
+	  if (expected_token != G_TOKEN_NONE)
+	    goto out;
+	  max_seq_len = MAX (max_seq_len, entry->seq_len);
+	  break;
+	default:
+	  g_scanner_get_next_token (scanner);
+	  expected_token = '}';
+	  goto out;
+	}
+      g_scanner_peek_next_token (scanner);
+    }
+  g_scanner_get_next_token (scanner);
+  expected_token = G_TOKEN_NONE;
+
+  if (skip)
+    goto out;
+
+  table->max_seq_len = max_seq_len;
+  table->n_seqs = g_slist_length (sl_entries);
+  table->data = g_new0 (guint16, (max_seq_len + 2) * table->n_seqs);
+
+  for (slist = sl_entries, n = 0; slist; slist = g_slist_next (slist))
+    {
+      entry = slist->data;
+      g_memmove (&table->data[n], entry->seq,
+		 entry->seq_len * sizeof (guint16));
+      n += max_seq_len;
+      table->data[n++] = entry->result >> 16;
+      table->data[n++] = entry->result & 0xFFFF;
+    }
+
+  g_qsort_with_data (table->data, table->n_seqs,
+		     (max_seq_len + 2) * sizeof (guint16),
+		     compare_seqs, GINT_TO_POINTER (max_seq_len));
+
+out:
+  for (slist = sl_entries; slist; slist = g_slist_next (slist))
+    {
+      compose_entry_free (slist->data);
+    }
+  g_slist_free (sl_entries);
+  return expected_token;
+}
+
+/**
+ * _gtk_compose_reset_parsed:
+ * 
+ * Removes all compose tables that were added by
+ * gtk_compose_parse_compose()
+ **/
+void
+_gtk_compose_reset_parsed (void)
+{
+  GSList *slist, *next;
+
+  slist = gtk_compose_table_list;
+  while (slist)
+    {
+      GtkComposeTable *compose_table;
+
+      compose_table = slist->data;
+      next = slist->next;
+
+      if (compose_table->parsed)
+	gtk_compose_table_delete (compose_table);
+
+      slist = next;
+    }
+}
diff -Nur gtk+.ori/gtk/gtkcompose.h gtk+/gtk/gtkcompose.h
--- gtk+.ori/gtk/gtkcompose.h	1970-01-01 01:00:00.000000000 +0100
+++ gtk+/gtk/gtkcompose.h	2004-10-10 12:48:05.000000000 +0200
@@ -0,0 +1,82 @@
+/* GTK - The GIMP Toolkit
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * GtkComposeTable: Keycompose manager for GtkObjects.
+ * Copyright (C) 2004 Leonard Michlmayr
+ *
+ * Uses parts of GtkBinding:
+ * Copyright (C) 1998 Tim Janik
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
+ * file for a list of people on the GTK+ Team.  See the ChangeLog
+ * files for a list of changes.  These files are distributed with
+ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
+ */
+
+#ifndef __GTK_COMPOSE_H__
+#define __GTK_COMPOSE_H__
+
+#include "gtkobject.h"
+#include "gtkenums.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif				/* __cplusplus */
+
+
+/* Types */
+
+typedef struct _GtkComposeTable GtkComposeTable;
+
+struct _GtkComposeTable
+{
+  guint16 *data;
+  gint max_seq_len;
+  gint n_seqs;
+  gchar *table_name;
+  GtkPathPriorityType priority;
+  guint parsed:1;
+};
+
+/* Variables */
+
+extern GSList *gtk_compose_table_list;
+
+/* Application-level methods */
+
+GtkComposeTable *gtk_compose_table_new (gchar const *name,
+					GtkPathPriorityType priority);
+GtkComposeTable *gtk_compose_table_find (gchar const *name);
+void gtk_compose_table_delete (GtkComposeTable * compose_table);
+
+/* Non-public methods */
+
+guint gtk_compose_parse_compose_table (GScanner * scanner,
+				       GtkPathPriorityType
+				       default_priority);
+void _gtk_compose_reset_parsed (void);
+
+#ifdef __cplusplus
+}
+#endif				/* __cplusplus */
+
+
+#endif				/* __GTK_COMPOSE_H__ */
diff -Nur gtk+.ori/gtk/gtkimcontextsimple.c gtk+/gtk/gtkimcontextsimple.c
--- gtk+.ori/gtk/gtkimcontextsimple.c	2004-08-09 18:59:52.000000000 +0200
+++ gtk+/gtk/gtkimcontextsimple.c	2004-10-10 03:50:19.000000000 +0200
@@ -24,15 +24,7 @@
 #include "gtkalias.h"
 #include "gtkaccelgroup.h"
 #include "gtkimcontextsimple.h"
-
-typedef struct _GtkComposeTable GtkComposeTable;
-
-struct _GtkComposeTable 
-{
-  const guint16 *data;
-  gint max_seq_len;
-  gint n_seqs;
-};
+#include "gtkcompose.h"
 
 /* The following table was generated from the X compose tables include with
  * XFree86 4.0 using a set of Perl scripts. Contact Owen Taylor <otaylor@redhat.com>
@@ -899,12 +891,6 @@
   GDK_Multi_key,	GDK_Greek_omega,	GDK_apostrophe,	0,	0,	0x03CE,	/* GREEK SMALL LETTER OMEGA WITH TONOS */
 };
 
-static const GtkComposeTable gtk_compose_table = {
-  gtk_compose_seqs,
-  4,
-  G_N_ELEMENTS (gtk_compose_seqs) / 6
-};
-
 static const guint16 gtk_compose_ignore[] = {
   GDK_Shift_L,
   GDK_Shift_R,
@@ -969,6 +955,7 @@
 {
   GtkIMContextClass *im_context_class = GTK_IM_CONTEXT_CLASS (class);
   GObjectClass *gobject_class = G_OBJECT_CLASS (class);
+  GtkComposeTable *table;
 
   parent_class = g_type_class_peek_parent (class);
 
@@ -976,6 +963,12 @@
   im_context_class->reset = gtk_im_context_simple_reset;
   im_context_class->get_preedit_string = gtk_im_context_simple_get_preedit_string;
   gobject_class->finalize = gtk_im_context_simple_finalize;
+
+  table = gtk_compose_table_new ("default", GTK_PATH_PRIO_GTK);
+  table->data = g_memdup (gtk_compose_seqs, sizeof (gtk_compose_seqs));
+  table->max_seq_len = 4;
+  table->n_seqs = G_N_ELEMENTS (gtk_compose_seqs) / 6;
+  table->parsed = FALSE;
 }
 
 static void
@@ -1064,7 +1057,15 @@
 	     gint                   n_compose)
 {
   gint row_stride = table->max_seq_len + 2; 
-  guint16 *seq = bsearch (context_simple->compose_buffer,
+  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);
@@ -1386,8 +1387,13 @@
           tmp_list = tmp_list->next;
         }
   
-      if (check_table (context_simple, &gtk_compose_table, n_compose))
-        return TRUE;
+      tmp_list = gtk_compose_table_list;
+      while (tmp_list)
+        {
+          if (check_table (context_simple, tmp_list->data, n_compose))
+            return TRUE;
+          tmp_list = tmp_list->next;
+        }
     }
   
   /* The current compose_buffer doesn't match anything */
@@ -1498,6 +1504,9 @@
   table->data = data;
   table->max_seq_len = max_seq_len;
   table->n_seqs = n_seqs;
+  table->table_name = NULL;
+  table->priority = GTK_PATH_PRIO_HIGHEST;
+  table->parsed = FALSE;
 
   context_simple->tables = g_slist_prepend (context_simple->tables, table);
 }
diff -Nur gtk+.ori/gtk/gtkrc.c gtk+/gtk/gtkrc.c
--- gtk+.ori/gtk/gtkrc.c	2004-08-09 18:59:52.000000000 +0200
+++ gtk+/gtk/gtkrc.c	2004-10-10 03:50:22.000000000 +0200
@@ -51,6 +51,7 @@
 #include "gtkversion.h"
 #include "gtkrc.h"
 #include "gtkbindings.h"
+#include "gtkcompose.h"
 #include "gtkthemes.h"
 #include "gtkintl.h"
 #include "gtkiconfactory.h"
@@ -99,6 +100,7 @@
 
   gchar *theme_name;
   gchar *key_theme_name;
+  gchar *compose_theme_name;
   gchar *font_name;
   
   gchar *pixmap_path[GTK_RC_MAX_PIXMAP_PATHS];
@@ -279,7 +281,9 @@
   { "stock", GTK_RC_TOKEN_STOCK },
   { "im_module_file", GTK_RC_TOKEN_IM_MODULE_FILE },
   { "LTR", GTK_RC_TOKEN_LTR },
-  { "RTL", GTK_RC_TOKEN_RTL }
+  { "RTL", GTK_RC_TOKEN_RTL },
+  { "composetable", GTK_RC_TOKEN_COMPOSE_TABLE },
+  { "compose", GTK_RC_TOKEN_COMPOSE }
 };
 
 static GHashTable *realized_style_ht = NULL;
@@ -520,22 +524,27 @@
 {
   gchar *new_theme_name;
   gchar *new_key_theme_name;
+  gchar *new_compose_theme_name;
 
   g_object_get (settings,
 		"gtk-theme-name", &new_theme_name,
 		"gtk-key-theme-name", &new_key_theme_name,
+		"gtk-compose-theme-name", &new_compose_theme_name,
 		NULL);
 
   if ((new_theme_name != context->theme_name && 
        !(new_theme_name && context->theme_name && strcmp (new_theme_name, context->theme_name) == 0)) ||
       (new_key_theme_name != context->key_theme_name &&
-       !(new_key_theme_name && context->key_theme_name && strcmp (new_key_theme_name, context->key_theme_name) == 0)))
+       !(new_key_theme_name && context->key_theme_name && strcmp (new_key_theme_name, context->key_theme_name) == 0)) ||
+      (new_compose_theme_name != context->compose_theme_name &&
+       !(new_compose_theme_name && context->compose_theme_name && strcmp (new_compose_theme_name, context->compose_theme_name) == 0)))
     {
       gtk_rc_reparse_all_for_settings (settings, TRUE);
     }
 
   g_free (new_theme_name);
   g_free (new_key_theme_name);
+  g_free (new_compose_theme_name);
 }
 
 static void
@@ -564,6 +573,7 @@
       g_object_get (settings,
 		    "gtk-theme-name", &context->theme_name,
 		    "gtk-key-theme-name", &context->key_theme_name,
+		    "gtk-compose-theme-name", &context->compose_theme_name,
 		    "gtk-font-name", &context->font_name,
 		    NULL);
 
@@ -575,6 +585,10 @@
 			"notify::gtk-key-theme-name",
 			G_CALLBACK (gtk_rc_settings_changed),
 			context);
+      g_signal_connect (settings,
+			"notify::gtk-compose-theme-name",
+			G_CALLBACK (gtk_rc_settings_changed),
+			context);
       g_signal_connect (settings,
 			"notify::gtk-font-name",
 			G_CALLBACK (gtk_rc_font_name_changed),
@@ -1471,6 +1485,7 @@
   if (force_load || mtime_modified)
     {
       _gtk_binding_reset_parsed ();
+      _gtk_compose_reset_parsed ();
       gtk_rc_clear_styles (context);
       g_object_freeze_notify (G_OBJECT (context->settings));
 
@@ -1509,16 +1524,20 @@
 
       g_free (context->theme_name);
       g_free (context->key_theme_name);
+      g_free (context->compose_theme_name);
 
       g_object_get (context->settings,
 		    "gtk-theme-name", &context->theme_name,
 		    "gtk-key-theme-name", &context->key_theme_name,
+		    "gtk-compose-theme-name", &context->compose_theme_name,
 		    NULL);
 
       if (context->theme_name && context->theme_name[0])
 	gtk_rc_parse_named (context, context->theme_name, NULL);
       if (context->key_theme_name && context->key_theme_name[0])
 	gtk_rc_parse_named (context, context->key_theme_name, "key");
+      if (context->compose_theme_name && context->compose_theme_name[0])
+	gtk_rc_parse_named (context, context->compose_theme_name, "compose");
       
       g_object_thaw_notify (G_OBJECT (context->settings));
 
@@ -2421,6 +2440,9 @@
     case GTK_RC_TOKEN_BINDING:
       return gtk_binding_parse_binding (scanner);
       
+    case GTK_RC_TOKEN_COMPOSE_TABLE:
+      return gtk_compose_parse_compose_table (scanner, context->default_priority);
+
     case GTK_RC_TOKEN_PIXMAP_PATH:
       return gtk_rc_parse_pixmap_path (context, scanner);
       
diff -Nur gtk+.ori/gtk/gtkrc.h gtk+/gtk/gtkrc.h
--- gtk+.ori/gtk/gtkrc.h	2004-02-26 20:51:00.000000000 +0100
+++ gtk+/gtk/gtkrc.h	2004-10-10 02:46:55.000000000 +0200
@@ -204,6 +204,8 @@
   GTK_RC_TOKEN_STOCK,
   GTK_RC_TOKEN_LTR,
   GTK_RC_TOKEN_RTL,
+  GTK_RC_TOKEN_COMPOSE_TABLE,
+  GTK_RC_TOKEN_COMPOSE,
   GTK_RC_TOKEN_LAST
 } GtkRcTokenType;
 
diff -Nur gtk+.ori/gtk/gtksettings.c gtk+/gtk/gtksettings.c
--- gtk+.ori/gtk/gtksettings.c	2004-09-13 18:00:00.000000000 +0200
+++ gtk+/gtk/gtksettings.c	2004-10-10 02:46:55.000000000 +0200
@@ -60,6 +60,7 @@
   PROP_THEME_NAME,
   PROP_ICON_THEME_NAME,
   PROP_KEY_THEME_NAME,
+  PROP_COMPOSE_THEME_NAME,
   PROP_MENU_BAR_ACCEL,
   PROP_DND_DRAG_THRESHOLD,
   PROP_FONT_NAME,
@@ -328,6 +329,15 @@
                                              NULL);
   g_assert (result == PROP_KEY_THEME_NAME);    
 
+  result = settings_install_property_parser (class,
+                                             g_param_spec_string ("gtk-compose-theme-name",
+								  P_("Compose Theme Name"),
+								  P_("Name of compose theme RC file to load"),
+								  NULL,
+								  G_PARAM_READWRITE),
+                                             NULL);
+  g_assert (result == PROP_COMPOSE_THEME_NAME);    
+
   result = settings_install_property_parser (class,
                                              g_param_spec_string ("gtk-menu-bar-accel",
                                                                   P_("Menu bar accelerator"),
diff -Nur gtk+.ori/gtk/Makefile.am gtk+/gtk/Makefile.am
--- gtk+.ori/gtk/Makefile.am	2004-09-27 20:37:33.000000000 +0200
+++ gtk+/gtk/Makefile.am	2004-10-10 02:46:55.000000000 +0200
@@ -284,6 +284,7 @@
 # Installed header files without compatibility guarantees
 # that are not include in gtk/gtk.h
 gtk_semi_private_h_sources =    \
+	gtkcompose.h		\
 	gtktextlayout.h		\
 	gtkfilesystem.h
 
@@ -353,6 +354,7 @@
 	gtkcombo.c		\
 	gtkcombobox.c		\
 	gtkcomboboxentry.c	\
+	gtkcompose.c		\
 	gtkcontainer.c		\
 	gtkctree.c		\
 	gtkcurve.c		\
