X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkcsslookup.c;h=acd35b6049111d8f54905b27c3c1e7a600c402ac;hb=320613c439c6c7eeb5bc64685522195e0a6adc4e;hp=5badd7b403befede6c2a815643066a5c73c3d010;hpb=6dd50c6ccaa131451cea90912e8abeb779fd3cb5;p=~andy%2Fgtk diff --git a/gtk/gtkcsslookup.c b/gtk/gtkcsslookup.c index 5badd7b40..acd35b604 100644 --- a/gtk/gtkcsslookup.c +++ b/gtk/gtkcsslookup.c @@ -12,32 +12,35 @@ * 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" #include "gtkcsslookupprivate.h" -#include "gtkstylepropertyprivate.h" +#include "gtkcsstypesprivate.h" +#include "gtkprivatetypebuiltins.h" +#include "gtkcssstylepropertyprivate.h" #include "gtkstylepropertiesprivate.h" -struct _GtkCssLookup { - GtkBitmask *missing; - const GValue *values[1]; -}; - GtkCssLookup * -_gtk_css_lookup_new (void) +_gtk_css_lookup_new (const GtkBitmask *relevant) { GtkCssLookup *lookup; - guint n = _gtk_style_property_get_count (); + guint n = _gtk_css_style_property_get_n_properties (); + + lookup = g_malloc0 (sizeof (GtkCssLookup) + sizeof (GtkCssLookupValue) * n); - lookup = g_malloc0 (sizeof (GtkCssLookup) + sizeof (const GValue *) * 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; } @@ -51,79 +54,120 @@ _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] == NULL; + return _gtk_bitmask_get (lookup->missing, id); } /** * _gtk_css_lookup_set: * @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 "cascading 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. + * 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. **/ void -_gtk_css_lookup_set (GtkCssLookup *lookup, - guint id, - const GValue *value) +_gtk_css_lookup_set (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); - _gtk_bitmask_set (lookup->missing, id, FALSE); - lookup->values[id] = value; + 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 + * @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". * * XXX: This bypasses the notion of "specified value". If this ever becomes * an issue, go fix it. - * - * Returns: a new #GtkStyleProperties **/ -GtkStyleProperties * -_gtk_css_lookup_resolve (GtkCssLookup *lookup) +void +_gtk_css_lookup_resolve (GtkCssLookup *lookup, + GtkStyleProviderPrivate *provider, + GtkCssComputedValues *values, + GtkCssComputedValues *parent_values) { - GtkStyleProperties *props; guint i, n; - g_return_val_if_fail (lookup != NULL, NULL); + g_return_if_fail (lookup != NULL); + 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)); - n = _gtk_style_property_get_count (); - props = gtk_style_properties_new (); + n = _gtk_css_style_property_get_n_properties (); for (i = 0; i < n; i++) { - if (lookup->values[i] == NULL) - continue; - - _gtk_style_properties_set_property_by_property (props, - _gtk_style_property_get (i), - 0, - lookup->values[i]); + 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 */ } - - return props; }