summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2012-03-12 02:24:03 +0100
committerBenjamin Otte <otte@redhat.com>2012-03-14 19:32:55 +0100
commit1b48a544e5ff17357e4188dbff43df250f9ad266 (patch)
treeb0fc43407f9620a221ab205842e43c7c32dd86c9
parent6a14c755c864c17253cf791593d6983a887e5161 (diff)
downloadgtk+-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.c16
-rw-r--r--gtk/gtkwidget.c27
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);