From 1b48a544e5ff17357e4188dbff43df250f9ad266 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Mon, 12 Mar 2012 02:24:03 +0100 Subject: [PATCH] gtk: Invoke trackers and recognizers Adds the basic plumbing necessary to ensure recognizers and trackers get invoked. --- gtk/gtkmain.c | 16 ++++++++++++++++ gtk/gtkwidget.c | 27 +++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c index 65df934ccb..847c4d4b9a 100644 --- a/gtk/gtkmain.c +++ b/gtk/gtkmain.c @@ -114,6 +114,7 @@ #include "gtkclipboard.h" #include "gtkdebug.h" #include "gtkdnd.h" +#include "gtkeventtrackerprivate.h" #include "gtkmain.h" #include "gtkmenu.h" #include "gtkmodules.h" @@ -1647,6 +1648,9 @@ gtk_main_do_event (GdkEvent *event) case GDK_WINDOW_STATE: case GDK_GRAB_BROKEN: case GDK_DAMAGE: + if (_gtk_event_trackers_invoke (event)) + break; + if (!_gtk_widget_captured_event (event_widget, event)) gtk_widget_event (event_widget, event); break; @@ -1656,6 +1660,9 @@ gtk_main_do_event (GdkEvent *event) case GDK_2BUTTON_PRESS: case GDK_3BUTTON_PRESS: case GDK_TOUCH_BEGIN: + if (_gtk_event_trackers_invoke (event)) + break; + if (!_gtk_propagate_captured_event (grab_widget, event, topmost_widget)) gtk_propagate_event (grab_widget, event); break; @@ -1709,11 +1716,17 @@ gtk_main_do_event (GdkEvent *event) case GDK_TOUCH_UPDATE: case GDK_TOUCH_END: case GDK_TOUCH_CANCEL: + if (_gtk_event_trackers_invoke (event)) + break; + if (!_gtk_propagate_captured_event (grab_widget, event, topmost_widget)) gtk_propagate_event (grab_widget, event); break; case GDK_ENTER_NOTIFY: + if (_gtk_event_trackers_invoke (event)) + break; + if (event->crossing.detail != GDK_NOTIFY_VIRTUAL && event->crossing.detail != GDK_NOTIFY_NONLINEAR_VIRTUAL) _gtk_widget_set_device_window (event_widget, @@ -1725,6 +1738,9 @@ gtk_main_do_event (GdkEvent *event) break; case GDK_LEAVE_NOTIFY: + if (_gtk_event_trackers_invoke (event)) + break; + if (event->crossing.detail != GDK_NOTIFY_VIRTUAL && event->crossing.detail != GDK_NOTIFY_NONLINEAR_VIRTUAL) _gtk_widget_set_device_window (event_widget, diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 0beea08062..99a58deadf 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -6282,6 +6282,31 @@ event_window_is_still_viewable (GdkEvent *event) } } +static gboolean +gtk_widget_invoke_recognizers (GtkWidget *widget, + GdkEvent *event) +{ + GtkWidgetClass *klass = GTK_WIDGET_GET_CLASS (widget); + GtkWidgetClassPrivate *priv = klass->priv; + guint i; + gboolean eat_event = FALSE; + + if (priv->recognizers == NULL) + return FALSE; + + g_object_ref (widget); + + for (i = 0; i < priv->recognizers->len; i++) + { + GtkEventRecognizer *recognizer = g_ptr_array_index (priv->recognizers, i); + _gtk_event_recognizer_recognize (recognizer, widget, event); + } + + g_object_unref (widget); + + return eat_event; +} + static gint gtk_widget_event_internal (GtkWidget *widget, GdkEvent *event) @@ -6296,6 +6321,8 @@ gtk_widget_event_internal (GtkWidget *widget, if (!event_window_is_still_viewable (event)) return TRUE; + gtk_widget_invoke_recognizers (widget, event); + g_object_ref (widget); g_signal_emit (widget, widget_signals[EVENT], 0, event, &return_val);