X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkstyleproperties.c;h=9788006b1612f5dec65c947af8bdea3d25edf9dd;hb=50065b7ba07fe08f5c71e42101fedf5b6e810982;hp=99bb3411ed6f9c759447b5f1aace2acf320caf57;hpb=0a368fe622b41963cea587a7444362d5a8eaad68;p=~andy%2Fgtk diff --git a/gtk/gtkstyleproperties.c b/gtk/gtkstyleproperties.c index 99bb3411e..9788006b1 100644 --- a/gtk/gtkstyleproperties.c +++ b/gtk/gtkstyleproperties.c @@ -12,9 +12,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library. If not, see . */ #include "config.h" @@ -26,14 +24,20 @@ #include #include "gtkstyleprovider.h" -#include "gtksymboliccolor.h" #include "gtkthemingengine.h" -#include "gtkanimationdescription.h" -#include "gtkgradient.h" -#include "gtkshadowprivate.h" +#include "gtkcssshorthandpropertyprivate.h" +#include "gtkcsstypedvalueprivate.h" +#include "gtkcsstypesprivate.h" +#include "gtkborderimageprivate.h" +#include "gtkprivatetypebuiltins.h" #include "gtkstylepropertyprivate.h" +#include "gtkstyleproviderprivate.h" #include "gtkintl.h" +#include "gtkwin32themeprivate.h" + +#include "deprecated/gtkgradient.h" +#include "deprecated/gtksymboliccolorprivate.h" /** * SECTION:gtkstyleproperties @@ -54,14 +58,13 @@ * should use the APIs provided by #GtkThemingEngine instead. */ -typedef struct GtkStylePropertiesPrivate GtkStylePropertiesPrivate; typedef struct PropertyData PropertyData; typedef struct ValueData ValueData; struct ValueData { GtkStateFlags state; - GValue value; + GtkCssValue *value; }; struct PropertyData @@ -69,19 +72,22 @@ struct PropertyData GArray *values; }; -struct GtkStylePropertiesPrivate +struct _GtkStylePropertiesPrivate { GHashTable *color_map; GHashTable *properties; }; -static void gtk_style_properties_provider_init (GtkStyleProviderIface *iface); -static void gtk_style_properties_finalize (GObject *object); +static void gtk_style_properties_provider_init (GtkStyleProviderIface *iface); +static void gtk_style_properties_provider_private_init (GtkStyleProviderPrivateInterface *iface); +static void gtk_style_properties_finalize (GObject *object); G_DEFINE_TYPE_EXTENDED (GtkStyleProperties, gtk_style_properties, G_TYPE_OBJECT, 0, G_IMPLEMENT_INTERFACE (GTK_TYPE_STYLE_PROVIDER, - gtk_style_properties_provider_init)); + gtk_style_properties_provider_init) + G_IMPLEMENT_INTERFACE (GTK_TYPE_STYLE_PROVIDER_PRIVATE, + gtk_style_properties_provider_private_init)); static void gtk_style_properties_class_init (GtkStylePropertiesClass *klass) @@ -115,8 +121,8 @@ property_data_remove_values (PropertyData *data) value_data = &g_array_index (data->values, ValueData, i); - if (G_IS_VALUE (&value_data->value)) - g_value_unset (&value_data->value); + _gtk_css_value_unref (value_data->value); + value_data->value = NULL; } if (data->values->len > 0) @@ -181,11 +187,10 @@ property_data_find_position (PropertyData *data, return found; } -static GValue * +static ValueData * property_data_get_value (PropertyData *data, GtkStateFlags state) { - ValueData *val_data; guint pos; if (!property_data_find_position (data, state, &pos)) @@ -196,12 +201,10 @@ property_data_get_value (PropertyData *data, g_array_insert_val (data->values, pos, new); } - val_data = &g_array_index (data->values, ValueData, pos); - - return &val_data->value; + return &g_array_index (data->values, ValueData, pos); } -static GValue * +static GtkCssValue * property_data_match_state (PropertyData *data, GtkStateFlags state) { @@ -214,7 +217,7 @@ property_data_match_state (PropertyData *data, /* Exact match */ val_data = &g_array_index (data->values, ValueData, pos); - return &val_data->value; + return val_data->value; } if (pos >= data->values->len) @@ -241,7 +244,7 @@ property_data_match_state (PropertyData *data, if (val_data->state == 0 || ((val_data->state & state) != 0 && (val_data->state & ~state) == 0)) - return &val_data->value; + return val_data->value; } return NULL; @@ -276,130 +279,77 @@ gtk_style_properties_finalize (GObject *object) G_OBJECT_CLASS (gtk_style_properties_parent_class)->finalize (object); } -GtkStyleProperties * -gtk_style_properties_get_style (GtkStyleProvider *provider, - GtkWidgetPath *path) -{ - /* Return style set itself */ - return g_object_ref (provider); -} - static void gtk_style_properties_provider_init (GtkStyleProviderIface *iface) { - iface->get_style = gtk_style_properties_get_style; } -/* Property registration functions */ - -/** - * gtk_style_properties_register_property: (skip) - * @parse_func: parsing function to use, or %NULL - * @pspec: the #GParamSpec for the new property - * - * Registers a property so it can be used in the CSS file format. - * This function is the low-level equivalent of - * gtk_theming_engine_register_property(), if you are implementing - * a theming engine, you want to use that function instead. - * - * Since: 3.0 - **/ -void -gtk_style_properties_register_property (GtkStylePropertyParser parse_func, - GParamSpec *pspec) +static GtkCssValue * +gtk_style_properties_provider_get_color (GtkStyleProviderPrivate *provider, + const char *name) { - g_return_if_fail (G_IS_PARAM_SPEC (pspec)); + GtkSymbolicColor *symbolic; - _gtk_style_property_register (pspec, - parse_func); + G_GNUC_BEGIN_IGNORE_DEPRECATIONS; + + symbolic = gtk_style_properties_lookup_color (GTK_STYLE_PROPERTIES (provider), name); + if (symbolic == NULL) + return NULL; + + return _gtk_symbolic_color_get_css_value (symbolic); + + G_GNUC_END_IGNORE_DEPRECATIONS; } -/** - * gtk_style_properties_lookup_property: (skip) - * @property_name: property name to look up - * @parse_func: (out): return location for the parse function - * @pspec: (out) (transfer none): return location for the #GParamSpec - * - * Returns %TRUE if a property has been registered, if @pspec or - * @parse_func are not %NULL, the #GParamSpec and parsing function - * will be respectively returned. - * - * Returns: %TRUE if the property is registered, %FALSE otherwise - * - * Since: 3.0 - **/ -gboolean -gtk_style_properties_lookup_property (const gchar *property_name, - GtkStylePropertyParser *parse_func, - GParamSpec **pspec) +static void +gtk_style_properties_provider_lookup (GtkStyleProviderPrivate *provider, + const GtkCssMatcher *matcher, + GtkCssLookup *lookup) { - const GtkStyleProperty *node; - gboolean found = FALSE; + GtkStyleProperties *props; + GtkStylePropertiesPrivate *priv; + GHashTableIter iter; + gpointer key, value; - g_return_val_if_fail (property_name != NULL, FALSE); + props = GTK_STYLE_PROPERTIES (provider); + priv = props->priv; - node = _gtk_style_property_lookup (property_name); + /* Merge symbolic style properties */ + g_hash_table_iter_init (&iter, priv->properties); - if (node) + while (g_hash_table_iter_next (&iter, &key, &value)) { - if (pspec) - *pspec = node->pspec; + GtkCssStyleProperty *prop = key; + PropertyData *data = value; + GtkCssValue *value; + guint id; - if (parse_func) - *parse_func = node->parse_func; + id = _gtk_css_style_property_get_id (prop); - found = TRUE; - } - - return found; -} + if (!_gtk_css_lookup_is_missing (lookup, id)) + continue; -/* GParamSpec functionality */ + value = property_data_match_state (data, _gtk_css_matcher_get_state (matcher)); + if (value == NULL) + continue; -enum { - GTK_STYLE_PROPERTY_INHERIT = 1 << G_PARAM_USER_SHIFT -}; + _gtk_css_lookup_set_computed (lookup, id, NULL, value); + } +} -/** - * gtk_style_param_set_inherit: - * @pspec: A style param - * @inherit: whether the @pspec value should be inherited - * - * Sets whether a param spec installed with function such as - * gtk_style_properties_register_property() or - * gtk_widget_class_install_style_property() should inherit their - * value from the parent widget if it is not set instead of using - * the default value of @pspec. See the - * - * CSS specification's description of inheritance for a - * longer description of this concept. - * - * By default, param specs do not inherit their value. - **/ -void -gtk_style_param_set_inherit (GParamSpec *pspec, - gboolean inherit) +static GtkCssChange +gtk_style_properties_provider_get_change (GtkStyleProviderPrivate *provider, + const GtkCssMatcher *matcher) { - if (inherit) - pspec->flags |= GTK_STYLE_PROPERTY_INHERIT; - else - pspec->flags &= ~GTK_STYLE_PROPERTY_INHERIT; + return GTK_CSS_CHANGE_STATE; } -/** - * gtk_style_param_get_inherit: - * @pspec: a style param - * - * Checks if the value of this param should be inherited from the parent - * #GtkWidget instead of using the default value when it has not been - * specified. See gtk_style_param_set_inherit() for more details. - * - * Returns: %TRUE if the param should inherit its value - **/ -gboolean -gtk_style_param_get_inherit (GParamSpec *pspec) +static void +gtk_style_properties_provider_private_init (GtkStyleProviderPrivateInterface *iface) { - return (pspec->flags & GTK_STYLE_PROPERTY_INHERIT) ? TRUE : FALSE; + iface->get_color = gtk_style_properties_provider_get_color; + iface->lookup = gtk_style_properties_provider_lookup; + iface->get_change = gtk_style_properties_provider_get_change; } /* GtkStyleProperties methods */ @@ -427,6 +377,8 @@ gtk_style_properties_new (void) * gtk_style_properties_lookup_color() * * Since: 3.0 + * + * Deprecated: 3.8: #GtkSymbolicColor is deprecated. **/ void gtk_style_properties_map_color (GtkStyleProperties *props, @@ -441,6 +393,8 @@ gtk_style_properties_map_color (GtkStyleProperties *props, priv = props->priv; + G_GNUC_BEGIN_IGNORE_DEPRECATIONS; + if (G_UNLIKELY (!priv->color_map)) priv->color_map = g_hash_table_new_full (g_str_hash, g_str_equal, @@ -450,6 +404,10 @@ gtk_style_properties_map_color (GtkStyleProperties *props, g_hash_table_replace (priv->color_map, g_strdup (name), gtk_symbolic_color_ref (color)); + + G_GNUC_END_IGNORE_DEPRECATIONS; + + _gtk_style_provider_private_changed (GTK_STYLE_PROVIDER_PRIVATE (props)); } /** @@ -463,6 +421,8 @@ gtk_style_properties_map_color (GtkStyleProperties *props, * Returns: (transfer none): The mapped color * * Since: 3.0 + * + * Deprecated: 3.8: #GtkSymbolicColor is deprecated. **/ GtkSymbolicColor * gtk_style_properties_lookup_color (GtkStyleProperties *props, @@ -482,59 +442,30 @@ gtk_style_properties_lookup_color (GtkStyleProperties *props, } void -_gtk_style_properties_set_property_by_pspec (GtkStyleProperties *props, - GParamSpec *pspec, - GtkStateFlags state, - const GValue *value) +_gtk_style_properties_set_property_by_property (GtkStyleProperties *props, + GtkCssStyleProperty *style_prop, + GtkStateFlags state, + GtkCssValue *value) { GtkStylePropertiesPrivate *priv; PropertyData *prop; - GType value_type; - GValue *val; - - value_type = G_VALUE_TYPE (value); - - if (pspec->value_type == GDK_TYPE_RGBA || - pspec->value_type == GDK_TYPE_COLOR) - { - /* Allow GtkSymbolicColor as well */ - g_return_if_fail (value_type == GDK_TYPE_RGBA || - value_type == GDK_TYPE_COLOR || - value_type == GTK_TYPE_SYMBOLIC_COLOR); - } - else if (pspec->value_type == CAIRO_GOBJECT_TYPE_PATTERN) - { - /* Allow GtkGradient as a substitute */ - g_return_if_fail (value_type == CAIRO_GOBJECT_TYPE_PATTERN || - value_type == GTK_TYPE_GRADIENT); - } - else - g_return_if_fail (pspec->value_type == value_type); + ValueData *val; priv = props->priv; - prop = g_hash_table_lookup (priv->properties, pspec); + prop = g_hash_table_lookup (priv->properties, style_prop); if (!prop) { prop = property_data_new (); - g_hash_table_insert (priv->properties, pspec, prop); + g_hash_table_insert (priv->properties, (gpointer) style_prop, prop); } val = property_data_get_value (prop, state); - if (G_VALUE_TYPE (val) == value_type) - g_value_reset (val); - else - { - if (G_IS_VALUE (val)) - g_value_unset (val); + _gtk_css_value_unref (val->value); + val->value = _gtk_css_value_ref (value); - g_value_init (val, value_type); - } - - g_value_copy (value, val); - if (pspec->value_type == value_type) - g_param_value_validate (pspec, val); + _gtk_style_provider_private_changed (GTK_STYLE_PROVIDER_PRIVATE (props)); } /** @@ -554,7 +485,7 @@ gtk_style_properties_set_property (GtkStyleProperties *props, GtkStateFlags state, const GValue *value) { - const GtkStyleProperty *node; + GtkStyleProperty *node; g_return_if_fail (GTK_IS_STYLE_PROPERTIES (props)); g_return_if_fail (property != NULL); @@ -567,11 +498,13 @@ gtk_style_properties_set_property (GtkStyleProperties *props, g_warning ("Style property \"%s\" is not registered", property); return; } - - _gtk_style_properties_set_property_by_pspec (props, - node->pspec, - state, - value); + if (_gtk_style_property_get_value_type (node) == G_TYPE_NONE) + { + g_warning ("Style property \"%s\" is not settable", property); + return; + } + + _gtk_style_property_assign (node, props, state, value); } /** @@ -589,20 +522,18 @@ gtk_style_properties_set_valist (GtkStyleProperties *props, GtkStateFlags state, va_list args) { - GtkStylePropertiesPrivate *priv; const gchar *property_name; g_return_if_fail (GTK_IS_STYLE_PROPERTIES (props)); - priv = props->priv; property_name = va_arg (args, const gchar *); while (property_name) { - const GtkStyleProperty *node; - PropertyData *prop; + GtkStyleProperty *node; gchar *error = NULL; - GValue *val; + GType val_type; + GValue val = G_VALUE_INIT; node = _gtk_style_property_lookup (property_name); @@ -612,30 +543,26 @@ gtk_style_properties_set_valist (GtkStyleProperties *props, break; } - prop = g_hash_table_lookup (priv->properties, node->pspec); - - if (!prop) + val_type = _gtk_style_property_get_value_type (node); + if (val_type == G_TYPE_NONE) { - prop = property_data_new (); - g_hash_table_insert (priv->properties, node->pspec, prop); + g_warning ("Style property \"%s\" is not settable", property_name); + break; } - val = property_data_get_value (prop, state); - - if (G_IS_VALUE (val)) - g_value_unset (val); - - G_VALUE_COLLECT_INIT (val, node->pspec->value_type, + G_VALUE_COLLECT_INIT (&val, _gtk_style_property_get_value_type (node), args, 0, &error); - g_param_value_validate (node->pspec, val); if (error) { g_warning ("Could not set style property \"%s\": %s", property_name, error); - g_value_unset (val); + g_value_unset (&val); g_free (error); break; } + _gtk_style_property_assign (node, props, state, &val); + g_value_unset (&val); + property_name = va_arg (args, const gchar *); } } @@ -664,180 +591,39 @@ gtk_style_properties_set (GtkStyleProperties *props, va_end (args); } -static gboolean -resolve_color (GtkStyleProperties *props, - GValue *value) -{ - GdkRGBA color; - - /* Resolve symbolic color to GdkRGBA */ - if (!gtk_symbolic_color_resolve (g_value_get_boxed (value), props, &color)) - return FALSE; - - /* Store it back, this is where GdkRGBA caching happens */ - g_value_unset (value); - g_value_init (value, GDK_TYPE_RGBA); - g_value_set_boxed (value, &color); - - return TRUE; -} - -static gboolean -resolve_color_rgb (GtkStyleProperties *props, - GValue *value) -{ - GdkColor color = { 0 }; - GdkRGBA rgba; - - if (!gtk_symbolic_color_resolve (g_value_get_boxed (value), props, &rgba)) - return FALSE; - - color.red = rgba.red * 65535. + 0.5; - color.green = rgba.green * 65535. + 0.5; - color.blue = rgba.blue * 65535. + 0.5; - - g_value_unset (value); - g_value_init (value, GDK_TYPE_COLOR); - g_value_set_boxed (value, &color); - - return TRUE; -} - -static gboolean -resolve_gradient (GtkStyleProperties *props, - GValue *value) -{ - cairo_pattern_t *gradient; - - if (!gtk_gradient_resolve (g_value_get_boxed (value), props, &gradient)) - return FALSE; - - /* Store it back, this is where cairo_pattern_t caching happens */ - g_value_unset (value); - g_value_init (value, CAIRO_GOBJECT_TYPE_PATTERN); - g_value_take_boxed (value, gradient); - - return TRUE; -} - -static gboolean -resolve_shadow (GtkStyleProperties *props, - GValue *value) -{ - GtkShadow *resolved, *base; - - base = g_value_get_boxed (value); - - if (base == NULL) - return TRUE; - - if (_gtk_shadow_get_resolved (base)) - return TRUE; - - resolved = _gtk_shadow_resolve (base, props); - if (resolved == NULL) - return FALSE; - - g_value_take_boxed (value, resolved); - - return TRUE; -} - -static gboolean -style_properties_resolve_type (GtkStyleProperties *props, - const GtkStyleProperty *node, - GValue *val) -{ - if (G_VALUE_TYPE (val) == GTK_TYPE_SYMBOLIC_COLOR) - { - if (node->pspec->value_type == GDK_TYPE_RGBA) - { - if (!resolve_color (props, val)) - return FALSE; - } - else if (node->pspec->value_type == GDK_TYPE_COLOR) - { - if (!resolve_color_rgb (props, val)) - return FALSE; - } - else - return FALSE; - } - else if (G_VALUE_TYPE (val) == GTK_TYPE_GRADIENT) - { - g_return_val_if_fail (node->pspec->value_type == CAIRO_GOBJECT_TYPE_PATTERN, FALSE); - - if (!resolve_gradient (props, val)) - return FALSE; - } - else if (G_VALUE_TYPE (val) == GTK_TYPE_SHADOW) - { - if (!resolve_shadow (props, val)) - return FALSE; - } - - return TRUE; -} - -static void -lookup_default_value (const GtkStyleProperty *node, - GValue *value) -{ - if (node->pspec->value_type == GTK_TYPE_THEMING_ENGINE) - g_value_set_object (value, gtk_theming_engine_load (NULL)); - else if (node->pspec->value_type == PANGO_TYPE_FONT_DESCRIPTION) - g_value_take_boxed (value, pango_font_description_from_string ("Sans 10")); - else if (node->pspec->value_type == GDK_TYPE_RGBA) - { - GdkRGBA color; - gdk_rgba_parse (&color, "pink"); - g_value_set_boxed (value, &color); - } - else if (node->pspec->value_type == GTK_TYPE_BORDER) - { - g_value_take_boxed (value, gtk_border_new ()); - } - else - g_param_value_set_default (node->pspec, value); -} - -const GValue * -_gtk_style_properties_peek_property (GtkStyleProperties *props, - const gchar *prop_name, - GtkStateFlags state, - const GtkStyleProperty **property) +GtkCssValue * +_gtk_style_properties_peek_property (GtkStyleProperties *props, + GtkCssStyleProperty *property, + GtkStateFlags state) { GtkStylePropertiesPrivate *priv; - const GtkStyleProperty *node; PropertyData *prop; - GValue *val; - g_return_val_if_fail (GTK_IS_STYLE_PROPERTIES (props), NULL); - g_return_val_if_fail (prop_name != NULL, NULL); - - node = _gtk_style_property_lookup (prop_name); - if (property) - *property = node; - - if (!node) - { - g_warning ("Style property \"%s\" is not registered", prop_name); - return NULL; - } + g_return_val_if_fail (GTK_IS_STYLE_PROPERTIES (props), FALSE); + g_return_val_if_fail (property != NULL, FALSE); priv = props->priv; - prop = g_hash_table_lookup (priv->properties, node->pspec); - - if (!prop) + prop = g_hash_table_lookup (priv->properties, property); + if (prop == NULL) return NULL; - val = property_data_match_state (prop, state); + return property_data_match_state (prop, state); +} - if (val && - !style_properties_resolve_type (props, node, val)) - return NULL; +typedef struct { + GtkStyleProperties *props; + GtkStateFlags state; +} StyleQueryData; - return val; +static GtkCssValue * +style_query_func (guint id, + gpointer data) +{ + StyleQueryData *query = data; + + return _gtk_style_properties_peek_property (query->props, + _gtk_css_style_property_lookup_by_id (id), + query->state); } /** @@ -860,24 +646,29 @@ gtk_style_properties_get_property (GtkStyleProperties *props, GtkStateFlags state, GValue *value) { - const GtkStyleProperty *node; - const GValue *val; + StyleQueryData query = { props, state }; + GtkStyleProperty *node; g_return_val_if_fail (GTK_IS_STYLE_PROPERTIES (props), FALSE); g_return_val_if_fail (property != NULL, FALSE); g_return_val_if_fail (value != NULL, FALSE); - val = _gtk_style_properties_peek_property (props, property, state, &node); - + node = _gtk_style_property_lookup (property); if (!node) - return FALSE; - - g_value_init (value, node->pspec->value_type); + { + g_warning ("Style property \"%s\" is not registered", property); + return FALSE; + } + if (_gtk_style_property_get_value_type (node) == G_TYPE_NONE) + { + g_warning ("Style property \"%s\" is not gettable", property); + return FALSE; + } - if (val) - g_value_copy (val, value); - else - lookup_default_value (node, value); + _gtk_style_property_query (node, + value, + style_query_func, + &query); return TRUE; } @@ -897,51 +688,25 @@ gtk_style_properties_get_valist (GtkStyleProperties *props, GtkStateFlags state, va_list args) { - GtkStylePropertiesPrivate *priv; const gchar *property_name; g_return_if_fail (GTK_IS_STYLE_PROPERTIES (props)); - priv = props->priv; property_name = va_arg (args, const gchar *); while (property_name) { - const GtkStyleProperty *node; - PropertyData *prop; gchar *error = NULL; - GValue *val = NULL; - - node = _gtk_style_property_lookup (property_name); - - if (!node) - { - g_warning ("Style property \"%s\" is not registered", property_name); - break; - } + GValue value = G_VALUE_INIT; - prop = g_hash_table_lookup (priv->properties, node->pspec); + if (!gtk_style_properties_get_property (props, + property_name, + state, + &value)) + break; - if (prop) - val = property_data_match_state (prop, state); - - if (val && - !style_properties_resolve_type (props, node, val)) - val = NULL; - - if (val) - { - G_VALUE_LCOPY (val, args, 0, &error); - } - else - { - GValue default_value = { 0 }; - - g_value_init (&default_value, node->pspec->value_type); - lookup_default_value (node, &default_value); - G_VALUE_LCOPY (&default_value, args, 0, &error); - g_value_unset (&default_value); - } + G_VALUE_LCOPY (&value, args, 0, &error); + g_value_unset (&value); if (error) { @@ -995,7 +760,7 @@ gtk_style_properties_unset_property (GtkStyleProperties *props, GtkStateFlags state) { GtkStylePropertiesPrivate *priv; - const GtkStyleProperty *node; + GtkStyleProperty *node; PropertyData *prop; guint pos; @@ -1009,9 +774,28 @@ gtk_style_properties_unset_property (GtkStyleProperties *props, g_warning ("Style property \"%s\" is not registered", property); return; } + if (_gtk_style_property_get_value_type (node) == G_TYPE_NONE) + { + g_warning ("Style property \"%s\" is not settable", property); + return; + } + + if (GTK_IS_CSS_SHORTHAND_PROPERTY (node)) + { + GtkCssShorthandProperty *shorthand = GTK_CSS_SHORTHAND_PROPERTY (node); + + for (pos = 0; pos < _gtk_css_shorthand_property_get_n_subproperties (shorthand); pos++) + { + GtkCssStyleProperty *sub = _gtk_css_shorthand_property_get_subproperty (shorthand, pos); + gtk_style_properties_unset_property (props, + _gtk_style_property_get_name (GTK_STYLE_PROPERTY (sub)), + state); + } + return; + } priv = props->priv; - prop = g_hash_table_lookup (priv->properties, node->pspec); + prop = g_hash_table_lookup (priv->properties, node); if (!prop) return; @@ -1022,10 +806,12 @@ gtk_style_properties_unset_property (GtkStyleProperties *props, data = &g_array_index (prop->values, ValueData, pos); - if (G_IS_VALUE (&data->value)) - g_value_unset (&data->value); + _gtk_css_value_unref (data->value); + data->value = NULL; g_array_remove_index (prop->values, pos); + + _gtk_style_provider_private_changed (GTK_STYLE_PROVIDER_PRIVATE (props)); } } @@ -1044,6 +830,8 @@ gtk_style_properties_clear (GtkStyleProperties *props) priv = props->priv; g_hash_table_remove_all (priv->properties); + + _gtk_style_provider_private_changed (GTK_STYLE_PROVIDER_PRIVATE (props)); } /** @@ -1091,7 +879,9 @@ gtk_style_properties_merge (GtkStyleProperties *props, g_hash_table_lookup (priv->color_map, name)) continue; + G_GNUC_BEGIN_IGNORE_DEPRECATIONS; gtk_style_properties_map_color (props, name, color); + G_GNUC_END_IGNORE_DEPRECATIONS; } } @@ -1115,12 +905,12 @@ gtk_style_properties_merge (GtkStyleProperties *props, for (i = 0; i < prop_to_merge->values->len; i++) { ValueData *data; - GValue *value; + ValueData *value; data = &g_array_index (prop_to_merge->values, ValueData, i); if (replace && data->state == GTK_STATE_FLAG_NORMAL && - G_VALUE_TYPE (&data->value) != PANGO_TYPE_FONT_DESCRIPTION) + _gtk_is_css_typed_value_of_type (data->value, PANGO_TYPE_FONT_DESCRIPTION)) { /* Let normal state override all states * previously set in the original set @@ -1130,20 +920,20 @@ gtk_style_properties_merge (GtkStyleProperties *props, value = property_data_get_value (prop, data->state); - if (G_VALUE_TYPE (&data->value) == PANGO_TYPE_FONT_DESCRIPTION && - G_IS_VALUE (value)) + if (_gtk_is_css_typed_value_of_type (data->value, PANGO_TYPE_FONT_DESCRIPTION) && + value->value != NULL) { PangoFontDescription *font_desc; PangoFontDescription *font_desc_to_merge; /* Handle merging of font descriptions */ - font_desc = g_value_get_boxed (value); - font_desc_to_merge = g_value_get_boxed (&data->value); + font_desc = g_value_get_boxed (_gtk_css_typed_value_get (value->value)); + font_desc_to_merge = g_value_get_boxed (_gtk_css_typed_value_get (data->value)); pango_font_description_merge (font_desc, font_desc_to_merge, replace); } - else if (G_VALUE_TYPE (&data->value) == G_TYPE_PTR_ARRAY && - G_IS_VALUE (value)) + else if (_gtk_is_css_typed_value_of_type (data->value, G_TYPE_PTR_ARRAY) && + value->value != NULL) { GPtrArray *array, *array_to_merge; gint i; @@ -1151,24 +941,19 @@ gtk_style_properties_merge (GtkStyleProperties *props, /* Append the array, mainly thought * for the gtk-key-bindings property */ - array = g_value_get_boxed (value); - array_to_merge = g_value_get_boxed (&data->value); + array = g_value_get_boxed (_gtk_css_typed_value_get (value->value)); + array_to_merge = g_value_get_boxed (_gtk_css_typed_value_get (data->value)); for (i = 0; i < array_to_merge->len; i++) g_ptr_array_add (array, g_ptr_array_index (array_to_merge, i)); } - else if (replace || !G_IS_VALUE (value)) + else if (replace || value->value == NULL) { - if (!G_IS_VALUE (value)) - g_value_init (value, G_VALUE_TYPE (&data->value)); - else if (G_VALUE_TYPE (value) != G_VALUE_TYPE (&data->value)) - { - g_value_unset (value); - g_value_init (value, G_VALUE_TYPE (&data->value)); - } - - g_value_copy (&data->value, value); + _gtk_css_value_unref (value->value); + value->value = _gtk_css_value_ref (data->value); } } } + + _gtk_style_provider_private_changed (GTK_STYLE_PROVIDER_PRIVATE (props)); }