]> Pileus Git - ~andy/gtk/commitdiff
quartz: fix coordinates for synthesized event
authorKristian Rietveld <kris@lanedo.com>
Sun, 22 Apr 2012 15:11:38 +0000 (17:11 +0200)
committerKristian Rietveld <kris@lanedo.com>
Sun, 22 Apr 2012 15:38:52 +0000 (17:38 +0200)
Of course, we must pass coordinates in the NSWindow coordinate system
when creating an NSEvent. This fixes drag icon positioning and makes
the icon slide back to the correct position when the drag is
canceled.

gtk/gtkdnd-quartz.c

index 6b89b355c39f8352b32bea476842941b242a6510..d9d8ca72a9f9b5784ce4c8fa4d71a65ae6fa27cc 100644 (file)
@@ -1090,7 +1090,7 @@ gtk_drag_begin_idle (gpointer arg)
 
   [nswindow dragImage:drag_image
                    at:point
-               offset:NSMakeSize(0, 0)
+               offset:NSZeroSize
                 event:info->nsevent
            pasteboard:pasteboard
                source:nswindow
@@ -1134,8 +1134,25 @@ gtk_drag_begin_internal (GtkWidget         *widget,
     {
       if (gdk_event_get_coords (event, &x, &y))
         {
+          /* We need to translate (x, y) to coordinates relative to the
+           * toplevel GdkWindow, which should be the GdkWindow backing
+           * nswindow. Then, we convert to the NSWindow coordinate system.
+           */
+          GdkWindow *window = event->any.window;
+          GdkWindow *toplevel = gdk_window_get_effective_toplevel (window);
+
+          while (window != toplevel)
+            {
+              double old_x = x;
+              double old_y = y;
+
+              gdk_window_coords_to_parent (window, old_x, old_y,
+                                           &x, &y);
+              window = gdk_window_get_effective_parent (window);
+            }
+
           point.x = x;
-          point.y = y;
+          point.y = gdk_window_get_height (window) - y;
         }
       time = (double)gdk_event_get_time (event);
     }