[gtk+] Implement gtk_drag_begin_with_coordinates () for quartz.
- From: John Ralls <jralls src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] Implement gtk_drag_begin_with_coordinates () for quartz.
- Date: Thu, 10 Oct 2013 22:41:06 +0000 (UTC)
commit 9e0faf6a38d9029485455d24d5cff0e42519ad01
Author: John Ralls <jralls ceridwen us>
Date: Thu Oct 10 15:34:08 2013 -0700
Implement gtk_drag_begin_with_coordinates () for quartz.
gtk/gtkdnd-quartz.c | 88 ++++++++++++++++++++++++++++++++++-----------------
1 files changed, 59 insertions(+), 29 deletions(-)
---
diff --git a/gtk/gtkdnd-quartz.c b/gtk/gtkdnd-quartz.c
index ff37b58..1ec5db5 100644
--- a/gtk/gtkdnd-quartz.c
+++ b/gtk/gtkdnd-quartz.c
@@ -1194,7 +1194,9 @@ gtk_drag_begin_internal (GtkWidget *widget,
GtkTargetList *target_list,
GdkDragAction actions,
gint button,
- GdkEvent *event)
+ GdkEvent *event,
+ gint x,
+ gint y)
{
GtkDragSourceInfo *info;
GdkDevice *pointer;
@@ -1202,36 +1204,49 @@ gtk_drag_begin_internal (GtkWidget *widget,
GdkDragContext *context;
NSWindow *nswindow = get_toplevel_nswindow (widget);
NSPoint point = {0, 0};
- gdouble x, y;
double time = (double)g_get_real_time ();
NSEvent *nsevent;
NSTimeInterval nstime;
- if (event)
+ if ((x != -1 && y != -1) || event)
{
- 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);
- }
+ GdkWindow *window;
+ gdouble dx, dy;
+ if (x != -1 && y != -1)
+ {
+ GtkWidget *toplevel = gtk_widget_get_toplevel (widget);
+ window = gtk_widget_get_window (toplevel);
+ gtk_widget_translate_coordinates (widget, toplevel, x, y, &x, &y);
+ gdk_window_get_root_coords (gtk_widget_get_window (toplevel), x, y,
+ &x, &y);
+ dx = (gdouble)x;
+ dy = (gdouble)y;
+ }
+ else if (event)
+ {
+ if (gdk_event_get_coords (event, &dx, &dy))
+ {
+ /* 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.
+ */
+ window = event->any.window;
+ GdkWindow *toplevel = gdk_window_get_effective_toplevel (window);
+
+ while (window != toplevel)
+ {
+ double old_x = dx;
+ double old_y = dy;
- point.x = x;
- point.y = gdk_window_get_height (window) - y;
- }
- time = (double)gdk_event_get_time (event);
+ gdk_window_coords_to_parent (window, old_x, old_y,
+ &dx, &dy);
+ window = gdk_window_get_effective_parent (window);
+ }
+ }
+ time = (double)gdk_event_get_time (event);
+ }
+ point.x = dx;
+ point.y = gdk_window_get_height (window) - dy;
}
nstime = [[NSDate dateWithTimeIntervalSince1970: time / 1000] timeIntervalSinceReferenceDate];
@@ -1309,6 +1324,22 @@ gtk_drag_begin_internal (GtkWidget *widget,
return context;
}
+GdkDragContext *
+gtk_drag_begin_with_coordinates (GtkWidget *widget,
+ GtkTargetList *targets,
+ GdkDragAction actions,
+ gint button,
+ GdkEvent *event,
+ gint x,
+ gint y)
+{
+ g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
+ g_return_val_if_fail (gtk_widget_get_realized (widget), NULL);
+ g_return_val_if_fail (targets != NULL, NULL);
+
+ return gtk_drag_begin_internal (widget, NULL, targets,
+ actions, button, event, x, y);
+}
/**
* gtk_drag_begin: (method)
* @widget: the source widget.
@@ -1330,7 +1361,7 @@ gtk_drag_begin (GtkWidget *widget,
g_return_val_if_fail (targets != NULL, NULL);
return gtk_drag_begin_internal (widget, NULL, targets,
- actions, button, event);
+ actions, button, event, -1, -1);
}
@@ -1368,7 +1399,7 @@ gtk_drag_source_event_cb (GtkWidget *widget,
int i;
for (i=1; i<6; i++)
{
- if (site->state & event->motion.state &
+ if (site->state & event->motion.state &
GDK_BUTTON1_MASK << (i - 1))
break;
}
@@ -1378,8 +1409,7 @@ gtk_drag_source_event_cb (GtkWidget *widget,
{
site->state = 0;
gtk_drag_begin_internal (widget, site, site->target_list,
- site->actions,
- i, event);
+ site->actions, i, event, -1, -1);
retval = TRUE;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]