[gtk+/wip/events: 1/8] events: Add the basics of the event recognizer implementation
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/events: 1/8] events: Add the basics of the event recognizer implementation
- Date: Mon, 5 Mar 2012 13:42:00 +0000 (UTC)
commit d76308b8c07403608c081e24605962d719dbbe30
Author: Benjamin Otte <otte redhat com>
Date: Sat Mar 3 22:49:43 2012 +0100
events: Add the basics of the event recognizer implementation
gtk/Makefile.am | 4 +
gtk/gtk.h | 2 +
gtk/gtkeventrecognizer.c | 64 ++++++++++++++++
gtk/gtkeventrecognizer.h | 88 ++++++++++++++++++++++
gtk/gtkeventtracker.c | 183 ++++++++++++++++++++++++++++++++++++++++++++++
gtk/gtkeventtracker.h | 71 ++++++++++++++++++
gtk/gtktypes.h | 4 +
7 files changed, 416 insertions(+), 0 deletions(-)
---
diff --git a/gtk/Makefile.am b/gtk/Makefile.am
index 9f4f818..1af798d 100644
--- a/gtk/Makefile.am
+++ b/gtk/Makefile.am
@@ -237,6 +237,8 @@ gtk_public_h_sources = \
gtkentrycompletion.h \
gtkenums.h \
gtkeventbox.h \
+ gtkeventrecognizer.h \
+ gtkeventtracker.h \
gtkexpander.h \
gtkfilechooser.h \
gtkfilechooserbutton.h \
@@ -641,6 +643,8 @@ gtk_base_c_sources = \
gtkentrybuffer.c \
gtkentrycompletion.c \
gtkeventbox.c \
+ gtkeventrecognizer.c \
+ gtkeventtracker.c \
gtkexpander.c \
gtkfilechooser.c \
gtkfilechooserbutton.c \
diff --git a/gtk/gtk.h b/gtk/gtk.h
index de0181b..04be83b 100644
--- a/gtk/gtk.h
+++ b/gtk/gtk.h
@@ -95,6 +95,8 @@
#include <gtk/gtkentrycompletion.h>
#include <gtk/gtkenums.h>
#include <gtk/gtkeventbox.h>
+#include <gtk/gtkeventrecognizer.h>
+#include <gtk/gtkeventtracker.h>
#include <gtk/gtkexpander.h>
#include <gtk/gtkfixed.h>
#include <gtk/gtkfilechooser.h>
diff --git a/gtk/gtkeventrecognizer.c b/gtk/gtkeventrecognizer.c
new file mode 100644
index 0000000..384c5eb
--- /dev/null
+++ b/gtk/gtkeventrecognizer.c
@@ -0,0 +1,64 @@
+/*
+ * Copyright  2012 Red Hat Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Authors: Benjamin Otte <otte gnome org>
+ */
+
+#include "config.h"
+
+#include "gtkeventrecognizer.h"
+
+/**
+ * SECTION:gtkeventrecognizer
+ * @Short_description: Recognizes gestures from events
+ * @Title: GtkEventRecognizer
+ * @See_also: #GtkEventTracker
+ *
+ * #GtkEventRecoginzer and its subclasses are used for defining the event
+ * handling behavior of #GtkWidgets.
+ *
+ * #GtkEventRecognizer was added in GTK 3.6.
+ */
+
+G_DEFINE_ABSTRACT_TYPE (GtkEventRecognizer, gtk_event_recognizer, G_TYPE_OBJECT)
+
+static GtkEventTracker *
+gtk_event_recognizer_default_recognize (GtkEventRecognizer *recognizer,
+ GdkEvent *event)
+{
+ return NULL;
+}
+
+static void
+gtk_event_recognizer_default_track (GtkEventRecognizer *recognizer,
+ GtkEventTracker *tracker,
+ GdkEvent *event)
+{
+}
+
+static void
+gtk_event_recognizer_class_init (GtkEventRecognizerClass *klass)
+{
+ klass->recognize = gtk_event_recognizer_default_recognize;
+ klass->track = gtk_event_recognizer_default_track;
+}
+
+static void
+gtk_event_recognizer_init (GtkEventRecognizer *recognizer)
+{
+}
+
diff --git a/gtk/gtkeventrecognizer.h b/gtk/gtkeventrecognizer.h
new file mode 100644
index 0000000..8fcde87
--- /dev/null
+++ b/gtk/gtkeventrecognizer.h
@@ -0,0 +1,88 @@
+/*
+ * Copyright  2012 Red Hat Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Authors: Benjamin Otte <otte gnome org>
+ */
+
+#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION)
+#error "Only <gtk/gtk.h> can be included directly."
+#endif
+
+#ifndef __GTK_EVENT_RECOGNIZER_H__
+#define __GTK_EVENT_RECOGNIZER_H__
+
+#include <gdk/gdk.h>
+
+#include <gtk/gtktypes.h>
+
+G_BEGIN_DECLS
+
+#define GTK_TYPE_EVENT_RECOGNIZER (gtk_event_recognizer_get_type ())
+#define GTK_EVENT_RECOGNIZER(obj) (G_TYPE_CHECK_INSTANCE_CAST (obj, GTK_TYPE_EVENT_RECOGNIZER, GtkEventRecognizer))
+#define GTK_EVENT_RECOGNIZER_CLASS(cls) (G_TYPE_CHECK_CLASS_CAST (cls, GTK_TYPE_EVENT_RECOGNIZER, GtkEventRecognizerClass))
+#define GTK_IS_EVENT_RECOGNIZER(obj) (G_TYPE_CHECK_INSTANCE_TYPE (obj, GTK_TYPE_EVENT_RECOGNIZER))
+#define GTK_IS_EVENT_RECOGNIZER_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE (obj, GTK_TYPE_EVENT_RECOGNIZER))
+#define GTK_EVENT_RECOGNIZER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_EVENT_RECOGNIZER, GtkEventRecognizerClass))
+
+typedef struct _GtkEventRecognizerClass GtkEventRecognizerClass;
+typedef struct _GtkEventRecognizerPrivate GtkEventRecognizerPrivate;
+
+struct _GtkEventRecognizer
+{
+ GObject parent;
+
+ GtkEventRecognizerPrivate *priv;
+};
+
+struct _GtkEventRecognizerClass
+{
+ GObjectClass parent_class;
+
+ GtkEventTracker * (* recognize) (GtkEventRecognizer *recognizer,
+ GdkEvent *event);
+ void (* track) (GtkEventRecognizer *recognizer,
+ GtkEventTracker *tracker,
+ GdkEvent *event);
+
+ /* signals */
+ void (* started) (GtkEventRecognizer *recognizer,
+ GtkEventTracker *tracker);
+ void (* updated) (GtkEventRecognizer *recognizer,
+ GtkEventTracker *tracker);
+ void (* cancelled) (GtkEventRecognizer *recognizer,
+ GtkEventTracker *tracker);
+ void (* finished) (GtkEventRecognizer *recognizer,
+ GtkEventTracker *tracker);
+
+ /* Padding for future expansion */
+ void (*_gtk_reserved0) (void);
+ void (*_gtk_reserved1) (void);
+ void (*_gtk_reserved2) (void);
+ void (*_gtk_reserved3) (void);
+ void (*_gtk_reserved4) (void);
+ void (*_gtk_reserved5) (void);
+ void (*_gtk_reserved6) (void);
+ void (*_gtk_reserved7) (void);
+};
+
+GType gtk_event_recognizer_get_type (void) G_GNUC_CONST;
+
+
+
+G_END_DECLS
+
+#endif /* __GTK_EVENT_RECOGNIZER_H__ */
diff --git a/gtk/gtkeventtracker.c b/gtk/gtkeventtracker.c
new file mode 100644
index 0000000..432dcc3
--- /dev/null
+++ b/gtk/gtkeventtracker.c
@@ -0,0 +1,183 @@
+/*
+ * Copyright  2012 Red Hat Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Authors: Benjamin Otte <otte gnome org>
+ */
+
+#include "config.h"
+
+#include "gtkeventtracker.h"
+
+#include "gtkeventrecognizer.h"
+#include "gtkintl.h"
+#include "gtkwidget.h"
+
+/**
+ * SECTION:gtkeventtracker
+ * @Short_description: Tracks the events from a #GtkEventRecognizer
+ * @Title: GtkEventTracker
+ * @See_also: #GtkEventRecognizer
+ *
+ * The #GtkEventTracker object - or a subclass of it - is used to track
+ * sequences of events as recognized by a #GtkEventRecognizer. Once the
+ * recognizer finds it can potentially identify a sequence of events, it
+ * creates a #GtkEventTracker and uses it to store information about the
+ * event. See the event handling howto for a highlevel overview.
+ *
+ * #GtkEventTracker was added in GTK 3.6.
+ */
+
+
+enum {
+ PROP_0,
+ PROP_RECOGNIZER,
+ PROP_WIDGET
+};
+
+struct _GtkEventTrackerPrivate {
+ GtkEventRecognizer *recognizer;
+ GtkWidget *widget;
+};
+
+G_DEFINE_ABSTRACT_TYPE (GtkEventTracker, gtk_event_tracker, G_TYPE_OBJECT)
+
+static void
+gtk_event_tracker_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GtkEventTracker *tracker = GTK_EVENT_TRACKER (object);
+ GtkEventTrackerPrivate *priv = tracker->priv;
+
+ switch (prop_id)
+ {
+ case PROP_RECOGNIZER:
+ priv->recognizer = g_value_dup_object (value);
+ if (priv->recognizer == NULL)
+ g_critical ("Attempting to construct a `%s' without a recognizer", G_OBJECT_TYPE_NAME (object));
+ break;
+ case PROP_WIDGET:
+ priv->widget = g_value_dup_object (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gtk_event_tracker_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GtkEventTracker *tracker = GTK_EVENT_TRACKER (object);
+ GtkEventTrackerPrivate *priv = tracker->priv;
+
+ switch (prop_id)
+ {
+ case PROP_RECOGNIZER:
+ g_value_set_object (value, priv->recognizer);
+ break;
+ case PROP_WIDGET:
+ g_value_set_object (value, priv->widget);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gtk_event_tracker_dispose (GObject *object)
+{
+ GtkEventTracker *tracker = GTK_EVENT_TRACKER (object);
+ GtkEventTrackerPrivate *priv = tracker->priv;
+
+ g_clear_object (&priv->recognizer);
+ g_clear_object (&priv->widget);
+
+ G_OBJECT_CLASS (gtk_event_tracker_parent_class)->dispose (object);
+}
+
+static void
+gtk_event_tracker_class_init (GtkEventTrackerClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->dispose = gtk_event_tracker_dispose;
+ object_class->set_property = gtk_event_tracker_set_property;
+ object_class->get_property = gtk_event_tracker_get_property;
+
+ g_object_class_install_property (object_class,
+ PROP_RECOGNIZER,
+ g_param_spec_object ("recognizer",
+ P_("recognizer"),
+ P_("Recognizer running this tracker"),
+ GTK_TYPE_EVENT_RECOGNIZER,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+ g_object_class_install_property (object_class,
+ PROP_WIDGET,
+ g_param_spec_object ("widget",
+ P_("widget"),
+ P_("Widget that spawned this tracker"),
+ GTK_TYPE_WIDGET,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+}
+
+static void
+gtk_event_tracker_init (GtkEventTracker *tracker)
+{
+}
+
+/**
+ * gtk_event_tracker_get_recognizer:
+ * @tracker: The event tracker
+ *
+ * Gets the recognizer that spawned this @tracker.
+ *
+ * Returns: The recognizer that spawned this tracker
+ *
+ * @Since: 3.6
+ **/
+GtkEventRecognizer *
+gtk_event_tracker_get_recognizer (GtkEventTracker *tracker)
+{
+ g_return_val_if_fail (GTK_IS_EVENT_TRACKER (tracker), NULL);
+
+ return tracker->priv->recognizer;
+}
+
+/**
+ * gtk_event_tracker_get_widget:
+ * @tracker: The event tracker
+ *
+ * Gets the widget that is affected by this tracker.
+ *
+ * Returns: The widget this tracker runs on or %NULL if none.
+ *
+ * @Since: 3.6
+ **/
+GtkWidget *
+gtk_event_tracker_get_widget (GtkEventTracker *tracker)
+{
+ g_return_val_if_fail (GTK_IS_EVENT_TRACKER (tracker), NULL);
+
+ return tracker->priv->widget;
+}
+
diff --git a/gtk/gtkeventtracker.h b/gtk/gtkeventtracker.h
new file mode 100644
index 0000000..ff90617
--- /dev/null
+++ b/gtk/gtkeventtracker.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright  2012 Red Hat Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Authors: Benjamin Otte <otte gnome org>
+ */
+
+#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION)
+#error "Only <gtk/gtk.h> can be included directly."
+#endif
+
+#ifndef __GTK_EVENT_TRACKER_H__
+#define __GTK_EVENT_TRACKER_H__
+
+#include <gtk/gtktypes.h>
+
+G_BEGIN_DECLS
+
+#define GTK_TYPE_EVENT_TRACKER (gtk_event_tracker_get_type ())
+#define GTK_EVENT_TRACKER(obj) (G_TYPE_CHECK_INSTANCE_CAST (obj, GTK_TYPE_EVENT_TRACKER, GtkEventTracker))
+#define GTK_EVENT_TRACKER_CLASS(cls) (G_TYPE_CHECK_CLASS_CAST (cls, GTK_TYPE_EVENT_TRACKER, GtkEventTrackerClass))
+#define GTK_IS_EVENT_TRACKER(obj) (G_TYPE_CHECK_INSTANCE_TYPE (obj, GTK_TYPE_EVENT_TRACKER))
+#define GTK_IS_EVENT_TRACKER_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE (obj, GTK_TYPE_EVENT_TRACKER))
+#define GTK_EVENT_TRACKER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_EVENT_TRACKER, GtkEventTrackerClass))
+
+typedef struct _GtkEventTrackerClass GtkEventTrackerClass;
+typedef struct _GtkEventTrackerPrivate GtkEventTrackerPrivate;
+
+struct _GtkEventTracker
+{
+ GObject parent;
+
+ GtkEventTrackerPrivate *priv;
+};
+
+struct _GtkEventTrackerClass
+{
+ GObjectClass parent_class;
+
+ /* Padding for future expansion */
+ void (*_gtk_reserved0) (void);
+ void (*_gtk_reserved1) (void);
+ void (*_gtk_reserved2) (void);
+ void (*_gtk_reserved3) (void);
+ void (*_gtk_reserved4) (void);
+ void (*_gtk_reserved5) (void);
+ void (*_gtk_reserved6) (void);
+ void (*_gtk_reserved7) (void);
+};
+
+GType gtk_event_tracker_get_type (void) G_GNUC_CONST;
+
+GtkEventRecognizer * gtk_event_tracker_get_recognizer (GtkEventTracker *tracker);
+
+
+G_END_DECLS
+
+#endif /* __GTK_EVENT_TRACKER_H__ */
diff --git a/gtk/gtktypes.h b/gtk/gtktypes.h
index b3eade3..7e2b0b1 100644
--- a/gtk/gtktypes.h
+++ b/gtk/gtktypes.h
@@ -29,10 +29,14 @@
#ifndef __GTK_TYPES_H__
#define __GTK_TYPES_H__
+#include <glib-object.h>
+
G_BEGIN_DECLS
typedef struct _GtkAdjustment GtkAdjustment;
typedef struct _GtkClipboard GtkClipboard;
+typedef struct _GtkEventRecognizer GtkEventRecognizer;
+typedef struct _GtkEventTracker GtkEventTracker;
typedef struct _GtkIconSet GtkIconSet;
typedef struct _GtkIconSource GtkIconSource;
typedef struct _GtkRcStyle GtkRcStyle;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]