X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkcsslookup.c;h=acd35b6049111d8f54905b27c3c1e7a600c402ac;hb=HEAD;hp=fce852845ab1c7decae54fab429dc1ecb13d57e4;hpb=e4c2d9b25958f608717bd79b49aef941b312fada;p=~andy%2Fgtk diff --git a/gtk/gtkcsslookup.c b/gtk/gtkcsslookup.c index fce852845..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,14 +54,6 @@ _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) @@ -92,17 +80,51 @@ 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 @@ -116,24 +138,36 @@ _gtk_css_lookup_set (GtkCssLookup *lookup, * an issue, go fix it. **/ void -_gtk_css_lookup_resolve (GtkCssLookup *lookup, - GtkStyleContext *context, - GtkCssComputedValues *values) +_gtk_css_lookup_resolve (GtkCssLookup *lookup, + GtkStyleProviderPrivate *provider, + GtkCssComputedValues *values, + GtkCssComputedValues *parent_values) { 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_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_css_style_property_get_n_properties (); for (i = 0; i < n; i++) { - _gtk_css_computed_values_compute_value (values, - context, - i, - lookup->values[i].value, - lookup->values[i].section); + 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 */ } }