GtkStyleSet: Optionally take GtkSymbolicColors.

gtk_style_set_set_property() now takes both GdkColor and GtkSymbolicColor
GValues, All accessors still return GdkColors, so any symbolic color will
be resolved and replaced in the styleset at that time.
This commit is contained in:
Carlos Garnacho 2010-06-25 20:08:07 +02:00
parent b8fb2d1a36
commit 4ed96df96a

View File

@ -315,8 +315,10 @@ set_property_internal (GtkStyleSet *set,
GtkStyleSetPrivate *priv;
PropertyNode *node;
PropertyData *prop;
GType value_type;
GValue *val;
value_type = G_VALUE_TYPE (value);
node = property_node_lookup (g_quark_try_string (property));
if (!node)
@ -325,7 +327,13 @@ set_property_internal (GtkStyleSet *set,
return;
}
g_return_if_fail (node->property_type == G_VALUE_TYPE (value));
if (node->property_type == GDK_TYPE_COLOR)
{
/* Allow GtkSymbolicColor as well */
g_return_if_fail (value_type == GDK_TYPE_COLOR || value_type == GTK_TYPE_SYMBOLIC_COLOR);
}
else
g_return_if_fail (node->property_type == G_VALUE_TYPE (value));
priv = GTK_STYLE_SET_GET_PRIVATE (set);
prop = g_hash_table_lookup (priv->properties,
@ -344,10 +352,15 @@ set_property_internal (GtkStyleSet *set,
else
val = &prop->values[state];
if (G_IS_VALUE (val))
if (G_VALUE_TYPE (val) == value_type)
g_value_reset (val);
else
g_value_init (val, node->property_type);
{
if (G_IS_VALUE (val))
g_value_unset (val);
g_value_init (val, value_type);
}
g_value_copy (value, val);
}
@ -447,6 +460,24 @@ gtk_style_set_set (GtkStyleSet *set,
va_end (args);
}
static gboolean
resolve_color (GtkStyleSet *set,
GValue *value)
{
GdkColor color;
/* Resolve symbolic color to GdkColor */
if (!gtk_symbolic_color_resolve (g_value_get_boxed (value), set, &color))
return FALSE;
/* Store it back, this is where GdkColor caching happens */
g_value_unset (value);
g_value_init (value, GDK_TYPE_COLOR);
g_value_set_boxed (value, &color);
return TRUE;
}
gboolean
gtk_style_set_get_property (GtkStyleSet *set,
const gchar *property,
@ -456,6 +487,7 @@ gtk_style_set_get_property (GtkStyleSet *set,
GtkStyleSetPrivate *priv;
PropertyNode *node;
PropertyData *prop;
GValue *val;
g_return_val_if_fail (GTK_IS_STYLE_SET (set), FALSE);
g_return_val_if_fail (property != NULL, FALSE);
@ -479,10 +511,22 @@ gtk_style_set_get_property (GtkStyleSet *set,
g_value_init (value, node->property_type);
if (!G_IS_VALUE (&prop->values[state]))
g_value_copy (&prop->default_value, value);
if (G_IS_VALUE (&prop->values[state]))
val = &prop->values[state];
else
g_value_copy (&prop->values[state], value);
val = &prop->default_value;
g_return_val_if_fail (G_IS_VALUE (val), FALSE);
if (G_VALUE_TYPE (val) == GTK_TYPE_SYMBOLIC_COLOR)
{
g_return_val_if_fail (node->property_type == GDK_TYPE_COLOR, FALSE);
if (!resolve_color (set, val))
return FALSE;
}
g_value_copy (val, value);
return TRUE;
}
@ -527,10 +571,25 @@ gtk_style_set_get_valist (GtkStyleSet *set,
g_value_init (&empty_value, node->property_type);
G_VALUE_LCOPY (&empty_value, args, 0, &error);
}
else if (!G_IS_VALUE (&prop->values[state]))
G_VALUE_LCOPY (&prop->default_value, args, 0, &error);
else
G_VALUE_LCOPY (&prop->values[state], args, 0, &error);
{
GValue *val;
if (G_IS_VALUE (&prop->values[state]))
val = &prop->values[state];
else
val = &prop->default_value;
if (G_VALUE_TYPE (val) == GTK_TYPE_SYMBOLIC_COLOR)
{
g_return_if_fail (node->property_type == GDK_TYPE_COLOR);
if (!resolve_color (set, val))
return;
}
G_VALUE_LCOPY (val, args, 0, &error);
}
if (error)
{