forked from AuroraMiddleware/gtk
stylecontext: Make StyleInfo keep the next pointer
This commit is contained in:
parent
deefb64661
commit
b8c72a0bdb
@ -331,6 +331,7 @@ struct PropertyValue
|
||||
|
||||
struct GtkStyleInfo
|
||||
{
|
||||
GtkStyleInfo *next;
|
||||
GArray *style_classes;
|
||||
GArray *regions;
|
||||
GtkJunctionSides junction_sides;
|
||||
@ -359,7 +360,7 @@ struct _GtkStyleContextPrivate
|
||||
GtkWidget *widget;
|
||||
GtkWidgetPath *widget_path;
|
||||
GHashTable *style_data;
|
||||
GSList *info_stack;
|
||||
GtkStyleInfo *info;
|
||||
|
||||
GtkTextDirection direction;
|
||||
|
||||
@ -542,7 +543,17 @@ style_info_free (GtkStyleInfo *info)
|
||||
}
|
||||
|
||||
static GtkStyleInfo *
|
||||
style_info_copy (const GtkStyleInfo *info)
|
||||
style_info_pop (GtkStyleInfo *info)
|
||||
{
|
||||
GtkStyleInfo *next = info->next;
|
||||
|
||||
style_info_free (info);
|
||||
|
||||
return next;
|
||||
}
|
||||
|
||||
static GtkStyleInfo *
|
||||
style_info_copy (GtkStyleInfo *info)
|
||||
{
|
||||
GtkStyleInfo *copy;
|
||||
|
||||
@ -555,6 +566,7 @@ style_info_copy (const GtkStyleInfo *info)
|
||||
info->regions->data,
|
||||
info->regions->len);
|
||||
|
||||
copy->next = info;
|
||||
copy->junction_sides = info->junction_sides;
|
||||
copy->state_flags = info->state_flags;
|
||||
if (info->data)
|
||||
@ -674,7 +686,6 @@ static void
|
||||
gtk_style_context_init (GtkStyleContext *style_context)
|
||||
{
|
||||
GtkStyleContextPrivate *priv;
|
||||
GtkStyleInfo *info;
|
||||
|
||||
priv = style_context->priv = G_TYPE_INSTANCE_GET_PRIVATE (style_context,
|
||||
GTK_TYPE_STYLE_CONTEXT,
|
||||
@ -691,8 +702,7 @@ gtk_style_context_init (GtkStyleContext *style_context)
|
||||
priv->relevant_changes = GTK_CSS_CHANGE_ANY;
|
||||
|
||||
/* Create default info store */
|
||||
info = style_info_new ();
|
||||
priv->info_stack = g_slist_prepend (priv->info_stack, info);
|
||||
priv->info = style_info_new ();
|
||||
|
||||
gtk_style_context_set_cascade (style_context,
|
||||
_gtk_style_cascade_get_for_screen (priv->screen));
|
||||
@ -797,7 +807,8 @@ gtk_style_context_finalize (GObject *object)
|
||||
|
||||
g_hash_table_destroy (priv->style_data);
|
||||
|
||||
g_slist_free_full (priv->info_stack, (GDestroyNotify) style_info_free);
|
||||
while (priv->info)
|
||||
priv->info = style_info_pop (priv->info);
|
||||
|
||||
G_OBJECT_CLASS (gtk_style_context_parent_class)->finalize (object);
|
||||
}
|
||||
@ -897,7 +908,7 @@ create_query_path (GtkStyleContext *context)
|
||||
path = priv->widget ? _gtk_widget_create_path (priv->widget) : gtk_widget_path_copy (priv->widget_path);
|
||||
pos = gtk_widget_path_length (path) - 1;
|
||||
|
||||
info = priv->info_stack->data;
|
||||
info = priv->info;
|
||||
|
||||
/* Set widget regions */
|
||||
for (i = 0; i < info->regions->len; i++)
|
||||
@ -930,7 +941,7 @@ style_data_lookup (GtkStyleContext *context)
|
||||
GtkStyleInfo *info;
|
||||
|
||||
priv = context->priv;
|
||||
info = priv->info_stack->data;
|
||||
info = priv->info;
|
||||
|
||||
/* Current data in use is cached, just return it */
|
||||
if (info->data)
|
||||
@ -993,7 +1004,7 @@ gtk_style_context_set_invalid (GtkStyleContext *context,
|
||||
static gboolean
|
||||
gtk_style_context_is_saved (GtkStyleContext *context)
|
||||
{
|
||||
return context->priv->info_stack->next != NULL;
|
||||
return context->priv->info->next != NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1001,7 +1012,7 @@ gtk_style_context_queue_invalidate_internal (GtkStyleContext *context,
|
||||
GtkCssChange change)
|
||||
{
|
||||
GtkStyleContextPrivate *priv = context->priv;
|
||||
GtkStyleInfo *info = priv->info_stack->data;
|
||||
GtkStyleInfo *info = priv->info;
|
||||
|
||||
if (gtk_style_context_is_saved (context))
|
||||
{
|
||||
@ -1402,14 +1413,9 @@ void
|
||||
gtk_style_context_set_state (GtkStyleContext *context,
|
||||
GtkStateFlags flags)
|
||||
{
|
||||
GtkStyleContextPrivate *priv;
|
||||
GtkStyleInfo *info;
|
||||
|
||||
g_return_if_fail (GTK_IS_STYLE_CONTEXT (context));
|
||||
|
||||
priv = context->priv;
|
||||
info = priv->info_stack->data;
|
||||
info->state_flags = flags;
|
||||
context->priv->info->state_flags = flags;
|
||||
|
||||
gtk_style_context_queue_invalidate_internal (context, GTK_CSS_CHANGE_STATE);
|
||||
}
|
||||
@ -1427,15 +1433,9 @@ gtk_style_context_set_state (GtkStyleContext *context,
|
||||
GtkStateFlags
|
||||
gtk_style_context_get_state (GtkStyleContext *context)
|
||||
{
|
||||
GtkStyleContextPrivate *priv;
|
||||
GtkStyleInfo *info;
|
||||
|
||||
g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), 0);
|
||||
|
||||
priv = context->priv;
|
||||
info = priv->info_stack->data;
|
||||
|
||||
return info->state_flags;
|
||||
return context->priv->info->state_flags;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1614,16 +1614,12 @@ void
|
||||
gtk_style_context_save (GtkStyleContext *context)
|
||||
{
|
||||
GtkStyleContextPrivate *priv;
|
||||
GtkStyleInfo *info;
|
||||
|
||||
g_return_if_fail (GTK_IS_STYLE_CONTEXT (context));
|
||||
|
||||
priv = context->priv;
|
||||
|
||||
g_assert (priv->info_stack != NULL);
|
||||
|
||||
info = style_info_copy (priv->info_stack->data);
|
||||
priv->info_stack = g_slist_prepend (priv->info_stack, info);
|
||||
priv->info = style_info_copy (priv->info);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1639,26 +1635,19 @@ void
|
||||
gtk_style_context_restore (GtkStyleContext *context)
|
||||
{
|
||||
GtkStyleContextPrivate *priv;
|
||||
GtkStyleInfo *info;
|
||||
|
||||
g_return_if_fail (GTK_IS_STYLE_CONTEXT (context));
|
||||
|
||||
priv = context->priv;
|
||||
|
||||
if (priv->info_stack)
|
||||
{
|
||||
info = priv->info_stack->data;
|
||||
priv->info_stack = g_slist_remove (priv->info_stack, info);
|
||||
style_info_free (info);
|
||||
}
|
||||
priv->info = style_info_pop (priv->info);
|
||||
|
||||
if (!priv->info_stack)
|
||||
if (!priv->info)
|
||||
{
|
||||
g_warning ("Unpaired gtk_style_context_restore() call");
|
||||
|
||||
/* Create default region */
|
||||
info = style_info_new ();
|
||||
priv->info_stack = g_slist_prepend (priv->info_stack, info);
|
||||
priv->info = style_info_new ();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1793,8 +1782,7 @@ gtk_style_context_add_class (GtkStyleContext *context,
|
||||
priv = context->priv;
|
||||
class_quark = g_quark_from_string (class_name);
|
||||
|
||||
g_assert (priv->info_stack != NULL);
|
||||
info = priv->info_stack->data;
|
||||
info = priv->info;
|
||||
|
||||
if (!style_class_find (info->style_classes, class_quark, &position))
|
||||
{
|
||||
@ -1832,8 +1820,7 @@ gtk_style_context_remove_class (GtkStyleContext *context,
|
||||
|
||||
priv = context->priv;
|
||||
|
||||
g_assert (priv->info_stack != NULL);
|
||||
info = priv->info_stack->data;
|
||||
info = priv->info;
|
||||
|
||||
if (style_class_find (info->style_classes, class_quark, &position))
|
||||
{
|
||||
@ -1873,8 +1860,7 @@ gtk_style_context_has_class (GtkStyleContext *context,
|
||||
|
||||
priv = context->priv;
|
||||
|
||||
g_assert (priv->info_stack != NULL);
|
||||
info = priv->info_stack->data;
|
||||
info = priv->info;
|
||||
|
||||
if (style_class_find (info->style_classes, class_quark, NULL))
|
||||
return TRUE;
|
||||
@ -1907,8 +1893,7 @@ gtk_style_context_list_classes (GtkStyleContext *context)
|
||||
|
||||
priv = context->priv;
|
||||
|
||||
g_assert (priv->info_stack != NULL);
|
||||
info = priv->info_stack->data;
|
||||
info = priv->info;
|
||||
|
||||
for (i = 0; i < info->style_classes->len; i++)
|
||||
{
|
||||
@ -1946,8 +1931,7 @@ gtk_style_context_list_regions (GtkStyleContext *context)
|
||||
|
||||
priv = context->priv;
|
||||
|
||||
g_assert (priv->info_stack != NULL);
|
||||
info = priv->info_stack->data;
|
||||
info = priv->info;
|
||||
|
||||
for (i = 0; i < info->regions->len; i++)
|
||||
{
|
||||
@ -2031,8 +2015,7 @@ gtk_style_context_add_region (GtkStyleContext *context,
|
||||
priv = context->priv;
|
||||
region_quark = g_quark_from_string (region_name);
|
||||
|
||||
g_assert (priv->info_stack != NULL);
|
||||
info = priv->info_stack->data;
|
||||
info = priv->info;
|
||||
|
||||
if (!region_find (info->regions, region_quark, &position))
|
||||
{
|
||||
@ -2075,8 +2058,7 @@ gtk_style_context_remove_region (GtkStyleContext *context,
|
||||
|
||||
priv = context->priv;
|
||||
|
||||
g_assert (priv->info_stack != NULL);
|
||||
info = priv->info_stack->data;
|
||||
info = priv->info;
|
||||
|
||||
if (region_find (info->regions, region_quark, &position))
|
||||
{
|
||||
@ -2123,8 +2105,7 @@ gtk_style_context_has_region (GtkStyleContext *context,
|
||||
|
||||
priv = context->priv;
|
||||
|
||||
g_assert (priv->info_stack != NULL);
|
||||
info = priv->info_stack->data;
|
||||
info = priv->info;
|
||||
|
||||
if (region_find (info->regions, region_quark, &position))
|
||||
{
|
||||
@ -2632,14 +2613,9 @@ void
|
||||
gtk_style_context_set_junction_sides (GtkStyleContext *context,
|
||||
GtkJunctionSides sides)
|
||||
{
|
||||
GtkStyleContextPrivate *priv;
|
||||
GtkStyleInfo *info;
|
||||
|
||||
g_return_if_fail (GTK_IS_STYLE_CONTEXT (context));
|
||||
|
||||
priv = context->priv;
|
||||
info = priv->info_stack->data;
|
||||
info->junction_sides = sides;
|
||||
context->priv->info->junction_sides = sides;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2655,14 +2631,9 @@ gtk_style_context_set_junction_sides (GtkStyleContext *context,
|
||||
GtkJunctionSides
|
||||
gtk_style_context_get_junction_sides (GtkStyleContext *context)
|
||||
{
|
||||
GtkStyleContextPrivate *priv;
|
||||
GtkStyleInfo *info;
|
||||
|
||||
g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), 0);
|
||||
|
||||
priv = context->priv;
|
||||
info = priv->info_stack->data;
|
||||
return info->junction_sides;
|
||||
return context->priv->info->junction_sides;
|
||||
}
|
||||
|
||||
static GtkSymbolicColor *
|
||||
@ -2911,13 +2882,12 @@ static void
|
||||
gtk_style_context_clear_cache (GtkStyleContext *context)
|
||||
{
|
||||
GtkStyleContextPrivate *priv;
|
||||
GSList *list;
|
||||
GtkStyleInfo *info;
|
||||
|
||||
priv = context->priv;
|
||||
|
||||
for (list = priv->info_stack; list; list = list->next)
|
||||
for (info = priv->info; info; info = info->next)
|
||||
{
|
||||
GtkStyleInfo *info = list->data;
|
||||
if (info->data)
|
||||
{
|
||||
style_data_unref (info->data);
|
||||
@ -2991,7 +2961,7 @@ _gtk_style_context_validate (GtkStyleContext *context,
|
||||
GtkCssMatcher matcher;
|
||||
|
||||
path = create_query_path (context);
|
||||
_gtk_css_matcher_init (&matcher, path, ((GtkStyleInfo *) priv->info_stack->data)->state_flags);
|
||||
_gtk_css_matcher_init (&matcher, path, priv->info->state_flags);
|
||||
|
||||
priv->relevant_changes = _gtk_style_provider_private_get_change (GTK_STYLE_PROVIDER_PRIVATE (priv->cascade),
|
||||
&matcher);
|
||||
@ -3003,7 +2973,7 @@ _gtk_style_context_validate (GtkStyleContext *context,
|
||||
|
||||
if (priv->relevant_changes & change)
|
||||
{
|
||||
GtkStyleInfo *info = priv->info_stack->data;
|
||||
GtkStyleInfo *info = priv->info;
|
||||
GtkCssComputedValues *old, *new;
|
||||
|
||||
old = info->data ? g_object_ref (info->data->store) : NULL;
|
||||
|
Loading…
Reference in New Issue
Block a user