styleproperty: Pass initial value explicitly

This commit is contained in:
Benjamin Otte
2011-12-29 02:28:32 +01:00
parent 4d15186e67
commit aa4925480d
3 changed files with 91 additions and 65 deletions

View File

@ -34,6 +34,7 @@
#include "gtkcsstypesprivate.h" #include "gtkcsstypesprivate.h"
#include "gtkborderimageprivate.h" #include "gtkborderimageprivate.h"
#include "gtkprivatetypebuiltins.h"
#include "gtkstylepropertyprivate.h" #include "gtkstylepropertyprivate.h"
#include "gtkstyleproviderprivate.h" #include "gtkstyleproviderprivate.h"
#include "gtkintl.h" #include "gtkintl.h"
@ -537,9 +538,10 @@ _gtk_style_properties_set_property_by_property (GtkStyleProperties *props,
if (style_prop->pspec->value_type == GDK_TYPE_RGBA || if (style_prop->pspec->value_type == GDK_TYPE_RGBA ||
style_prop->pspec->value_type == GDK_TYPE_COLOR) style_prop->pspec->value_type == GDK_TYPE_COLOR)
{ {
/* Allow GtkSymbolicColor as well */ /* Allow GtkSymbolicColor and special values as well */
g_return_if_fail (value_type == GDK_TYPE_RGBA || g_return_if_fail (value_type == GDK_TYPE_RGBA ||
value_type == GDK_TYPE_COLOR || value_type == GDK_TYPE_COLOR ||
value_type == GTK_TYPE_CSS_SPECIAL_VALUE ||
value_type == GTK_TYPE_SYMBOLIC_COLOR); value_type == GTK_TYPE_SYMBOLIC_COLOR);
} }
else if (style_prop->pspec->value_type == CAIRO_GOBJECT_TYPE_PATTERN) else if (style_prop->pspec->value_type == CAIRO_GOBJECT_TYPE_PATTERN)

View File

@ -2211,34 +2211,6 @@ unset_border_image (GtkStyleProperties *props,
gtk_style_properties_unset_property (props, "border-image-width", state); gtk_style_properties_unset_property (props, "border-image-width", state);
} }
/*** default values ***/
static void
border_image_width_default_value (GtkStyleProperties *props,
GtkStateFlags state,
GValue *value)
{
}
static void
background_color_default_value (GtkStyleProperties *props,
GtkStateFlags state,
GValue *value)
{
GdkRGBA transparent_black = { 0, 0, 0, 0 };
g_value_set_boxed (value, &transparent_black);
}
static void
border_color_default_value (GtkStyleProperties *props,
GtkStateFlags state,
GValue *value)
{
g_value_unset (value);
gtk_style_properties_get_property (props, "color", state, value);
}
/*** API ***/ /*** API ***/
guint guint
@ -2440,24 +2412,7 @@ _gtk_style_property_default_value (const GtkStyleProperty *property,
GtkStateFlags state, GtkStateFlags state,
GValue *value) GValue *value)
{ {
if (property->default_value_func) g_value_copy (&property->initial_value, value);
property->default_value_func (properties, state, value);
else if (property->pspec->value_type == GTK_TYPE_THEMING_ENGINE)
g_value_set_object (value, gtk_theming_engine_load (NULL));
else if (property->pspec->value_type == PANGO_TYPE_FONT_DESCRIPTION)
g_value_take_boxed (value, pango_font_description_from_string ("Sans 10"));
else if (property->pspec->value_type == GDK_TYPE_RGBA)
{
GdkRGBA color;
gdk_rgba_parse (&color, "pink");
g_value_set_boxed (value, &color);
}
else if (property->pspec->value_type == GTK_TYPE_BORDER)
{
g_value_take_boxed (value, gtk_border_new ());
}
else
g_param_value_set_default (property->pspec, value);
} }
gboolean gboolean
@ -2584,7 +2539,24 @@ _gtk_style_property_resolve (const GtkStyleProperty *property,
GValue *val, GValue *val,
GValue *val_out) GValue *val_out)
{ {
if (G_VALUE_TYPE (val) == GTK_TYPE_SYMBOLIC_COLOR) if (G_VALUE_TYPE (val) == GTK_TYPE_CSS_SPECIAL_VALUE)
{
GtkCssSpecialValue special = g_value_get_enum (val);
g_value_unset (val);
switch (special)
{
case GTK_CSS_CURRENT_COLOR:
g_assert (property->pspec->value_type == GDK_TYPE_RGBA);
gtk_style_properties_get_property (props, "color", state, val);
break;
case GTK_CSS_INHERIT:
case GTK_CSS_INITIAL:
default:
g_assert_not_reached ();
}
}
else if (G_VALUE_TYPE (val) == GTK_TYPE_SYMBOLIC_COLOR)
{ {
if (property->pspec->value_type == GDK_TYPE_RGBA) if (property->pspec->value_type == GDK_TYPE_RGBA)
{ {
@ -2669,9 +2641,19 @@ _gtk_style_property_pack (const GtkStyleProperty *property,
property->pack_func (value, props, state, context); property->pack_func (value, props, state, context);
} }
#define rgba_init(rgba, r, g, b, a) G_STMT_START{ \
(rgba)->red = (r); \
(rgba)->green = (g); \
(rgba)->blue = (b); \
(rgba)->alpha = (a); \
}G_STMT_END
static void static void
gtk_style_property_init (void) gtk_style_property_init (void)
{ {
GValue value = { 0, };
char *default_font_family[] = { "Sans", NULL };
GdkRGBA rgba;
if (G_LIKELY (properties)) if (G_LIKELY (properties))
return; return;
@ -2681,6 +2663,9 @@ gtk_style_property_init (void)
/* note that gtk_style_properties_register_property() calls this function, /* note that gtk_style_properties_register_property() calls this function,
* so make sure we're sanely inited to avoid infloops */ * so make sure we're sanely inited to avoid infloops */
g_value_init (&value, GDK_TYPE_RGBA);
rgba_init (&rgba, 1, 1, 1, 1);
g_value_set_boxed (&value, &rgba);
_gtk_style_property_register (g_param_spec_boxed ("color", _gtk_style_property_register (g_param_spec_boxed ("color",
"Foreground color", "Foreground color",
"Foreground color", "Foreground color",
@ -2691,8 +2676,10 @@ gtk_style_property_init (void)
NULL, NULL,
NULL, NULL,
NULL, NULL,
NULL, &value,
NULL); NULL);
rgba_init (&rgba, 0, 0, 0, 0);
g_value_set_boxed (&value, &rgba);
_gtk_style_property_register (g_param_spec_boxed ("background-color", _gtk_style_property_register (g_param_spec_boxed ("background-color",
"Background color", "Background color",
"Background color", "Background color",
@ -2703,9 +2690,12 @@ gtk_style_property_init (void)
NULL, NULL,
transparent_color_value_parse, transparent_color_value_parse,
NULL, NULL,
background_color_default_value, &value,
NULL); NULL);
g_value_unset (&value);
g_value_init (&value, G_TYPE_STRV);
g_value_set_boxed (&value, default_font_family);
_gtk_style_property_register (g_param_spec_boxed ("font-family", _gtk_style_property_register (g_param_spec_boxed ("font-family",
"Font family", "Font family",
"Font family", "Font family",
@ -2716,8 +2706,9 @@ gtk_style_property_init (void)
NULL, NULL,
font_family_parse, font_family_parse,
font_family_value_print, font_family_value_print,
NULL, &value,
NULL); NULL);
g_value_unset (&value);
_gtk_style_property_register (g_param_spec_enum ("font-style", _gtk_style_property_register (g_param_spec_enum ("font-style",
"Font style", "Font style",
"Font style", "Font style",
@ -2758,6 +2749,8 @@ gtk_style_property_init (void)
NULL, NULL,
NULL, NULL,
NULL); NULL);
g_value_init (&value, G_TYPE_DOUBLE);
g_value_set_double (&value, 10);
_gtk_style_property_register (g_param_spec_double ("font-size", _gtk_style_property_register (g_param_spec_double ("font-size",
"Font size", "Font size",
"Font size", "Font size",
@ -2768,8 +2761,9 @@ gtk_style_property_init (void)
NULL, NULL,
NULL, NULL,
NULL, NULL,
NULL, &value,
NULL); NULL);
g_value_unset (&value);
_gtk_style_property_register (g_param_spec_boxed ("font", _gtk_style_property_register (g_param_spec_boxed ("font",
"Font Description", "Font Description",
"Font Description", "Font Description",
@ -2990,6 +2984,8 @@ gtk_style_property_init (void)
"Background origin", "Background origin",
GTK_TYPE_CSS_AREA, GTK_TYPE_CSS_AREA,
GTK_CSS_AREA_PADDING_BOX, 0)); GTK_CSS_AREA_PADDING_BOX, 0));
g_value_init (&value, GTK_TYPE_CSS_SPECIAL_VALUE);
g_value_set_enum (&value, GTK_CSS_CURRENT_COLOR);
_gtk_style_property_register (g_param_spec_boxed ("border-top-color", _gtk_style_property_register (g_param_spec_boxed ("border-top-color",
"Border top color", "Border top color",
"Border top color", "Border top color",
@ -3000,7 +2996,7 @@ gtk_style_property_init (void)
NULL, NULL,
transparent_color_value_parse, transparent_color_value_parse,
NULL, NULL,
border_color_default_value, &value,
NULL); NULL);
_gtk_style_property_register (g_param_spec_boxed ("border-right-color", _gtk_style_property_register (g_param_spec_boxed ("border-right-color",
"Border right color", "Border right color",
@ -3012,7 +3008,7 @@ gtk_style_property_init (void)
NULL, NULL,
transparent_color_value_parse, transparent_color_value_parse,
NULL, NULL,
border_color_default_value, &value,
NULL); NULL);
_gtk_style_property_register (g_param_spec_boxed ("border-bottom-color", _gtk_style_property_register (g_param_spec_boxed ("border-bottom-color",
"Border bottom color", "Border bottom color",
@ -3024,7 +3020,7 @@ gtk_style_property_init (void)
NULL, NULL,
transparent_color_value_parse, transparent_color_value_parse,
NULL, NULL,
border_color_default_value, &value,
NULL); NULL);
_gtk_style_property_register (g_param_spec_boxed ("border-left-color", _gtk_style_property_register (g_param_spec_boxed ("border-left-color",
"Border left color", "Border left color",
@ -3036,8 +3032,9 @@ gtk_style_property_init (void)
NULL, NULL,
transparent_color_value_parse, transparent_color_value_parse,
NULL, NULL,
border_color_default_value, &value,
NULL); NULL);
g_value_unset (&value);
_gtk_style_property_register (g_param_spec_boxed ("border-color", _gtk_style_property_register (g_param_spec_boxed ("border-color",
"Border color", "Border color",
"Border color", "Border color",
@ -3077,6 +3074,7 @@ gtk_style_property_init (void)
"Border image slice", "Border image slice",
"Border image slice", "Border image slice",
GTK_TYPE_BORDER, 0)); GTK_TYPE_BORDER, 0));
g_value_init (&value, GTK_TYPE_BORDER);
_gtk_style_property_register (g_param_spec_boxed ("border-image-width", _gtk_style_property_register (g_param_spec_boxed ("border-image-width",
"Border image width", "Border image width",
"Border image width", "Border image width",
@ -3087,8 +3085,9 @@ gtk_style_property_init (void)
NULL, NULL,
NULL, NULL,
NULL, NULL,
border_image_width_default_value, &value,
NULL); NULL);
g_value_unset (&value);
_gtk_style_property_register (g_param_spec_boxed ("border-image", _gtk_style_property_register (g_param_spec_boxed ("border-image",
"Border Image", "Border Image",
"Border Image", "Border Image",
@ -3143,7 +3142,7 @@ _gtk_style_property_register (GParamSpec *pspec,
GtkStylePackFunc pack_func, GtkStylePackFunc pack_func,
GtkStyleParseFunc parse_func, GtkStyleParseFunc parse_func,
GtkStylePrintFunc print_func, GtkStylePrintFunc print_func,
GtkStyleDefaultValueFunc default_value_func, const GValue * initial_value,
GtkStyleUnsetFunc unset_func) GtkStyleUnsetFunc unset_func)
{ {
const GtkStyleProperty *existing; const GtkStyleProperty *existing;
@ -3169,11 +3168,39 @@ _gtk_style_property_register (GParamSpec *pspec,
node->unpack_func = unpack_func; node->unpack_func = unpack_func;
node->parse_func = parse_func; node->parse_func = parse_func;
node->print_func = print_func; node->print_func = print_func;
node->default_value_func = default_value_func;
node->unset_func = unset_func; node->unset_func = unset_func;
if (!_gtk_style_property_is_shorthand (node)) if (!_gtk_style_property_is_shorthand (node))
_gtk_style_property_generate_id (node); {
_gtk_style_property_generate_id (node);
/* initialize the initial value */
if (initial_value)
{
g_value_init (&node->initial_value, G_VALUE_TYPE (initial_value));
g_value_copy (initial_value, &node->initial_value);
}
else
{
g_value_init (&node->initial_value, pspec->value_type);
if (pspec->value_type == GTK_TYPE_THEMING_ENGINE)
g_value_set_object (&node->initial_value, gtk_theming_engine_load (NULL));
else if (pspec->value_type == PANGO_TYPE_FONT_DESCRIPTION)
g_value_take_boxed (&node->initial_value, pango_font_description_from_string ("Sans 10"));
else if (pspec->value_type == GDK_TYPE_RGBA)
{
GdkRGBA color;
gdk_rgba_parse (&color, "pink");
g_value_set_boxed (&node->initial_value, &color);
}
else if (pspec->value_type == GTK_TYPE_BORDER)
{
g_value_take_boxed (&node->initial_value, gtk_border_new ());
}
else
g_param_value_set_default (pspec, &node->initial_value);
}
}
/* pspec owns name */ /* pspec owns name */
g_hash_table_insert (properties, (gchar *)pspec->name, node); g_hash_table_insert (properties, (gchar *)pspec->name, node);

View File

@ -41,9 +41,6 @@ typedef gboolean (* GtkStyleParseFunc) (GtkCssParser
GValue *value); GValue *value);
typedef void (* GtkStylePrintFunc) (const GValue *value, typedef void (* GtkStylePrintFunc) (const GValue *value,
GString *string); GString *string);
typedef void (* GtkStyleDefaultValueFunc) (GtkStyleProperties *props,
GtkStateFlags state,
GValue *value);
typedef void (* GtkStyleUnsetFunc) (GtkStyleProperties *props, typedef void (* GtkStyleUnsetFunc) (GtkStyleProperties *props,
GtkStateFlags state); GtkStateFlags state);
@ -53,13 +50,13 @@ struct _GtkStyleProperty
GParamSpec *pspec; GParamSpec *pspec;
GtkStylePropertyFlags flags; GtkStylePropertyFlags flags;
guint id; guint id;
GValue initial_value;
GtkStylePropertyParser property_parse_func; GtkStylePropertyParser property_parse_func;
GtkStyleUnpackFunc unpack_func; GtkStyleUnpackFunc unpack_func;
GtkStylePackFunc pack_func; GtkStylePackFunc pack_func;
GtkStyleParseFunc parse_func; GtkStyleParseFunc parse_func;
GtkStylePrintFunc print_func; GtkStylePrintFunc print_func;
GtkStyleDefaultValueFunc default_value_func;
GtkStyleUnsetFunc unset_func; GtkStyleUnsetFunc unset_func;
}; };
@ -75,7 +72,7 @@ void _gtk_style_property_register (GParamSpec
GtkStylePackFunc pack_func, GtkStylePackFunc pack_func,
GtkStyleParseFunc parse_func, GtkStyleParseFunc parse_func,
GtkStylePrintFunc print_func, GtkStylePrintFunc print_func,
GtkStyleDefaultValueFunc default_value_func, const GValue *initial_value,
GtkStyleUnsetFunc unset_func); GtkStyleUnsetFunc unset_func);
gboolean _gtk_style_property_is_inherit (const GtkStyleProperty *property); gboolean _gtk_style_property_is_inherit (const GtkStyleProperty *property);