diff options
author | Benjamin Otte <otte@redhat.com> | 2012-03-12 02:24:03 +0100 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2012-03-14 19:32:55 +0100 |
commit | 1b48a544e5ff17357e4188dbff43df250f9ad266 (patch) | |
tree | b0fc43407f9620a221ab205842e43c7c32dd86c9 | |
parent | 6a14c755c864c17253cf791593d6983a887e5161 (diff) | |
download | gtk+-1b48a544e5ff17357e4188dbff43df250f9ad266.tar.gz |
gtk: Invoke trackers and recognizers
Adds the basic plumbing necessary to ensure recognizers and trackers get
invoked.
-rw-r--r-- | gtk/gtkmain.c | 16 | ||||
-rw-r--r-- | gtk/gtkwidget.c | 27 |
2 files changed, 43 insertions, 0 deletions
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); |