]> Pileus Git - ~andy/gtk/commitdiff
quartz: resolve the modifier confusion on the Mac
authorMichael Natterer <mitch@lanedo.com>
Fri, 16 Sep 2011 13:54:03 +0000 (15:54 +0200)
committerMichael Natterer <mitch@gimp.org>
Mon, 26 Sep 2011 14:01:50 +0000 (16:01 +0200)
- map Alt/Option to MOD1
- map Command to MOD2
- map MOD2 to the virtual Meta
- improve/fix (?) group handling in gdkkeys-quartz.c

gdk/quartz/gdkevents-quartz.c
gdk/quartz/gdkkeys-quartz.c

index f7f42aca7c40d7d4448cc44353dfd834dd03729f..546fa231e562031f317d9f3e5d0c8c8930d85123 100644 (file)
@@ -223,8 +223,10 @@ get_keyboard_modifiers_from_ns_event (NSEvent *nsevent)
     modifiers |= GDK_SHIFT_MASK;
   if (nsflags & NSControlKeyMask)
     modifiers |= GDK_CONTROL_MASK;
-  if (nsflags & NSCommandKeyMask)
+  if (nsflags & NSAlternateKeyMask)
     modifiers |= GDK_MOD1_MASK;
+  if (nsflags & NSCommandKeyMask)
+    modifiers |= GDK_MOD2_MASK;
 
   return modifiers;
 }
@@ -912,7 +914,7 @@ fill_key_event (GdkWindow    *window,
         {
         case GDK_KEY_Meta_R:
         case GDK_KEY_Meta_L:
-          mask = GDK_MOD1_MASK;
+          mask = GDK_MOD2_MASK;
           break;
         case GDK_KEY_Shift_R:
         case GDK_KEY_Shift_L:
@@ -923,7 +925,7 @@ fill_key_event (GdkWindow    *window,
           break;
         case GDK_KEY_Alt_R:
         case GDK_KEY_Alt_L:
-          mask = GDK_MOD5_MASK;
+          mask = GDK_MOD1_MASK;
           break;
         case GDK_KEY_Control_R:
         case GDK_KEY_Control_L:
index 70c9596bd67ecbc695a8a71c104668ef96796a69..9c925ae14c659cf088285bd8fd41330a431c278c 100644 (file)
@@ -561,8 +561,8 @@ gdk_quartz_keymap_get_entries_for_keyval (GdkKeymap     *keymap,
       (*n_keys)++;
 
       key.keycode = i / KEYVALS_PER_KEYCODE;
-      key.group = 0;
-      key.level = i % KEYVALS_PER_KEYCODE;
+      key.group = (i % KEYVALS_PER_KEYCODE) >= 2;
+      key.level = i % 2;
 
       g_array_append_val (keys_array, key);
     }
@@ -617,7 +617,7 @@ gdk_quartz_keymap_get_entries_for_keycode (GdkKeymap     *keymap,
          GdkKeymapKey key;
 
          key.keycode = hardware_keycode;
-         key.group = i / 2;
+         key.group = i >= 2;
          key.level = i % 2;
 
          g_array_append_val (keys_array, key);
@@ -673,6 +673,11 @@ translate_keysym (guint           hardware_keycode,
         tmp_keyval = upper;
     }
 
+  if (effective_group)
+    *effective_group = group;
+  if (effective_level)
+    *effective_level = level;
+
   return tmp_keyval;
 }
 
@@ -727,14 +732,17 @@ static void
 gdk_quartz_keymap_add_virtual_modifiers (GdkKeymap       *keymap,
                                          GdkModifierType *state)
 {
-  /* FIXME: For now, we've mimiced the Windows backend. */
+  if (*state & GDK_MOD2_MASK)
+    *state |= GDK_META_MASK;
 }
 
 static gboolean
 gdk_quartz_keymap_map_virtual_modifiers (GdkKeymap       *keymap,
                                          GdkModifierType *state)
 {
-  /* FIXME: For now, we've mimiced the Windows backend. */
+  if (*state & GDK_META_MASK)
+    *state |= GDK_MOD2_MASK;
+
   return TRUE;
 }