X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkcsscustomproperty.c;h=4c0437983ff59fdfcf54e2170c208700a903e284;hb=3c8e1c92a85b2e41161698f141747ced2c574f32;hp=bce695df4823785b9cb92a77dbbae02f1f3b269b;hpb=43c56d70ea247b3317c386e22407ad20769d2762;p=~andy%2Fgtk diff --git a/gtk/gtkcsscustomproperty.c b/gtk/gtkcsscustomproperty.c index bce695df4..4c0437983 100644 --- a/gtk/gtkcsscustomproperty.c +++ b/gtk/gtkcsscustomproperty.c @@ -24,17 +24,34 @@ #include #include "gtkcssstylefuncsprivate.h" +#include "gtkcsstypedvalueprivate.h" +#include "gtkstylepropertiesprivate.h" #include "gtkthemingengine.h" +#include "deprecated/gtksymboliccolor.h" + G_DEFINE_TYPE (GtkCssCustomProperty, _gtk_css_custom_property, GTK_TYPE_CSS_STYLE_PROPERTY) -static gboolean +static GType +gtk_css_custom_property_get_specified_type (GParamSpec *pspec) +{ + G_GNUC_BEGIN_IGNORE_DEPRECATIONS; + + if (pspec->value_type == GDK_TYPE_RGBA || + pspec->value_type == GDK_TYPE_COLOR) + return GTK_TYPE_SYMBOLIC_COLOR; + else + return pspec->value_type; + + G_GNUC_END_IGNORE_DEPRECATIONS; +} + +static GtkCssValue * gtk_css_custom_property_parse_value (GtkStyleProperty *property, - GValue *value, - GtkCssParser *parser, - GFile *base) + GtkCssParser *parser) { GtkCssCustomProperty *custom = GTK_CSS_CUSTOM_PROPERTY (property); + GValue value = G_VALUE_INIT; gboolean success; if (custom->property_parse_func) @@ -42,12 +59,12 @@ gtk_css_custom_property_parse_value (GtkStyleProperty *property, GError *error = NULL; char *value_str; - g_value_init (value, _gtk_style_property_get_value_type (property)); + g_value_init (&value, _gtk_style_property_get_value_type (property)); value_str = _gtk_css_parser_read_value (parser); if (value_str != NULL) { - success = (* custom->property_parse_func) (value_str, value, &error); + success = (* custom->property_parse_func) (value_str, &value, &error); g_free (value_str); } else @@ -55,16 +72,50 @@ gtk_css_custom_property_parse_value (GtkStyleProperty *property, } else { - GtkCssStyleProperty *style = GTK_CSS_STYLE_PROPERTY (property); - g_value_init (value, _gtk_css_style_property_get_specified_type (style)); + g_value_init (&value, gtk_css_custom_property_get_specified_type (custom->pspec)); - success = _gtk_css_style_parse_value (value, parser, base); + success = _gtk_css_style_parse_value (&value, parser); } if (!success) - g_value_unset (value); + { + g_value_unset (&value); + return NULL; + } + + return _gtk_css_typed_value_new_take (&value); +} + +static void +gtk_css_custom_property_query (GtkStyleProperty *property, + GValue *value, + GtkStyleQueryFunc query_func, + gpointer query_data) +{ + GtkCssStyleProperty *style = GTK_CSS_STYLE_PROPERTY (property); + GtkCssCustomProperty *custom = GTK_CSS_CUSTOM_PROPERTY (property); + GtkCssValue *css_value; + + css_value = (* query_func) (_gtk_css_style_property_get_id (style), query_data); + if (css_value == NULL) + css_value = _gtk_css_style_property_get_initial_value (style); + + g_value_init (value, custom->pspec->value_type); + g_value_copy (_gtk_css_typed_value_get (css_value), value); +} - return success; +static void +gtk_css_custom_property_assign (GtkStyleProperty *property, + GtkStyleProperties *props, + GtkStateFlags state, + const GValue *value) +{ + GtkCssValue *css_value = _gtk_css_typed_value_new (value); + _gtk_style_properties_set_property_by_property (props, + GTK_CSS_STYLE_PROPERTY (property), + state, + css_value); + _gtk_css_value_unref (css_value); } static void @@ -73,11 +124,12 @@ _gtk_css_custom_property_class_init (GtkCssCustomPropertyClass *klass) GtkStylePropertyClass *property_class = GTK_STYLE_PROPERTY_CLASS (klass); property_class->parse_value = gtk_css_custom_property_parse_value; + property_class->query = gtk_css_custom_property_query; + property_class->assign = gtk_css_custom_property_assign; } - static void -_gtk_css_custom_property_init (GtkCssCustomProperty *custom_property) +_gtk_css_custom_property_init (GtkCssCustomProperty *custom) { } @@ -85,6 +137,7 @@ static GtkCssValue * gtk_css_custom_property_create_initial_value (GParamSpec *pspec) { GValue value = G_VALUE_INIT; + GtkCssValue *result; g_value_init (&value, pspec->value_type); @@ -96,13 +149,13 @@ gtk_css_custom_property_create_initial_value (GParamSpec *pspec) { GdkRGBA color; gdk_rgba_parse (&color, "pink"); - g_value_take_boxed (&value, &color); + g_value_set_boxed (&value, &color); } else if (pspec->value_type == GDK_TYPE_COLOR) { GdkColor color; gdk_color_parse ("pink", &color); - g_value_take_boxed (&value, &color); + g_value_set_boxed (&value, &color); } else if (pspec->value_type == GTK_TYPE_BORDER) { @@ -111,7 +164,10 @@ gtk_css_custom_property_create_initial_value (GParamSpec *pspec) else g_param_value_set_default (pspec, &value); - return _gtk_css_value_new_take_gvalue (&value); + result = _gtk_css_typed_value_new (&value); + g_value_unset (&value); + + return result; } /* Property registration functions */ @@ -155,6 +211,8 @@ gtk_css_custom_property_create_initial_value (GParamSpec *pspec) * * * Since: 3.0 + * + * Deprecated: 3.8: Code should use the default properties provided by CSS. **/ void gtk_theming_engine_register_property (const gchar *name_space, @@ -170,12 +228,20 @@ gtk_theming_engine_register_property (const gchar *name_space, g_return_if_fail (G_IS_PARAM_SPEC (pspec)); name = g_strdup_printf ("-%s-%s", name_space, pspec->name); + + /* This also initializes the default properties */ + if (_gtk_style_property_lookup (pspec->name)) + { + g_warning ("a property with name '%s' already exists", name); + g_free (name); + return; + } + initial = gtk_css_custom_property_create_initial_value (pspec); node = g_object_new (GTK_TYPE_CSS_CUSTOM_PROPERTY, "initial-value", initial, "name", name, - "computed-type", pspec->value_type, "value-type", pspec->value_type, NULL); node->pspec = pspec; @@ -196,6 +262,8 @@ gtk_theming_engine_register_property (const gchar *name_space, * a theming engine, you want to use that function instead. * * Since: 3.0 + * + * Deprecated: 3.8: Code should use the default properties provided by CSS. **/ void gtk_style_properties_register_property (GtkStylePropertyParser parse_func, @@ -206,12 +274,18 @@ gtk_style_properties_register_property (GtkStylePropertyParser parse_func, g_return_if_fail (G_IS_PARAM_SPEC (pspec)); + /* This also initializes the default properties */ + if (_gtk_style_property_lookup (pspec->name)) + { + g_warning ("a property with name '%s' already exists", pspec->name); + return; + } + initial = gtk_css_custom_property_create_initial_value (pspec); node = g_object_new (GTK_TYPE_CSS_CUSTOM_PROPERTY, "initial-value", initial, "name", pspec->name, - "computed-type", pspec->value_type, "value-type", pspec->value_type, NULL); node->pspec = pspec; @@ -233,6 +307,9 @@ gtk_style_properties_register_property (GtkStylePropertyParser parse_func, * Returns: %TRUE if the property is registered, %FALSE otherwise * * Since: 3.0 + * + * Deprecated: 3.8: This code could only look up custom properties and + * those are deprecated. **/ gboolean gtk_style_properties_lookup_property (const gchar *property_name,