summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2012-03-12 03:20:58 +0100
committerBenjamin Otte <otte@redhat.com>2012-03-14 19:32:55 +0100
commit7914ce8231f472d9c36e250e546912b927b9df1b (patch)
tree51e192b367667a03f3409a3ee44dc8f1e2fe8bd7
parent39b9acf56d00954bfb809570cfb685089147aed9 (diff)
downloadgtk+-7914ce8231f472d9c36e250e546912b927b9df1b.tar.gz
API: widget: Change recognizer addition/removal API
Instead of addition/removal/inspection per class, there's now just addition per class and addition/removal/inspection per widgets. Widgets inherit the class recognizers on init.
-rw-r--r--gtk/gtkwidget.c142
-rw-r--r--gtk/gtkwidget.h9
2 files changed, 110 insertions, 41 deletions
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index 99a58deadf..e6bae5c1d5 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -402,6 +402,11 @@ struct _GtkWidgetPrivate
/* The widget's parent */
GtkWidget *parent;
+ /* The recognizers used by widget. Usually equal to the recognizers
+ * of its class, but can be modified.
+ */
+ GPtrArray *recognizers;
+
#ifdef G_ENABLE_DEBUG
/* Number of gtk_widget_push_verify_invariants () */
guint verifying_invariants_count;
@@ -544,7 +549,8 @@ struct _GtkStateData
static void gtk_widget_base_class_init (gpointer g_class);
static void gtk_widget_class_init (GtkWidgetClass *klass);
static void gtk_widget_base_class_finalize (GtkWidgetClass *klass);
-static void gtk_widget_init (GtkWidget *widget);
+static void gtk_widget_init (GTypeInstance *instance,
+ gpointer g_class);
static void gtk_widget_set_property (GObject *object,
guint prop_id,
const GValue *value,
@@ -758,7 +764,7 @@ gtk_widget_get_type (void)
NULL, /* class_init */
sizeof (GtkWidget),
0, /* n_preallocs */
- (GInstanceInitFunc) gtk_widget_init,
+ gtk_widget_init,
NULL, /* value_table */
};
@@ -3648,8 +3654,9 @@ gtk_widget_get_property (GObject *object,
}
static void
-gtk_widget_init (GtkWidget *widget)
+gtk_widget_init (GTypeInstance *instance, gpointer g_class)
{
+ GtkWidget *widget = GTK_WIDGET (instance);
GtkWidgetPrivate *priv;
widget->priv = G_TYPE_INSTANCE_GET_PRIVATE (widget,
@@ -3685,6 +3692,12 @@ gtk_widget_init (GtkWidget *widget)
priv->style = gtk_widget_get_default_style ();
g_object_ref (priv->style);
+
+ if (GTK_WIDGET_CLASS (g_class)->priv->recognizers)
+ {
+ priv->recognizers = GTK_WIDGET_CLASS (g_class)->priv->recognizers;
+ g_ptr_array_ref (priv->recognizers);
+ }
}
@@ -6286,8 +6299,7 @@ static gboolean
gtk_widget_invoke_recognizers (GtkWidget *widget,
GdkEvent *event)
{
- GtkWidgetClass *klass = GTK_WIDGET_GET_CLASS (widget);
- GtkWidgetClassPrivate *priv = klass->priv;
+ GtkWidgetPrivate *priv = widget->priv;
guint i;
gboolean eat_event = FALSE;
@@ -9603,9 +9615,9 @@ _gtk_widget_restore_size_request (GtkWidget *widget,
}
static gint
-gtk_widget_class_get_recognizer_event_mask (GtkWidgetClass *klass)
+gtk_widget_get_recognizer_event_mask (GtkWidget *widget)
{
- GtkWidgetClassPrivate *priv = klass->priv;
+ GtkWidgetPrivate *priv = widget->priv;
gint event_mask;
guint i;
@@ -10055,7 +10067,7 @@ gtk_widget_get_events (GtkWidget *widget)
g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
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));
+ event_mask |= gtk_widget_get_recognizer_event_mask (widget);
return event_mask;
}
@@ -10450,6 +10462,12 @@ gtk_widget_real_destroy (GtkWidget *object)
g_object_unref (priv->style);
priv->style = gtk_widget_get_default_style ();
g_object_ref (priv->style);
+
+ if (priv->recognizers)
+ {
+ g_ptr_array_unref (priv->recognizers);
+ priv->recognizers = NULL;
+ }
}
static void
@@ -13887,50 +13905,100 @@ gtk_widget_class_add_recognizer (GtkWidgetClass *widget_class,
g_ptr_array_add (priv->recognizers, recognizer);
}
+static void
+gtk_widget_ensure_custom_recognizers (GtkWidget *widget)
+{
+ GtkWidgetClass *klass = GTK_WIDGET_GET_CLASS (widget);
+ GtkWidgetPrivate *priv = widget->priv;
+ GPtrArray *shared;
+ guint i;
+
+ shared = klass->priv->recognizers;
+ if (priv->recognizers != shared)
+ return;
+
+ priv->recognizers = g_ptr_array_new_with_free_func (g_object_unref);
+ if (shared == NULL)
+ return;
+
+ for (i = 0; i < shared->len; i++)
+ {
+ GtkEventRecognizer *recognizer;
+
+ recognizer = g_ptr_array_index (shared, i);
+ g_object_ref (recognizer);
+ g_ptr_array_add (priv->recognizers, recognizer);
+ }
+ g_object_unref (shared);
+}
+
/**
- * gtk_widget_class_remove_recognizer:
- * @widget_class: The widget class to remove the recognizer from
- * @id: The index
+ * gtk_widget_add_recognizer:
+ * @widget: The widget
+ * @recognizer: The recognizer to add
*
- * Removes the recognizer at @id from @idget_class.
+ * Adds @recognizer to @widget_class. The @recognizer will be
+ * added at the end of the list of recognizers.
+ **/
+void
+gtk_widget_add_recognizer (GtkWidget *widget,
+ GtkEventRecognizer *recognizer)
+{
+ GtkWidgetPrivate *priv;
+
+ g_return_if_fail (GTK_IS_WIDGET (widget));
+ g_return_if_fail (GTK_IS_EVENT_RECOGNIZER (recognizer));
+
+ gtk_widget_ensure_custom_recognizers (widget);
+
+ priv = widget->priv;
+
+ g_object_ref (recognizer);
+ g_ptr_array_add (priv->recognizers, recognizer);
+}
+
+/**
+ * gtk_widget_remove_recognizer:
+ * @widget: The widget to remove the recognizer from
+ * @id: The index
*
- * This function should only be called in the class_init function
- * of @widget_class.
+ * Removes the recognizer at @id from @widget.
**/
void
-gtk_widget_class_remove_recognizer (GtkWidgetClass *widget_class,
- guint id)
+gtk_widget_remove_recognizer (GtkWidget *widget,
+ guint id)
{
- GtkWidgetClassPrivate *priv;
+ GtkWidgetPrivate *priv;
- g_return_if_fail (GTK_IS_WIDGET_CLASS (widget_class));
+ g_return_if_fail (GTK_IS_WIDGET (widget));
- priv = widget_class->priv;
- g_return_if_fail (priv->recognizers != NULL);
+ gtk_widget_ensure_custom_recognizers (widget);
+
+ priv = widget->priv;
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
+ * gtk_widget_get_recognizer:
+ * @widget: The widget
* @id: the index of the recognizer. Must be less then the number of
- * recognizers of @widget_class.
+ * recognizers of @widget.
*
- * Gets the recognizer @id in use by @widget class
+ * Gets the recognizer @id in use by @widget
*
* Returns: The recognizer
**/
GtkEventRecognizer *
-gtk_widget_class_get_recognizer (GtkWidgetClass *widget_class,
- guint id)
+gtk_widget_get_recognizer (GtkWidget *widget,
+ guint id)
{
- GtkWidgetClassPrivate *priv;
+ GtkWidgetPrivate *priv;
- g_return_val_if_fail (GTK_IS_WIDGET_CLASS (widget_class), NULL);
+ g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
- priv = widget_class->priv;
+ priv = widget->priv;
g_return_val_if_fail (priv->recognizers != NULL, NULL);
g_return_val_if_fail (id < priv->recognizers->len, NULL);
@@ -13938,21 +14006,21 @@ gtk_widget_class_get_recognizer (GtkWidgetClass *widget_class,
}
/**
- * gtk_widget_class_get_n_recognizers:
- * @widget_class: the widget class
+ * gtk_widget_get_n_recognizers:
+ * @widget: the widget
*
- * Gets the number of recognizers in use by @widget_class.
+ * Gets the number of recognizers in use by @widget.
*
- * Returns: The number of recognizers currently in use by @widget_class
+ * Returns: The number of recognizers currently in use by @widget
**/
guint
-gtk_widget_class_get_n_recognizers (GtkWidgetClass *widget_class)
+gtk_widget_get_n_recognizers (GtkWidget *widget)
{
- GtkWidgetClassPrivate *priv;
+ GtkWidgetPrivate *priv;
- g_return_val_if_fail (GTK_IS_WIDGET_CLASS (widget_class), 0);
+ g_return_val_if_fail (GTK_IS_WIDGET_CLASS (widget), 0);
- priv = widget_class->priv;
+ priv = widget->priv;
if (priv->recognizers == NULL)
return 0;
diff --git a/gtk/gtkwidget.h b/gtk/gtkwidget.h
index 556ad926ee..25808fc050 100644
--- a/gtk/gtkwidget.h
+++ b/gtk/gtkwidget.h
@@ -528,13 +528,14 @@ gboolean gtk_widget_send_focus_change (GtkWidget *widget,
void gtk_widget_class_add_recognizer(GtkWidgetClass *widget_class,
GtkEventRecognizer *recognizer);
-void gtk_widget_class_remove_recognizer
- (GtkWidgetClass *widget_class,
+void gtk_widget_add_recognizer (GtkWidget *widget,
+ GtkEventRecognizer *recognizer);
+void gtk_widget_remove_recognizer (GtkWidget *widget,
guint id);
GtkEventRecognizer *
- gtk_widget_class_get_recognizer(GtkWidgetClass *widget_class,
+ gtk_widget_get_recognizer (GtkWidget *widget,
guint id);
-guint gtk_widget_class_get_n_recognizers (GtkWidgetClass *widget_class);
+guint gtk_widget_get_n_recognizers (GtkWidget *widget);
gboolean gtk_widget_activate (GtkWidget *widget);