[gtk+] quartz: fix coordinates for synthesized event
- From: Kristian Rietveld <kristian src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] quartz: fix coordinates for synthesized event
- Date: Sun, 22 Apr 2012 15:41:31 +0000 (UTC)
commit 89f166b54218ac3dc9b7b1584db9044d88f85966
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 6b89b35..d9d8ca7 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);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]