forked from AuroraMiddleware/gtk
stylecontext: Get rid of StyleData struct
It's now just a GtkCssComputedValues + refcount. And GtkCssComputedValues has its own refcount, so use that one instead.
This commit is contained in:
parent
57c4f01e0d
commit
200bdf1aec
@ -232,7 +232,6 @@
|
||||
typedef struct GtkStyleInfo GtkStyleInfo;
|
||||
typedef struct GtkRegion GtkRegion;
|
||||
typedef struct PropertyValue PropertyValue;
|
||||
typedef struct StyleData StyleData;
|
||||
|
||||
struct GtkRegion
|
||||
{
|
||||
@ -254,13 +253,7 @@ struct GtkStyleInfo
|
||||
GArray *regions;
|
||||
GtkJunctionSides junction_sides;
|
||||
GtkStateFlags state_flags;
|
||||
StyleData *data;
|
||||
};
|
||||
|
||||
struct StyleData
|
||||
{
|
||||
GtkCssComputedValues *store;
|
||||
guint ref_count;
|
||||
GtkCssComputedValues *values;
|
||||
};
|
||||
|
||||
struct _GtkStyleContextPrivate
|
||||
@ -273,7 +266,7 @@ struct _GtkStyleContextPrivate
|
||||
GSList *children;
|
||||
GtkWidget *widget;
|
||||
GtkWidgetPath *widget_path;
|
||||
GHashTable *style_data;
|
||||
GHashTable *style_values;
|
||||
GtkStyleInfo *info;
|
||||
GArray *property_cache;
|
||||
gint scale;
|
||||
@ -314,7 +307,7 @@ static void gtk_style_context_impl_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec);
|
||||
static StyleData *style_data_lookup (GtkStyleContext *context);
|
||||
static GtkCssComputedValues *style_values_lookup(GtkStyleContext *context);
|
||||
|
||||
|
||||
static void gtk_style_context_disconnect_update (GtkStyleContext *context);
|
||||
@ -391,17 +384,6 @@ gtk_style_context_class_init (GtkStyleContextClass *klass)
|
||||
GTK_PARAM_READWRITE));
|
||||
}
|
||||
|
||||
static StyleData *
|
||||
style_data_new (void)
|
||||
{
|
||||
StyleData *data;
|
||||
|
||||
data = g_slice_new0 (StyleData);
|
||||
data->ref_count = 1;
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_style_context_clear_property_cache (GtkStyleContext *context)
|
||||
{
|
||||
@ -419,33 +401,6 @@ gtk_style_context_clear_property_cache (GtkStyleContext *context)
|
||||
g_array_set_size (priv->property_cache, 0);
|
||||
}
|
||||
|
||||
static StyleData *
|
||||
style_data_ref (StyleData *style_data)
|
||||
{
|
||||
style_data->ref_count++;
|
||||
|
||||
return style_data;
|
||||
}
|
||||
|
||||
static void
|
||||
style_data_unref (StyleData *data)
|
||||
{
|
||||
data->ref_count--;
|
||||
|
||||
if (data->ref_count > 0)
|
||||
return;
|
||||
|
||||
g_object_unref (data->store);
|
||||
|
||||
g_slice_free (StyleData, data);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
style_data_is_animating (StyleData *style_data)
|
||||
{
|
||||
return !_gtk_css_computed_values_is_static (style_data->store);
|
||||
}
|
||||
|
||||
static GtkStyleInfo *
|
||||
style_info_new (void)
|
||||
{
|
||||
@ -459,25 +414,26 @@ style_info_new (void)
|
||||
}
|
||||
|
||||
static void
|
||||
style_info_set_data (GtkStyleInfo *info,
|
||||
StyleData *data)
|
||||
style_info_set_values (GtkStyleInfo *info,
|
||||
GtkCssComputedValues *values)
|
||||
{
|
||||
if (info->data == data)
|
||||
if (info->values == values)
|
||||
return;
|
||||
|
||||
if (data)
|
||||
style_data_ref (data);
|
||||
if (values)
|
||||
g_object_ref (values);
|
||||
|
||||
if (info->data)
|
||||
style_data_unref (info->data);
|
||||
if (info->values)
|
||||
g_object_unref (info->values);
|
||||
|
||||
info->data = data;
|
||||
info->values = values;
|
||||
}
|
||||
|
||||
static void
|
||||
style_info_free (GtkStyleInfo *info)
|
||||
{
|
||||
style_info_set_data (info, NULL);
|
||||
if (info->values)
|
||||
g_object_unref (info->values);
|
||||
g_array_free (info->style_classes, TRUE);
|
||||
g_array_free (info->regions, TRUE);
|
||||
g_slice_free (GtkStyleInfo, info);
|
||||
@ -510,7 +466,7 @@ style_info_copy (GtkStyleInfo *info)
|
||||
copy->next = info;
|
||||
copy->junction_sides = info->junction_sides;
|
||||
copy->state_flags = info->state_flags;
|
||||
style_info_set_data (copy, info->data);
|
||||
style_info_set_values (copy, info->values);
|
||||
|
||||
return copy;
|
||||
}
|
||||
@ -624,10 +580,10 @@ gtk_style_context_init (GtkStyleContext *style_context)
|
||||
priv = style_context->priv =
|
||||
gtk_style_context_get_instance_private (style_context);
|
||||
|
||||
priv->style_data = g_hash_table_new_full (style_info_hash,
|
||||
style_info_equal,
|
||||
(GDestroyNotify) style_info_free,
|
||||
(GDestroyNotify) style_data_unref);
|
||||
priv->style_values = g_hash_table_new_full (style_info_hash,
|
||||
style_info_equal,
|
||||
(GDestroyNotify) style_info_free,
|
||||
g_object_unref);
|
||||
|
||||
priv->screen = gdk_screen_get_default ();
|
||||
priv->relevant_changes = GTK_CSS_CHANGE_ANY;
|
||||
@ -716,7 +672,7 @@ static gboolean
|
||||
gtk_style_context_should_animate (GtkStyleContext *context)
|
||||
{
|
||||
GtkStyleContextPrivate *priv;
|
||||
StyleData *data;
|
||||
GtkCssComputedValues *values;
|
||||
gboolean animate;
|
||||
|
||||
priv = context->priv;
|
||||
@ -727,8 +683,8 @@ gtk_style_context_should_animate (GtkStyleContext *context)
|
||||
if (!gtk_widget_get_mapped (priv->widget))
|
||||
return FALSE;
|
||||
|
||||
data = style_data_lookup (context);
|
||||
if (!style_data_is_animating (data))
|
||||
values = style_values_lookup (context);
|
||||
if (_gtk_css_computed_values_is_static (values))
|
||||
return FALSE;
|
||||
|
||||
g_object_get (gtk_widget_get_settings (context->priv->widget),
|
||||
@ -768,7 +724,7 @@ gtk_style_context_finalize (GObject *object)
|
||||
if (priv->widget_path)
|
||||
gtk_widget_path_free (priv->widget_path);
|
||||
|
||||
g_hash_table_destroy (priv->style_data);
|
||||
g_hash_table_destroy (priv->style_values);
|
||||
|
||||
while (priv->info)
|
||||
priv->info = style_info_pop (priv->info);
|
||||
@ -910,62 +866,61 @@ build_properties (GtkStyleContext *context,
|
||||
GTK_STYLE_PROVIDER_PRIVATE (priv->cascade),
|
||||
priv->scale,
|
||||
values,
|
||||
priv->parent ? style_data_lookup (priv->parent)->store : NULL);
|
||||
priv->parent ? style_values_lookup (priv->parent) : NULL);
|
||||
|
||||
_gtk_css_lookup_free (lookup);
|
||||
gtk_widget_path_free (path);
|
||||
}
|
||||
|
||||
static StyleData *
|
||||
style_data_lookup (GtkStyleContext *context)
|
||||
static GtkCssComputedValues *
|
||||
style_values_lookup (GtkStyleContext *context)
|
||||
{
|
||||
GtkStyleContextPrivate *priv;
|
||||
GtkCssComputedValues *values;
|
||||
GtkStyleInfo *info;
|
||||
StyleData *data;
|
||||
|
||||
priv = context->priv;
|
||||
info = priv->info;
|
||||
|
||||
/* Current data in use is cached, just return it */
|
||||
if (info->data)
|
||||
return info->data;
|
||||
if (info->values)
|
||||
return info->values;
|
||||
|
||||
g_assert (priv->widget != NULL || priv->widget_path != NULL);
|
||||
|
||||
data = g_hash_table_lookup (priv->style_data, info);
|
||||
if (data)
|
||||
values = g_hash_table_lookup (priv->style_values, info);
|
||||
if (values)
|
||||
{
|
||||
style_info_set_data (info, data);
|
||||
return data;
|
||||
style_info_set_values (info, values);
|
||||
return values;
|
||||
}
|
||||
|
||||
data = style_data_new ();
|
||||
data->store = _gtk_css_computed_values_new ();
|
||||
style_info_set_data (info, data);
|
||||
g_hash_table_insert (priv->style_data,
|
||||
values = _gtk_css_computed_values_new ();
|
||||
style_info_set_values (info, values);
|
||||
g_hash_table_insert (priv->style_values,
|
||||
style_info_copy (info),
|
||||
data);
|
||||
values);
|
||||
|
||||
build_properties (context, data->store, info, NULL);
|
||||
build_properties (context, values, info, NULL);
|
||||
|
||||
return data;
|
||||
return values;
|
||||
}
|
||||
|
||||
static StyleData *
|
||||
style_data_lookup_for_state (GtkStyleContext *context,
|
||||
GtkStateFlags state)
|
||||
static GtkCssComputedValues *
|
||||
style_values_lookup_for_state (GtkStyleContext *context,
|
||||
GtkStateFlags state)
|
||||
{
|
||||
StyleData *data;
|
||||
GtkCssComputedValues *values;
|
||||
|
||||
if (context->priv->info->state_flags == state)
|
||||
return style_data_lookup (context);
|
||||
return style_values_lookup (context);
|
||||
|
||||
gtk_style_context_save (context);
|
||||
gtk_style_context_set_state (context, state);
|
||||
data = style_data_lookup (context);
|
||||
values = style_values_lookup (context);
|
||||
gtk_style_context_restore (context);
|
||||
|
||||
return data;
|
||||
return values;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1012,7 +967,7 @@ gtk_style_context_queue_invalidate_internal (GtkStyleContext *context,
|
||||
|
||||
if (gtk_style_context_is_saved (context))
|
||||
{
|
||||
style_info_set_data (info, NULL);
|
||||
style_info_set_values (info, NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1250,8 +1205,8 @@ gtk_style_context_get_section (GtkStyleContext *context,
|
||||
const gchar *property)
|
||||
{
|
||||
GtkStyleContextPrivate *priv;
|
||||
GtkCssComputedValues *values;
|
||||
GtkStyleProperty *prop;
|
||||
StyleData *data;
|
||||
|
||||
g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), NULL);
|
||||
g_return_val_if_fail (property != NULL, NULL);
|
||||
@ -1263,8 +1218,8 @@ gtk_style_context_get_section (GtkStyleContext *context,
|
||||
if (!GTK_IS_CSS_STYLE_PROPERTY (prop))
|
||||
return NULL;
|
||||
|
||||
data = style_data_lookup (context);
|
||||
return _gtk_css_computed_values_get_section (data->store, _gtk_css_style_property_get_id (GTK_CSS_STYLE_PROPERTY (prop)));
|
||||
values = style_values_lookup (context);
|
||||
return _gtk_css_computed_values_get_section (values, _gtk_css_style_property_get_id (GTK_CSS_STYLE_PROPERTY (prop)));
|
||||
}
|
||||
|
||||
static GtkCssValue *
|
||||
@ -1295,8 +1250,8 @@ gtk_style_context_get_property (GtkStyleContext *context,
|
||||
GValue *value)
|
||||
{
|
||||
GtkStyleContextPrivate *priv;
|
||||
GtkCssComputedValues *values;
|
||||
GtkStyleProperty *prop;
|
||||
StyleData *data;
|
||||
|
||||
g_return_if_fail (GTK_IS_STYLE_CONTEXT (context));
|
||||
g_return_if_fail (property != NULL);
|
||||
@ -1317,8 +1272,8 @@ gtk_style_context_get_property (GtkStyleContext *context,
|
||||
return;
|
||||
}
|
||||
|
||||
data = style_data_lookup_for_state (context, state);
|
||||
_gtk_style_property_query (prop, value, gtk_style_context_query_func, data->store);
|
||||
values = style_values_lookup_for_state (context, state);
|
||||
_gtk_style_property_query (prop, value, gtk_style_context_query_func, values);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1665,8 +1620,8 @@ gtk_style_context_save (GtkStyleContext *context)
|
||||
/* Need to unset animations here because we can not know what style
|
||||
* class potential transitions came from once we save().
|
||||
*/
|
||||
if (priv->info->data && style_data_is_animating (priv->info->data))
|
||||
style_info_set_data (priv->info, NULL);
|
||||
if (priv->info->values && !_gtk_css_computed_values_is_static (priv->info->values))
|
||||
style_info_set_values (priv->info, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2189,9 +2144,9 @@ GtkCssValue *
|
||||
_gtk_style_context_peek_property (GtkStyleContext *context,
|
||||
guint property_id)
|
||||
{
|
||||
StyleData *data = style_data_lookup (context);
|
||||
GtkCssComputedValues *values = style_values_lookup (context);
|
||||
|
||||
return _gtk_css_computed_values_get_value (data->store, property_id);
|
||||
return _gtk_css_computed_values_get_value (values, property_id);
|
||||
}
|
||||
|
||||
const GValue *
|
||||
@ -2986,9 +2941,9 @@ gtk_style_context_clear_cache (GtkStyleContext *context)
|
||||
|
||||
for (info = priv->info; info; info = info->next)
|
||||
{
|
||||
style_info_set_data (info, NULL);
|
||||
style_info_set_values (info, NULL);
|
||||
}
|
||||
g_hash_table_remove_all (priv->style_data);
|
||||
g_hash_table_remove_all (priv->style_values);
|
||||
|
||||
gtk_style_context_clear_property_cache (context);
|
||||
}
|
||||
@ -3006,17 +2961,17 @@ gtk_style_context_update_cache (GtkStyleContext *context,
|
||||
|
||||
priv = context->priv;
|
||||
|
||||
g_hash_table_iter_init (&iter, priv->style_data);
|
||||
g_hash_table_iter_init (&iter, priv->style_values);
|
||||
while (g_hash_table_iter_next (&iter, &key, &value))
|
||||
{
|
||||
GtkStyleInfo *info = key;
|
||||
StyleData *data = value;
|
||||
GtkCssComputedValues *values = value;
|
||||
GtkBitmask *changes;
|
||||
|
||||
changes = _gtk_css_computed_values_compute_dependencies (data->store, parent_changes);
|
||||
changes = _gtk_css_computed_values_compute_dependencies (values, parent_changes);
|
||||
|
||||
if (!_gtk_bitmask_is_empty (changes))
|
||||
build_properties (context, data->store, info, changes);
|
||||
build_properties (context, values, info, changes);
|
||||
|
||||
_gtk_bitmask_free (changes);
|
||||
}
|
||||
@ -3050,14 +3005,13 @@ gtk_style_context_update_animations (GtkStyleContext *context,
|
||||
gint64 timestamp)
|
||||
{
|
||||
GtkBitmask *differences;
|
||||
StyleData *style_data;
|
||||
GtkCssComputedValues *values;
|
||||
|
||||
style_data = style_data_lookup (context);
|
||||
values = style_values_lookup (context);
|
||||
|
||||
differences = _gtk_css_computed_values_advance (style_data->store,
|
||||
timestamp);
|
||||
differences = _gtk_css_computed_values_advance (values, timestamp);
|
||||
|
||||
if (_gtk_css_computed_values_is_static (style_data->store))
|
||||
if (_gtk_css_computed_values_is_static (values))
|
||||
_gtk_style_context_update_animating (context);
|
||||
|
||||
return differences;
|
||||
@ -3132,7 +3086,7 @@ _gtk_style_context_validate (GtkStyleContext *context,
|
||||
{
|
||||
GtkStyleContextPrivate *priv;
|
||||
GtkStyleInfo *info;
|
||||
StyleData *current;
|
||||
GtkCssComputedValues *current;
|
||||
GtkBitmask *changes;
|
||||
GSList *list;
|
||||
|
||||
@ -3164,8 +3118,8 @@ _gtk_style_context_validate (GtkStyleContext *context,
|
||||
gtk_style_context_set_invalid (context, FALSE);
|
||||
|
||||
info = priv->info;
|
||||
if (info->data)
|
||||
current = style_data_ref (info->data);
|
||||
if (info->values)
|
||||
current = g_object_ref (info->values);
|
||||
else
|
||||
current = NULL;
|
||||
|
||||
@ -3173,7 +3127,7 @@ _gtk_style_context_validate (GtkStyleContext *context,
|
||||
if (current == NULL ||
|
||||
gtk_style_context_needs_full_revalidate (context, change))
|
||||
{
|
||||
StyleData *data;
|
||||
GtkCssComputedValues *values;
|
||||
|
||||
if ((priv->relevant_changes & change) & ~GTK_STYLE_CONTEXT_CACHED_CHANGE)
|
||||
{
|
||||
@ -3182,18 +3136,18 @@ _gtk_style_context_validate (GtkStyleContext *context,
|
||||
else
|
||||
{
|
||||
gtk_style_context_update_cache (context, parent_changes);
|
||||
style_info_set_data (info, NULL);
|
||||
style_info_set_values (info, NULL);
|
||||
}
|
||||
|
||||
data = style_data_lookup (context);
|
||||
values = style_values_lookup (context);
|
||||
|
||||
_gtk_css_computed_values_create_animations (data->store,
|
||||
priv->parent ? style_data_lookup (priv->parent)->store : NULL,
|
||||
_gtk_css_computed_values_create_animations (values,
|
||||
priv->parent ? style_values_lookup (priv->parent) : NULL,
|
||||
timestamp,
|
||||
GTK_STYLE_PROVIDER_PRIVATE (priv->cascade),
|
||||
priv->scale,
|
||||
current && gtk_style_context_should_create_transitions (context) ? current->store : NULL);
|
||||
if (_gtk_css_computed_values_is_static (data->store))
|
||||
gtk_style_context_should_create_transitions (context) ? current : NULL);
|
||||
if (_gtk_css_computed_values_is_static (values))
|
||||
change &= ~GTK_CSS_CHANGE_ANIMATE;
|
||||
else
|
||||
change |= GTK_CSS_CHANGE_ANIMATE;
|
||||
@ -3201,10 +3155,10 @@ _gtk_style_context_validate (GtkStyleContext *context,
|
||||
|
||||
if (current)
|
||||
{
|
||||
changes = _gtk_css_computed_values_get_difference (data->store, current->store);
|
||||
changes = _gtk_css_computed_values_get_difference (values, current);
|
||||
|
||||
/* In the case where we keep the cache, we want unanimated values */
|
||||
_gtk_css_computed_values_cancel_animations (current->store);
|
||||
_gtk_css_computed_values_cancel_animations (current);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -3214,13 +3168,13 @@ _gtk_style_context_validate (GtkStyleContext *context,
|
||||
}
|
||||
else
|
||||
{
|
||||
changes = _gtk_css_computed_values_compute_dependencies (current->store, parent_changes);
|
||||
changes = _gtk_css_computed_values_compute_dependencies (current, parent_changes);
|
||||
|
||||
gtk_style_context_update_cache (context, parent_changes);
|
||||
}
|
||||
|
||||
if (current)
|
||||
style_data_unref (current);
|
||||
g_object_unref (current);
|
||||
|
||||
if (change & GTK_CSS_CHANGE_ANIMATE &&
|
||||
gtk_style_context_is_animating (context))
|
||||
@ -3574,7 +3528,7 @@ gtk_style_context_get_font (GtkStyleContext *context,
|
||||
GtkStateFlags state)
|
||||
{
|
||||
GtkStyleContextPrivate *priv;
|
||||
StyleData *data;
|
||||
GtkCssComputedValues *values;
|
||||
PangoFontDescription *description, *previous;
|
||||
|
||||
g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), NULL);
|
||||
@ -3582,13 +3536,13 @@ gtk_style_context_get_font (GtkStyleContext *context,
|
||||
priv = context->priv;
|
||||
g_return_val_if_fail (priv->widget != NULL || priv->widget_path != NULL, NULL);
|
||||
|
||||
data = style_data_lookup_for_state (context, state);
|
||||
values = style_values_lookup_for_state (context, state);
|
||||
|
||||
/* Yuck, fonts are created on-demand but we don't return a ref.
|
||||
* Do bad things to achieve this requirement */
|
||||
gtk_style_context_get (context, state, "font", &description, NULL);
|
||||
|
||||
previous = g_object_get_data (G_OBJECT (data->store), "font-cache-for-get_font");
|
||||
previous = g_object_get_data (G_OBJECT (values), "font-cache-for-get_font");
|
||||
|
||||
if (previous)
|
||||
{
|
||||
@ -3598,7 +3552,7 @@ gtk_style_context_get_font (GtkStyleContext *context,
|
||||
}
|
||||
else
|
||||
{
|
||||
g_object_set_data_full (G_OBJECT (data->store),
|
||||
g_object_set_data_full (G_OBJECT (values),
|
||||
"font-cache-for-get_font",
|
||||
description,
|
||||
(GDestroyNotify) pango_font_description_free);
|
||||
@ -4845,8 +4799,8 @@ gtk_gradient_resolve_for_context (GtkGradient *gradient,
|
||||
|
||||
return _gtk_gradient_resolve_full (gradient,
|
||||
GTK_STYLE_PROVIDER_PRIVATE (priv->cascade),
|
||||
style_data_lookup (context)->store,
|
||||
priv->parent ? style_data_lookup (priv->parent)->store : NULL,
|
||||
style_values_lookup (context),
|
||||
priv->parent ? style_values_lookup (priv->parent) : NULL,
|
||||
&ignored);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user