summaryrefslogtreecommitdiff
path: root/gtk/gtkcssstaticstyle.c
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2014-12-17 04:18:44 +0100
committerBenjamin Otte <otte@redhat.com>2015-01-07 14:26:47 +0100
commitb7be202089664f27ae3120c41c2f4f5780bb2607 (patch)
tree805d08a47a0ca26f84823d6245729b5aa4bf33a3 /gtk/gtkcssstaticstyle.c
parent7406ec84bce536560d2458753de1ec9bbf6af231 (diff)
downloadgtk+-b7be202089664f27ae3120c41c2f4f5780bb2607.tar.gz
stylecontext: Refactor update_properties()
It now always returns a new instance.
Diffstat (limited to 'gtk/gtkcssstaticstyle.c')
-rw-r--r--gtk/gtkcssstaticstyle.c97
1 files changed, 69 insertions, 28 deletions
diff --git a/gtk/gtkcssstaticstyle.c b/gtk/gtkcssstaticstyle.c
index bcb37a025f..82066cf1f0 100644
--- a/gtk/gtkcssstaticstyle.c
+++ b/gtk/gtkcssstaticstyle.c
@@ -137,17 +137,81 @@ gtk_css_static_style_init (GtkCssStaticStyle *style)
style->depends_on_font_size = _gtk_bitmask_new ();
}
+static void
+maybe_unref_section (gpointer section)
+{
+ if (section)
+ gtk_css_section_unref (section);
+}
+
+static void
+gtk_css_static_style_set_value (GtkCssStaticStyle *style,
+ guint id,
+ GtkCssValue *value,
+ GtkCssSection *section)
+{
+ if (style->values == NULL)
+ style->values = g_ptr_array_new_with_free_func ((GDestroyNotify)_gtk_css_value_unref);
+ if (id >= style->values->len)
+ g_ptr_array_set_size (style->values, id + 1);
+
+ if (g_ptr_array_index (style->values, id))
+ _gtk_css_value_unref (g_ptr_array_index (style->values, id));
+ g_ptr_array_index (style->values, id) = _gtk_css_value_ref (value);
+
+ if (style->sections && style->sections->len > id && g_ptr_array_index (style->sections, id))
+ {
+ gtk_css_section_unref (g_ptr_array_index (style->sections, id));
+ g_ptr_array_index (style->sections, id) = NULL;
+ }
+
+ if (section)
+ {
+ if (style->sections == NULL)
+ style->sections = g_ptr_array_new_with_free_func (maybe_unref_section);
+ if (style->sections->len <= id)
+ g_ptr_array_set_size (style->sections, id + 1);
+
+ g_ptr_array_index (style->sections, id) = gtk_css_section_ref (section);
+ }
+}
+
GtkCssStyle *
gtk_css_static_style_new (void)
{
return g_object_new (GTK_TYPE_CSS_STATIC_STYLE, NULL);
}
-static void
-maybe_unref_section (gpointer section)
+GtkCssStyle *
+gtk_css_static_style_copy (GtkCssStaticStyle *original,
+ const GtkBitmask *properties_to_not_copy)
{
- if (section)
- gtk_css_section_unref (section);
+ GtkCssStaticStyle *copy;
+ guint i;
+
+ copy = g_object_new (GTK_TYPE_CSS_STATIC_STYLE, NULL);
+
+ copy->depends_on_parent = _gtk_bitmask_subtract (_gtk_bitmask_union (copy->depends_on_parent, original->depends_on_parent),
+ properties_to_not_copy);
+ copy->equals_parent = _gtk_bitmask_subtract (_gtk_bitmask_union (copy->equals_parent, original->equals_parent),
+ properties_to_not_copy);
+ copy->depends_on_color = _gtk_bitmask_subtract (_gtk_bitmask_union (copy->depends_on_color, original->depends_on_color),
+ properties_to_not_copy);
+ copy->depends_on_font_size = _gtk_bitmask_subtract (_gtk_bitmask_union (copy->depends_on_font_size, original->depends_on_font_size),
+ properties_to_not_copy);
+
+ for (i = 0; i < original->values->len; i++)
+ {
+ if (_gtk_bitmask_get (properties_to_not_copy, i))
+ continue;
+
+ gtk_css_static_style_set_value (copy,
+ i,
+ gtk_css_static_style_get_value (GTK_CSS_STYLE (original), i),
+ gtk_css_static_style_get_section (GTK_CSS_STYLE (original), i));
+ }
+
+ return GTK_CSS_STYLE (copy);
}
void
@@ -185,14 +249,7 @@ gtk_css_static_style_compute_value (GtkCssStaticStyle *style,
value = _gtk_css_value_compute (specified, id, provider, scale, GTK_CSS_STYLE (style), parent_style, &dependencies);
- if (style->values == NULL)
- style->values = g_ptr_array_new_with_free_func ((GDestroyNotify)_gtk_css_value_unref);
- if (id >= style->values->len)
- g_ptr_array_set_size (style->values, id + 1);
-
- if (g_ptr_array_index (style->values, id))
- _gtk_css_value_unref (g_ptr_array_index (style->values, id));
- g_ptr_array_index (style->values, id) = _gtk_css_value_ref (value);
+ gtk_css_static_style_set_value (style, id, value, section);
if (dependencies & (GTK_CSS_DEPENDS_ON_PARENT | GTK_CSS_EQUALS_PARENT))
style->depends_on_parent = _gtk_bitmask_set (style->depends_on_parent, id, TRUE);
@@ -203,22 +260,6 @@ gtk_css_static_style_compute_value (GtkCssStaticStyle *style,
if (dependencies & (GTK_CSS_DEPENDS_ON_FONT_SIZE))
style->depends_on_font_size = _gtk_bitmask_set (style->depends_on_font_size, id, TRUE);
- if (style->sections && style->sections->len > id && g_ptr_array_index (style->sections, id))
- {
- gtk_css_section_unref (g_ptr_array_index (style->sections, id));
- g_ptr_array_index (style->sections, id) = NULL;
- }
-
- if (section)
- {
- if (style->sections == NULL)
- style->sections = g_ptr_array_new_with_free_func (maybe_unref_section);
- if (style->sections->len <= id)
- g_ptr_array_set_size (style->sections, id + 1);
-
- g_ptr_array_index (style->sections, id) = gtk_css_section_ref (section);
- }
-
_gtk_css_value_unref (value);
_gtk_css_value_unref (specified);
}