stylecontext: Refactor update_properties()

It now always returns a new instance.
This commit is contained in:
Benjamin Otte 2014-12-17 04:18:44 +01:00
parent 7406ec84bc
commit b7be202089
5 changed files with 108 additions and 40 deletions

View File

@ -445,12 +445,14 @@ gtk_css_animated_style_new (GtkCssStyle *base_style,
GtkCssStyle *
gtk_css_animated_style_new_advance (GtkCssAnimatedStyle *source,
GtkCssStyle *base,
gint64 timestamp)
{
GtkCssAnimatedStyle *result;
GSList *l, *animations;
gtk_internal_return_val_if_fail (GTK_IS_CSS_ANIMATED_STYLE (source), NULL);
gtk_internal_return_val_if_fail (GTK_IS_CSS_STYLE (base), NULL);
animations = NULL;
for (l = source->animations; l; l = l->next)
@ -469,7 +471,7 @@ gtk_css_animated_style_new_advance (GtkCssAnimatedStyle *source,
result = g_object_new (GTK_TYPE_CSS_ANIMATED_STYLE, NULL);
result->style = g_object_ref (source->style);
result->style = g_object_ref (base);
result->current_time = timestamp;
result->animations = animations;

View File

@ -59,6 +59,7 @@ GtkCssStyle * gtk_css_animated_style_new (GtkCssStyle
int scale,
GtkCssStyle *previous_style);
GtkCssStyle * gtk_css_animated_style_new_advance (GtkCssAnimatedStyle *source,
GtkCssStyle *base,
gint64 timestamp);
void gtk_css_animated_style_set_animated_value(GtkCssAnimatedStyle *style,

View File

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

View File

@ -55,6 +55,8 @@ struct _GtkCssStaticStyleClass
GType gtk_css_static_style_get_type (void) G_GNUC_CONST;
GtkCssStyle * gtk_css_static_style_new (void);
GtkCssStyle * gtk_css_static_style_copy (GtkCssStaticStyle *original,
const GtkBitmask *properties_to_not_copy);
void gtk_css_static_style_compute_value (GtkCssStaticStyle *style,
GtkStyleProviderPrivate*provider,

View File

@ -681,7 +681,7 @@ create_query_path (GtkStyleContext *context,
return path;
}
static void
static GtkCssStyle *
update_properties (GtkStyleContext *context,
GtkCssStyle *style,
const GtkCssNodeDeclaration *decl,
@ -692,6 +692,7 @@ update_properties (GtkStyleContext *context,
GtkWidgetPath *path;
GtkCssLookup *lookup;
GtkBitmask *changes;
GtkCssStyle *result;
priv = context->priv;
@ -699,9 +700,10 @@ update_properties (GtkStyleContext *context,
if (_gtk_bitmask_is_empty (changes))
{
_gtk_bitmask_free (changes);
return;
return g_object_ref (style);
}
result = gtk_css_static_style_copy (GTK_CSS_STATIC_STYLE (style), changes);
path = create_query_path (context, decl);
lookup = _gtk_css_lookup_new (changes);
@ -714,12 +716,14 @@ update_properties (GtkStyleContext *context,
_gtk_css_lookup_resolve (lookup,
GTK_STYLE_PROVIDER_PRIVATE (priv->cascade),
priv->scale,
GTK_CSS_STATIC_STYLE (style),
GTK_CSS_STATIC_STYLE (result),
priv->parent ? style_values_lookup (priv->parent) : NULL);
_gtk_css_lookup_free (lookup);
gtk_widget_path_free (path);
_gtk_bitmask_free (changes);
return result;
}
static GtkCssStyle *
@ -2694,7 +2698,9 @@ gtk_style_context_update_cache (GtkStyleContext *context,
const GtkCssNodeDeclaration *decl = key;
GtkCssStyle *values = value;
update_properties (context, values, decl, parent_changes);
values = update_properties (context, values, decl, parent_changes);
g_hash_table_iter_replace (&iter, values);
}
gtk_style_context_clear_property_cache (context);
@ -2843,18 +2849,34 @@ _gtk_style_context_validate (GtkStyleContext *context,
if (!_gtk_bitmask_is_empty (parent_changes))
{
if (GTK_IS_CSS_ANIMATED_STYLE (current))
update_properties (context, GTK_CSS_ANIMATED_STYLE (current)->style, info->decl, parent_changes);
else
update_properties (context, current, info->decl, parent_changes);
}
GtkCssStyle *new_values;
if (change & GTK_CSS_CHANGE_ANIMATE &&
if (GTK_IS_CSS_ANIMATED_STYLE (current))
{
GtkCssStyle *new_base;
new_base = update_properties (context, GTK_CSS_ANIMATED_STYLE (current)->style, info->decl, parent_changes);
new_values = gtk_css_animated_style_new_advance (GTK_CSS_ANIMATED_STYLE (current),
new_base,
timestamp);
g_object_unref (new_base);
}
else
{
new_values = update_properties (context, current, info->decl, parent_changes);
}
style_info_set_values (info, new_values);
g_object_unref (new_values);
}
else if (change & GTK_CSS_CHANGE_ANIMATE &&
gtk_style_context_is_animating (context))
{
GtkCssStyle *new_values;
new_values = gtk_css_animated_style_new_advance (GTK_CSS_ANIMATED_STYLE (info->values), timestamp);
new_values = gtk_css_animated_style_new_advance (GTK_CSS_ANIMATED_STYLE (info->values),
GTK_CSS_ANIMATED_STYLE (info->values)->style,
timestamp);
style_info_set_values (info, new_values);
g_object_unref (new_values);