[gtk+/gtk-2-24] quartz: fix coordinates for synthesized event



commit f91c525fe23a71abe389746bc5560bfe507ae5cb
Author: Kristian Rietveld <kris lanedo com>
Date:   Sun Apr 22 17:11:38 2012 +0200

    quartz: fix coordinates for synthesized event
    
    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 |   21 +++++++++++++++++++--
 1 files changed, 19 insertions(+), 2 deletions(-)
---
diff --git a/gtk/gtkdnd-quartz.c b/gtk/gtkdnd-quartz.c
index 6be1c15..44ab020 100644
--- a/gtk/gtkdnd-quartz.c
+++ b/gtk/gtkdnd-quartz.c
@@ -1108,7 +1108,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
@@ -1143,8 +1143,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);
     }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]