[gtk+/gtk-2-24] quartz: fix coordinates for synthesized event
- From: Kristian Rietveld <kristian src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/gtk-2-24] quartz: fix coordinates for synthesized event
- Date: Sun, 22 Apr 2012 15:17:13 +0000 (UTC)
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]