diff options
author | Benjamin Otte <otte@redhat.com> | 2012-03-12 03:20:58 +0100 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2012-03-14 19:32:55 +0100 |
commit | 7914ce8231f472d9c36e250e546912b927b9df1b (patch) | |
tree | 51e192b367667a03f3409a3ee44dc8f1e2fe8bd7 | |
parent | 39b9acf56d00954bfb809570cfb685089147aed9 (diff) | |
download | gtk+-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.c | 142 | ||||
-rw-r--r-- | gtk/gtkwidget.h | 9 |
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); |