1diff --git a/gdk/quartz/gdkevents-quartz.c b/gdk/quartz/gdkevents-quartz.c 2index a8800f7..ec6a893 100644 3--- a/gdk/quartz/gdkevents-quartz.c 4+++ b/gdk/quartz/gdkevents-quartz.c 5@@ -292,10 +292,19 @@ get_keyboard_modifiers_from_ns_flags (NSUInteger nsflags) 6 modifiers |= GDK_SHIFT_MASK; 7 if (nsflags & NSControlKeyMask) 8 modifiers |= GDK_CONTROL_MASK; 9- if (nsflags & NSAlternateKeyMask) 10- modifiers |= GDK_MOD1_MASK; 11- if (nsflags & NSCommandKeyMask) 12- modifiers |= GDK_MOD2_MASK; 13+ 14+ if (gdk_quartz_get_fix_modifiers ()) 15+ { 16+ if (nsflags & NSAlternateKeyMask) 17+ modifiers |= GDK_MOD1_MASK; 18+ if (nsflags & NSCommandKeyMask) 19+ modifiers |= GDK_MOD2_MASK; 20+ } 21+ else 22+ { 23+ if (nsflags & NSCommandKeyMask) 24+ modifiers |= GDK_MOD1_MASK; 25+ } 26 27 return modifiers; 28 } 29@@ -930,7 +939,7 @@ fill_key_event (GdkWindow *window, 30 { 31 case GDK_Meta_R: 32 case GDK_Meta_L: 33- mask = GDK_MOD2_MASK; 34+ mask = gdk_quartz_get_fix_modifiers () ? GDK_MOD2_MASK : GDK_MOD1_MASK; 35 break; 36 case GDK_Shift_R: 37 case GDK_Shift_L: 38@@ -941,7 +950,7 @@ fill_key_event (GdkWindow *window, 39 break; 40 case GDK_Alt_R: 41 case GDK_Alt_L: 42- mask = GDK_MOD1_MASK; 43+ mask = gdk_quartz_get_fix_modifiers () ? GDK_MOD1_MASK : GDK_MOD2_MASK; 44 break; 45 case GDK_Control_R: 46 case GDK_Control_L: 47@@ -1089,9 +1098,9 @@ _gdk_quartz_events_get_current_keyboard_modifiers (void) 48 if (carbon_modifiers & controlKey) 49 modifiers |= GDK_CONTROL_MASK; 50 if (carbon_modifiers & optionKey) 51- modifiers |= GDK_MOD1_MASK; 52+ modifiers |= (gdk_quartz_get_fix_modifiers () ? GDK_MOD1_MASK : GDK_MOD2_MASK); 53 if (carbon_modifiers & cmdKey) 54- modifiers |= GDK_MOD2_MASK; 55+ modifiers |= (gdk_quartz_get_fix_modifiers () ? GDK_MOD2_MASK : GDK_MOD1_MASK); 56 57 return modifiers; 58 } 59diff --git a/gdk/quartz/gdkglobals-quartz.c b/gdk/quartz/gdkglobals-quartz.c 60index 53c6d5e..31dbab1 100644 61--- a/gdk/quartz/gdkglobals-quartz.c 62+++ b/gdk/quartz/gdkglobals-quartz.c 63@@ -41,3 +41,17 @@ gdk_quartz_osx_version (void) 64 else 65 return minor; 66 } 67+ 68+static gboolean fix_modifiers = FALSE; 69+ 70+void 71+gdk_quartz_set_fix_modifiers (gboolean fix) 72+{ 73+ fix_modifiers = fix; 74+} 75+ 76+gboolean 77+gdk_quartz_get_fix_modifiers (void) 78+{ 79+ return fix_modifiers; 80+} 81diff --git a/gdk/quartz/gdkkeys-quartz.c b/gdk/quartz/gdkkeys-quartz.c 82index 19a20f5..c7ceec6 100644 83--- a/gdk/quartz/gdkkeys-quartz.c 84+++ b/gdk/quartz/gdkkeys-quartz.c 85@@ -693,11 +693,11 @@ gdk_keymap_translate_keyboard_state (GdkKeymap *keymap, 86 for (bit = GDK_SHIFT_MASK; bit < GDK_BUTTON1_MASK; bit <<= 1) 87 { 88 if (translate_keysym (hardware_keycode, 89- (bit == GDK_MOD1_MASK) ? 0 : group, 90+ (bit == (gdk_quartz_get_fix_modifiers () ? GDK_MOD1_MASK : GDK_MOD2_MASK)) ? 0 : group, 91 state & ~bit, 92 NULL, NULL) != 93 translate_keysym (hardware_keycode, 94- (bit == GDK_MOD1_MASK) ? 1 : group, 95+ (bit == (gdk_quartz_get_fix_modifiers () ? GDK_MOD1_MASK : GDK_MOD2_MASK)) ? 1 : group, 96 state | bit, 97 NULL, NULL)) 98 tmp_modifiers |= bit; 99@@ -718,16 +718,32 @@ void 100 gdk_keymap_add_virtual_modifiers (GdkKeymap *keymap, 101 GdkModifierType *state) 102 { 103- if (*state & GDK_MOD2_MASK) 104- *state |= GDK_META_MASK; 105+ if (gdk_quartz_get_fix_modifiers ()) 106+ { 107+ if (*state & GDK_MOD2_MASK) 108+ *state |= GDK_META_MASK; 109+ } 110+ else 111+ { 112+ if (*state & GDK_MOD1_MASK) 113+ *state |= GDK_META_MASK; 114+ } 115 } 116 117 gboolean 118 gdk_keymap_map_virtual_modifiers (GdkKeymap *keymap, 119 GdkModifierType *state) 120 { 121- if (*state & GDK_META_MASK) 122- *state |= GDK_MOD2_MASK; 123+ if (gdk_quartz_get_fix_modifiers ()) 124+ { 125+ if (*state & GDK_META_MASK) 126+ *state |= GDK_MOD2_MASK; 127+ } 128+ else 129+ { 130+ if (*state & GDK_META_MASK) 131+ *state |= GDK_MOD1_MASK; 132+ } 133 134 return TRUE; 135 } 136diff --git a/gdk/quartz/gdkquartz.h b/gdk/quartz/gdkquartz.h 137index 742d651..ed0ba35 100644 138--- a/gdk/quartz/gdkquartz.h 139+++ b/gdk/quartz/gdkquartz.h 140@@ -58,6 +58,9 @@ id gdk_quartz_drag_context_get_dragging_info_libgtk_only (GdkDragContext 141 NSEvent *gdk_quartz_event_get_nsevent (GdkEvent *event); 142 GdkOSXVersion gdk_quartz_osx_version (void); 143 144+void gdk_quartz_set_fix_modifiers (gboolean fix); 145+gboolean gdk_quartz_get_fix_modifiers (void); 146+ 147 G_END_DECLS 148 149 #endif /* __GDK_QUARTZ_H__ */ 150diff --git a/gtk/gtkprivate.h b/gtk/gtkprivate.h 151index 6386c32..aa1cc74 100644 152--- a/gtk/gtkprivate.h 153+++ b/gtk/gtkprivate.h 154@@ -122,7 +122,7 @@ gboolean _gtk_fnmatch (const char *pattern, 155 #ifndef GDK_WINDOWING_QUARTZ 156 #define GTK_NO_TEXT_INPUT_MOD_MASK (GDK_MOD1_MASK | GDK_CONTROL_MASK) 157 #else 158-#define GTK_NO_TEXT_INPUT_MOD_MASK (GDK_MOD2_MASK | GDK_CONTROL_MASK) 159+#define GTK_NO_TEXT_INPUT_MOD_MASK (gdk_quartz_get_fix_modifiers () ? (GDK_MOD2_MASK | GDK_CONTROL_MASK) : (GDK_MOD1_MASK | GDK_CONTROL_MASK)) 160 #endif 161 162 #ifndef GDK_WINDOWING_QUARTZ 163@@ -130,13 +130,13 @@ gboolean _gtk_fnmatch (const char *pattern, 164 #define GTK_MODIFY_SELECTION_MOD_MASK GDK_CONTROL_MASK 165 #else 166 #define GTK_EXTEND_SELECTION_MOD_MASK GDK_SHIFT_MASK 167-#define GTK_MODIFY_SELECTION_MOD_MASK GDK_MOD2_MASK 168+#define GTK_MODIFY_SELECTION_MOD_MASK (gdk_quartz_get_fix_modifiers () ? GDK_MOD2_MASK : GDK_MOD1_MASK) 169 #endif 170 171 #ifndef GDK_WINDOWING_QUARTZ 172 #define GTK_TOGGLE_GROUP_MOD_MASK 0 173 #else 174-#define GTK_TOGGLE_GROUP_MOD_MASK GDK_MOD1_MASK 175+#define GTK_TOGGLE_GROUP_MOD_MASK (gdk_quartz_get_fix_modifiers () ? GDK_MOD1_MASK : 0) 176 #endif 177 178 gboolean _gtk_button_event_triggers_context_menu (GdkEventButton *event); 179