[gtk+/wip/events: 9/25] gtk: Invoke trackers and recognizers
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/events: 9/25] gtk: Invoke trackers and recognizers
- Date: Wed, 14 Mar 2012 18:42:30 +0000 (UTC)
commit 1b48a544e5ff17357e4188dbff43df250f9ad266
Author: Benjamin Otte <otte redhat com>
Date: Mon Mar 12 02:24:03 2012 +0100
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(+), 0 deletions(-)
---
diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c
index 65df934..847c4d4 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 0beea08..99a58de 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);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]