X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkcsslookup.c;h=acd35b6049111d8f54905b27c3c1e7a600c402ac;hb=aaedf5a35219b034a244730564b8fdf2b7d32540;hp=ef075d37d64dad5c74cbbbea0bf2ce2870748d98;hpb=84d294ee7f795dfed34828194b39e68e6f186d56;p=~andy%2Fgtk diff --git a/gtk/gtkcsslookup.c b/gtk/gtkcsslookup.c index ef075d37d..acd35b604 100644 --- a/gtk/gtkcsslookup.c +++ b/gtk/gtkcsslookup.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,25 +24,23 @@ #include "gtkcssstylepropertyprivate.h" #include "gtkstylepropertiesprivate.h" -typedef struct { - GtkCssSection *section; - const GValue *value; -} GtkCssLookupValue; - -struct _GtkCssLookup { - GtkBitmask *missing; - GtkCssLookupValue values[1]; -}; - GtkCssLookup * -_gtk_css_lookup_new (void) +_gtk_css_lookup_new (const GtkBitmask *relevant) { GtkCssLookup *lookup; guint n = _gtk_css_style_property_get_n_properties (); lookup = g_malloc0 (sizeof (GtkCssLookup) + sizeof (GtkCssLookupValue) * n); - lookup->missing = _gtk_bitmask_new (); - _gtk_bitmask_invert_range (lookup->missing, 0, n); + + if (relevant) + { + lookup->missing = _gtk_bitmask_copy (relevant); + } + else + { + lookup->missing = _gtk_bitmask_new (); + lookup->missing = _gtk_bitmask_invert_range (lookup->missing, 0, n); + } return lookup; } @@ -58,21 +54,13 @@ _gtk_css_lookup_free (GtkCssLookup *lookup) g_free (lookup); } -const GtkBitmask * -_gtk_css_lookup_get_missing (const GtkCssLookup *lookup) -{ - g_return_val_if_fail (lookup != NULL, NULL); - - return lookup->missing; -} - gboolean _gtk_css_lookup_is_missing (const GtkCssLookup *lookup, guint id) { g_return_val_if_fail (lookup != NULL, FALSE); - return lookup->values[id].value == NULL; + return _gtk_bitmask_get (lookup->missing, id); } /** @@ -92,22 +80,56 @@ void _gtk_css_lookup_set (GtkCssLookup *lookup, guint id, GtkCssSection *section, - const GValue *value) + GtkCssValue *value) { g_return_if_fail (lookup != NULL); g_return_if_fail (_gtk_bitmask_get (lookup->missing, id)); g_return_if_fail (value != NULL); - _gtk_bitmask_set (lookup->missing, id, FALSE); + lookup->missing = _gtk_bitmask_set (lookup->missing, id, FALSE); lookup->values[id].value = value; lookup->values[id].section = section; } +/** + * _gtk_css_lookup_set_computed: + * @lookup: the lookup + * @id: id of the property to set, see _gtk_style_property_get_id() + * @section: (allow-none): The @section the value was defined in or %NULL + * @value: the "computed value" to use + * + * Sets the @value for a given @id. No value may have been set for @id + * before. See _gtk_css_lookup_is_missing(). This function is used to + * set the "winning declaration" of a lookup. Note that for performance + * reasons @value and @section are not copied. It is your responsibility + * to ensure they are kept alive until _gtk_css_lookup_free() is called. + * + * As opposed to _gtk_css_lookup_set(), this function forces a computed + * value and will not cause computation to happen. In particular, with this + * method relative lengths or symbolic colors can not be used. This is + * usually only useful for doing overrides. It should not be used for proper + * CSS. + **/ +void +_gtk_css_lookup_set_computed (GtkCssLookup *lookup, + guint id, + GtkCssSection *section, + GtkCssValue *value) +{ + g_return_if_fail (lookup != NULL); + g_return_if_fail (_gtk_bitmask_get (lookup->missing, id)); + g_return_if_fail (value != NULL); + + lookup->missing = _gtk_bitmask_set (lookup->missing, id, FALSE); + lookup->values[id].computed = value; + lookup->values[id].section = section; +} + /** * _gtk_css_lookup_resolve: * @lookup: the lookup * @context: the context the values are resolved for - * @props: a new #GtkStyleProperties to be filled with the new properties + * @values: a new #GtkCssComputedValues to be filled with the new properties * * Resolves the current lookup into a styleproperties object. This is done * by converting from the "winning declaration" to the "computed value". @@ -116,106 +138,36 @@ _gtk_css_lookup_set (GtkCssLookup *lookup, * an issue, go fix it. **/ void -_gtk_css_lookup_resolve (GtkCssLookup *lookup, - GtkStyleContext *context, - GtkStyleProperties *props) +_gtk_css_lookup_resolve (GtkCssLookup *lookup, + GtkStyleProviderPrivate *provider, + GtkCssComputedValues *values, + GtkCssComputedValues *parent_values) { - GtkStyleContext *parent; guint i, n; g_return_if_fail (lookup != NULL); - g_return_if_fail (GTK_IS_STYLE_CONTEXT (context)); - g_return_if_fail (GTK_IS_STYLE_PROPERTIES (props)); + g_return_if_fail (GTK_IS_STYLE_PROVIDER_PRIVATE (provider)); + g_return_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values)); + g_return_if_fail (parent_values == NULL || GTK_IS_CSS_COMPUTED_VALUES (parent_values)); - parent = gtk_style_context_get_parent (context); n = _gtk_css_style_property_get_n_properties (); for (i = 0; i < n; i++) { - GtkCssStyleProperty *prop = _gtk_css_style_property_lookup_by_id (i); - const GValue *result; - GValue value = { 0, }; - - /* http://www.w3.org/TR/css3-cascade/#cascade - * Then, for every element, the value for each property can be found - * by following this pseudo-algorithm: - * 1) Identify all declarations that apply to the element - */ - if (lookup->values[i].value != NULL) - { - /* 2) If the cascading process (described below) yields a winning - * declaration and the value of the winning declaration is not - * ‘initial’ or ‘inherit’, the value of the winning declaration - * becomes the specified value. - */ - if (!G_VALUE_HOLDS (lookup->values[i].value, GTK_TYPE_CSS_SPECIAL_VALUE)) - { - result = lookup->values[i].value; - } - else - { - switch (g_value_get_enum (lookup->values[i].value)) - { - case GTK_CSS_INHERIT: - /* 3) if the value of the winning declaration is ‘inherit’, - * the inherited value (see below) becomes the specified value. - */ - result = NULL; - break; - case GTK_CSS_INITIAL: - /* if the value of the winning declaration is ‘initial’, - * the initial value (see below) becomes the specified value. - */ - result = _gtk_css_style_property_get_initial_value (prop); - break; - default: - /* This is part of (2) above */ - result = lookup->values[i].value; - break; - } - } - } - else - { - if (_gtk_css_style_property_is_inherit (prop)) - { - /* 4) if the property is inherited, the inherited value becomes - * the specified value. - */ - result = NULL; - } - else - { - /* 5) Otherwise, the initial value becomes the specified value. - */ - result = _gtk_css_style_property_get_initial_value (prop); - } - } - - if (result == NULL && parent == NULL) - { - /* If the ‘inherit’ value is set on the root element, the property is - * assigned its initial value. */ - result = _gtk_css_style_property_get_initial_value (prop); - } - - if (result) - { - _gtk_css_style_property_compute_value (prop, &value, context, result); - } - else - { - /* Set NULL here and do the inheritance upon lookup? */ - result = _gtk_style_context_peek_property (parent, - _gtk_style_property_get_name (GTK_STYLE_PROPERTY (prop))); - g_value_init (&value, G_VALUE_TYPE (result)); - g_value_copy (result, &value); - } - - _gtk_style_properties_set_property_by_property (props, - prop, - 0, - &value); - g_value_unset (&value); + if (lookup->values[i].computed) + _gtk_css_computed_values_set_value (values, + i, + lookup->values[i].computed, + 0, + lookup->values[i].section); + else if (lookup->values[i].value || + _gtk_bitmask_get (lookup->missing, i)) + _gtk_css_computed_values_compute_value (values, + provider, + parent_values, + i, + lookup->values[i].value, + lookup->values[i].section); + /* else not a relevant property */ } }