summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2017-03-31 18:25:04 +0200
committerCarlos Garnacho <carlosg@gnome.org>2017-05-25 16:25:58 +0200
commitef4f0e53364b51efea1d71f7770e8d52631c3cb0 (patch)
tree2e847a98496d665b9a97858b1e35348a19410aed /gtk
parent02932bc406502aa88e36ff840a983e1bcb24eb25 (diff)
downloadgtk+-ef4f0e53364b51efea1d71f7770e8d52631c3cb0.tar.gz
gtkwidget: Make gtk_widget_event() Accept pointing events in root coordinates
This function will, at the last minute, ensure the event contains the right widget-relative coordinates for the widget the event is being emitted to.
Diffstat (limited to 'gtk')
-rw-r--r--gtk/gtkwidget.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index 55e1353224..a550394ca5 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -6981,6 +6981,26 @@ event_window_is_still_viewable (GdkEvent *event)
}
}
+static void
+translate_coordinates (GdkEvent *event,
+ GtkWidget *widget)
+{
+ GtkWidget *event_widget;
+ gdouble xd, yd;
+ gint x, y;
+
+ if (!gdk_event_get_coords (event, &xd, &yd))
+ return;
+ event_widget = gtk_get_event_widget (event);
+
+ /* FIXME: loses precision */
+ x = xd;
+ y = yd;
+ gtk_widget_translate_coordinates (event_widget, widget,
+ x, y, &x, &y);
+ gdk_event_set_coords (event, x, y);
+}
+
static gint
gtk_widget_event_internal (GtkWidget *widget,
GdkEvent *event)
@@ -6996,6 +7016,7 @@ gtk_widget_event_internal (GtkWidget *widget,
return TRUE;
g_object_ref (widget);
+ translate_coordinates (event_copy, widget);
if (widget == gtk_get_event_widget (event))
return_val |= _gtk_widget_run_controllers (widget, event, GTK_PHASE_TARGET);