Index: gdk/quartz/gdkevents-quartz.c
===================================================================
--- gdk/quartz/gdkevents-quartz.c	(revision 21712)
+++ gdk/quartz/gdkevents-quartz.c	(working copy)
@@ -436,7 +436,10 @@ get_mouse_button_from_ns_event (NSEvent 
   switch (button)
     {
     case 0:
-      return 1;
+      if ([event modifierFlags] & NSControlKeyMask)
+        return 3;
+      else
+        return 1;
     case 1:
       return 3;
     case 2:
@@ -465,17 +468,29 @@ get_keyboard_modifiers_from_ns_event (NS
 {
   GdkModifierType modifiers = 0;
   int nsflags;
+  gboolean swap_ctrl_cmd = FALSE;
 
   nsflags = [nsevent modifierFlags];
-  
+
+  switch ([nsevent type])
+    {
+      case NSLeftMouseDown:
+      case NSLeftMouseUp:
+      case NSLeftMouseDragged:
+        swap_ctrl_cmd = TRUE;
+        break;
+      default:
+        break;
+    }
+
   if (nsflags & NSAlphaShiftKeyMask)
     modifiers |= GDK_LOCK_MASK;
   if (nsflags & NSShiftKeyMask)
     modifiers |= GDK_SHIFT_MASK;
   if (nsflags & NSControlKeyMask)
-    modifiers |= GDK_CONTROL_MASK;
+    modifiers |= swap_ctrl_cmd ? GDK_META_MASK : GDK_CONTROL_MASK;
   if (nsflags & NSCommandKeyMask)
-    modifiers |= GDK_META_MASK;
+    modifiers |= swap_ctrl_cmd ? GDK_CONTROL_MASK : GDK_META_MASK;
   if (nsflags & NSAlternateKeyMask)
     modifiers |= GDK_MOD1_MASK;
 
