diff -ruN gtk+-2.2.4-orig/gdk/x11/gdkkeys-x11.c gtk+-2.2.4-new/gdk/x11/gdkkeys-x11.c
--- gtk+-2.2.4-orig/gdk/x11/gdkkeys-x11.c	2003-08-26 15:11:15.000000000 +0100
+++ gtk+-2.2.4-new/gdk/x11/gdkkeys-x11.c	2004-06-15 12:52:33.000000000 +0100
@@ -242,6 +242,57 @@
       keymap_x11->keymap = XGetKeyboardMapping (xdisplay, keymap_x11->min_keycode,
 						keymap_x11->max_keycode - keymap_x11->min_keycode + 1,
 						&keymap_x11->keysyms_per_keycode);
+      
+      // The KEYSYMS_PER_INDEX macro (and possibly other code in
+      // this file) has logic which assumes that the value of 
+      // keysyms_per_keycode is an even number. ReflectionX 10.0
+      // returns a value of 3 when in SwissGerman keyboard 
+      // layout, since there are no keysyms defined for the 
+      // combination Mode_Switch+Shift. This breaks the macro
+      // resulting in the presence of Mode_Switch being lost
+      // during the keysym lookup. As a simple test case, try
+      // entering the combination AltGr+7 when in SwissGerman
+      // keyboard layout. The desired result is a pipe / vertical
+      // bar '|', but without this patch the actual result is '7'
+      
+      // This code re-allocates the keymap enlarging it so that 
+      // keysyms_per_keycode is an even number. The extra
+      // elements are filled with a value of NoSymbol. This 
+      // replicates behaviour of XFree86 w/ SwissGerman layout.
+      if (keymap_x11->keysyms_per_keycode % 2) 
+        {
+          int i, j;
+          KeySym* orig_keymap = keymap_x11->keymap;
+          int orig_keysyms_per_keycode = 
+            keymap_x11->keysyms_per_keycode;
+          int orig_count = (keymap_x11->max_keycode - 
+                            keymap_x11->min_keycode + 1);
+          
+          keymap_x11->keysyms_per_keycode++;
+          
+          keymap_x11->keymap = malloc(sizeof(KeySym) * orig_count * 
+                                      keymap_x11->keysyms_per_keycode);
+          
+          for (i = 0 ; i < orig_count ; i++) 
+            {
+              for (j = 0 ; j <= orig_keysyms_per_keycode ; j++) 
+                {
+                  if (j == orig_keysyms_per_keycode) 
+                    {
+                      keymap_x11->keymap[(i*keymap_x11->keysyms_per_keycode)+j] = 
+                        NoSymbol;
+                    } 
+                  else 
+                    {
+                      keymap_x11->keymap[(i*keymap_x11->keysyms_per_keycode)+j] =
+                        orig_keymap[(i*orig_keysyms_per_keycode)+j];
+                    }
+                }
+            }
+          
+          XFree(orig_keymap);
+        }
+      
 
 
       /* GDK_ISO_Left_Tab, as usually configured through XKB, really messes
