summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Rietveld <kris@lanedo.com>2012-04-22 17:11:38 +0200
committerKristian Rietveld <kris@lanedo.com>2012-04-22 17:11:38 +0200
commitf91c525fe23a71abe389746bc5560bfe507ae5cb (patch)
tree8d8c67f81d487995b8ec58c4a04b02c66dc2bd2b
parent5f25687104f77aba310ac32c35d263f9d565d983 (diff)
downloadgtk+-f91c525fe23a71abe389746bc5560bfe507ae5cb.tar.gz
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.
-rw-r--r--gtk/gtkdnd-quartz.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/gtk/gtkdnd-quartz.c b/gtk/gtkdnd-quartz.c
index 6be1c150ae..44ab02099d 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);
}