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 "gtkcssimageprivate.h"
44 #include "gtkgradient.h"
45 #include "gtkshadowprivate.h"
46 #include "gtksymboliccolorprivate.h"
47 #include "gtkthemingengine.h"
48 #include "gtktypebuiltins.h"
49 #include "gtkwin32themeprivate.h"
51 /*** REGISTRATION ***/
54 gtk_css_style_property_register (const char * name,
58 GtkStylePropertyFlags flags,
59 GtkCssStylePropertyParseFunc parse_value,
60 GtkCssStylePropertyPrintFunc print_value,
61 GtkCssStylePropertyComputeFunc compute_value,
64 GtkCssStyleProperty *node;
65 GValue initial_value = G_VALUE_INIT;
69 va_start (args, compute_value);
70 G_VALUE_COLLECT_INIT (&initial_value, specified_type,
74 g_error ("property `%s' initial value is broken: %s", name, error);
75 g_value_unset (&initial_value);
81 node = g_object_new (GTK_TYPE_CSS_STYLE_PROPERTY,
82 "value-type", value_type,
83 "computed-type", computed_type,
84 "inherit", (flags & GTK_STYLE_PROPERTY_INHERIT) ? TRUE : FALSE,
85 "initial-value", &initial_value,
90 node->parse_value = parse_value;
92 node->print_value = print_value;
94 node->compute_value = compute_value;
96 g_value_unset (&initial_value);
102 string_append_string (GString *str,
107 g_string_append_c (str, '"');
110 len = strcspn (string, "\"\n\r\f");
111 g_string_append (str, string);
118 g_string_append (str, "\\A ");
121 g_string_append (str, "\\D ");
124 g_string_append (str, "\\C ");
127 g_string_append (str, "\\\"");
130 g_assert_not_reached ();
135 g_string_append_c (str, '"');
138 /*** IMPLEMENTATIONS ***/
141 color_compute (GtkCssStyleProperty *property,
143 GtkStyleContext *context,
144 const GValue *specified)
146 GtkSymbolicColor *symbolic = g_value_get_boxed (specified);
149 if (symbolic == _gtk_symbolic_color_get_current_color ())
151 /* The computed value of the ‘currentColor’ keyword is the computed
152 * value of the ‘color’ property. If the ‘currentColor’ keyword is
153 * set on the ‘color’ property itself, it is treated as ‘color: inherit’.
155 if (g_str_equal (_gtk_style_property_get_name (GTK_STYLE_PROPERTY (property)), "color"))
157 GtkStyleContext *parent = gtk_style_context_get_parent (context);
160 g_value_copy (_gtk_style_context_peek_property (parent, "color"), computed);
162 _gtk_css_style_compute_value (computed,
164 _gtk_css_style_property_get_initial_value (property));
168 g_value_copy (_gtk_style_context_peek_property (context, "color"), computed);
171 else if (_gtk_style_context_resolve_color (context,
175 g_value_set_boxed (computed, &rgba);
179 color_compute (property,
182 _gtk_css_style_property_get_initial_value (property));
187 font_family_parse (GtkCssStyleProperty *property,
189 GtkCssParser *parser,
195 /* We don't special case generic families. Pango should do
198 names = g_ptr_array_new ();
201 name = _gtk_css_parser_try_ident (parser, TRUE);
204 GString *string = g_string_new (name);
206 while ((name = _gtk_css_parser_try_ident (parser, TRUE)))
208 g_string_append_c (string, ' ');
209 g_string_append (string, name);
212 name = g_string_free (string, FALSE);
216 name = _gtk_css_parser_read_string (parser);
219 g_ptr_array_free (names, TRUE);
224 g_ptr_array_add (names, name);
225 } while (_gtk_css_parser_try (parser, ",", TRUE));
227 /* NULL-terminate array */
228 g_ptr_array_add (names, NULL);
229 g_value_set_boxed (value, g_ptr_array_free (names, FALSE));
234 font_family_value_print (GtkCssStyleProperty *property,
238 const char **names = g_value_get_boxed (value);
240 if (names == NULL || *names == NULL)
242 g_string_append (string, "none");
246 string_append_string (string, *names);
250 g_string_append (string, ", ");
251 string_append_string (string, *names);
257 bindings_value_parse (GtkCssStyleProperty *property,
259 GtkCssParser *parser,
263 GtkBindingSet *binding_set;
266 array = g_ptr_array_new ();
269 name = _gtk_css_parser_try_ident (parser, TRUE);
272 _gtk_css_parser_error (parser, "Not a valid binding name");
273 g_ptr_array_free (array, TRUE);
277 binding_set = gtk_binding_set_find (name);
281 _gtk_css_parser_error (parser, "No binding set named '%s'", name);
286 g_ptr_array_add (array, binding_set);
289 while (_gtk_css_parser_try (parser, ",", TRUE));
291 g_value_take_boxed (value, array);
297 bindings_value_print (GtkCssStyleProperty *property,
304 array = g_value_get_boxed (value);
306 for (i = 0; i < array->len; i++)
308 GtkBindingSet *binding_set = g_ptr_array_index (array, i);
311 g_string_append (string, ", ");
312 g_string_append (string, binding_set->set_name);
317 border_corner_radius_value_parse (GtkCssStyleProperty *property,
319 GtkCssParser *parser,
322 GtkCssBorderCornerRadius corner;
324 if (!_gtk_css_parser_read_number (parser,
326 GTK_CSS_POSITIVE_ONLY
327 | GTK_CSS_PARSE_PERCENT
328 | GTK_CSS_NUMBER_AS_PIXELS
329 | GTK_CSS_PARSE_LENGTH))
332 if (!_gtk_css_parser_has_number (parser))
333 corner.vertical = corner.horizontal;
334 else if (!_gtk_css_parser_read_number (parser,
336 GTK_CSS_POSITIVE_ONLY
337 | GTK_CSS_PARSE_PERCENT
338 | GTK_CSS_NUMBER_AS_PIXELS
339 | GTK_CSS_PARSE_LENGTH))
342 g_value_set_boxed (value, &corner);
347 border_corner_radius_value_print (GtkCssStyleProperty *property,
351 GtkCssBorderCornerRadius *corner;
353 corner = g_value_get_boxed (value);
355 _gtk_css_number_print (&corner->horizontal, string);
357 if (!_gtk_css_number_equal (&corner->horizontal, &corner->vertical))
359 g_string_append_c (string, ' ');
360 _gtk_css_number_print (&corner->vertical, string);
365 css_image_value_parse (GtkCssStyleProperty *property,
367 GtkCssParser *parser,
372 if (_gtk_css_parser_try (parser, "none", TRUE))
376 image = _gtk_css_image_new_parse (parser, base);
381 g_value_take_object (value, image);
386 css_image_value_print (GtkCssStyleProperty *property,
390 GtkCssImage *image = g_value_get_object (value);
393 _gtk_css_image_print (image, string);
395 g_string_append (string, "none");
399 css_image_value_compute (GtkCssStyleProperty *property,
401 GtkStyleContext *context,
402 const GValue *specified)
404 GtkCssImage *image = g_value_get_object (specified);
407 image = _gtk_css_image_compute (image, context);
409 g_value_take_object (computed, image);
413 parse_margin (GtkCssStyleProperty *property,
415 GtkCssParser *parser,
420 if (!_gtk_css_parser_read_number (parser,
422 GTK_CSS_NUMBER_AS_PIXELS
423 | GTK_CSS_PARSE_LENGTH))
426 g_value_set_boxed (value, &number);
431 compute_margin (GtkCssStyleProperty *property,
433 GtkStyleContext *context,
434 const GValue *specified)
438 _gtk_css_number_compute (&number,
439 g_value_get_boxed (specified),
441 g_value_set_boxed (computed, &number);
445 parse_padding (GtkCssStyleProperty *property,
447 GtkCssParser *parser,
452 if (!_gtk_css_parser_read_number (parser,
454 GTK_CSS_POSITIVE_ONLY
455 | GTK_CSS_NUMBER_AS_PIXELS
456 | GTK_CSS_PARSE_LENGTH))
459 g_value_set_boxed (value, &number);
464 compute_padding (GtkCssStyleProperty *property,
466 GtkStyleContext *context,
467 const GValue *specified)
471 _gtk_css_number_compute (&number,
472 g_value_get_boxed (specified),
474 g_value_set_boxed (computed, &number);
478 parse_border_width (GtkCssStyleProperty *property,
480 GtkCssParser *parser,
485 if (!_gtk_css_parser_read_number (parser,
487 GTK_CSS_POSITIVE_ONLY
488 | GTK_CSS_NUMBER_AS_PIXELS
489 | GTK_CSS_PARSE_LENGTH))
492 g_value_set_boxed (value, &number);
497 compute_border_width (GtkCssStyleProperty *property,
499 GtkStyleContext *context,
500 const GValue *specified)
502 GtkCssStyleProperty *style;
503 GtkBorderStyle border_style;
506 /* The -1 is magic that is only true because we register the style
507 * properties directly after the width properties.
509 style = _gtk_css_style_property_lookup_by_id (_gtk_css_style_property_get_id (property) - 1);
510 border_style = g_value_get_enum (_gtk_style_context_peek_property (context, _gtk_style_property_get_name (GTK_STYLE_PROPERTY (style))));
512 if (border_style == GTK_BORDER_STYLE_NONE ||
513 border_style == GTK_BORDER_STYLE_HIDDEN)
515 g_value_set_int (computed, 0);
519 _gtk_css_number_compute (&number,
520 g_value_get_boxed (specified),
522 g_value_set_int (computed, round (number.value));
526 background_repeat_value_parse (GtkCssStyleProperty *property,
528 GtkCssParser *parser,
531 int repeat, vertical;
533 if (!_gtk_css_parser_try_enum (parser, GTK_TYPE_CSS_BACKGROUND_REPEAT, &repeat))
535 _gtk_css_parser_error (parser, "Not a valid value");
539 if (repeat <= GTK_CSS_BACKGROUND_REPEAT_MASK)
541 if (_gtk_css_parser_try_enum (parser, GTK_TYPE_CSS_BACKGROUND_REPEAT, &vertical))
543 if (vertical >= GTK_CSS_BACKGROUND_REPEAT_MASK)
545 _gtk_css_parser_error (parser, "Not a valid 2nd value");
549 repeat |= vertical << GTK_CSS_BACKGROUND_REPEAT_SHIFT;
552 repeat |= repeat << GTK_CSS_BACKGROUND_REPEAT_SHIFT;
555 g_value_set_enum (value, repeat);
560 background_repeat_value_print (GtkCssStyleProperty *property,
564 GEnumClass *enum_class;
565 GEnumValue *enum_value;
566 GtkCssBackgroundRepeat repeat;
568 repeat = g_value_get_enum (value);
569 enum_class = g_type_class_ref (GTK_TYPE_CSS_BACKGROUND_REPEAT);
570 enum_value = g_enum_get_value (enum_class, repeat);
572 /* only triggers for 'repeat-x' and 'repeat-y' */
574 g_string_append (string, enum_value->value_nick);
577 enum_value = g_enum_get_value (enum_class, GTK_CSS_BACKGROUND_HORIZONTAL (repeat));
578 g_string_append (string, enum_value->value_nick);
580 if (GTK_CSS_BACKGROUND_HORIZONTAL (repeat) != GTK_CSS_BACKGROUND_VERTICAL (repeat))
582 enum_value = g_enum_get_value (enum_class, GTK_CSS_BACKGROUND_VERTICAL (repeat));
583 g_string_append (string, " ");
584 g_string_append (string, enum_value->value_nick);
588 g_type_class_unref (enum_class);
592 background_size_parse (GtkCssStyleProperty *property,
594 GtkCssParser *parser,
597 GtkCssBackgroundSize size = { GTK_CSS_NUMBER_INIT (0, GTK_CSS_PX), GTK_CSS_NUMBER_INIT (0, GTK_CSS_PX), FALSE, FALSE};
599 if (_gtk_css_parser_try (parser, "cover", TRUE))
601 else if (_gtk_css_parser_try (parser, "contain", TRUE))
605 if (_gtk_css_parser_try (parser, "auto", TRUE))
606 _gtk_css_number_init (&size.width, 0, GTK_CSS_PX);
607 else if (!_gtk_css_parser_read_number (parser,
609 GTK_CSS_POSITIVE_ONLY
610 | GTK_CSS_PARSE_PERCENT
611 | GTK_CSS_PARSE_LENGTH))
614 if (_gtk_css_parser_try (parser, "auto", TRUE))
615 _gtk_css_number_init (&size.height, 0, GTK_CSS_PX);
616 else if (_gtk_css_parser_has_number (parser))
618 if (!_gtk_css_parser_read_number (parser,
620 GTK_CSS_POSITIVE_ONLY
621 | GTK_CSS_PARSE_PERCENT
622 | GTK_CSS_PARSE_LENGTH))
626 _gtk_css_number_init (&size.height, 0, GTK_CSS_PX);
629 g_value_set_boxed (value, &size);
634 background_size_print (GtkCssStyleProperty *property,
638 GtkCssBackgroundSize *size = g_value_get_boxed (value);
641 g_string_append (string, "cover");
642 else if (size->contain)
643 g_string_append (string, "contain");
646 if (size->width.value == 0)
647 g_string_append (string, "auto");
649 _gtk_css_number_print (&size->width, string);
651 if (size->height.value != 0)
653 g_string_append (string, " ");
654 _gtk_css_number_print (&size->height, string);
660 background_size_compute (GtkCssStyleProperty *property,
662 GtkStyleContext *context,
663 const GValue *specified)
665 GtkCssBackgroundSize *ssize = g_value_get_boxed (specified);
666 GtkCssBackgroundSize csize;
668 csize.cover = ssize->cover;
669 csize.contain = ssize->contain;
670 _gtk_css_number_compute (&csize.width,
673 _gtk_css_number_compute (&csize.height,
677 g_value_set_boxed (computed, &csize);
680 /*** REGISTRATION ***/
682 static GtkSymbolicColor *
683 gtk_symbolic_color_new_rgba (double red,
688 GdkRGBA rgba = { red, green, blue, alpha };
690 return gtk_symbolic_color_new_literal (&rgba);
694 _gtk_css_style_property_init_properties (void)
696 char *default_font_family[] = { "Sans", NULL };
698 GtkSymbolicColor *symbolic;
699 GtkCssBackgroundSize default_background_size = { GTK_CSS_NUMBER_INIT (0, GTK_CSS_PX), GTK_CSS_NUMBER_INIT (0, GTK_CSS_PX), FALSE, FALSE };
700 GtkCssBorderCornerRadius no_corner_radius = { GTK_CSS_NUMBER_INIT (0, GTK_CSS_PX), GTK_CSS_NUMBER_INIT (0, GTK_CSS_PX) };
701 GtkBorder border_of_ones = { 1, 1, 1, 1 };
702 GtkCssBorderImageRepeat border_image_repeat = { GTK_CSS_REPEAT_STYLE_STRETCH, GTK_CSS_REPEAT_STYLE_STRETCH };
704 /* Initialize "color" and "font-size" first,
705 * so that when computing values later they are
706 * done first. That way, 'currentColor' and font
707 * sizes in em can be looked up properly */
708 symbolic = gtk_symbolic_color_new_rgba (1, 1, 1, 1);
709 gtk_css_style_property_register ("color",
710 GTK_TYPE_SYMBOLIC_COLOR,
713 GTK_STYLE_PROPERTY_INHERIT,
718 gtk_symbolic_color_unref (symbolic);
719 gtk_css_style_property_register ("font-size",
723 GTK_STYLE_PROPERTY_INHERIT,
729 /* properties that aren't referenced when computing values
731 symbolic = gtk_symbolic_color_new_rgba (0, 0, 0, 0);
732 gtk_css_style_property_register ("background-color",
733 GTK_TYPE_SYMBOLIC_COLOR,
741 gtk_symbolic_color_unref (symbolic);
743 gtk_css_style_property_register ("font-family",
747 GTK_STYLE_PROPERTY_INHERIT,
749 font_family_value_print,
751 default_font_family);
752 gtk_css_style_property_register ("font-style",
756 GTK_STYLE_PROPERTY_INHERIT,
761 gtk_css_style_property_register ("font-variant",
765 GTK_STYLE_PROPERTY_INHERIT,
769 PANGO_VARIANT_NORMAL);
770 /* xxx: need to parse this properly, ie parse the numbers */
771 gtk_css_style_property_register ("font-weight",
775 GTK_STYLE_PROPERTY_INHERIT,
779 PANGO_WEIGHT_NORMAL);
781 gtk_css_style_property_register ("text-shadow",
785 GTK_STYLE_PROPERTY_INHERIT,
791 gtk_css_style_property_register ("icon-shadow",
795 GTK_STYLE_PROPERTY_INHERIT,
801 gtk_css_style_property_register ("box-shadow",
811 _gtk_css_number_init (&number, 0, GTK_CSS_PX);
812 gtk_css_style_property_register ("margin-top",
821 gtk_css_style_property_register ("margin-left",
830 gtk_css_style_property_register ("margin-bottom",
839 gtk_css_style_property_register ("margin-right",
848 gtk_css_style_property_register ("padding-top",
857 gtk_css_style_property_register ("padding-left",
866 gtk_css_style_property_register ("padding-bottom",
875 gtk_css_style_property_register ("padding-right",
884 /* IMPORTANT: compute_border_width() requires that the border-width
885 * properties be immeditaly followed by the border-style properties
887 gtk_css_style_property_register ("border-top-style",
888 GTK_TYPE_BORDER_STYLE,
889 GTK_TYPE_BORDER_STYLE,
890 GTK_TYPE_BORDER_STYLE,
895 GTK_BORDER_STYLE_NONE);
896 gtk_css_style_property_register ("border-top-width",
903 compute_border_width,
905 gtk_css_style_property_register ("border-left-style",
906 GTK_TYPE_BORDER_STYLE,
907 GTK_TYPE_BORDER_STYLE,
908 GTK_TYPE_BORDER_STYLE,
913 GTK_BORDER_STYLE_NONE);
914 gtk_css_style_property_register ("border-left-width",
921 compute_border_width,
923 gtk_css_style_property_register ("border-bottom-style",
924 GTK_TYPE_BORDER_STYLE,
925 GTK_TYPE_BORDER_STYLE,
926 GTK_TYPE_BORDER_STYLE,
931 GTK_BORDER_STYLE_NONE);
932 gtk_css_style_property_register ("border-bottom-width",
939 compute_border_width,
941 gtk_css_style_property_register ("border-right-style",
942 GTK_TYPE_BORDER_STYLE,
943 GTK_TYPE_BORDER_STYLE,
944 GTK_TYPE_BORDER_STYLE,
949 GTK_BORDER_STYLE_NONE);
950 gtk_css_style_property_register ("border-right-width",
957 compute_border_width,
960 gtk_css_style_property_register ("border-top-left-radius",
961 GTK_TYPE_CSS_BORDER_CORNER_RADIUS,
962 GTK_TYPE_CSS_BORDER_CORNER_RADIUS,
963 GTK_TYPE_CSS_BORDER_CORNER_RADIUS,
965 border_corner_radius_value_parse,
966 border_corner_radius_value_print,
969 gtk_css_style_property_register ("border-top-right-radius",
970 GTK_TYPE_CSS_BORDER_CORNER_RADIUS,
971 GTK_TYPE_CSS_BORDER_CORNER_RADIUS,
972 GTK_TYPE_CSS_BORDER_CORNER_RADIUS,
974 border_corner_radius_value_parse,
975 border_corner_radius_value_print,
978 gtk_css_style_property_register ("border-bottom-right-radius",
979 GTK_TYPE_CSS_BORDER_CORNER_RADIUS,
980 GTK_TYPE_CSS_BORDER_CORNER_RADIUS,
981 GTK_TYPE_CSS_BORDER_CORNER_RADIUS,
983 border_corner_radius_value_parse,
984 border_corner_radius_value_print,
987 gtk_css_style_property_register ("border-bottom-left-radius",
988 GTK_TYPE_CSS_BORDER_CORNER_RADIUS,
989 GTK_TYPE_CSS_BORDER_CORNER_RADIUS,
990 GTK_TYPE_CSS_BORDER_CORNER_RADIUS,
992 border_corner_radius_value_parse,
993 border_corner_radius_value_print,
997 gtk_css_style_property_register ("outline-style",
998 GTK_TYPE_BORDER_STYLE,
999 GTK_TYPE_BORDER_STYLE,
1000 GTK_TYPE_BORDER_STYLE,
1005 GTK_BORDER_STYLE_NONE);
1006 gtk_css_style_property_register ("outline-width",
1007 GTK_TYPE_CSS_NUMBER,
1013 compute_border_width,
1015 gtk_css_style_property_register ("outline-offset",
1025 gtk_css_style_property_register ("background-clip",
1033 GTK_CSS_AREA_BORDER_BOX);
1034 gtk_css_style_property_register ("background-origin",
1042 GTK_CSS_AREA_PADDING_BOX);
1043 gtk_css_style_property_register ("background-size",
1044 GTK_TYPE_CSS_BACKGROUND_SIZE,
1045 GTK_TYPE_CSS_BACKGROUND_SIZE,
1048 background_size_parse,
1049 background_size_print,
1050 background_size_compute,
1051 &default_background_size);
1053 gtk_css_style_property_register ("border-top-color",
1054 GTK_TYPE_SYMBOLIC_COLOR,
1061 _gtk_symbolic_color_get_current_color ());
1062 gtk_css_style_property_register ("border-right-color",
1063 GTK_TYPE_SYMBOLIC_COLOR,
1070 _gtk_symbolic_color_get_current_color ());
1071 gtk_css_style_property_register ("border-bottom-color",
1072 GTK_TYPE_SYMBOLIC_COLOR,
1079 _gtk_symbolic_color_get_current_color ());
1080 gtk_css_style_property_register ("border-left-color",
1081 GTK_TYPE_SYMBOLIC_COLOR,
1088 _gtk_symbolic_color_get_current_color ());
1089 gtk_css_style_property_register ("outline-color",
1090 GTK_TYPE_SYMBOLIC_COLOR,
1097 _gtk_symbolic_color_get_current_color ());
1099 gtk_css_style_property_register ("background-repeat",
1100 GTK_TYPE_CSS_BACKGROUND_REPEAT,
1101 GTK_TYPE_CSS_BACKGROUND_REPEAT,
1102 GTK_TYPE_CSS_BACKGROUND_REPEAT,
1104 background_repeat_value_parse,
1105 background_repeat_value_print,
1107 GTK_CSS_BACKGROUND_REPEAT | (GTK_CSS_BACKGROUND_REPEAT << GTK_CSS_BACKGROUND_REPEAT_SHIFT));
1108 gtk_css_style_property_register ("background-image",
1111 CAIRO_GOBJECT_TYPE_PATTERN,
1113 css_image_value_parse,
1114 css_image_value_print,
1115 css_image_value_compute,
1118 gtk_css_style_property_register ("border-image-source",
1121 CAIRO_GOBJECT_TYPE_PATTERN,
1123 css_image_value_parse,
1124 css_image_value_print,
1125 css_image_value_compute,
1127 gtk_css_style_property_register ("border-image-repeat",
1128 GTK_TYPE_CSS_BORDER_IMAGE_REPEAT,
1129 GTK_TYPE_CSS_BORDER_IMAGE_REPEAT,
1130 GTK_TYPE_CSS_BORDER_IMAGE_REPEAT,
1135 &border_image_repeat);
1137 /* XXX: The initial value is wrong, it should be 100% */
1138 gtk_css_style_property_register ("border-image-slice",
1147 gtk_css_style_property_register ("border-image-width",
1156 gtk_css_style_property_register ("engine",
1157 GTK_TYPE_THEMING_ENGINE,
1158 GTK_TYPE_THEMING_ENGINE,
1159 GTK_TYPE_THEMING_ENGINE,
1164 gtk_theming_engine_load (NULL));
1165 gtk_css_style_property_register ("transition",
1166 GTK_TYPE_ANIMATION_DESCRIPTION,
1167 GTK_TYPE_ANIMATION_DESCRIPTION,
1168 GTK_TYPE_ANIMATION_DESCRIPTION,
1175 /* Private property holding the binding sets */
1176 gtk_css_style_property_register ("gtk-key-bindings",
1181 bindings_value_parse,
1182 bindings_value_print,