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 return _gtk_css_border_value_parse (parser,
733 GTK_CSS_PARSE_PERCENT
734 | GTK_CSS_PARSE_LENGTH
735 | GTK_CSS_PARSE_NUMBER
736 | GTK_CSS_POSITIVE_ONLY,
742 compute_border (GtkCssStyleProperty *property,
743 GtkStyleContext *context,
744 GtkCssValue *specified)
746 return _gtk_css_border_value_compute (specified, context);
750 transition_property_parse_one (GtkCssParser *parser)
754 value = _gtk_css_ident_value_try_parse (parser);
758 _gtk_css_parser_error (parser, "Expected an identifier");
766 transition_property_parse (GtkCssStyleProperty *property,
767 GtkCssParser *parser,
770 return _gtk_css_array_value_parse (parser, transition_property_parse_one, FALSE);
774 transition_time_parse_one (GtkCssParser *parser)
776 return _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_TIME);
780 transition_time_parse (GtkCssStyleProperty *property,
781 GtkCssParser *parser,
784 return _gtk_css_array_value_parse (parser, transition_time_parse_one, FALSE);
788 transition_timing_function_parse (GtkCssStyleProperty *property,
789 GtkCssParser *parser,
792 return _gtk_css_array_value_parse (parser, _gtk_css_ease_value_parse, FALSE);
796 engine_parse (GtkCssStyleProperty *property,
797 GtkCssParser *parser,
800 return _gtk_css_engine_value_parse (parser);
804 engine_query (GtkCssStyleProperty *property,
805 const GtkCssValue *css_value,
808 g_value_init (value, GTK_TYPE_THEMING_ENGINE);
809 g_value_set_object (value, _gtk_css_engine_value_get_engine (css_value));
813 engine_assign (GtkCssStyleProperty *property,
816 return _gtk_css_engine_value_new (g_value_get_object (value));
820 transition_parse (GtkCssStyleProperty *property,
821 GtkCssParser *parser,
824 GValue value = G_VALUE_INIT;
827 g_value_init (&value, GTK_TYPE_ANIMATION_DESCRIPTION);
828 if (!_gtk_css_style_parse_value (&value, parser, base))
830 g_value_unset (&value);
834 result = _gtk_css_value_new_from_gvalue (&value);
835 g_value_unset (&value);
841 parse_margin (GtkCssStyleProperty *property,
842 GtkCssParser *parser,
845 return _gtk_css_number_value_parse (parser,
846 GTK_CSS_NUMBER_AS_PIXELS
847 | GTK_CSS_PARSE_LENGTH);
851 compute_margin (GtkCssStyleProperty *property,
852 GtkStyleContext *context,
853 GtkCssValue *specified)
855 return _gtk_css_number_value_compute (specified, context);
859 parse_padding (GtkCssStyleProperty *property,
860 GtkCssParser *parser,
863 return _gtk_css_number_value_parse (parser,
864 GTK_CSS_POSITIVE_ONLY
865 | GTK_CSS_NUMBER_AS_PIXELS
866 | GTK_CSS_PARSE_LENGTH);
870 compute_padding (GtkCssStyleProperty *property,
871 GtkStyleContext *context,
872 GtkCssValue *specified)
874 return _gtk_css_number_value_compute (specified, context);
878 parse_border_width (GtkCssStyleProperty *property,
879 GtkCssParser *parser,
882 return _gtk_css_number_value_parse (parser,
883 GTK_CSS_POSITIVE_ONLY
884 | GTK_CSS_NUMBER_AS_PIXELS
885 | GTK_CSS_PARSE_LENGTH);
889 compute_border_width (GtkCssStyleProperty *property,
890 GtkStyleContext *context,
891 GtkCssValue *specified)
893 GtkBorderStyle border_style;
895 /* The -1 is magic that is only true because we register the style
896 * properties directly after the width properties.
898 border_style = _gtk_css_border_style_value_get (_gtk_style_context_peek_property (context, _gtk_css_style_property_get_id (property) - 1));
900 if (border_style == GTK_BORDER_STYLE_NONE ||
901 border_style == GTK_BORDER_STYLE_HIDDEN)
902 return _gtk_css_number_value_new (0, GTK_CSS_PX);
904 return _gtk_css_number_value_compute (specified, context);
908 background_repeat_value_parse (GtkCssStyleProperty *property,
909 GtkCssParser *parser,
912 GtkCssValue *value = _gtk_css_background_repeat_value_try_parse (parser);
916 _gtk_css_parser_error (parser, "Not a valid value");
924 background_size_parse (GtkCssStyleProperty *property,
925 GtkCssParser *parser,
928 return _gtk_css_bg_size_value_parse (parser);
932 background_size_compute (GtkCssStyleProperty *property,
933 GtkStyleContext *context,
934 GtkCssValue *specified)
936 return _gtk_css_bg_size_value_compute (specified, context);
940 background_position_parse (GtkCssStyleProperty *property,
941 GtkCssParser *parser,
944 return _gtk_css_position_value_parse (parser);
948 background_position_compute (GtkCssStyleProperty *property,
949 GtkStyleContext *context,
950 GtkCssValue *specified)
952 return _gtk_css_position_value_compute (specified, context);
955 /*** REGISTRATION ***/
957 static GtkSymbolicColor *
958 gtk_symbolic_color_new_rgba (double red,
963 GdkRGBA rgba = { red, green, blue, alpha };
965 return gtk_symbolic_color_new_literal (&rgba);
969 _gtk_css_style_property_init_properties (void)
971 /* Initialize "color" and "font-size" first,
972 * so that when computing values later they are
973 * done first. That way, 'currentColor' and font
974 * sizes in em can be looked up properly */
975 gtk_css_style_property_register ("color",
976 GTK_CSS_PROPERTY_COLOR,
978 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
981 color_property_compute,
985 _gtk_css_value_new_take_symbolic_color (
986 gtk_symbolic_color_new_rgba (1, 1, 1, 1)));
987 gtk_css_style_property_register ("font-size",
988 GTK_CSS_PROPERTY_FONT_SIZE,
990 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
994 query_length_as_double,
995 assign_length_from_double,
997 /* XXX: This should be 'normal' */
998 _gtk_css_number_value_new (10.0, GTK_CSS_PX));
1000 /* properties that aren't referenced when computing values
1002 gtk_css_style_property_register ("background-color",
1003 GTK_CSS_PROPERTY_BACKGROUND_COLOR,
1005 GTK_STYLE_PROPERTY_ANIMATED,
1012 _gtk_css_value_new_take_symbolic_color (
1013 gtk_symbolic_color_new_rgba (0, 0, 0, 0)));
1015 gtk_css_style_property_register ("font-family",
1016 GTK_CSS_PROPERTY_FONT_FAMILY,
1018 GTK_STYLE_PROPERTY_INHERIT,
1025 _gtk_css_array_value_new (_gtk_css_string_value_new ("Sans")));
1026 gtk_css_style_property_register ("font-style",
1027 GTK_CSS_PROPERTY_FONT_STYLE,
1029 GTK_STYLE_PROPERTY_INHERIT,
1036 _gtk_css_font_style_value_new (PANGO_STYLE_NORMAL));
1037 gtk_css_style_property_register ("font-variant",
1038 GTK_CSS_PROPERTY_FONT_VARIANT,
1040 GTK_STYLE_PROPERTY_INHERIT,
1041 parse_pango_variant,
1044 query_pango_variant,
1045 assign_pango_variant,
1047 _gtk_css_font_variant_value_new (PANGO_VARIANT_NORMAL));
1048 gtk_css_style_property_register ("font-weight",
1049 GTK_CSS_PROPERTY_FONT_WEIGHT,
1051 GTK_STYLE_PROPERTY_INHERIT,
1056 assign_pango_weight,
1058 _gtk_css_font_weight_value_new (PANGO_WEIGHT_NORMAL));
1060 gtk_css_style_property_register ("text-shadow",
1061 GTK_CSS_PROPERTY_TEXT_SHADOW,
1063 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
1066 shadow_value_compute,
1070 _gtk_css_shadows_value_new_none ());
1072 gtk_css_style_property_register ("icon-shadow",
1073 GTK_CSS_PROPERTY_ICON_SHADOW,
1075 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
1078 shadow_value_compute,
1082 _gtk_css_shadows_value_new_none ());
1084 gtk_css_style_property_register ("box-shadow",
1085 GTK_CSS_PROPERTY_BOX_SHADOW,
1087 GTK_STYLE_PROPERTY_ANIMATED,
1090 shadow_value_compute,
1094 _gtk_css_shadows_value_new_none ());
1096 gtk_css_style_property_register ("margin-top",
1097 GTK_CSS_PROPERTY_MARGIN_TOP,
1099 GTK_STYLE_PROPERTY_ANIMATED,
1103 query_length_as_int,
1104 assign_length_from_int,
1106 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1107 gtk_css_style_property_register ("margin-left",
1108 GTK_CSS_PROPERTY_MARGIN_LEFT,
1110 GTK_STYLE_PROPERTY_ANIMATED,
1114 query_length_as_int,
1115 assign_length_from_int,
1117 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1118 gtk_css_style_property_register ("margin-bottom",
1119 GTK_CSS_PROPERTY_MARGIN_BOTTOM,
1121 GTK_STYLE_PROPERTY_ANIMATED,
1125 query_length_as_int,
1126 assign_length_from_int,
1128 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1129 gtk_css_style_property_register ("margin-right",
1130 GTK_CSS_PROPERTY_MARGIN_RIGHT,
1132 GTK_STYLE_PROPERTY_ANIMATED,
1136 query_length_as_int,
1137 assign_length_from_int,
1139 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1140 gtk_css_style_property_register ("padding-top",
1141 GTK_CSS_PROPERTY_PADDING_TOP,
1143 GTK_STYLE_PROPERTY_ANIMATED,
1147 query_length_as_int,
1148 assign_length_from_int,
1150 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1151 gtk_css_style_property_register ("padding-left",
1152 GTK_CSS_PROPERTY_PADDING_LEFT,
1154 GTK_STYLE_PROPERTY_ANIMATED,
1158 query_length_as_int,
1159 assign_length_from_int,
1161 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1162 gtk_css_style_property_register ("padding-bottom",
1163 GTK_CSS_PROPERTY_PADDING_BOTTOM,
1165 GTK_STYLE_PROPERTY_ANIMATED,
1169 query_length_as_int,
1170 assign_length_from_int,
1172 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1173 gtk_css_style_property_register ("padding-right",
1174 GTK_CSS_PROPERTY_PADDING_RIGHT,
1176 GTK_STYLE_PROPERTY_ANIMATED,
1180 query_length_as_int,
1181 assign_length_from_int,
1183 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1184 /* IMPORTANT: compute_border_width() requires that the border-width
1185 * properties be immeditaly followed by the border-style properties
1187 gtk_css_style_property_register ("border-top-style",
1188 GTK_CSS_PROPERTY_BORDER_TOP_STYLE,
1189 GTK_TYPE_BORDER_STYLE,
1195 assign_border_style,
1197 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1198 gtk_css_style_property_register ("border-top-width",
1199 GTK_CSS_PROPERTY_BORDER_TOP_WIDTH,
1201 GTK_STYLE_PROPERTY_ANIMATED,
1204 compute_border_width,
1205 query_length_as_int,
1206 assign_length_from_int,
1208 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1209 gtk_css_style_property_register ("border-left-style",
1210 GTK_CSS_PROPERTY_BORDER_LEFT_STYLE,
1211 GTK_TYPE_BORDER_STYLE,
1217 assign_border_style,
1219 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1220 gtk_css_style_property_register ("border-left-width",
1221 GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH,
1223 GTK_STYLE_PROPERTY_ANIMATED,
1226 compute_border_width,
1227 query_length_as_int,
1228 assign_length_from_int,
1230 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1231 gtk_css_style_property_register ("border-bottom-style",
1232 GTK_CSS_PROPERTY_BORDER_BOTTOM_STYLE,
1233 GTK_TYPE_BORDER_STYLE,
1239 assign_border_style,
1241 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1242 gtk_css_style_property_register ("border-bottom-width",
1243 GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH,
1245 GTK_STYLE_PROPERTY_ANIMATED,
1248 compute_border_width,
1249 query_length_as_int,
1250 assign_length_from_int,
1252 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1253 gtk_css_style_property_register ("border-right-style",
1254 GTK_CSS_PROPERTY_BORDER_RIGHT_STYLE,
1255 GTK_TYPE_BORDER_STYLE,
1261 assign_border_style,
1263 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1264 gtk_css_style_property_register ("border-right-width",
1265 GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH,
1267 GTK_STYLE_PROPERTY_ANIMATED,
1270 compute_border_width,
1271 query_length_as_int,
1272 assign_length_from_int,
1274 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1276 gtk_css_style_property_register ("border-top-left-radius",
1277 GTK_CSS_PROPERTY_BORDER_TOP_LEFT_RADIUS,
1279 GTK_STYLE_PROPERTY_ANIMATED,
1280 border_corner_radius_value_parse,
1282 border_corner_radius_value_compute,
1286 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1287 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1288 gtk_css_style_property_register ("border-top-right-radius",
1289 GTK_CSS_PROPERTY_BORDER_TOP_RIGHT_RADIUS,
1291 GTK_STYLE_PROPERTY_ANIMATED,
1292 border_corner_radius_value_parse,
1294 border_corner_radius_value_compute,
1298 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1299 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1300 gtk_css_style_property_register ("border-bottom-right-radius",
1301 GTK_CSS_PROPERTY_BORDER_BOTTOM_RIGHT_RADIUS,
1303 GTK_STYLE_PROPERTY_ANIMATED,
1304 border_corner_radius_value_parse,
1306 border_corner_radius_value_compute,
1310 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1311 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1312 gtk_css_style_property_register ("border-bottom-left-radius",
1313 GTK_CSS_PROPERTY_BORDER_BOTTOM_LEFT_RADIUS,
1315 GTK_STYLE_PROPERTY_ANIMATED,
1316 border_corner_radius_value_parse,
1318 border_corner_radius_value_compute,
1322 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1323 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1325 gtk_css_style_property_register ("outline-style",
1326 GTK_CSS_PROPERTY_OUTLINE_STYLE,
1327 GTK_TYPE_BORDER_STYLE,
1333 assign_border_style,
1335 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1336 gtk_css_style_property_register ("outline-width",
1337 GTK_CSS_PROPERTY_OUTLINE_WIDTH,
1339 GTK_STYLE_PROPERTY_ANIMATED,
1342 compute_border_width,
1343 query_length_as_int,
1344 assign_length_from_int,
1346 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1347 gtk_css_style_property_register ("outline-offset",
1348 GTK_CSS_PROPERTY_OUTLINE_OFFSET,
1354 query_length_as_int,
1355 assign_length_from_int,
1357 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1359 gtk_css_style_property_register ("background-clip",
1360 GTK_CSS_PROPERTY_BACKGROUND_CLIP,
1369 _gtk_css_area_value_new (GTK_CSS_AREA_BORDER_BOX));
1370 gtk_css_style_property_register ("background-origin",
1371 GTK_CSS_PROPERTY_BACKGROUND_ORIGIN,
1380 _gtk_css_area_value_new (GTK_CSS_AREA_PADDING_BOX));
1381 gtk_css_style_property_register ("background-size",
1382 GTK_CSS_PROPERTY_BACKGROUND_SIZE,
1385 background_size_parse,
1387 background_size_compute,
1391 _gtk_css_bg_size_value_new (NULL, NULL));
1392 gtk_css_style_property_register ("background-position",
1393 GTK_CSS_PROPERTY_BACKGROUND_POSITION,
1395 GTK_STYLE_PROPERTY_ANIMATED,
1396 background_position_parse,
1398 background_position_compute,
1402 _gtk_css_position_value_new (_gtk_css_number_value_new (0, GTK_CSS_PERCENT),
1403 _gtk_css_number_value_new (0, GTK_CSS_PERCENT)));
1405 gtk_css_style_property_register ("border-top-color",
1406 GTK_CSS_PROPERTY_BORDER_TOP_COLOR,
1408 GTK_STYLE_PROPERTY_ANIMATED,
1415 _gtk_css_value_new_take_symbolic_color (
1416 gtk_symbolic_color_ref (
1417 _gtk_symbolic_color_get_current_color ())));
1418 gtk_css_style_property_register ("border-right-color",
1419 GTK_CSS_PROPERTY_BORDER_RIGHT_COLOR,
1421 GTK_STYLE_PROPERTY_ANIMATED,
1428 _gtk_css_value_new_take_symbolic_color (
1429 gtk_symbolic_color_ref (
1430 _gtk_symbolic_color_get_current_color ())));
1431 gtk_css_style_property_register ("border-bottom-color",
1432 GTK_CSS_PROPERTY_BORDER_BOTTOM_COLOR,
1434 GTK_STYLE_PROPERTY_ANIMATED,
1441 _gtk_css_value_new_take_symbolic_color (
1442 gtk_symbolic_color_ref (
1443 _gtk_symbolic_color_get_current_color ())));
1444 gtk_css_style_property_register ("border-left-color",
1445 GTK_CSS_PROPERTY_BORDER_LEFT_COLOR,
1447 GTK_STYLE_PROPERTY_ANIMATED,
1454 _gtk_css_value_new_take_symbolic_color (
1455 gtk_symbolic_color_ref (
1456 _gtk_symbolic_color_get_current_color ())));
1457 gtk_css_style_property_register ("outline-color",
1458 GTK_CSS_PROPERTY_OUTLINE_COLOR,
1460 GTK_STYLE_PROPERTY_ANIMATED,
1467 _gtk_css_value_new_take_symbolic_color (
1468 gtk_symbolic_color_ref (
1469 _gtk_symbolic_color_get_current_color ())));
1471 gtk_css_style_property_register ("background-repeat",
1472 GTK_CSS_PROPERTY_BACKGROUND_REPEAT,
1475 background_repeat_value_parse,
1481 _gtk_css_background_repeat_value_new (GTK_CSS_REPEAT_STYLE_REPEAT,
1482 GTK_CSS_REPEAT_STYLE_REPEAT));
1483 gtk_css_style_property_register ("background-image",
1484 GTK_CSS_PROPERTY_BACKGROUND_IMAGE,
1485 CAIRO_GOBJECT_TYPE_PATTERN,
1486 GTK_STYLE_PROPERTY_ANIMATED,
1487 css_image_value_parse,
1489 css_image_value_compute,
1490 css_image_value_query,
1491 css_image_value_assign,
1493 _gtk_css_image_value_new (NULL));
1495 gtk_css_style_property_register ("border-image-source",
1496 GTK_CSS_PROPERTY_BORDER_IMAGE_SOURCE,
1497 CAIRO_GOBJECT_TYPE_PATTERN,
1498 GTK_STYLE_PROPERTY_ANIMATED,
1499 css_image_value_parse,
1501 css_image_value_compute,
1502 css_image_value_query,
1503 css_image_value_assign,
1505 _gtk_css_image_value_new (NULL));
1506 gtk_css_style_property_register ("border-image-repeat",
1507 GTK_CSS_PROPERTY_BORDER_IMAGE_REPEAT,
1510 border_image_repeat_parse,
1516 _gtk_css_border_repeat_value_new (GTK_CSS_REPEAT_STYLE_STRETCH,
1517 GTK_CSS_REPEAT_STYLE_STRETCH));
1519 gtk_css_style_property_register ("border-image-slice",
1520 GTK_CSS_PROPERTY_BORDER_IMAGE_SLICE,
1523 border_image_slice_parse,
1529 _gtk_css_border_value_new (_gtk_css_number_value_new (100, GTK_CSS_PERCENT),
1530 _gtk_css_number_value_new (100, GTK_CSS_PERCENT),
1531 _gtk_css_number_value_new (100, GTK_CSS_PERCENT),
1532 _gtk_css_number_value_new (100, GTK_CSS_PERCENT)));
1533 gtk_css_style_property_register ("border-image-width",
1534 GTK_CSS_PROPERTY_BORDER_IMAGE_WIDTH,
1537 border_image_width_parse,
1543 _gtk_css_border_value_new (_gtk_css_number_value_new (1, GTK_CSS_NUMBER),
1544 _gtk_css_number_value_new (1, GTK_CSS_NUMBER),
1545 _gtk_css_number_value_new (1, GTK_CSS_NUMBER),
1546 _gtk_css_number_value_new (1, GTK_CSS_NUMBER)));
1548 gtk_css_style_property_register ("transition-property",
1549 GTK_CSS_PROPERTY_TRANSITION_PROPERTY,
1552 transition_property_parse,
1558 _gtk_css_array_value_new (_gtk_css_ident_value_new ("all")));
1559 gtk_css_style_property_register ("transition-duration",
1560 GTK_CSS_PROPERTY_TRANSITION_DURATION,
1563 transition_time_parse,
1569 _gtk_css_array_value_new (_gtk_css_number_value_new (0, GTK_CSS_S)));
1570 gtk_css_style_property_register ("transition-timing-function",
1571 GTK_CSS_PROPERTY_TRANSITION_TIMING_FUNCTION,
1574 transition_timing_function_parse,
1580 _gtk_css_array_value_new (
1581 _gtk_css_ease_value_new_cubic_bezier (0.25, 0.1, 0.25, 1.0)));
1582 gtk_css_style_property_register ("transition-delay",
1583 GTK_CSS_PROPERTY_TRANSITION_DELAY,
1586 transition_time_parse,
1592 _gtk_css_array_value_new (_gtk_css_number_value_new (0, GTK_CSS_S)));
1594 gtk_css_style_property_register ("engine",
1595 GTK_CSS_PROPERTY_ENGINE,
1596 GTK_TYPE_THEMING_ENGINE,
1604 _gtk_css_engine_value_new (gtk_theming_engine_load (NULL)));
1605 gtk_css_style_property_register ("transition",
1606 GTK_CSS_PROPERTY_TRANSITION,
1607 GTK_TYPE_ANIMATION_DESCRIPTION,
1615 _gtk_css_value_new_from_boxed (GTK_TYPE_ANIMATION_DESCRIPTION, NULL));
1617 /* Private property holding the binding sets */
1618 gtk_css_style_property_register ("gtk-key-bindings",
1619 GTK_CSS_PROPERTY_GTK_KEY_BINDINGS,
1622 bindings_value_parse,
1625 bindings_value_query,
1626 bindings_value_assign,
1628 _gtk_css_array_value_new (NULL));