[gtk+/wip/events: 8/16] widget: Add API for adding recognizers



commit 09f5016cf40a675f3b7a4192f5cc2bd801b1d570
Author: Benjamin Otte <otte redhat com>
Date:   Sun Mar 4 02:06:19 2012 +0100

    widget: Add API for adding recognizers
    
    Apart from adding and removing them, nothing can be done with them.

 gtk/gtkwidget.c |  159 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 gtk/gtkwidget.h |   10 ++++
 2 files changed, 167 insertions(+), 2 deletions(-)
---
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index a82f050..0beea08 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -35,6 +35,7 @@
 #include "gtkcontainer.h"
 #include "gtkaccelmapprivate.h"
 #include "gtkclipboard.h"
+#include "gtkeventrecognizerprivate.h"
 #include "gtkiconfactory.h"
 #include "gtkintl.h"
 #include "gtkmarshalers.h"
@@ -411,6 +412,7 @@ struct _GtkWidgetClassPrivate
 {
   GType accessible_type;
   AtkRole accessible_role;
+  GPtrArray *recognizers;
 };
 
 enum {
@@ -792,8 +794,23 @@ static void
 gtk_widget_base_class_init (gpointer g_class)
 {
   GtkWidgetClass *klass = g_class;
+  GtkWidgetClassPrivate *priv;
+
+  priv = klass->priv = G_TYPE_CLASS_GET_PRIVATE (g_class, GTK_TYPE_WIDGET, GtkWidgetClassPrivate);
 
-  klass->priv = G_TYPE_CLASS_GET_PRIVATE (g_class, GTK_TYPE_WIDGET, GtkWidgetClassPrivate);
+  if (priv->recognizers)
+    {
+      GPtrArray *copy;
+      guint i;
+      
+      copy = g_ptr_array_new_full (priv->recognizers->len, g_object_unref);
+      for (i = 0; i < priv->recognizers->len; i++)
+        {
+          g_ptr_array_add (copy, g_object_ref (g_ptr_array_index (priv->recognizers, i)));
+        }
+
+      priv->recognizers = copy;
+    }
 }
 
 static void
@@ -3288,8 +3305,15 @@ gtk_widget_class_init (GtkWidgetClass *klass)
 static void
 gtk_widget_base_class_finalize (GtkWidgetClass *klass)
 {
+  GtkWidgetClassPrivate *priv = klass->priv;
   GList *list, *node;
 
+  if (priv->recognizers)
+    {
+      g_ptr_array_free (priv->recognizers, TRUE);
+      priv->recognizers = NULL;
+    }
+
   list = g_param_spec_pool_list_owned (style_property_spec_pool, G_OBJECT_CLASS_TYPE (klass));
   for (node = list; node; node = node->next)
     {
@@ -9551,6 +9575,27 @@ _gtk_widget_restore_size_request (GtkWidget *widget,
 				 GTK_QUEUE_RESIZE_INVALIDATE_ONLY);
 }
 
+static gint
+gtk_widget_class_get_recognizer_event_mask (GtkWidgetClass *klass)
+{
+  GtkWidgetClassPrivate *priv = klass->priv;
+  gint event_mask;
+  guint i;
+
+  if (priv->recognizers == NULL)
+    return 0;
+
+  event_mask = 0;
+  for (i = 0; i < priv->recognizers->len; i++)
+    {
+      event_mask |= gtk_event_recognizer_class_get_event_mask (
+          GTK_EVENT_RECOGNIZER_GET_CLASS (
+            g_ptr_array_index (priv->recognizers, i)));
+    }
+
+  return event_mask;
+}
+
 /**
  * gtk_widget_set_events:
  * @widget: a #GtkWidget
@@ -9978,9 +10023,14 @@ gtk_widget_get_settings (GtkWidget *widget)
 gint
 gtk_widget_get_events (GtkWidget *widget)
 {
+  gint event_mask;
+
   g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
 
-  return GPOINTER_TO_INT (g_object_get_qdata (G_OBJECT (widget), quark_event_mask));
+  event_mask = GPOINTER_TO_INT (g_object_get_qdata (G_OBJECT (widget), quark_event_mask));
+  event_mask |= gtk_widget_class_get_recognizer_event_mask (GTK_WIDGET_GET_CLASS (widget));
+
+  return event_mask;
 }
 
 /**
@@ -13779,6 +13829,111 @@ gtk_widget_send_focus_change (GtkWidget *widget,
 }
 
 /**
+ * gtk_widget_class_add_recognizer:
+ * @widget_class: The widget class
+ * @recognizer: The recognizer to add
+ *
+ * Adds @recognizer to @widget_class. The @recognizer will be
+ * added at the end of the list of recognizers.
+ *
+ * After calling this function, the properties of @recognizer
+ * should not be modified anymore.
+ *
+ * This function should only be called in the class_init function
+ * of @widget_class.
+ **/
+void
+gtk_widget_class_add_recognizer (GtkWidgetClass     *widget_class,
+                                 GtkEventRecognizer *recognizer)
+{
+  GtkWidgetClassPrivate *priv;
+
+  g_return_if_fail (GTK_IS_WIDGET_CLASS (widget_class));
+  g_return_if_fail (GTK_IS_EVENT_RECOGNIZER (recognizer));
+
+  priv = widget_class->priv;
+
+  if (priv->recognizers == NULL)
+    priv->recognizers = g_ptr_array_new_with_free_func (g_object_unref);
+
+  g_object_ref (recognizer);
+  g_ptr_array_add (priv->recognizers, recognizer);
+}
+
+/**
+ * gtk_widget_class_remove_recognizer:
+ * @widget_class: The widget class to remove the recognizer from 
+ * @id: The index
+ *
+ * Removes the recognizer at @id from @idget_class.
+ *
+ * This function should only be called in the class_init function
+ * of @widget_class.
+ **/
+void
+gtk_widget_class_remove_recognizer (GtkWidgetClass     *widget_class,
+                                    guint               id)
+{
+  GtkWidgetClassPrivate *priv;
+
+  g_return_if_fail (GTK_IS_WIDGET_CLASS (widget_class));
+
+  priv = widget_class->priv;
+  g_return_if_fail (priv->recognizers != NULL);
+  g_return_if_fail (id < priv->recognizers->len);
+
+  g_ptr_array_remove_index (priv->recognizers, id);
+}
+
+/**
+ * gtk_widget_class_get_recognizer:
+ * @widget_class: The widget class
+ * @id: the index of the recognizer. Must be less then the number of
+ *   recognizers of @widget_class.
+ *
+ * Gets the recognizer @id in use by @widget class
+ *
+ * Returns: The recognizer
+ **/
+GtkEventRecognizer *
+gtk_widget_class_get_recognizer (GtkWidgetClass *widget_class,
+                                 guint           id)
+{
+  GtkWidgetClassPrivate *priv;
+
+  g_return_val_if_fail (GTK_IS_WIDGET_CLASS (widget_class), NULL);
+
+  priv = widget_class->priv;
+  g_return_val_if_fail (priv->recognizers != NULL, NULL);
+  g_return_val_if_fail (id < priv->recognizers->len, NULL);
+
+  return g_ptr_array_index (priv->recognizers, id);
+}
+
+/**
+ * gtk_widget_class_get_n_recognizers:
+ * @widget_class: the widget class
+ *
+ * Gets the number of recognizers in use by @widget_class.
+ *
+ * Returns: The number of recognizers currently in use by @widget_class
+ **/
+guint
+gtk_widget_class_get_n_recognizers (GtkWidgetClass *widget_class)
+{
+  GtkWidgetClassPrivate *priv;
+
+  g_return_val_if_fail (GTK_IS_WIDGET_CLASS (widget_class), 0);
+
+  priv = widget_class->priv;
+
+  if (priv->recognizers == NULL)
+    return 0;
+
+  return priv->recognizers->len;
+}
+
+/**
  * gtk_widget_in_destruction:
  * @widget: a #GtkWidget
  *
diff --git a/gtk/gtkwidget.h b/gtk/gtkwidget.h
index 5a4ac4f..556ad92 100644
--- a/gtk/gtkwidget.h
+++ b/gtk/gtkwidget.h
@@ -526,6 +526,16 @@ gint       gtk_widget_send_expose         (GtkWidget           *widget,
 gboolean   gtk_widget_send_focus_change   (GtkWidget           *widget,
                                            GdkEvent            *event);
 
+void       gtk_widget_class_add_recognizer(GtkWidgetClass      *widget_class,
+                                           GtkEventRecognizer  *recognizer);
+void       gtk_widget_class_remove_recognizer
+                                          (GtkWidgetClass      *widget_class,
+                                           guint                id);
+GtkEventRecognizer *
+           gtk_widget_class_get_recognizer(GtkWidgetClass      *widget_class,
+                                           guint                id);
+guint      gtk_widget_class_get_n_recognizers (GtkWidgetClass  *widget_class);
+
 gboolean   gtk_widget_activate		     (GtkWidget	       *widget);
      
 void	   gtk_widget_reparent		  (GtkWidget	       *widget,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]