Make lookups refcounted

This will be useful when we share lookups.
This commit is contained in:
Matthias Clasen
2020-02-10 18:10:42 -05:00
parent bfa7f57a92
commit acb5c2abef
3 changed files with 42 additions and 12 deletions

View File

@@ -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

View File

@@ -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,

View File

@@ -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);
}