Index: quartz/GdkQuartzWindow.c
===================================================================
--- quartz/GdkQuartzWindow.c    (revision 21770)
+++ quartz/GdkQuartzWindow.c    (working copy)
@@ -461,8 +461,29 @@
 {
   GdkDragAction result = 0;
 
+  /* GDK and Quartz drag operations do not map 1:1.
+     This mapping represents about the best that we
+     can come up.
+
+     Note that NSDragOperationPrivate and GDK_ACTION_PRIVATE
+     have almost opposite meanings: the GDK one means that the
+     destination is solely responsible for the action; the Quartz
+     one means that the source and destination will agree
+     privately on the action. NSOperationGeneric is close in meaning
+     to GDK_ACTION_PRIVATE but there is a problem: it will be
+     sent for any ordinary drag, and likely not understood
+     by any intra-widget drag (since the source & dest are the
+     same)
+   */
+
   if (operation & NSDragOperationGeneric)
+    result |= GDK_ACTION_MOVE;
+  if (operation & NSDragOperationCopy)
     result |= GDK_ACTION_COPY;
+  if (operation & NSDragOperationMove)
+    result |= GDK_ACTION_MOVE;
+  if (operation & NSDragOperationLink)
+    result |= GDK_ACTION_LINK;
 
   return result;
 }
@@ -474,6 +495,10 @@
 
   if (action & GDK_ACTION_COPY)
     result |= NSDragOperationCopy;
+  if (action & GDK_ACTION_LINK)
+    result |= NSDragOperationLink;
+  if (action & GDK_ACTION_MOVE)
+    result |= NSDragOperationMove;
 
   return result;
 }
@@ -485,6 +510,7 @@
 
   GDK_DRAG_CONTEXT_PRIVATE (current_context)->dragging_info = sender;
   current_context->suggested_action = drag_operation_to_drag_action ([sender draggin
gSourceOperationMask]);
+  current_context->actions = current_context->suggested_action;
 }
 
 - (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender
@@ -510,6 +536,10 @@
 
 - (void)draggingEnded:(id <NSDraggingInfo>)sender
 {
+  /* leave a note for the source about what action was taken */
+  if (_gdk_quartz_drag_source_context && current_context) 
+   _gdk_quartz_drag_source_context->action = current_context->action;
+
   if (current_context)
     g_object_unref (current_context);
   current_context = NULL;
