X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkcssvalue.c;h=6d77cf80c94fe299ddb11897e658de4991fab853;hb=feb64f40b0f50735104da0a7fdafbe480763c180;hp=152297419b14a35499684c288373e10007a69226;hpb=0ece7a5de3eae5f4d7e4d1623d191a0a0628e652;p=~andy%2Fgtk diff --git a/gtk/gtkcssvalue.c b/gtk/gtkcssvalue.c index 152297419..6d77cf80c 100644 --- a/gtk/gtkcssvalue.c +++ b/gtk/gtkcssvalue.c @@ -17,224 +17,28 @@ #include "config.h" +#include "gtkprivate.h" #include "gtkcssvalueprivate.h" -#include "gtktypebuiltins.h" -#include "gtkgradient.h" -#include -#include "gtkprivatetypebuiltins.h" -struct _GtkCssValue -{ - volatile gint ref_count; - GValue g_value; +#include "gtkcsscomputedvaluesprivate.h" +#include "gtkstyleproviderprivate.h" + +struct _GtkCssValue { + GTK_CSS_VALUE_BASE }; G_DEFINE_BOXED_TYPE (GtkCssValue, _gtk_css_value, _gtk_css_value_ref, _gtk_css_value_unref) -static GtkCssValue * -_gtk_css_value_new (void) -{ - GtkCssValue *value; - - value = g_slice_new0 (GtkCssValue); - - value->ref_count = 1; - - return value; -} - -GtkCssValue * -_gtk_css_value_new_from_gvalue (const GValue *g_value) -{ - GtkCssValue *value; - - g_return_val_if_fail (g_value != NULL, NULL); - - value = _gtk_css_value_new (); - - g_value_init (&value->g_value, G_VALUE_TYPE (g_value)); - g_value_copy (g_value, &value->g_value); - - return value; -} - -GtkCssValue * -_gtk_css_value_new_take_gvalue (GValue *g_value) -{ - GtkCssValue *value; - - g_return_val_if_fail (g_value != NULL, NULL); - - value = _gtk_css_value_new (); - value->g_value = *g_value; - - return value; -} - -GtkCssValue * -_gtk_css_value_new_from_int (gint val) -{ - GtkCssValue *value; - - value = _gtk_css_value_new (); - g_value_init (&value->g_value, G_TYPE_INT); - g_value_set_int (&value->g_value, val); - - return value; -} - -GtkCssValue * -_gtk_css_value_new_take_string (char *string) -{ - GtkCssValue *value; - - value = _gtk_css_value_new (); - g_value_init (&value->g_value, G_TYPE_STRING); - g_value_take_string (&value->g_value, string); - - return value; -} - -GtkCssValue * -_gtk_css_value_new_from_string (const char *string) -{ - GtkCssValue *value; - - value = _gtk_css_value_new (); - g_value_init (&value->g_value, G_TYPE_STRING); - g_value_set_string (&value->g_value, string); - - return value; -} - -GtkCssValue * -_gtk_css_value_new_from_border (const GtkBorder *border) -{ - GtkCssValue *value; - - value = _gtk_css_value_new (); - g_value_init (&value->g_value, GTK_TYPE_BORDER); - g_value_set_boxed (&value->g_value, border); - - return value; -} - -GtkCssValue * -_gtk_css_value_new_take_pattern (cairo_pattern_t *v) -{ - GtkCssValue *value; - - value = _gtk_css_value_new (); - g_value_init (&value->g_value, CAIRO_GOBJECT_TYPE_PATTERN); - g_value_take_boxed (&value->g_value, v); - - return value; -} - -GtkCssValue * -_gtk_css_value_new_from_pattern (const cairo_pattern_t *v) -{ - GtkCssValue *value; - - value = _gtk_css_value_new (); - g_value_init (&value->g_value, CAIRO_GOBJECT_TYPE_PATTERN); - g_value_set_boxed (&value->g_value, v); - - return value; -} - -GtkCssValue * -_gtk_css_value_new_take_shadow (GtkShadow *v) -{ - GtkCssValue *value; - - value = _gtk_css_value_new (); - g_value_init (&value->g_value, GTK_TYPE_SHADOW); - g_value_take_boxed (&value->g_value, v); - - return value; -} - -GtkCssValue * -_gtk_css_value_new_take_font_description (PangoFontDescription *v) -{ - GtkCssValue *value; - - value = _gtk_css_value_new (); - g_value_init (&value->g_value, PANGO_TYPE_FONT_DESCRIPTION); - g_value_take_boxed (&value->g_value, v); - - return value; -} - -GtkCssValue * -_gtk_css_value_new_take_image (GtkCssImage *v) -{ - GtkCssValue *value; - - value = _gtk_css_value_new (); - g_value_init (&value->g_value, GTK_TYPE_CSS_IMAGE); - g_value_take_object (&value->g_value, v); - - return value; -} - GtkCssValue * -_gtk_css_value_new_from_number (const GtkCssNumber *v) +_gtk_css_value_alloc (const GtkCssValueClass *klass, + gsize size) { GtkCssValue *value; - value = _gtk_css_value_new (); - g_value_init (&value->g_value, GTK_TYPE_CSS_NUMBER); - g_value_set_boxed (&value->g_value, v); - - return value; -} + value = g_slice_alloc0 (size); -GtkCssValue * -_gtk_css_value_new_from_rgba (const GdkRGBA *v) -{ - GtkCssValue *value; - - value = _gtk_css_value_new (); - g_value_init (&value->g_value, GDK_TYPE_RGBA); - g_value_set_boxed (&value->g_value, v); - - return value; -} - -GtkCssValue * -_gtk_css_value_new_from_color (const GdkColor *v) -{ - GtkCssValue *value; - - value = _gtk_css_value_new (); - g_value_init (&value->g_value, GDK_TYPE_COLOR); - g_value_set_boxed (&value->g_value, v); - - return value; -} - -GtkCssValue * -_gtk_css_value_new_from_background_size (const GtkCssBackgroundSize *v) -{ - GtkCssValue *value; - - value = _gtk_css_value_new (); - g_value_init (&value->g_value, GTK_TYPE_CSS_BACKGROUND_SIZE); - g_value_set_boxed (&value->g_value, v); - - return value; -} - -GtkCssValue * -_gtk_css_value_new_take_symbolic_color (GtkSymbolicColor *v) -{ - GtkCssValue *value; - - value = _gtk_css_value_new (); - g_value_init (&value->g_value, GTK_TYPE_SYMBOLIC_COLOR); - g_value_take_boxed (&value->g_value, v); + value->class = klass; + value->ref_count = 1; return value; } @@ -242,7 +46,7 @@ _gtk_css_value_new_take_symbolic_color (GtkSymbolicColor *v) GtkCssValue * _gtk_css_value_ref (GtkCssValue *value) { - g_return_val_if_fail (value != NULL, NULL); + gtk_internal_return_val_if_fail (value != NULL, NULL); g_atomic_int_add (&value->ref_count, 1); @@ -258,210 +62,123 @@ _gtk_css_value_unref (GtkCssValue *value) if (!g_atomic_int_dec_and_test (&value->ref_count)) return; - g_value_unset (&value->g_value); - g_slice_free (GtkCssValue, value); + value->class->free (value); } -GType -_gtk_css_value_get_content_type (GtkCssValue *value) +/** + * _gtk_css_value_compute: + * @value: the value to compute from + * @property_id: the ID of the property to compute + * @provider: Style provider for looking up extra information + * @values: values to compute for + * @parent_values: parent values to use for inherited values + * @dependencies: (out) (allow-none): Set to the dependencies of the + * computed values that indicate when this value needs to be + * recomputed and how. + * + * Converts the specified @value into the computed value for the CSS + * property given by @property_id using the information in @context. + * This step is explained in detail in + * g_value), - G_VALUE_TYPE_NAME (g_value)); + return value->class->compute (value, property_id, provider, values, parent_values, dependencies); } gboolean -_gtk_css_value_is_special (GtkCssValue *value) -{ - return _gtk_css_value_holds (value, GTK_TYPE_CSS_SPECIAL_VALUE); -} - -GtkCssSpecialValue -_gtk_css_value_get_special_kind (GtkCssValue *value) +_gtk_css_value_equal (const GtkCssValue *value1, + const GtkCssValue *value2) { - g_return_val_if_fail (_gtk_css_value_holds (value, GTK_TYPE_CSS_SPECIAL_VALUE), 0); - return g_value_get_enum (&value->g_value); -} + gtk_internal_return_val_if_fail (value1 != NULL, FALSE); + gtk_internal_return_val_if_fail (value2 != NULL, FALSE); -GtkCssNumber * -_gtk_css_value_get_number (GtkCssValue *value) -{ - g_return_val_if_fail (_gtk_css_value_holds (value, GTK_TYPE_CSS_NUMBER), NULL); - return g_value_get_boxed (&value->g_value); -} + if (value1 == value2) + return TRUE; -GtkSymbolicColor * -_gtk_css_value_get_symbolic_color (GtkCssValue *value) -{ - g_return_val_if_fail (_gtk_css_value_holds (value, GTK_TYPE_SYMBOLIC_COLOR), NULL); - return g_value_get_boxed (&value->g_value); -} + if (value1->class != value2->class) + return FALSE; -int -_gtk_css_value_get_int (GtkCssValue *value) -{ - g_return_val_if_fail (_gtk_css_value_holds (value, G_TYPE_INT), 0); - return g_value_get_int (&value->g_value); -} - -double -_gtk_css_value_get_double (GtkCssValue *value) -{ - g_return_val_if_fail (_gtk_css_value_holds (value, G_TYPE_DOUBLE), 0); - return g_value_get_double (&value->g_value); + return value1->class->equal (value1, value2); } -const char * -_gtk_css_value_get_string (GtkCssValue *value) -{ - g_return_val_if_fail (_gtk_css_value_holds (value, G_TYPE_STRING), 0); - return g_value_get_string (&value->g_value); -} - -gpointer -_gtk_css_value_dup_object (GtkCssValue *value) -{ - g_return_val_if_fail (_gtk_css_value_holds (value, G_TYPE_OBJECT), NULL); - return g_value_dup_object (&value->g_value); -} - -gpointer -_gtk_css_value_get_object (GtkCssValue *value) -{ - g_return_val_if_fail (_gtk_css_value_holds (value, G_TYPE_OBJECT), NULL); - return g_value_get_object (&value->g_value); -} - -gpointer -_gtk_css_value_get_boxed (GtkCssValue *value) -{ - g_return_val_if_fail (_gtk_css_value_holds (value, G_TYPE_BOXED), NULL); - return g_value_get_boxed (&value->g_value); -} - -const char ** -_gtk_css_value_get_strv (GtkCssValue *value) -{ - g_return_val_if_fail (_gtk_css_value_holds (value, G_TYPE_STRV), NULL); - return g_value_get_boxed (&value->g_value); -} - -GtkCssImage * -_gtk_css_value_get_image (GtkCssValue *value) -{ - g_return_val_if_fail (_gtk_css_value_holds (value, GTK_TYPE_CSS_IMAGE), NULL); - return g_value_get_object (&value->g_value); -} - -GtkBorderStyle -_gtk_css_value_get_border_style (GtkCssValue *value) +gboolean +_gtk_css_value_equal0 (const GtkCssValue *value1, + const GtkCssValue *value2) { - g_return_val_if_fail (_gtk_css_value_holds (value, GTK_TYPE_BORDER_STYLE), 0); - return g_value_get_enum (&value->g_value); -} + /* Inclues both values being NULL */ + if (value1 == value2) + return TRUE; -GtkCssBackgroundSize * -_gtk_css_value_get_background_size (GtkCssValue *value) -{ - g_return_val_if_fail (_gtk_css_value_holds (value, GTK_TYPE_CSS_BACKGROUND_SIZE), NULL); - return g_value_get_boxed (&value->g_value); -} + if (value1 == NULL || value2 == NULL) + return FALSE; -GtkCssBorderImageRepeat * -_gtk_css_value_get_border_image_repeat (GtkCssValue *value) -{ - g_return_val_if_fail (_gtk_css_value_holds (value, GTK_TYPE_CSS_BORDER_IMAGE_REPEAT), NULL); - return g_value_get_boxed (&value->g_value); + return _gtk_css_value_equal (value1, value2); } -GtkCssBorderCornerRadius * -_gtk_css_value_get_border_corner_radius (GtkCssValue *value) +GtkCssValue * +_gtk_css_value_transition (GtkCssValue *start, + GtkCssValue *end, + guint property_id, + double progress) { - g_return_val_if_fail (_gtk_css_value_holds (value, GTK_TYPE_CSS_BORDER_CORNER_RADIUS), NULL); - return g_value_get_boxed (&value->g_value); -} + gtk_internal_return_val_if_fail (start != NULL, FALSE); + gtk_internal_return_val_if_fail (end != NULL, FALSE); -PangoFontDescription * -_gtk_css_value_get_font_description (GtkCssValue *value) -{ - g_return_val_if_fail (_gtk_css_value_holds (value, PANGO_TYPE_FONT_DESCRIPTION), 0); - return g_value_get_boxed (&value->g_value); -} + if (start->class != end->class) + return NULL; -PangoStyle -_gtk_css_value_get_pango_style (GtkCssValue *value) -{ - g_return_val_if_fail (_gtk_css_value_holds (value, PANGO_TYPE_STYLE), 0); - return g_value_get_enum (&value->g_value); + return start->class->transition (start, end, property_id, progress); } -PangoVariant -_gtk_css_value_get_pango_variant (GtkCssValue *value) +char * +_gtk_css_value_to_string (const GtkCssValue *value) { - g_return_val_if_fail (_gtk_css_value_holds (value, PANGO_TYPE_VARIANT), 0); - return g_value_get_enum (&value->g_value); -} + GString *string; -PangoWeight -_gtk_css_value_get_pango_weight (GtkCssValue *value) -{ - g_return_val_if_fail (_gtk_css_value_holds (value, PANGO_TYPE_WEIGHT), 0); - return g_value_get_enum (&value->g_value); -} + gtk_internal_return_val_if_fail (value != NULL, NULL); -GdkRGBA * -_gtk_css_value_get_rgba (GtkCssValue *value) -{ - g_return_val_if_fail (_gtk_css_value_holds (value, GDK_TYPE_RGBA), NULL); - return g_value_get_boxed (&value->g_value); + string = g_string_new (NULL); + _gtk_css_value_print (value, string); + return g_string_free (string, FALSE); } -cairo_pattern_t * -_gtk_css_value_get_pattern (GtkCssValue *value) +/** + * _gtk_css_value_print: + * @value: the value to print + * @string: the string to print to + * + * Prints @value to the given @string in CSS format. The @value must be a + * valid specified value as parsed using the parse functions or as assigned + * via _gtk_style_property_assign(). + **/ +void +_gtk_css_value_print (const GtkCssValue *value, + GString *string) { - g_return_val_if_fail (_gtk_css_value_holds (value, CAIRO_GOBJECT_TYPE_PATTERN), NULL); - return g_value_get_boxed (&value->g_value); -} + gtk_internal_return_if_fail (value != NULL); + gtk_internal_return_if_fail (string != NULL); -GtkGradient * -_gtk_css_value_get_gradient (GtkCssValue *value) -{ - g_return_val_if_fail (_gtk_css_value_holds (value, GTK_TYPE_GRADIENT), NULL); - return g_value_get_boxed (&value->g_value); + value->class->print (value, string); } -GtkShadow * -_gtk_css_value_get_shadow (GtkCssValue *value) -{ - g_return_val_if_fail (_gtk_css_value_holds (value, GTK_TYPE_SHADOW), NULL); - return g_value_get_boxed (&value->g_value); -}