diff --git a/gtk/gtkcsslookup.c b/gtk/gtkcsslookup.c index 68551fb3c4..11f15e837f 100644 --- a/gtk/gtkcsslookup.c +++ b/gtk/gtkcsslookup.c @@ -24,18 +24,45 @@ #include "gtkprivatetypebuiltins.h" #include "gtkprivate.h" -void -gtk_css_lookup_init (GtkCssLookup *lookup) +GtkCssLookup * +gtk_css_lookup_new (void) { - memset (lookup, 0, sizeof (*lookup)); + GtkCssLookup *lookup = g_new0 (GtkCssLookup, 1); + lookup->ref_count = 1; lookup->set_values = _gtk_bitmask_new (); + + return lookup; +} + +static void +gtk_css_lookup_free (GtkCssLookup *lookup) +{ + _gtk_bitmask_free (lookup->set_values); + g_free (lookup); +} + +GtkCssLookup * +gtk_css_lookup_ref (GtkCssLookup *lookup) +{ + gtk_internal_return_val_if_fail (lookup != NULL, NULL); + gtk_internal_return_val_if_fail (lookup->ref_count > 0, NULL); + + lookup->ref_count++; + + return lookup; } void -gtk_css_lookup_destroy (GtkCssLookup *lookup) +gtk_css_lookup_unref (GtkCssLookup *lookup) { - _gtk_bitmask_free (lookup->set_values); + gtk_internal_return_if_fail (lookup != NULL); + gtk_internal_return_if_fail (lookup->ref_count > 0); + + lookup->ref_count--; + + if (lookup->ref_count == 0) + gtk_css_lookup_free (lookup); } gboolean diff --git a/gtk/gtkcsslookupprivate.h b/gtk/gtkcsslookupprivate.h index 344995810a..aab2a3d197 100644 --- a/gtk/gtkcsslookupprivate.h +++ b/gtk/gtkcsslookupprivate.h @@ -36,12 +36,15 @@ typedef struct { } GtkCssLookupValue; struct _GtkCssLookup { + int ref_count; GtkBitmask *set_values; GtkCssLookupValue values[GTK_CSS_PROPERTY_N_PROPERTIES]; }; -void gtk_css_lookup_init (GtkCssLookup *lookup); -void gtk_css_lookup_destroy (GtkCssLookup *lookup); +GtkCssLookup * gtk_css_lookup_new (void); +GtkCssLookup * gtk_css_lookup_ref (GtkCssLookup *lookup); +void gtk_css_lookup_unref (GtkCssLookup *lookup); + gboolean gtk_css_lookup_is_missing (const GtkCssLookup *lookup, guint id); void gtk_css_lookup_set (GtkCssLookup *lookup, diff --git a/gtk/gtkcssstaticstyle.c b/gtk/gtkcssstaticstyle.c index 388f9557c2..7cc60fd970 100644 --- a/gtk/gtkcssstaticstyle.c +++ b/gtk/gtkcssstaticstyle.c @@ -989,16 +989,16 @@ gtk_css_static_style_new_compute (GtkStyleProvider *provider, GtkCssChange change) { GtkCssStaticStyle *result; - GtkCssLookup lookup; + GtkCssLookup *lookup; GtkCssNode *parent; - gtk_css_lookup_init (&lookup); + lookup = gtk_css_lookup_new (); if (node) gtk_style_provider_lookup (provider, filter, node, - &lookup, + lookup, change == 0 ? &change : NULL); result = g_object_new (GTK_TYPE_CSS_STATIC_STYLE, NULL); @@ -1010,12 +1010,12 @@ gtk_css_static_style_new_compute (GtkStyleProvider *provider, else parent = NULL; - gtk_css_lookup_resolve (&lookup, + gtk_css_lookup_resolve (lookup, provider, result, parent ? gtk_css_node_get_style (parent) : NULL); - gtk_css_lookup_destroy (&lookup); + gtk_css_lookup_unref (lookup); return GTK_CSS_STYLE (result); }