1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 2010 Carlos Garnacho <carlosg@gnome.org>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
20 #include "gtkstylepropertyprivate.h"
22 #include <gobject/gvaluecollector.h>
23 #include <gdk-pixbuf/gdk-pixbuf.h>
24 #include <cairo-gobject.h>
27 #include "gtkcssparserprivate.h"
28 #include "gtkcssstylefuncsprivate.h"
29 #include "gtkcssstylepropertyprivate.h"
30 #include "gtkcsstypesprivate.h"
32 #include "gtkprivatetypebuiltins.h"
33 #include "gtkstylepropertiesprivate.h"
35 /* this is in case round() is not provided by the compiler,
36 * such as in the case of C89 compilers, like MSVC
38 #include "fallback-c89.c"
40 /* the actual parsers we have */
41 #include "gtkanimationdescription.h"
42 #include "gtkbindings.h"
43 #include "gtkcssarrayvalueprivate.h"
44 #include "gtkcssbgsizevalueprivate.h"
45 #include "gtkcssbordervalueprivate.h"
46 #include "gtkcsscornervalueprivate.h"
47 #include "gtkcsseasevalueprivate.h"
48 #include "gtkcssenginevalueprivate.h"
49 #include "gtkcssimagegradientprivate.h"
50 #include "gtkcssimageprivate.h"
51 #include "gtkcssimagevalueprivate.h"
52 #include "gtkcssenumvalueprivate.h"
53 #include "gtkcssnumbervalueprivate.h"
54 #include "gtkcsspositionvalueprivate.h"
55 #include "gtkcssrepeatvalueprivate.h"
56 #include "gtkcssrgbavalueprivate.h"
57 #include "gtkcssshadowsvalueprivate.h"
58 #include "gtkcssstringvalueprivate.h"
59 #include "gtksymboliccolorprivate.h"
60 #include "gtkthemingengine.h"
61 #include "gtktypebuiltins.h"
62 #include "gtkwin32themeprivate.h"
64 /*** REGISTRATION ***/
67 GTK_STYLE_PROPERTY_INHERIT = (1 << 0),
68 GTK_STYLE_PROPERTY_ANIMATED = (1 << 1)
69 } GtkStylePropertyFlags;
72 gtk_css_style_property_register (const char * name,
75 GtkStylePropertyFlags flags,
76 GtkCssStylePropertyParseFunc parse_value,
77 GtkCssStylePropertyPrintFunc print_value,
78 GtkCssStylePropertyComputeFunc compute_value,
79 GtkCssStylePropertyQueryFunc query_value,
80 GtkCssStylePropertyAssignFunc assign_value,
81 GtkCssStylePropertyEqualFunc equal_func,
82 GtkCssValue * initial_value)
84 GtkCssStyleProperty *node;
86 g_assert (initial_value != NULL);
87 g_assert (parse_value != NULL);
88 g_assert (value_type == G_TYPE_NONE || query_value != NULL);
89 g_assert (value_type == G_TYPE_NONE || assign_value != NULL);
91 node = g_object_new (GTK_TYPE_CSS_STYLE_PROPERTY,
92 "value-type", value_type,
93 "animated", (flags & GTK_STYLE_PROPERTY_ANIMATED) ? TRUE : FALSE,
94 "inherit", (flags & GTK_STYLE_PROPERTY_INHERIT) ? TRUE : FALSE,
95 "initial-value", initial_value,
99 node->parse_value = parse_value;
101 node->print_value = print_value;
103 node->compute_value = compute_value;
104 node->query_value = query_value;
105 node->assign_value = assign_value;
107 node->equal_func = equal_func;
109 _gtk_css_value_unref (initial_value);
111 g_assert (_gtk_css_style_property_get_id (node) == expected_id);
114 /*** IMPLEMENTATIONS ***/
117 query_simple (GtkCssStyleProperty *property,
118 const GtkCssValue *css_value,
121 _gtk_css_value_init_gvalue (css_value, value);
125 assign_simple (GtkCssStyleProperty *property,
128 return _gtk_css_value_new_from_gvalue (value);
132 query_length_as_int (GtkCssStyleProperty *property,
133 const GtkCssValue *css_value,
136 g_value_init (value, G_TYPE_INT);
137 g_value_set_int (value, round (_gtk_css_number_value_get (css_value, 100)));
141 assign_length_from_int (GtkCssStyleProperty *property,
144 return _gtk_css_number_value_new (g_value_get_int (value), GTK_CSS_PX);
148 query_length_as_double (GtkCssStyleProperty *property,
149 const GtkCssValue *css_value,
152 g_value_init (value, G_TYPE_DOUBLE);
153 g_value_set_double (value, _gtk_css_number_value_get (css_value, 100));
157 assign_length_from_double (GtkCssStyleProperty *property,
160 return _gtk_css_number_value_new (g_value_get_double (value), GTK_CSS_PX);
164 query_border (GtkCssStyleProperty *property,
165 const GtkCssValue *css_value,
170 g_value_init (value, GTK_TYPE_BORDER);
172 border.top = round (_gtk_css_number_value_get (_gtk_css_border_value_get_top (css_value), 100));
173 border.right = round (_gtk_css_number_value_get (_gtk_css_border_value_get_right (css_value), 100));
174 border.bottom = round (_gtk_css_number_value_get (_gtk_css_border_value_get_bottom (css_value), 100));
175 border.left = round (_gtk_css_number_value_get (_gtk_css_border_value_get_left (css_value), 100));
177 g_value_set_boxed (value, &border);
181 assign_border (GtkCssStyleProperty *property,
184 const GtkBorder *border = g_value_get_boxed (value);
187 return _gtk_css_value_ref (_gtk_css_style_property_get_initial_value (property));
189 return _gtk_css_border_value_new (_gtk_css_number_value_new (border->top, GTK_CSS_PX),
190 _gtk_css_number_value_new (border->right, GTK_CSS_PX),
191 _gtk_css_number_value_new (border->bottom, GTK_CSS_PX),
192 _gtk_css_number_value_new (border->left, GTK_CSS_PX));
196 color_parse (GtkCssStyleProperty *property,
197 GtkCssParser *parser,
200 GtkSymbolicColor *symbolic;
202 if (_gtk_css_parser_try (parser, "currentcolor", TRUE))
204 symbolic = gtk_symbolic_color_ref (_gtk_symbolic_color_get_current_color ());
208 symbolic = _gtk_css_parser_read_symbolic_color (parser);
209 if (symbolic == NULL)
213 return _gtk_css_value_new_take_symbolic_color (symbolic);
217 color_compute (GtkCssStyleProperty *property,
218 GtkStyleContext *context,
219 GtkCssValue *specified)
221 return _gtk_css_rgba_value_compute_from_symbolic (specified,
222 _gtk_css_style_property_get_initial_value (property),
228 color_property_compute (GtkCssStyleProperty *property,
229 GtkStyleContext *context,
230 GtkCssValue *specified)
234 value = _gtk_css_rgba_value_compute_from_symbolic (specified,
235 _gtk_css_style_property_get_initial_value (property),
238 _gtk_css_rgba_value_get_rgba (value);
243 color_query (GtkCssStyleProperty *property,
244 const GtkCssValue *css_value,
247 g_value_init (value, GDK_TYPE_RGBA);
248 g_value_set_boxed (value, _gtk_css_rgba_value_get_rgba (css_value));
252 color_assign (GtkCssStyleProperty *property,
255 return _gtk_css_rgba_value_new_from_rgba (g_value_get_boxed (value));
259 font_family_parse_one (GtkCssParser *parser)
263 name = _gtk_css_parser_try_ident (parser, TRUE);
266 GString *string = g_string_new (name);
268 while ((name = _gtk_css_parser_try_ident (parser, TRUE)))
270 g_string_append_c (string, ' ');
271 g_string_append (string, name);
274 name = g_string_free (string, FALSE);
278 name = _gtk_css_parser_read_string (parser);
283 return _gtk_css_string_value_new_take (name);
287 font_family_parse (GtkCssStyleProperty *property,
288 GtkCssParser *parser,
291 return _gtk_css_array_value_parse (parser, font_family_parse_one, FALSE);
295 font_family_query (GtkCssStyleProperty *property,
296 const GtkCssValue *css_value,
302 array = g_ptr_array_new ();
304 for (i = 0; i < _gtk_css_array_value_get_n_values (css_value); i++)
306 g_ptr_array_add (array, g_strdup (_gtk_css_string_value_get (_gtk_css_array_value_get_nth (css_value, i))));
310 g_ptr_array_add (array, NULL);
312 g_value_init (value, G_TYPE_STRV);
313 g_value_set_boxed (value, g_ptr_array_free (array, FALSE));
317 font_family_assign (GtkCssStyleProperty *property,
320 const char **names = g_value_get_boxed (value);
324 array = g_ptr_array_new ();
326 for (names = g_value_get_boxed (value); *names; names++)
328 g_ptr_array_add (array, _gtk_css_string_value_new (*names));
331 result = _gtk_css_array_value_new_from_array ((GtkCssValue **) array->pdata, array->len);
332 g_ptr_array_free (array, TRUE);
337 parse_pango_style (GtkCssStyleProperty *property,
338 GtkCssParser *parser,
341 GtkCssValue *value = _gtk_css_font_style_value_try_parse (parser);
344 _gtk_css_parser_error (parser, "unknown value for property");
350 query_pango_style (GtkCssStyleProperty *property,
351 const GtkCssValue *css_value,
354 g_value_init (value, PANGO_TYPE_STYLE);
355 g_value_set_enum (value, _gtk_css_font_style_value_get (css_value));
359 assign_pango_style (GtkCssStyleProperty *property,
362 return _gtk_css_font_style_value_new (g_value_get_enum (value));
366 parse_pango_weight (GtkCssStyleProperty *property,
367 GtkCssParser *parser,
370 GtkCssValue *value = _gtk_css_font_weight_value_try_parse (parser);
373 _gtk_css_parser_error (parser, "unknown value for property");
379 query_pango_weight (GtkCssStyleProperty *property,
380 const GtkCssValue *css_value,
383 g_value_init (value, PANGO_TYPE_WEIGHT);
384 g_value_set_enum (value, _gtk_css_font_weight_value_get (css_value));
388 assign_pango_weight (GtkCssStyleProperty *property,
391 return _gtk_css_font_weight_value_new (g_value_get_enum (value));
395 parse_pango_variant (GtkCssStyleProperty *property,
396 GtkCssParser *parser,
399 GtkCssValue *value = _gtk_css_font_variant_value_try_parse (parser);
402 _gtk_css_parser_error (parser, "unknown value for property");
408 query_pango_variant (GtkCssStyleProperty *property,
409 const GtkCssValue *css_value,
412 g_value_init (value, PANGO_TYPE_VARIANT);
413 g_value_set_enum (value, _gtk_css_font_variant_value_get (css_value));
417 assign_pango_variant (GtkCssStyleProperty *property,
420 return _gtk_css_font_variant_value_new (g_value_get_enum (value));
424 parse_border_style (GtkCssStyleProperty *property,
425 GtkCssParser *parser,
428 GtkCssValue *value = _gtk_css_border_style_value_try_parse (parser);
431 _gtk_css_parser_error (parser, "unknown value for property");
437 query_border_style (GtkCssStyleProperty *property,
438 const GtkCssValue *css_value,
441 g_value_init (value, GTK_TYPE_BORDER_STYLE);
442 g_value_set_enum (value, _gtk_css_border_style_value_get (css_value));
446 assign_border_style (GtkCssStyleProperty *property,
449 return _gtk_css_border_style_value_new (g_value_get_enum (value));
453 parse_css_area (GtkCssStyleProperty *property,
454 GtkCssParser *parser,
457 GtkCssValue *value = _gtk_css_area_value_try_parse (parser);
460 _gtk_css_parser_error (parser, "unknown value for property");
466 bindings_value_parse_one (GtkCssParser *parser)
470 name = _gtk_css_parser_try_ident (parser, TRUE);
473 _gtk_css_parser_error (parser, "Not a valid binding name");
478 if (!gtk_binding_set_find (name))
480 _gtk_css_parser_error (parser, "No binding set named '%s'", name);
485 return _gtk_css_string_value_new_take (name);
489 bindings_value_parse (GtkCssStyleProperty *property,
490 GtkCssParser *parser,
493 return _gtk_css_array_value_parse (parser, bindings_value_parse_one, TRUE);
497 bindings_value_query (GtkCssStyleProperty *property,
498 const GtkCssValue *css_value,
504 g_value_init (value, G_TYPE_PTR_ARRAY);
506 if (_gtk_css_array_value_get_n_values (css_value) == 0)
509 array = g_ptr_array_new ();
511 for (i = 0; i < _gtk_css_array_value_get_n_values (css_value); i++)
513 GtkBindingSet *binding_set = gtk_binding_set_find (_gtk_css_string_value_get (_gtk_css_array_value_get_nth (css_value, i)));
515 g_ptr_array_add (array, binding_set);
518 g_value_take_boxed (value, array);
522 bindings_value_assign (GtkCssStyleProperty *property,
525 GPtrArray *binding_sets = g_value_get_boxed (value);
526 GtkCssValue **values, *result;
529 if (binding_sets == NULL || binding_sets->len == 0)
530 return _gtk_css_array_value_new (NULL);
532 values = g_new (GtkCssValue *, binding_sets->len);
534 for (i = 0; i < binding_sets->len; i++)
536 GtkBindingSet *binding_set = g_ptr_array_index (binding_sets, i);
537 values[i] = _gtk_css_string_value_new (binding_set->set_name);
540 result = _gtk_css_array_value_new_from_array (values, binding_sets->len);
546 shadow_value_parse (GtkCssStyleProperty *property,
547 GtkCssParser *parser,
550 return _gtk_css_shadows_value_parse (parser);
554 shadow_value_compute (GtkCssStyleProperty *property,
555 GtkStyleContext *context,
556 GtkCssValue *specified)
558 return _gtk_css_shadows_value_compute (specified, context);
562 border_corner_radius_value_parse (GtkCssStyleProperty *property,
563 GtkCssParser *parser,
566 return _gtk_css_corner_value_parse (parser);
570 border_corner_radius_value_compute (GtkCssStyleProperty *property,
571 GtkStyleContext *context,
572 GtkCssValue *specified)
574 return _gtk_css_corner_value_compute (specified, context);
578 css_image_value_parse (GtkCssStyleProperty *property,
579 GtkCssParser *parser,
584 if (_gtk_css_parser_try (parser, "none", TRUE))
588 image = _gtk_css_image_new_parse (parser, base);
593 return _gtk_css_image_value_new (image);
597 css_image_value_compute (GtkCssStyleProperty *property,
598 GtkStyleContext *context,
599 GtkCssValue *specified)
601 GtkCssImage *image, *computed;
603 image = _gtk_css_image_value_get_image (specified);
606 return _gtk_css_value_ref (specified);
608 computed = _gtk_css_image_compute (image, context);
610 if (computed == image)
612 g_object_unref (computed);
613 return _gtk_css_value_ref (specified);
616 return _gtk_css_image_value_new (computed);
620 css_image_value_query (GtkCssStyleProperty *property,
621 const GtkCssValue *css_value,
624 GtkCssImage *image = _gtk_css_image_value_get_image (css_value);
625 cairo_pattern_t *pattern;
626 cairo_surface_t *surface;
627 cairo_matrix_t matrix;
629 g_value_init (value, CAIRO_GOBJECT_TYPE_PATTERN);
631 if (GTK_IS_CSS_IMAGE_GRADIENT (image))
632 g_value_set_boxed (value, GTK_CSS_IMAGE_GRADIENT (image)->pattern);
633 else if (image != NULL)
635 double width, height;
637 /* the 100, 100 is rather random */
638 _gtk_css_image_get_concrete_size (image, 0, 0, 100, 100, &width, &height);
639 surface = _gtk_css_image_get_surface (image, NULL, width, height);
640 pattern = cairo_pattern_create_for_surface (surface);
641 cairo_matrix_init_scale (&matrix, width, height);
642 cairo_pattern_set_matrix (pattern, &matrix);
643 cairo_surface_destroy (surface);
644 g_value_take_boxed (value, pattern);
649 css_image_value_assign (GtkCssStyleProperty *property,
652 g_warning ("FIXME: assigning images is not implemented");
653 return _gtk_css_image_value_new (NULL);
657 font_size_parse (GtkCssStyleProperty *property,
658 GtkCssParser *parser,
663 if (!_gtk_css_parser_try_double (parser, &d))
665 _gtk_css_parser_error (parser, "Expected a number");
669 return _gtk_css_number_value_new (d, GTK_CSS_PX);
673 font_size_compute (GtkCssStyleProperty *property,
674 GtkStyleContext *context,
675 GtkCssValue *specified)
677 return _gtk_css_number_value_compute (specified, context);
681 outline_parse (GtkCssStyleProperty *property,
682 GtkCssParser *parser,
685 return _gtk_css_number_value_parse (parser,
686 GTK_CSS_NUMBER_AS_PIXELS
687 | GTK_CSS_PARSE_LENGTH);
691 outline_compute (GtkCssStyleProperty *property,
692 GtkStyleContext *context,
693 GtkCssValue *specified)
695 return _gtk_css_number_value_compute (specified, context);
699 border_image_repeat_parse (GtkCssStyleProperty *property,
700 GtkCssParser *parser,
703 GtkCssValue *value = _gtk_css_border_repeat_value_try_parse (parser);
707 _gtk_css_parser_error (parser, "Not a valid value");
715 border_image_slice_parse (GtkCssStyleProperty *property,
716 GtkCssParser *parser,
719 return _gtk_css_border_value_parse (parser,
720 GTK_CSS_PARSE_PERCENT
721 | GTK_CSS_PARSE_NUMBER
722 | GTK_CSS_POSITIVE_ONLY,
728 border_image_width_parse (GtkCssStyleProperty *property,
729 GtkCssParser *parser,
732 GValue value = G_VALUE_INIT;
735 g_value_init (&value, GTK_TYPE_BORDER);
736 if (!_gtk_css_style_parse_value (&value, parser, base))
738 g_value_unset (&value);
742 result = _gtk_css_value_new_from_gvalue (&value);
743 g_value_unset (&value);
749 compute_border (GtkCssStyleProperty *property,
750 GtkStyleContext *context,
751 GtkCssValue *specified)
753 return _gtk_css_border_value_compute (specified, context);
757 transition_property_parse_one (GtkCssParser *parser)
761 value = _gtk_css_ident_value_try_parse (parser);
765 _gtk_css_parser_error (parser, "Expected an identifier");
773 transition_property_parse (GtkCssStyleProperty *property,
774 GtkCssParser *parser,
777 return _gtk_css_array_value_parse (parser, transition_property_parse_one, FALSE);
781 transition_time_parse_one (GtkCssParser *parser)
783 return _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_TIME);
787 transition_time_parse (GtkCssStyleProperty *property,
788 GtkCssParser *parser,
791 return _gtk_css_array_value_parse (parser, transition_time_parse_one, FALSE);
795 transition_timing_function_parse (GtkCssStyleProperty *property,
796 GtkCssParser *parser,
799 return _gtk_css_array_value_parse (parser, _gtk_css_ease_value_parse, FALSE);
803 engine_parse (GtkCssStyleProperty *property,
804 GtkCssParser *parser,
807 return _gtk_css_engine_value_parse (parser);
811 engine_query (GtkCssStyleProperty *property,
812 const GtkCssValue *css_value,
815 g_value_init (value, GTK_TYPE_THEMING_ENGINE);
816 g_value_set_object (value, _gtk_css_engine_value_get_engine (css_value));
820 engine_assign (GtkCssStyleProperty *property,
823 return _gtk_css_engine_value_new (g_value_get_object (value));
827 transition_parse (GtkCssStyleProperty *property,
828 GtkCssParser *parser,
831 GValue value = G_VALUE_INIT;
834 g_value_init (&value, GTK_TYPE_ANIMATION_DESCRIPTION);
835 if (!_gtk_css_style_parse_value (&value, parser, base))
837 g_value_unset (&value);
841 result = _gtk_css_value_new_from_gvalue (&value);
842 g_value_unset (&value);
848 parse_margin (GtkCssStyleProperty *property,
849 GtkCssParser *parser,
852 return _gtk_css_number_value_parse (parser,
853 GTK_CSS_NUMBER_AS_PIXELS
854 | GTK_CSS_PARSE_LENGTH);
858 compute_margin (GtkCssStyleProperty *property,
859 GtkStyleContext *context,
860 GtkCssValue *specified)
862 return _gtk_css_number_value_compute (specified, context);
866 parse_padding (GtkCssStyleProperty *property,
867 GtkCssParser *parser,
870 return _gtk_css_number_value_parse (parser,
871 GTK_CSS_POSITIVE_ONLY
872 | GTK_CSS_NUMBER_AS_PIXELS
873 | GTK_CSS_PARSE_LENGTH);
877 compute_padding (GtkCssStyleProperty *property,
878 GtkStyleContext *context,
879 GtkCssValue *specified)
881 return _gtk_css_number_value_compute (specified, context);
885 parse_border_width (GtkCssStyleProperty *property,
886 GtkCssParser *parser,
889 return _gtk_css_number_value_parse (parser,
890 GTK_CSS_POSITIVE_ONLY
891 | GTK_CSS_NUMBER_AS_PIXELS
892 | GTK_CSS_PARSE_LENGTH);
896 compute_border_width (GtkCssStyleProperty *property,
897 GtkStyleContext *context,
898 GtkCssValue *specified)
900 GtkBorderStyle border_style;
902 /* The -1 is magic that is only true because we register the style
903 * properties directly after the width properties.
905 border_style = _gtk_css_border_style_value_get (_gtk_style_context_peek_property (context, _gtk_css_style_property_get_id (property) - 1));
907 if (border_style == GTK_BORDER_STYLE_NONE ||
908 border_style == GTK_BORDER_STYLE_HIDDEN)
909 return _gtk_css_number_value_new (0, GTK_CSS_PX);
911 return _gtk_css_number_value_compute (specified, context);
915 background_repeat_value_parse (GtkCssStyleProperty *property,
916 GtkCssParser *parser,
919 GtkCssValue *value = _gtk_css_background_repeat_value_try_parse (parser);
923 _gtk_css_parser_error (parser, "Not a valid value");
931 background_size_parse (GtkCssStyleProperty *property,
932 GtkCssParser *parser,
935 return _gtk_css_bg_size_value_parse (parser);
939 background_size_compute (GtkCssStyleProperty *property,
940 GtkStyleContext *context,
941 GtkCssValue *specified)
943 return _gtk_css_bg_size_value_compute (specified, context);
947 background_position_parse (GtkCssStyleProperty *property,
948 GtkCssParser *parser,
951 return _gtk_css_position_value_parse (parser);
955 background_position_compute (GtkCssStyleProperty *property,
956 GtkStyleContext *context,
957 GtkCssValue *specified)
959 return _gtk_css_position_value_compute (specified, context);
962 /*** REGISTRATION ***/
964 static GtkSymbolicColor *
965 gtk_symbolic_color_new_rgba (double red,
970 GdkRGBA rgba = { red, green, blue, alpha };
972 return gtk_symbolic_color_new_literal (&rgba);
976 _gtk_css_style_property_init_properties (void)
978 /* Initialize "color" and "font-size" first,
979 * so that when computing values later they are
980 * done first. That way, 'currentColor' and font
981 * sizes in em can be looked up properly */
982 gtk_css_style_property_register ("color",
983 GTK_CSS_PROPERTY_COLOR,
985 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
988 color_property_compute,
992 _gtk_css_value_new_take_symbolic_color (
993 gtk_symbolic_color_new_rgba (1, 1, 1, 1)));
994 gtk_css_style_property_register ("font-size",
995 GTK_CSS_PROPERTY_FONT_SIZE,
997 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
1001 query_length_as_double,
1002 assign_length_from_double,
1004 /* XXX: This should be 'normal' */
1005 _gtk_css_number_value_new (10.0, GTK_CSS_PX));
1007 /* properties that aren't referenced when computing values
1009 gtk_css_style_property_register ("background-color",
1010 GTK_CSS_PROPERTY_BACKGROUND_COLOR,
1012 GTK_STYLE_PROPERTY_ANIMATED,
1019 _gtk_css_value_new_take_symbolic_color (
1020 gtk_symbolic_color_new_rgba (0, 0, 0, 0)));
1022 gtk_css_style_property_register ("font-family",
1023 GTK_CSS_PROPERTY_FONT_FAMILY,
1025 GTK_STYLE_PROPERTY_INHERIT,
1032 _gtk_css_array_value_new (_gtk_css_string_value_new ("Sans")));
1033 gtk_css_style_property_register ("font-style",
1034 GTK_CSS_PROPERTY_FONT_STYLE,
1036 GTK_STYLE_PROPERTY_INHERIT,
1043 _gtk_css_font_style_value_new (PANGO_STYLE_NORMAL));
1044 gtk_css_style_property_register ("font-variant",
1045 GTK_CSS_PROPERTY_FONT_VARIANT,
1047 GTK_STYLE_PROPERTY_INHERIT,
1048 parse_pango_variant,
1051 query_pango_variant,
1052 assign_pango_variant,
1054 _gtk_css_font_variant_value_new (PANGO_VARIANT_NORMAL));
1055 gtk_css_style_property_register ("font-weight",
1056 GTK_CSS_PROPERTY_FONT_WEIGHT,
1058 GTK_STYLE_PROPERTY_INHERIT,
1063 assign_pango_weight,
1065 _gtk_css_font_weight_value_new (PANGO_WEIGHT_NORMAL));
1067 gtk_css_style_property_register ("text-shadow",
1068 GTK_CSS_PROPERTY_TEXT_SHADOW,
1070 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
1073 shadow_value_compute,
1077 _gtk_css_shadows_value_new_none ());
1079 gtk_css_style_property_register ("icon-shadow",
1080 GTK_CSS_PROPERTY_ICON_SHADOW,
1082 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
1085 shadow_value_compute,
1089 _gtk_css_shadows_value_new_none ());
1091 gtk_css_style_property_register ("box-shadow",
1092 GTK_CSS_PROPERTY_BOX_SHADOW,
1094 GTK_STYLE_PROPERTY_ANIMATED,
1097 shadow_value_compute,
1101 _gtk_css_shadows_value_new_none ());
1103 gtk_css_style_property_register ("margin-top",
1104 GTK_CSS_PROPERTY_MARGIN_TOP,
1106 GTK_STYLE_PROPERTY_ANIMATED,
1110 query_length_as_int,
1111 assign_length_from_int,
1113 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1114 gtk_css_style_property_register ("margin-left",
1115 GTK_CSS_PROPERTY_MARGIN_LEFT,
1117 GTK_STYLE_PROPERTY_ANIMATED,
1121 query_length_as_int,
1122 assign_length_from_int,
1124 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1125 gtk_css_style_property_register ("margin-bottom",
1126 GTK_CSS_PROPERTY_MARGIN_BOTTOM,
1128 GTK_STYLE_PROPERTY_ANIMATED,
1132 query_length_as_int,
1133 assign_length_from_int,
1135 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1136 gtk_css_style_property_register ("margin-right",
1137 GTK_CSS_PROPERTY_MARGIN_RIGHT,
1139 GTK_STYLE_PROPERTY_ANIMATED,
1143 query_length_as_int,
1144 assign_length_from_int,
1146 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1147 gtk_css_style_property_register ("padding-top",
1148 GTK_CSS_PROPERTY_PADDING_TOP,
1150 GTK_STYLE_PROPERTY_ANIMATED,
1154 query_length_as_int,
1155 assign_length_from_int,
1157 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1158 gtk_css_style_property_register ("padding-left",
1159 GTK_CSS_PROPERTY_PADDING_LEFT,
1161 GTK_STYLE_PROPERTY_ANIMATED,
1165 query_length_as_int,
1166 assign_length_from_int,
1168 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1169 gtk_css_style_property_register ("padding-bottom",
1170 GTK_CSS_PROPERTY_PADDING_BOTTOM,
1172 GTK_STYLE_PROPERTY_ANIMATED,
1176 query_length_as_int,
1177 assign_length_from_int,
1179 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1180 gtk_css_style_property_register ("padding-right",
1181 GTK_CSS_PROPERTY_PADDING_RIGHT,
1183 GTK_STYLE_PROPERTY_ANIMATED,
1187 query_length_as_int,
1188 assign_length_from_int,
1190 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1191 /* IMPORTANT: compute_border_width() requires that the border-width
1192 * properties be immeditaly followed by the border-style properties
1194 gtk_css_style_property_register ("border-top-style",
1195 GTK_CSS_PROPERTY_BORDER_TOP_STYLE,
1196 GTK_TYPE_BORDER_STYLE,
1202 assign_border_style,
1204 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1205 gtk_css_style_property_register ("border-top-width",
1206 GTK_CSS_PROPERTY_BORDER_TOP_WIDTH,
1208 GTK_STYLE_PROPERTY_ANIMATED,
1211 compute_border_width,
1212 query_length_as_int,
1213 assign_length_from_int,
1215 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1216 gtk_css_style_property_register ("border-left-style",
1217 GTK_CSS_PROPERTY_BORDER_LEFT_STYLE,
1218 GTK_TYPE_BORDER_STYLE,
1224 assign_border_style,
1226 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1227 gtk_css_style_property_register ("border-left-width",
1228 GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH,
1230 GTK_STYLE_PROPERTY_ANIMATED,
1233 compute_border_width,
1234 query_length_as_int,
1235 assign_length_from_int,
1237 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1238 gtk_css_style_property_register ("border-bottom-style",
1239 GTK_CSS_PROPERTY_BORDER_BOTTOM_STYLE,
1240 GTK_TYPE_BORDER_STYLE,
1246 assign_border_style,
1248 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1249 gtk_css_style_property_register ("border-bottom-width",
1250 GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH,
1252 GTK_STYLE_PROPERTY_ANIMATED,
1255 compute_border_width,
1256 query_length_as_int,
1257 assign_length_from_int,
1259 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1260 gtk_css_style_property_register ("border-right-style",
1261 GTK_CSS_PROPERTY_BORDER_RIGHT_STYLE,
1262 GTK_TYPE_BORDER_STYLE,
1268 assign_border_style,
1270 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1271 gtk_css_style_property_register ("border-right-width",
1272 GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH,
1274 GTK_STYLE_PROPERTY_ANIMATED,
1277 compute_border_width,
1278 query_length_as_int,
1279 assign_length_from_int,
1281 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1283 gtk_css_style_property_register ("border-top-left-radius",
1284 GTK_CSS_PROPERTY_BORDER_TOP_LEFT_RADIUS,
1286 GTK_STYLE_PROPERTY_ANIMATED,
1287 border_corner_radius_value_parse,
1289 border_corner_radius_value_compute,
1293 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1294 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1295 gtk_css_style_property_register ("border-top-right-radius",
1296 GTK_CSS_PROPERTY_BORDER_TOP_RIGHT_RADIUS,
1298 GTK_STYLE_PROPERTY_ANIMATED,
1299 border_corner_radius_value_parse,
1301 border_corner_radius_value_compute,
1305 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1306 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1307 gtk_css_style_property_register ("border-bottom-right-radius",
1308 GTK_CSS_PROPERTY_BORDER_BOTTOM_RIGHT_RADIUS,
1310 GTK_STYLE_PROPERTY_ANIMATED,
1311 border_corner_radius_value_parse,
1313 border_corner_radius_value_compute,
1317 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1318 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1319 gtk_css_style_property_register ("border-bottom-left-radius",
1320 GTK_CSS_PROPERTY_BORDER_BOTTOM_LEFT_RADIUS,
1322 GTK_STYLE_PROPERTY_ANIMATED,
1323 border_corner_radius_value_parse,
1325 border_corner_radius_value_compute,
1329 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1330 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1332 gtk_css_style_property_register ("outline-style",
1333 GTK_CSS_PROPERTY_OUTLINE_STYLE,
1334 GTK_TYPE_BORDER_STYLE,
1340 assign_border_style,
1342 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1343 gtk_css_style_property_register ("outline-width",
1344 GTK_CSS_PROPERTY_OUTLINE_WIDTH,
1346 GTK_STYLE_PROPERTY_ANIMATED,
1349 compute_border_width,
1350 query_length_as_int,
1351 assign_length_from_int,
1353 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1354 gtk_css_style_property_register ("outline-offset",
1355 GTK_CSS_PROPERTY_OUTLINE_OFFSET,
1361 query_length_as_int,
1362 assign_length_from_int,
1364 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1366 gtk_css_style_property_register ("background-clip",
1367 GTK_CSS_PROPERTY_BACKGROUND_CLIP,
1376 _gtk_css_area_value_new (GTK_CSS_AREA_BORDER_BOX));
1377 gtk_css_style_property_register ("background-origin",
1378 GTK_CSS_PROPERTY_BACKGROUND_ORIGIN,
1387 _gtk_css_area_value_new (GTK_CSS_AREA_PADDING_BOX));
1388 gtk_css_style_property_register ("background-size",
1389 GTK_CSS_PROPERTY_BACKGROUND_SIZE,
1392 background_size_parse,
1394 background_size_compute,
1398 _gtk_css_bg_size_value_new (NULL, NULL));
1399 gtk_css_style_property_register ("background-position",
1400 GTK_CSS_PROPERTY_BACKGROUND_POSITION,
1402 GTK_STYLE_PROPERTY_ANIMATED,
1403 background_position_parse,
1405 background_position_compute,
1409 _gtk_css_position_value_new (_gtk_css_number_value_new (0, GTK_CSS_PERCENT),
1410 _gtk_css_number_value_new (0, GTK_CSS_PERCENT)));
1412 gtk_css_style_property_register ("border-top-color",
1413 GTK_CSS_PROPERTY_BORDER_TOP_COLOR,
1415 GTK_STYLE_PROPERTY_ANIMATED,
1422 _gtk_css_value_new_take_symbolic_color (
1423 gtk_symbolic_color_ref (
1424 _gtk_symbolic_color_get_current_color ())));
1425 gtk_css_style_property_register ("border-right-color",
1426 GTK_CSS_PROPERTY_BORDER_RIGHT_COLOR,
1428 GTK_STYLE_PROPERTY_ANIMATED,
1435 _gtk_css_value_new_take_symbolic_color (
1436 gtk_symbolic_color_ref (
1437 _gtk_symbolic_color_get_current_color ())));
1438 gtk_css_style_property_register ("border-bottom-color",
1439 GTK_CSS_PROPERTY_BORDER_BOTTOM_COLOR,
1441 GTK_STYLE_PROPERTY_ANIMATED,
1448 _gtk_css_value_new_take_symbolic_color (
1449 gtk_symbolic_color_ref (
1450 _gtk_symbolic_color_get_current_color ())));
1451 gtk_css_style_property_register ("border-left-color",
1452 GTK_CSS_PROPERTY_BORDER_LEFT_COLOR,
1454 GTK_STYLE_PROPERTY_ANIMATED,
1461 _gtk_css_value_new_take_symbolic_color (
1462 gtk_symbolic_color_ref (
1463 _gtk_symbolic_color_get_current_color ())));
1464 gtk_css_style_property_register ("outline-color",
1465 GTK_CSS_PROPERTY_OUTLINE_COLOR,
1467 GTK_STYLE_PROPERTY_ANIMATED,
1474 _gtk_css_value_new_take_symbolic_color (
1475 gtk_symbolic_color_ref (
1476 _gtk_symbolic_color_get_current_color ())));
1478 gtk_css_style_property_register ("background-repeat",
1479 GTK_CSS_PROPERTY_BACKGROUND_REPEAT,
1482 background_repeat_value_parse,
1488 _gtk_css_background_repeat_value_new (GTK_CSS_REPEAT_STYLE_REPEAT,
1489 GTK_CSS_REPEAT_STYLE_REPEAT));
1490 gtk_css_style_property_register ("background-image",
1491 GTK_CSS_PROPERTY_BACKGROUND_IMAGE,
1492 CAIRO_GOBJECT_TYPE_PATTERN,
1493 GTK_STYLE_PROPERTY_ANIMATED,
1494 css_image_value_parse,
1496 css_image_value_compute,
1497 css_image_value_query,
1498 css_image_value_assign,
1500 _gtk_css_image_value_new (NULL));
1502 gtk_css_style_property_register ("border-image-source",
1503 GTK_CSS_PROPERTY_BORDER_IMAGE_SOURCE,
1504 CAIRO_GOBJECT_TYPE_PATTERN,
1505 GTK_STYLE_PROPERTY_ANIMATED,
1506 css_image_value_parse,
1508 css_image_value_compute,
1509 css_image_value_query,
1510 css_image_value_assign,
1512 _gtk_css_image_value_new (NULL));
1513 gtk_css_style_property_register ("border-image-repeat",
1514 GTK_CSS_PROPERTY_BORDER_IMAGE_REPEAT,
1517 border_image_repeat_parse,
1523 _gtk_css_border_repeat_value_new (GTK_CSS_REPEAT_STYLE_STRETCH,
1524 GTK_CSS_REPEAT_STYLE_STRETCH));
1526 gtk_css_style_property_register ("border-image-slice",
1527 GTK_CSS_PROPERTY_BORDER_IMAGE_SLICE,
1530 border_image_slice_parse,
1536 _gtk_css_border_value_new (_gtk_css_number_value_new (100, GTK_CSS_PERCENT),
1537 _gtk_css_number_value_new (100, GTK_CSS_PERCENT),
1538 _gtk_css_number_value_new (100, GTK_CSS_PERCENT),
1539 _gtk_css_number_value_new (100, GTK_CSS_PERCENT)));
1540 gtk_css_style_property_register ("border-image-width",
1541 GTK_CSS_PROPERTY_BORDER_IMAGE_WIDTH,
1544 border_image_width_parse,
1550 _gtk_css_value_new_from_boxed (GTK_TYPE_BORDER, NULL));
1552 gtk_css_style_property_register ("transition-property",
1553 GTK_CSS_PROPERTY_TRANSITION_PROPERTY,
1556 transition_property_parse,
1562 _gtk_css_array_value_new (_gtk_css_ident_value_new ("all")));
1563 gtk_css_style_property_register ("transition-duration",
1564 GTK_CSS_PROPERTY_TRANSITION_DURATION,
1567 transition_time_parse,
1573 _gtk_css_array_value_new (_gtk_css_number_value_new (0, GTK_CSS_S)));
1574 gtk_css_style_property_register ("transition-timing-function",
1575 GTK_CSS_PROPERTY_TRANSITION_TIMING_FUNCTION,
1578 transition_timing_function_parse,
1584 _gtk_css_array_value_new (
1585 _gtk_css_ease_value_new_cubic_bezier (0.25, 0.1, 0.25, 1.0)));
1586 gtk_css_style_property_register ("transition-delay",
1587 GTK_CSS_PROPERTY_TRANSITION_DELAY,
1590 transition_time_parse,
1596 _gtk_css_array_value_new (_gtk_css_number_value_new (0, GTK_CSS_S)));
1598 gtk_css_style_property_register ("engine",
1599 GTK_CSS_PROPERTY_ENGINE,
1600 GTK_TYPE_THEMING_ENGINE,
1608 _gtk_css_engine_value_new (gtk_theming_engine_load (NULL)));
1609 gtk_css_style_property_register ("transition",
1610 GTK_CSS_PROPERTY_TRANSITION,
1611 GTK_TYPE_ANIMATION_DESCRIPTION,
1619 _gtk_css_value_new_from_boxed (GTK_TYPE_ANIMATION_DESCRIPTION, NULL));
1621 /* Private property holding the binding sets */
1622 gtk_css_style_property_register ("gtk-key-bindings",
1623 GTK_CSS_PROPERTY_GTK_KEY_BINDINGS,
1626 bindings_value_parse,
1629 bindings_value_query,
1630 bindings_value_assign,
1632 _gtk_css_array_value_new (NULL));