summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimm Bäder <mail@baedert.org>2019-08-13 12:29:00 +0200
committerTimm Bäder <mail@baedert.org>2019-08-15 16:23:01 +0200
commit960e766206a643bff3b8c6441a23f1355562b4bd (patch)
tree29302d590e33b6057e3c5038e73cbbc5ab93ed24
parent1c9fbe37734a16ac86791b1955127b2f859ff65d (diff)
downloadgtk+-960e766206a643bff3b8c6441a23f1355562b4bd.tar.gz
widget: Don't duplicate events to translate coordinates
-rw-r--r--gtk/gtkwidget.c64
-rw-r--r--gtk/gtkwidget.h2
-rw-r--r--gtk/gtkwidgetprivate.h4
3 files changed, 40 insertions, 30 deletions
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index f8060611d1..8f26578cb1 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -652,8 +652,8 @@ static void gtk_widget_propagate_state (GtkWidget
const GtkStateData *data);
static void gtk_widget_update_alpha (GtkWidget *widget);
-static gint gtk_widget_event_internal (GtkWidget *widget,
- const GdkEvent *event);
+static gboolean gtk_widget_event_internal (GtkWidget *widget,
+ GdkEvent *event);
static gboolean gtk_widget_real_mnemonic_activate (GtkWidget *widget,
gboolean group_cycling);
static void gtk_widget_real_measure (GtkWidget *widget,
@@ -5167,8 +5167,8 @@ gtk_widget_real_mnemonic_activate (GtkWidget *widget,
* the event was handled)
**/
gboolean
-gtk_widget_event (GtkWidget *widget,
- const GdkEvent *event)
+gtk_widget_event (GtkWidget *widget,
+ GdkEvent *event)
{
g_return_val_if_fail (GTK_IS_WIDGET (widget), TRUE);
g_return_val_if_fail (WIDGET_REALIZED_FOR_EVENT (widget, event), TRUE);
@@ -5229,13 +5229,16 @@ gtk_widget_run_controllers (GtkWidget *widget,
static gboolean
translate_event_coordinates (GdkEvent *event,
+ double event_x,
+ double event_y,
GtkWidget *widget);
gboolean
-_gtk_widget_captured_event (GtkWidget *widget,
- const GdkEvent *event)
+_gtk_widget_captured_event (GtkWidget *widget,
+ GdkEvent *event)
{
gboolean return_val = FALSE;
- GdkEvent *event_copy;
+ double old_x, old_y;
+ gboolean reset_event = FALSE;
g_return_val_if_fail (GTK_IS_WIDGET (widget), TRUE);
g_return_val_if_fail (WIDGET_REALIZED_FOR_EVENT (widget, event), TRUE);
@@ -5243,13 +5246,17 @@ _gtk_widget_captured_event (GtkWidget *widget,
if (!event_surface_is_still_viewable (event))
return TRUE;
- event_copy = gdk_event_copy (event);
- translate_event_coordinates (event_copy, widget);
+ if (gdk_event_get_coords (event, &old_x, &old_y))
+ {
+ reset_event = TRUE;
+ translate_event_coordinates (event, old_x, old_y, widget);
+ }
- return_val = gtk_widget_run_controllers (widget, event_copy, GTK_PHASE_CAPTURE);
- return_val |= !WIDGET_REALIZED_FOR_EVENT (widget, event_copy);
+ return_val = gtk_widget_run_controllers (widget, event, GTK_PHASE_CAPTURE);
+ return_val |= !WIDGET_REALIZED_FOR_EVENT (widget, event);
- g_object_unref (event_copy);
+ if (reset_event)
+ gdk_event_set_coords (event, old_x, old_y);
return return_val;
}
@@ -5293,20 +5300,18 @@ event_surface_is_still_viewable (const GdkEvent *event)
static gboolean
translate_event_coordinates (GdkEvent *event,
+ double event_x,
+ double event_y,
GtkWidget *widget)
{
GtkWidget *event_widget;
- double x, y;
graphene_point_t p;
- if (!gdk_event_get_coords (event, &x, &y))
- return TRUE;
-
event_widget = gtk_get_event_widget (event);
if (!gtk_widget_compute_point (event_widget,
widget,
- &GRAPHENE_POINT_INIT (x, y),
+ &GRAPHENE_POINT_INIT (event_x, event_y),
&p))
return FALSE;
@@ -5316,11 +5321,12 @@ translate_event_coordinates (GdkEvent *event,
}
static gboolean
-gtk_widget_event_internal (GtkWidget *widget,
- const GdkEvent *event)
+gtk_widget_event_internal (GtkWidget *widget,
+ GdkEvent *event)
{
gboolean return_val = FALSE;
- GdkEvent *event_copy;
+ gboolean reset_event = FALSE;
+ double old_x, old_y;
/* We check only once for is-still-visible; if someone
* hides the window in on of the signals on the widget,
@@ -5333,22 +5339,26 @@ gtk_widget_event_internal (GtkWidget *widget,
if (!_gtk_widget_get_mapped (widget))
return FALSE;
- event_copy = gdk_event_copy (event);
-
- translate_event_coordinates (event_copy, widget);
+ if (gdk_event_get_coords (event, &old_x, &old_y))
+ {
+ reset_event = TRUE;
+ translate_event_coordinates (event, old_x, old_y, widget);
+ }
- if (widget == gtk_get_event_target (event_copy))
- return_val |= gtk_widget_run_controllers (widget, event_copy, GTK_PHASE_TARGET);
+ if (widget == gtk_get_event_target (event))
+ return_val |= gtk_widget_run_controllers (widget, event, GTK_PHASE_TARGET);
if (return_val == FALSE)
- return_val |= gtk_widget_run_controllers (widget, event_copy, GTK_PHASE_BUBBLE);
- g_object_unref (event_copy);
+ return_val |= gtk_widget_run_controllers (widget, event, GTK_PHASE_BUBBLE);
if (return_val == FALSE &&
(event->any.type == GDK_KEY_PRESS ||
event->any.type == GDK_KEY_RELEASE))
return_val |= gtk_bindings_activate_event (G_OBJECT (widget), (GdkEventKey *) event);
+ if (reset_event)
+ gdk_event_set_coords (event, old_x, old_y);
+
return return_val;
}
diff --git a/gtk/gtkwidget.h b/gtk/gtkwidget.h
index 3f383ad2a9..cc511f5f26 100644
--- a/gtk/gtkwidget.h
+++ b/gtk/gtkwidget.h
@@ -443,7 +443,7 @@ gboolean gtk_widget_mnemonic_activate (GtkWidget *widget,
gboolean group_cycling);
GDK_AVAILABLE_IN_ALL
gboolean gtk_widget_event (GtkWidget *widget,
- const GdkEvent *event);
+ GdkEvent *event);
GDK_AVAILABLE_IN_ALL
gboolean gtk_widget_activate (GtkWidget *widget);
diff --git a/gtk/gtkwidgetprivate.h b/gtk/gtkwidgetprivate.h
index c724af58e0..68595f7aa9 100644
--- a/gtk/gtkwidgetprivate.h
+++ b/gtk/gtkwidgetprivate.h
@@ -281,8 +281,8 @@ void _gtk_widget_buildable_finish_accelerator (GtkWidget *widget,
gpointer user_data);
GtkStyleContext * _gtk_widget_peek_style_context (GtkWidget *widget);
-gboolean _gtk_widget_captured_event (GtkWidget *widget,
- const GdkEvent *event);
+gboolean _gtk_widget_captured_event (GtkWidget *widget,
+ GdkEvent *event);
GtkWidgetPath * _gtk_widget_create_path (GtkWidget *widget);
void gtk_widget_clear_path (GtkWidget *widget);