From: Kristian Rietveld Date: Sun, 22 Apr 2012 15:11:38 +0000 (+0200) Subject: quartz: fix coordinates for synthesized event X-Git-Url: http://pileus.org/git/?a=commitdiff_plain;h=89f166b54218ac3dc9b7b1584db9044d88f85966;p=~andy%2Fgtk 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. --- diff --git a/gtk/gtkdnd-quartz.c b/gtk/gtkdnd-quartz.c index 6b89b355c..d9d8ca72a 100644 --- a/gtk/gtkdnd-quartz.c +++ b/gtk/gtkdnd-quartz.c @@ -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); }