[gtk+/gtk-2-24-quartz] gdk: exclude MOD1 from the virtual modifier mapping



commit 7c9d87e377336bfc919aaa2cd7bfc24614f836ea
Author: Michael Natterer <mitch gimp org>
Date:   Mon Nov 7 20:09:00 2011 +0100

    gdk: exclude MOD1 from the virtual modifier mapping
    
    which effectively nails down the MOD1 == ALT assumption that is valid
    in all other parts of GTK+. After the modifier abstraction fixes for
    OSX, the virtual mapping is now (correctly) used in more places, and
    caused problems with the common default PC keyboard layout on X11 that
    colocates ALT and META on the same key.
    (cherry picked from commit ac943bf69a87c992cfde59c6720ef08fdd20e683)

 gdk/x11/gdkkeys-x11.c |   20 ++++++++++++--------
 1 files changed, 12 insertions(+), 8 deletions(-)
---
diff --git a/gdk/x11/gdkkeys-x11.c b/gdk/x11/gdkkeys-x11.c
index ae4d7fa..c6495f7 100644
--- a/gdk/x11/gdkkeys-x11.c
+++ b/gdk/x11/gdkkeys-x11.c
@@ -1684,13 +1684,12 @@ _gdk_keymap_add_virtual_modifiers_compat (GdkKeymap       *keymap,
   keymap = GET_EFFECTIVE_KEYMAP (keymap);
   keymap_x11 = GDK_KEYMAP_X11 (keymap);
 
-  for (i = 3; i < 8; i++)
+  /* See comment in add_virtual_modifiers() */
+  for (i = 4; i < 8; i++)
     {
       if ((1 << i) & *modifiers)
         {
-	  if (keymap_x11->modmap[i] & GDK_MOD1_MASK)
-	    *modifiers |= GDK_MOD1_MASK;
-	  else if (keymap_x11->modmap[i] & GDK_SUPER_MASK)
+	  if (keymap_x11->modmap[i] & GDK_SUPER_MASK)
 	    *modifiers |= GDK_SUPER_MASK;
 	  else if (keymap_x11->modmap[i] & GDK_HYPER_MASK)
 	    *modifiers |= GDK_HYPER_MASK;
@@ -1729,12 +1728,16 @@ gdk_keymap_add_virtual_modifiers (GdkKeymap       *keymap,
   keymap = GET_EFFECTIVE_KEYMAP (keymap);
   keymap_x11 = GDK_KEYMAP_X11 (keymap);
 
-  for (i = 3; i < 8; i++)
+  /*  This loop used to start at 3, which included MOD1 in the
+   *  virtual mapping. However, all of GTK+ treats MOD1 as a
+   *  synonym for Alt, and does not expect it to be mapped around,
+   *  therefore it's more sane to simply treat MOD1 like SHIFT and
+   *  CONTROL, which are not mappable either.
+   */
+  for (i = 4; i < 8; i++)
     {
       if ((1 << i) & *state)
         {
-	  if (keymap_x11->modmap[i] & GDK_MOD1_MASK)
-	    *state |= GDK_MOD1_MASK;
 	  if (keymap_x11->modmap[i] & GDK_SUPER_MASK)
 	    *state |= GDK_SUPER_MASK;
 	  if (keymap_x11->modmap[i] & GDK_HYPER_MASK)
@@ -1822,7 +1825,8 @@ gdk_keymap_map_virtual_modifiers (GdkKeymap       *keymap,
     {
       if (*state & vmods[j])
         {
-          for (i = 3; i < 8; i++)
+          /* See comment in add_virtual_modifiers() */
+          for (i = 4; i < 8; i++)
             {
               if (keymap_x11->modmap[i] & vmods[j])
                 {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]