diff options
author | Alexander Larsson <alexl@redhat.com> | 2012-02-15 20:30:48 +0100 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2012-02-15 20:30:48 +0100 |
commit | 281aa2a6a7176e81195401e581cadc0b9a3ff21d (patch) | |
tree | cb1cc815fc31ec6f88b23725fc5a772388710017 | |
parent | 94876a23ec837663bfbfe0561fba3b63c2dc309f (diff) | |
download | gtk+-wip/css-memuse.tar.gz |
Don't keep the GtkCSSSections around unless GTK_CSS_DEBUG env var setwip/css-memuse
This was using ~110Kb of memory showing gtk3-demo, which is to much
for a pure debugging feature.
-rw-r--r-- | gtk/gtkcssprovider.c | 73 |
1 files changed, 63 insertions, 10 deletions
diff --git a/gtk/gtkcssprovider.c b/gtk/gtkcssprovider.c index 7ff5daf590..8117526fc5 100644 --- a/gtk/gtkcssprovider.c +++ b/gtk/gtkcssprovider.c @@ -1005,6 +1005,8 @@ enum { LAST_SIGNAL }; +static gboolean gtk_keep_css_sections = FALSE; + static guint css_provider_signals[LAST_SIGNAL] = { 0 }; static void gtk_css_provider_finalize (GObject *object); @@ -1084,6 +1086,9 @@ gtk_css_provider_class_init (GtkCssProviderClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); + if (g_getenv ("GTK_CSS_DEBUG")) + gtk_keep_css_sections = TRUE; + /** * GtkCssProvider::parsing-error: * @provider: the provider that had a parsing error @@ -1154,7 +1159,11 @@ struct _PropertyValue { GtkStyleProperty *property; PropertyValue *next; GValue value; +}; +typedef struct _PropertyValueWithSection PropertyValueWithSection; +struct _PropertyValueWithSection { + PropertyValue base; GtkCssSection *section; }; @@ -1163,21 +1172,38 @@ property_value_new (GtkStyleProperty *property, GtkCssSection *section) { PropertyValue *value; - value = g_slice_new0 (PropertyValue); + if (gtk_keep_css_sections) + value = (PropertyValue *)g_slice_new0 (PropertyValueWithSection); + else + value = g_slice_new0 (PropertyValue); value->property = property; - value->section = gtk_css_section_ref (section); + + if (gtk_keep_css_sections) + ((PropertyValueWithSection *)value)->section = gtk_css_section_ref (section); return value; } +static GtkCssSection * +property_value_get_section (PropertyValue *value) +{ + if (gtk_keep_css_sections) + return ((PropertyValueWithSection *)value)->section; + return NULL; +} + static void property_value_free (PropertyValue *value) { + GtkCssSection *section; + if (G_IS_VALUE (&value->value)) g_value_unset (&value->value); - gtk_css_section_unref (value->section); + section = property_value_get_section (value); + if (section != NULL) + gtk_css_section_unref (section); g_slice_free (PropertyValue, value); } @@ -1219,31 +1245,53 @@ struct _WidgetPropertyValue { char *name; WidgetPropertyValue *next; GValue value; +}; +typedef struct _WidgetPropertyValueWithSection WidgetPropertyValueWithSection; +struct _WidgetPropertyValueWithSection { + WidgetPropertyValue base; GtkCssSection *section; }; + static WidgetPropertyValue * widget_property_value_new (char *name, GtkCssSection *section) { WidgetPropertyValue *value; - value = g_slice_new0 (WidgetPropertyValue); + if (gtk_keep_css_sections) + value = (WidgetPropertyValue *)g_slice_new0 (WidgetPropertyValueWithSection); + else + value = g_slice_new0 (WidgetPropertyValue); value->name = name; - value->section = gtk_css_section_ref (section); + if (gtk_keep_css_sections) + ((WidgetPropertyValueWithSection *)value)->section = gtk_css_section_ref (section); return value; } +static GtkCssSection * +widget_property_value_get_section (WidgetPropertyValue *value) +{ + if (gtk_keep_css_sections) + return ((WidgetPropertyValueWithSection *)value)->section; + return NULL; +} + static void widget_property_value_free (WidgetPropertyValue *value) { + GtkCssSection *section; + if (G_IS_VALUE (&value->value)) g_value_unset (&value->value); g_free (value->name); - gtk_css_section_unref (value->section); + + section = widget_property_value_get_section (value); + if (section != NULL) + gtk_css_section_unref (section); g_slice_free (WidgetPropertyValue, value); } @@ -1311,7 +1359,8 @@ gtk_css_ruleset_add (GtkCssRuleset *ruleset, const GValue *sub = &g_array_index (array, GValue, i); PropertyValue *val; - val = property_value_new (child, value->section); + val = property_value_new (GTK_STYLE_PROPERTY (child), + property_value_get_section (value)); g_value_init (&val->value, G_VALUE_TYPE (sub)); g_value_copy (sub, &val->value); gtk_css_ruleset_add (ruleset, GTK_STYLE_PROPERTY (child), val); @@ -1583,11 +1632,13 @@ gtk_css_provider_get_style_property (GtkStyleProvider *provider, if (strcmp (val->name, prop_name) == 0) { GtkCssScanner *scanner; + GtkCssSection *section; + section = widget_property_value_get_section (val); scanner = gtk_css_scanner_new (css_provider, NULL, - val->section, - gtk_css_section_get_file (val->section), + section, + section ? gtk_css_section_get_file (section) : NULL, g_value_get_string (&val->value)); found = _gtk_css_style_parse_value (value, @@ -1663,7 +1714,9 @@ gtk_css_style_provider_lookup (GtkStyleProviderPrivate *provider, if (!_gtk_css_lookup_is_missing (lookup, id)) continue; - _gtk_css_lookup_set (lookup, id, value->section, &value->value); + _gtk_css_lookup_set (lookup, id, + property_value_get_section (value), + &value->value); } } } |