diff options
author | Timm Bäder <mail@baedert.org> | 2019-08-13 12:29:00 +0200 |
---|---|---|
committer | Timm Bäder <mail@baedert.org> | 2019-08-15 16:23:01 +0200 |
commit | 960e766206a643bff3b8c6441a23f1355562b4bd (patch) | |
tree | 29302d590e33b6057e3c5038e73cbbc5ab93ed24 | |
parent | 1c9fbe37734a16ac86791b1955127b2f859ff65d (diff) | |
download | gtk+-960e766206a643bff3b8c6441a23f1355562b4bd.tar.gz |
widget: Don't duplicate events to translate coordinates
-rw-r--r-- | gtk/gtkwidget.c | 64 | ||||
-rw-r--r-- | gtk/gtkwidget.h | 2 | ||||
-rw-r--r-- | gtk/gtkwidgetprivate.h | 4 |
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); |