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 "gtkbindings.h"
42 #include "gtkcssarrayvalueprivate.h"
43 #include "gtkcssbgsizevalueprivate.h"
44 #include "gtkcssbordervalueprivate.h"
45 #include "gtkcsscolorvalueprivate.h"
46 #include "gtkcsscornervalueprivate.h"
47 #include "gtkcsseasevalueprivate.h"
48 #include "gtkcssenginevalueprivate.h"
49 #include "gtkcssimageprivate.h"
50 #include "gtkcssimagegradientprivate.h"
51 #include "gtkcssimagevalueprivate.h"
52 #include "gtkcssinitialvalueprivate.h"
53 #include "gtkcssenumvalueprivate.h"
54 #include "gtkcssnumbervalueprivate.h"
55 #include "gtkcsspositionvalueprivate.h"
56 #include "gtkcssrepeatvalueprivate.h"
57 #include "gtkcssrgbavalueprivate.h"
58 #include "gtkcssshadowsvalueprivate.h"
59 #include "gtkcssstringvalueprivate.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 GTK_STYLE_PROPERTY_NO_RESIZE = (1 << 2),
70 GTK_STYLE_PROPERTY_AFFECTS_FONT = (1 << 3)
71 } GtkStylePropertyFlags;
74 gtk_css_style_property_register (const char * name,
77 GtkStylePropertyFlags flags,
78 GtkCssStylePropertyParseFunc parse_value,
79 GtkCssStylePropertyQueryFunc query_value,
80 GtkCssStylePropertyAssignFunc assign_value,
81 GtkCssValue * initial_value)
83 GtkCssStyleProperty *node;
85 g_assert (initial_value != NULL);
86 g_assert (parse_value != NULL);
87 g_assert (value_type == G_TYPE_NONE || query_value != NULL);
88 g_assert (value_type == G_TYPE_NONE || assign_value != NULL);
90 node = g_object_new (GTK_TYPE_CSS_STYLE_PROPERTY,
91 "value-type", value_type,
92 "affects-size", (flags & GTK_STYLE_PROPERTY_NO_RESIZE) ? FALSE : TRUE,
93 "affects-font", (flags & GTK_STYLE_PROPERTY_AFFECTS_FONT) ? TRUE : FALSE,
94 "animated", (flags & GTK_STYLE_PROPERTY_ANIMATED) ? TRUE : FALSE,
95 "inherit", (flags & GTK_STYLE_PROPERTY_INHERIT) ? TRUE : FALSE,
96 "initial-value", initial_value,
100 node->parse_value = parse_value;
101 node->query_value = query_value;
102 node->assign_value = assign_value;
104 _gtk_css_value_unref (initial_value);
106 g_assert (_gtk_css_style_property_get_id (node) == expected_id);
109 /*** IMPLEMENTATIONS ***/
112 query_length_as_int (GtkCssStyleProperty *property,
113 const GtkCssValue *css_value,
116 g_value_init (value, G_TYPE_INT);
117 g_value_set_int (value, round (_gtk_css_number_value_get (css_value, 100)));
121 assign_length_from_int (GtkCssStyleProperty *property,
124 return _gtk_css_number_value_new (g_value_get_int (value), GTK_CSS_PX);
128 query_length_as_double (GtkCssStyleProperty *property,
129 const GtkCssValue *css_value,
132 g_value_init (value, G_TYPE_DOUBLE);
133 g_value_set_double (value, _gtk_css_number_value_get (css_value, 100));
137 assign_length_from_double (GtkCssStyleProperty *property,
140 return _gtk_css_number_value_new (g_value_get_double (value), GTK_CSS_PX);
144 query_border (GtkCssStyleProperty *property,
145 const GtkCssValue *css_value,
150 g_value_init (value, GTK_TYPE_BORDER);
152 border.top = round (_gtk_css_number_value_get (_gtk_css_border_value_get_top (css_value), 100));
153 border.right = round (_gtk_css_number_value_get (_gtk_css_border_value_get_right (css_value), 100));
154 border.bottom = round (_gtk_css_number_value_get (_gtk_css_border_value_get_bottom (css_value), 100));
155 border.left = round (_gtk_css_number_value_get (_gtk_css_border_value_get_left (css_value), 100));
157 g_value_set_boxed (value, &border);
161 assign_border (GtkCssStyleProperty *property,
164 const GtkBorder *border = g_value_get_boxed (value);
167 return _gtk_css_initial_value_new ();
169 return _gtk_css_border_value_new (_gtk_css_number_value_new (border->top, GTK_CSS_PX),
170 _gtk_css_number_value_new (border->right, GTK_CSS_PX),
171 _gtk_css_number_value_new (border->bottom, GTK_CSS_PX),
172 _gtk_css_number_value_new (border->left, GTK_CSS_PX));
176 color_parse (GtkCssStyleProperty *property,
177 GtkCssParser *parser)
179 return _gtk_css_color_value_parse (parser);
183 color_query (GtkCssStyleProperty *property,
184 const GtkCssValue *css_value,
187 g_value_init (value, GDK_TYPE_RGBA);
188 g_value_set_boxed (value, _gtk_css_rgba_value_get_rgba (css_value));
192 color_assign (GtkCssStyleProperty *property,
195 return _gtk_css_rgba_value_new_from_rgba (g_value_get_boxed (value));
199 font_family_parse_one (GtkCssParser *parser)
203 name = _gtk_css_parser_try_ident (parser, TRUE);
206 GString *string = g_string_new (name);
208 while ((name = _gtk_css_parser_try_ident (parser, TRUE)))
210 g_string_append_c (string, ' ');
211 g_string_append (string, name);
214 name = g_string_free (string, FALSE);
218 name = _gtk_css_parser_read_string (parser);
223 return _gtk_css_string_value_new_take (name);
227 font_family_parse (GtkCssStyleProperty *property,
228 GtkCssParser *parser)
230 return _gtk_css_array_value_parse (parser, font_family_parse_one);
234 font_family_query (GtkCssStyleProperty *property,
235 const GtkCssValue *css_value,
241 array = g_ptr_array_new ();
243 for (i = 0; i < _gtk_css_array_value_get_n_values (css_value); i++)
245 g_ptr_array_add (array, g_strdup (_gtk_css_string_value_get (_gtk_css_array_value_get_nth (css_value, i))));
249 g_ptr_array_add (array, NULL);
251 g_value_init (value, G_TYPE_STRV);
252 g_value_set_boxed (value, g_ptr_array_free (array, FALSE));
256 font_family_assign (GtkCssStyleProperty *property,
259 const char **names = g_value_get_boxed (value);
263 array = g_ptr_array_new ();
265 for (names = g_value_get_boxed (value); *names; names++)
267 g_ptr_array_add (array, _gtk_css_string_value_new (*names));
270 result = _gtk_css_array_value_new_from_array ((GtkCssValue **) array->pdata, array->len);
271 g_ptr_array_free (array, TRUE);
276 parse_pango_style (GtkCssStyleProperty *property,
277 GtkCssParser *parser)
279 GtkCssValue *value = _gtk_css_font_style_value_try_parse (parser);
282 _gtk_css_parser_error (parser, "unknown value for property");
288 query_pango_style (GtkCssStyleProperty *property,
289 const GtkCssValue *css_value,
292 g_value_init (value, PANGO_TYPE_STYLE);
293 g_value_set_enum (value, _gtk_css_font_style_value_get (css_value));
297 assign_pango_style (GtkCssStyleProperty *property,
300 return _gtk_css_font_style_value_new (g_value_get_enum (value));
304 parse_pango_weight (GtkCssStyleProperty *property,
305 GtkCssParser *parser)
307 GtkCssValue *value = _gtk_css_font_weight_value_try_parse (parser);
310 _gtk_css_parser_error (parser, "unknown value for property");
316 query_pango_weight (GtkCssStyleProperty *property,
317 const GtkCssValue *css_value,
320 g_value_init (value, PANGO_TYPE_WEIGHT);
321 g_value_set_enum (value, _gtk_css_font_weight_value_get (css_value));
325 assign_pango_weight (GtkCssStyleProperty *property,
328 return _gtk_css_font_weight_value_new (g_value_get_enum (value));
332 parse_pango_variant (GtkCssStyleProperty *property,
333 GtkCssParser *parser)
335 GtkCssValue *value = _gtk_css_font_variant_value_try_parse (parser);
338 _gtk_css_parser_error (parser, "unknown value for property");
344 query_pango_variant (GtkCssStyleProperty *property,
345 const GtkCssValue *css_value,
348 g_value_init (value, PANGO_TYPE_VARIANT);
349 g_value_set_enum (value, _gtk_css_font_variant_value_get (css_value));
353 assign_pango_variant (GtkCssStyleProperty *property,
356 return _gtk_css_font_variant_value_new (g_value_get_enum (value));
360 parse_border_style (GtkCssStyleProperty *property,
361 GtkCssParser *parser)
363 GtkCssValue *value = _gtk_css_border_style_value_try_parse (parser);
366 _gtk_css_parser_error (parser, "unknown value for property");
372 query_border_style (GtkCssStyleProperty *property,
373 const GtkCssValue *css_value,
376 g_value_init (value, GTK_TYPE_BORDER_STYLE);
377 g_value_set_enum (value, _gtk_css_border_style_value_get (css_value));
381 assign_border_style (GtkCssStyleProperty *property,
384 return _gtk_css_border_style_value_new (g_value_get_enum (value));
388 parse_css_area_one (GtkCssParser *parser)
390 GtkCssValue *value = _gtk_css_area_value_try_parse (parser);
393 _gtk_css_parser_error (parser, "unknown value for property");
399 parse_css_area (GtkCssStyleProperty *property,
400 GtkCssParser *parser)
402 return _gtk_css_array_value_parse (parser, parse_css_area_one);
406 parse_one_css_direction (GtkCssParser *parser)
408 GtkCssValue *value = _gtk_css_direction_value_try_parse (parser);
411 _gtk_css_parser_error (parser, "unknown value for property");
417 parse_css_direction (GtkCssStyleProperty *property,
418 GtkCssParser *parser)
420 return _gtk_css_array_value_parse (parser, parse_one_css_direction);
424 opacity_parse (GtkCssStyleProperty *property,
425 GtkCssParser *parser)
427 return _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_NUMBER);
432 parse_one_css_play_state (GtkCssParser *parser)
434 GtkCssValue *value = _gtk_css_play_state_value_try_parse (parser);
437 _gtk_css_parser_error (parser, "unknown value for property");
443 parse_css_play_state (GtkCssStyleProperty *property,
444 GtkCssParser *parser)
446 return _gtk_css_array_value_parse (parser, parse_one_css_play_state);
450 parse_one_css_fill_mode (GtkCssParser *parser)
452 GtkCssValue *value = _gtk_css_fill_mode_value_try_parse (parser);
455 _gtk_css_parser_error (parser, "unknown value for property");
461 parse_css_fill_mode (GtkCssStyleProperty *property,
462 GtkCssParser *parser)
464 return _gtk_css_array_value_parse (parser, parse_one_css_fill_mode);
468 bindings_value_parse_one (GtkCssParser *parser)
472 name = _gtk_css_parser_try_ident (parser, TRUE);
475 _gtk_css_parser_error (parser, "Not a valid binding name");
479 if (g_ascii_strcasecmp (name, "none"))
483 else if (!gtk_binding_set_find (name))
485 _gtk_css_parser_error (parser, "No binding set named '%s'", name);
490 return _gtk_css_string_value_new_take (name);
494 bindings_value_parse (GtkCssStyleProperty *property,
495 GtkCssParser *parser)
497 return _gtk_css_array_value_parse (parser, bindings_value_parse_one);
501 bindings_value_query (GtkCssStyleProperty *property,
502 const GtkCssValue *css_value,
508 g_value_init (value, G_TYPE_PTR_ARRAY);
510 if (_gtk_css_array_value_get_n_values (css_value) == 0)
515 for (i = 0; i < _gtk_css_array_value_get_n_values (css_value); i++)
518 GtkBindingSet *binding_set;
520 name = _gtk_css_string_value_get (_gtk_css_array_value_get_nth (css_value, i));
524 binding_set = gtk_binding_set_find (name);
525 if (binding_set == NULL)
529 array = g_ptr_array_new ();
530 g_ptr_array_add (array, binding_set);
533 g_value_take_boxed (value, array);
537 bindings_value_assign (GtkCssStyleProperty *property,
540 GPtrArray *binding_sets = g_value_get_boxed (value);
541 GtkCssValue **values, *result;
544 if (binding_sets == NULL || binding_sets->len == 0)
545 return _gtk_css_array_value_new (_gtk_css_string_value_new (NULL));
547 values = g_new (GtkCssValue *, binding_sets->len);
549 for (i = 0; i < binding_sets->len; i++)
551 GtkBindingSet *binding_set = g_ptr_array_index (binding_sets, i);
552 values[i] = _gtk_css_string_value_new (binding_set->set_name);
555 result = _gtk_css_array_value_new_from_array (values, binding_sets->len);
561 shadow_value_parse (GtkCssStyleProperty *property,
562 GtkCssParser *parser)
564 return _gtk_css_shadows_value_parse (parser);
568 border_corner_radius_value_parse (GtkCssStyleProperty *property,
569 GtkCssParser *parser)
571 return _gtk_css_corner_value_parse (parser);
575 css_image_value_parse (GtkCssStyleProperty *property,
576 GtkCssParser *parser)
580 if (_gtk_css_parser_try (parser, "none", TRUE))
584 image = _gtk_css_image_new_parse (parser);
589 return _gtk_css_image_value_new (image);
593 css_image_value_query (GtkCssStyleProperty *property,
594 const GtkCssValue *css_value,
597 GtkCssImage *image = _gtk_css_image_value_get_image (css_value);
598 cairo_pattern_t *pattern;
599 cairo_surface_t *surface;
600 cairo_matrix_t matrix;
602 g_value_init (value, CAIRO_GOBJECT_TYPE_PATTERN);
604 if (GTK_IS_CSS_IMAGE_GRADIENT (image))
605 g_value_set_boxed (value, GTK_CSS_IMAGE_GRADIENT (image)->pattern);
606 else if (image != NULL)
608 double width, height;
610 /* the 100, 100 is rather random */
611 _gtk_css_image_get_concrete_size (image, 0, 0, 100, 100, &width, &height);
612 surface = _gtk_css_image_get_surface (image, NULL, width, height);
613 pattern = cairo_pattern_create_for_surface (surface);
614 cairo_matrix_init_scale (&matrix, width, height);
615 cairo_pattern_set_matrix (pattern, &matrix);
616 cairo_surface_destroy (surface);
617 g_value_take_boxed (value, pattern);
622 css_image_value_assign (GtkCssStyleProperty *property,
625 g_warning ("FIXME: assigning images is not implemented");
626 return _gtk_css_image_value_new (NULL);
630 background_image_value_parse_one (GtkCssParser *parser)
632 return css_image_value_parse (NULL, parser);
636 background_image_value_parse (GtkCssStyleProperty *property,
637 GtkCssParser *parser)
639 return _gtk_css_array_value_parse (parser, background_image_value_parse_one);
643 background_image_value_query (GtkCssStyleProperty *property,
644 const GtkCssValue *css_value,
647 css_image_value_query (property, _gtk_css_array_value_get_nth (css_value, 0), value);
651 background_image_value_assign (GtkCssStyleProperty *property,
654 return _gtk_css_array_value_new (css_image_value_assign (property, value));
658 font_size_parse (GtkCssStyleProperty *property,
659 GtkCssParser *parser)
663 value = _gtk_css_font_size_value_try_parse (parser);
667 return _gtk_css_number_value_parse (parser,
669 | GTK_CSS_PARSE_PERCENT
670 | GTK_CSS_POSITIVE_ONLY
671 | GTK_CSS_NUMBER_AS_PIXELS);
675 outline_parse (GtkCssStyleProperty *property,
676 GtkCssParser *parser)
678 return _gtk_css_number_value_parse (parser,
679 GTK_CSS_NUMBER_AS_PIXELS
680 | GTK_CSS_PARSE_LENGTH);
684 border_image_repeat_parse (GtkCssStyleProperty *property,
685 GtkCssParser *parser)
687 GtkCssValue *value = _gtk_css_border_repeat_value_try_parse (parser);
691 _gtk_css_parser_error (parser, "Not a valid value");
699 border_image_slice_parse (GtkCssStyleProperty *property,
700 GtkCssParser *parser)
702 return _gtk_css_border_value_parse (parser,
703 GTK_CSS_PARSE_PERCENT
704 | GTK_CSS_PARSE_NUMBER
705 | GTK_CSS_POSITIVE_ONLY,
711 border_image_width_parse (GtkCssStyleProperty *property,
712 GtkCssParser *parser)
714 return _gtk_css_border_value_parse (parser,
715 GTK_CSS_PARSE_PERCENT
716 | GTK_CSS_PARSE_LENGTH
717 | GTK_CSS_PARSE_NUMBER
718 | GTK_CSS_POSITIVE_ONLY,
724 transition_property_parse_one (GtkCssParser *parser)
728 value = _gtk_css_ident_value_try_parse (parser);
732 _gtk_css_parser_error (parser, "Expected an identifier");
740 transition_property_parse (GtkCssStyleProperty *property,
741 GtkCssParser *parser)
743 return _gtk_css_array_value_parse (parser, transition_property_parse_one);
747 transition_time_parse_one (GtkCssParser *parser)
749 return _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_TIME);
753 transition_time_parse (GtkCssStyleProperty *property,
754 GtkCssParser *parser)
756 return _gtk_css_array_value_parse (parser, transition_time_parse_one);
760 transition_timing_function_parse (GtkCssStyleProperty *property,
761 GtkCssParser *parser)
763 return _gtk_css_array_value_parse (parser, _gtk_css_ease_value_parse);
767 iteration_count_parse_one (GtkCssParser *parser)
769 if (_gtk_css_parser_try (parser, "infinite", TRUE))
770 return _gtk_css_number_value_new (HUGE_VAL, GTK_CSS_NUMBER);
772 return _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_NUMBER | GTK_CSS_POSITIVE_ONLY);
776 iteration_count_parse (GtkCssStyleProperty *property,
777 GtkCssParser *parser)
779 return _gtk_css_array_value_parse (parser, iteration_count_parse_one);
783 engine_parse (GtkCssStyleProperty *property,
784 GtkCssParser *parser)
786 return _gtk_css_engine_value_parse (parser);
790 engine_query (GtkCssStyleProperty *property,
791 const GtkCssValue *css_value,
794 g_value_init (value, GTK_TYPE_THEMING_ENGINE);
795 g_value_set_object (value, _gtk_css_engine_value_get_engine (css_value));
799 engine_assign (GtkCssStyleProperty *property,
802 return _gtk_css_engine_value_new (g_value_get_object (value));
806 parse_margin (GtkCssStyleProperty *property,
807 GtkCssParser *parser)
809 return _gtk_css_number_value_parse (parser,
810 GTK_CSS_NUMBER_AS_PIXELS
811 | GTK_CSS_PARSE_LENGTH);
815 parse_padding (GtkCssStyleProperty *property,
816 GtkCssParser *parser)
818 return _gtk_css_number_value_parse (parser,
819 GTK_CSS_POSITIVE_ONLY
820 | GTK_CSS_NUMBER_AS_PIXELS
821 | GTK_CSS_PARSE_LENGTH);
825 parse_border_width (GtkCssStyleProperty *property,
826 GtkCssParser *parser)
828 return _gtk_css_number_value_parse (parser,
829 GTK_CSS_POSITIVE_ONLY
830 | GTK_CSS_NUMBER_AS_PIXELS
831 | GTK_CSS_PARSE_LENGTH);
835 background_repeat_value_parse_one (GtkCssParser *parser)
837 GtkCssValue *value = _gtk_css_background_repeat_value_try_parse (parser);
841 _gtk_css_parser_error (parser, "Not a valid value");
849 background_repeat_value_parse (GtkCssStyleProperty *property,
850 GtkCssParser *parser)
852 return _gtk_css_array_value_parse (parser, background_repeat_value_parse_one);
856 background_size_parse (GtkCssStyleProperty *property,
857 GtkCssParser *parser)
859 return _gtk_css_array_value_parse (parser, _gtk_css_bg_size_value_parse);
863 background_position_parse (GtkCssStyleProperty *property,
864 GtkCssParser *parser)
866 return _gtk_css_array_value_parse (parser, _gtk_css_position_value_parse);
869 /*** REGISTRATION ***/
872 _gtk_css_style_property_init_properties (void)
874 /* Initialize "color" and "font-size" first,
875 * so that when computing values later they are
876 * done first. That way, 'currentColor' and font
877 * sizes in em can be looked up properly */
878 gtk_css_style_property_register ("color",
879 GTK_CSS_PROPERTY_COLOR,
881 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
885 _gtk_css_color_value_new_rgba (1, 1, 1, 1));
886 gtk_css_style_property_register ("font-size",
887 GTK_CSS_PROPERTY_FONT_SIZE,
889 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_AFFECTS_FONT,
891 query_length_as_double,
892 assign_length_from_double,
893 _gtk_css_font_size_value_new (GTK_CSS_FONT_SIZE_MEDIUM));
895 /* properties that aren't referenced when computing values
897 gtk_css_style_property_register ("background-color",
898 GTK_CSS_PROPERTY_BACKGROUND_COLOR,
900 GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
904 _gtk_css_color_value_new_rgba (0, 0, 0, 0));
906 gtk_css_style_property_register ("font-family",
907 GTK_CSS_PROPERTY_FONT_FAMILY,
909 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_AFFECTS_FONT,
913 _gtk_css_array_value_new (_gtk_css_string_value_new ("Sans")));
914 gtk_css_style_property_register ("font-style",
915 GTK_CSS_PROPERTY_FONT_STYLE,
917 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_AFFECTS_FONT,
921 _gtk_css_font_style_value_new (PANGO_STYLE_NORMAL));
922 gtk_css_style_property_register ("font-variant",
923 GTK_CSS_PROPERTY_FONT_VARIANT,
925 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_AFFECTS_FONT,
928 assign_pango_variant,
929 _gtk_css_font_variant_value_new (PANGO_VARIANT_NORMAL));
930 gtk_css_style_property_register ("font-weight",
931 GTK_CSS_PROPERTY_FONT_WEIGHT,
933 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_AFFECTS_FONT,
937 _gtk_css_font_weight_value_new (PANGO_WEIGHT_NORMAL));
939 gtk_css_style_property_register ("text-shadow",
940 GTK_CSS_PROPERTY_TEXT_SHADOW,
942 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
946 _gtk_css_shadows_value_new_none ());
948 gtk_css_style_property_register ("icon-shadow",
949 GTK_CSS_PROPERTY_ICON_SHADOW,
951 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
955 _gtk_css_shadows_value_new_none ());
957 gtk_css_style_property_register ("box-shadow",
958 GTK_CSS_PROPERTY_BOX_SHADOW,
960 GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
964 _gtk_css_shadows_value_new_none ());
966 gtk_css_style_property_register ("margin-top",
967 GTK_CSS_PROPERTY_MARGIN_TOP,
969 GTK_STYLE_PROPERTY_ANIMATED,
972 assign_length_from_int,
973 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
974 gtk_css_style_property_register ("margin-left",
975 GTK_CSS_PROPERTY_MARGIN_LEFT,
977 GTK_STYLE_PROPERTY_ANIMATED,
980 assign_length_from_int,
981 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
982 gtk_css_style_property_register ("margin-bottom",
983 GTK_CSS_PROPERTY_MARGIN_BOTTOM,
985 GTK_STYLE_PROPERTY_ANIMATED,
988 assign_length_from_int,
989 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
990 gtk_css_style_property_register ("margin-right",
991 GTK_CSS_PROPERTY_MARGIN_RIGHT,
993 GTK_STYLE_PROPERTY_ANIMATED,
996 assign_length_from_int,
997 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
998 gtk_css_style_property_register ("padding-top",
999 GTK_CSS_PROPERTY_PADDING_TOP,
1001 GTK_STYLE_PROPERTY_ANIMATED,
1003 query_length_as_int,
1004 assign_length_from_int,
1005 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1006 gtk_css_style_property_register ("padding-left",
1007 GTK_CSS_PROPERTY_PADDING_LEFT,
1009 GTK_STYLE_PROPERTY_ANIMATED,
1011 query_length_as_int,
1012 assign_length_from_int,
1013 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1014 gtk_css_style_property_register ("padding-bottom",
1015 GTK_CSS_PROPERTY_PADDING_BOTTOM,
1017 GTK_STYLE_PROPERTY_ANIMATED,
1019 query_length_as_int,
1020 assign_length_from_int,
1021 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1022 gtk_css_style_property_register ("padding-right",
1023 GTK_CSS_PROPERTY_PADDING_RIGHT,
1025 GTK_STYLE_PROPERTY_ANIMATED,
1027 query_length_as_int,
1028 assign_length_from_int,
1029 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1030 /* IMPORTANT: the border-width properties must come after border-style properties,
1031 * they depend on them for their value computation.
1033 gtk_css_style_property_register ("border-top-style",
1034 GTK_CSS_PROPERTY_BORDER_TOP_STYLE,
1035 GTK_TYPE_BORDER_STYLE,
1036 GTK_STYLE_PROPERTY_NO_RESIZE,
1039 assign_border_style,
1040 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1041 gtk_css_style_property_register ("border-top-width",
1042 GTK_CSS_PROPERTY_BORDER_TOP_WIDTH,
1044 GTK_STYLE_PROPERTY_ANIMATED,
1046 query_length_as_int,
1047 assign_length_from_int,
1048 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1049 gtk_css_style_property_register ("border-left-style",
1050 GTK_CSS_PROPERTY_BORDER_LEFT_STYLE,
1051 GTK_TYPE_BORDER_STYLE,
1052 GTK_STYLE_PROPERTY_NO_RESIZE,
1055 assign_border_style,
1056 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1057 gtk_css_style_property_register ("border-left-width",
1058 GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH,
1060 GTK_STYLE_PROPERTY_ANIMATED,
1062 query_length_as_int,
1063 assign_length_from_int,
1064 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1065 gtk_css_style_property_register ("border-bottom-style",
1066 GTK_CSS_PROPERTY_BORDER_BOTTOM_STYLE,
1067 GTK_TYPE_BORDER_STYLE,
1068 GTK_STYLE_PROPERTY_NO_RESIZE,
1071 assign_border_style,
1072 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1073 gtk_css_style_property_register ("border-bottom-width",
1074 GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH,
1076 GTK_STYLE_PROPERTY_ANIMATED,
1078 query_length_as_int,
1079 assign_length_from_int,
1080 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1081 gtk_css_style_property_register ("border-right-style",
1082 GTK_CSS_PROPERTY_BORDER_RIGHT_STYLE,
1083 GTK_TYPE_BORDER_STYLE,
1084 GTK_STYLE_PROPERTY_NO_RESIZE,
1087 assign_border_style,
1088 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1089 gtk_css_style_property_register ("border-right-width",
1090 GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH,
1092 GTK_STYLE_PROPERTY_ANIMATED,
1094 query_length_as_int,
1095 assign_length_from_int,
1096 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1098 gtk_css_style_property_register ("border-top-left-radius",
1099 GTK_CSS_PROPERTY_BORDER_TOP_LEFT_RADIUS,
1101 GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
1102 border_corner_radius_value_parse,
1105 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1106 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1107 gtk_css_style_property_register ("border-top-right-radius",
1108 GTK_CSS_PROPERTY_BORDER_TOP_RIGHT_RADIUS,
1110 GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
1111 border_corner_radius_value_parse,
1114 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1115 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1116 gtk_css_style_property_register ("border-bottom-right-radius",
1117 GTK_CSS_PROPERTY_BORDER_BOTTOM_RIGHT_RADIUS,
1119 GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
1120 border_corner_radius_value_parse,
1123 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1124 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1125 gtk_css_style_property_register ("border-bottom-left-radius",
1126 GTK_CSS_PROPERTY_BORDER_BOTTOM_LEFT_RADIUS,
1128 GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
1129 border_corner_radius_value_parse,
1132 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1133 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1135 gtk_css_style_property_register ("outline-style",
1136 GTK_CSS_PROPERTY_OUTLINE_STYLE,
1137 GTK_TYPE_BORDER_STYLE,
1138 GTK_STYLE_PROPERTY_NO_RESIZE,
1141 assign_border_style,
1142 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1143 gtk_css_style_property_register ("outline-width",
1144 GTK_CSS_PROPERTY_OUTLINE_WIDTH,
1146 GTK_STYLE_PROPERTY_ANIMATED,
1148 query_length_as_int,
1149 assign_length_from_int,
1150 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1151 gtk_css_style_property_register ("outline-offset",
1152 GTK_CSS_PROPERTY_OUTLINE_OFFSET,
1154 GTK_STYLE_PROPERTY_NO_RESIZE,
1156 query_length_as_int,
1157 assign_length_from_int,
1158 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1160 gtk_css_style_property_register ("background-clip",
1161 GTK_CSS_PROPERTY_BACKGROUND_CLIP,
1163 GTK_STYLE_PROPERTY_NO_RESIZE,
1167 _gtk_css_array_value_new (_gtk_css_area_value_new (GTK_CSS_AREA_BORDER_BOX)));
1168 gtk_css_style_property_register ("background-origin",
1169 GTK_CSS_PROPERTY_BACKGROUND_ORIGIN,
1171 GTK_STYLE_PROPERTY_NO_RESIZE,
1175 _gtk_css_array_value_new (_gtk_css_area_value_new (GTK_CSS_AREA_PADDING_BOX)));
1176 gtk_css_style_property_register ("background-size",
1177 GTK_CSS_PROPERTY_BACKGROUND_SIZE,
1179 GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
1180 background_size_parse,
1183 _gtk_css_array_value_new (_gtk_css_bg_size_value_new (NULL, NULL)));
1184 gtk_css_style_property_register ("background-position",
1185 GTK_CSS_PROPERTY_BACKGROUND_POSITION,
1187 GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
1188 background_position_parse,
1191 _gtk_css_array_value_new (_gtk_css_position_value_new (_gtk_css_number_value_new (0, GTK_CSS_PERCENT),
1192 _gtk_css_number_value_new (0, GTK_CSS_PERCENT))));
1194 gtk_css_style_property_register ("border-top-color",
1195 GTK_CSS_PROPERTY_BORDER_TOP_COLOR,
1197 GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
1201 _gtk_css_color_value_new_current_color ());
1202 gtk_css_style_property_register ("border-right-color",
1203 GTK_CSS_PROPERTY_BORDER_RIGHT_COLOR,
1205 GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
1209 _gtk_css_color_value_new_current_color ());
1210 gtk_css_style_property_register ("border-bottom-color",
1211 GTK_CSS_PROPERTY_BORDER_BOTTOM_COLOR,
1213 GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
1217 _gtk_css_color_value_new_current_color ());
1218 gtk_css_style_property_register ("border-left-color",
1219 GTK_CSS_PROPERTY_BORDER_LEFT_COLOR,
1221 GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
1225 _gtk_css_color_value_new_current_color ());
1226 gtk_css_style_property_register ("outline-color",
1227 GTK_CSS_PROPERTY_OUTLINE_COLOR,
1229 GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
1233 _gtk_css_color_value_new_current_color ());
1235 gtk_css_style_property_register ("background-repeat",
1236 GTK_CSS_PROPERTY_BACKGROUND_REPEAT,
1238 GTK_STYLE_PROPERTY_NO_RESIZE,
1239 background_repeat_value_parse,
1242 _gtk_css_array_value_new (_gtk_css_background_repeat_value_new (GTK_CSS_REPEAT_STYLE_REPEAT,
1243 GTK_CSS_REPEAT_STYLE_REPEAT)));
1244 gtk_css_style_property_register ("background-image",
1245 GTK_CSS_PROPERTY_BACKGROUND_IMAGE,
1246 CAIRO_GOBJECT_TYPE_PATTERN,
1247 GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
1248 background_image_value_parse,
1249 background_image_value_query,
1250 background_image_value_assign,
1251 _gtk_css_array_value_new (_gtk_css_image_value_new (NULL)));
1253 gtk_css_style_property_register ("border-image-source",
1254 GTK_CSS_PROPERTY_BORDER_IMAGE_SOURCE,
1255 CAIRO_GOBJECT_TYPE_PATTERN,
1256 GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
1257 css_image_value_parse,
1258 css_image_value_query,
1259 css_image_value_assign,
1260 _gtk_css_image_value_new (NULL));
1261 gtk_css_style_property_register ("border-image-repeat",
1262 GTK_CSS_PROPERTY_BORDER_IMAGE_REPEAT,
1264 GTK_STYLE_PROPERTY_NO_RESIZE,
1265 border_image_repeat_parse,
1268 _gtk_css_border_repeat_value_new (GTK_CSS_REPEAT_STYLE_STRETCH,
1269 GTK_CSS_REPEAT_STYLE_STRETCH));
1271 gtk_css_style_property_register ("border-image-slice",
1272 GTK_CSS_PROPERTY_BORDER_IMAGE_SLICE,
1274 GTK_STYLE_PROPERTY_NO_RESIZE,
1275 border_image_slice_parse,
1278 _gtk_css_border_value_new (_gtk_css_number_value_new (100, GTK_CSS_PERCENT),
1279 _gtk_css_number_value_new (100, GTK_CSS_PERCENT),
1280 _gtk_css_number_value_new (100, GTK_CSS_PERCENT),
1281 _gtk_css_number_value_new (100, GTK_CSS_PERCENT)));
1282 gtk_css_style_property_register ("border-image-width",
1283 GTK_CSS_PROPERTY_BORDER_IMAGE_WIDTH,
1285 GTK_STYLE_PROPERTY_NO_RESIZE,
1286 border_image_width_parse,
1289 _gtk_css_border_value_new (_gtk_css_number_value_new (1, GTK_CSS_NUMBER),
1290 _gtk_css_number_value_new (1, GTK_CSS_NUMBER),
1291 _gtk_css_number_value_new (1, GTK_CSS_NUMBER),
1292 _gtk_css_number_value_new (1, GTK_CSS_NUMBER)));
1294 gtk_css_style_property_register ("transition-property",
1295 GTK_CSS_PROPERTY_TRANSITION_PROPERTY,
1297 GTK_STYLE_PROPERTY_NO_RESIZE,
1298 transition_property_parse,
1301 _gtk_css_array_value_new (_gtk_css_ident_value_new ("all")));
1302 gtk_css_style_property_register ("transition-duration",
1303 GTK_CSS_PROPERTY_TRANSITION_DURATION,
1305 GTK_STYLE_PROPERTY_NO_RESIZE,
1306 transition_time_parse,
1309 _gtk_css_array_value_new (_gtk_css_number_value_new (0, GTK_CSS_S)));
1310 gtk_css_style_property_register ("transition-timing-function",
1311 GTK_CSS_PROPERTY_TRANSITION_TIMING_FUNCTION,
1313 GTK_STYLE_PROPERTY_NO_RESIZE,
1314 transition_timing_function_parse,
1317 _gtk_css_array_value_new (
1318 _gtk_css_ease_value_new_cubic_bezier (0.25, 0.1, 0.25, 1.0)));
1319 gtk_css_style_property_register ("transition-delay",
1320 GTK_CSS_PROPERTY_TRANSITION_DELAY,
1322 GTK_STYLE_PROPERTY_NO_RESIZE,
1323 transition_time_parse,
1326 _gtk_css_array_value_new (_gtk_css_number_value_new (0, GTK_CSS_S)));
1328 gtk_css_style_property_register ("animation-name",
1329 GTK_CSS_PROPERTY_ANIMATION_NAME,
1331 GTK_STYLE_PROPERTY_NO_RESIZE,
1332 transition_property_parse,
1335 _gtk_css_array_value_new (_gtk_css_ident_value_new ("none")));
1336 gtk_css_style_property_register ("animation-duration",
1337 GTK_CSS_PROPERTY_ANIMATION_DURATION,
1339 GTK_STYLE_PROPERTY_NO_RESIZE,
1340 transition_time_parse,
1343 _gtk_css_array_value_new (_gtk_css_number_value_new (0, GTK_CSS_S)));
1344 gtk_css_style_property_register ("animation-timing-function",
1345 GTK_CSS_PROPERTY_ANIMATION_TIMING_FUNCTION,
1347 GTK_STYLE_PROPERTY_NO_RESIZE,
1348 transition_timing_function_parse,
1351 _gtk_css_array_value_new (
1352 _gtk_css_ease_value_new_cubic_bezier (0.25, 0.1, 0.25, 1.0)));
1353 gtk_css_style_property_register ("animation-iteration-count",
1354 GTK_CSS_PROPERTY_ANIMATION_ITERATION_COUNT,
1356 GTK_STYLE_PROPERTY_NO_RESIZE,
1357 iteration_count_parse,
1360 _gtk_css_array_value_new (_gtk_css_number_value_new (1, GTK_CSS_NUMBER)));
1361 gtk_css_style_property_register ("animation-direction",
1362 GTK_CSS_PROPERTY_ANIMATION_DIRECTION,
1364 GTK_STYLE_PROPERTY_NO_RESIZE,
1365 parse_css_direction,
1368 _gtk_css_array_value_new (_gtk_css_direction_value_new (GTK_CSS_DIRECTION_NORMAL)));
1369 gtk_css_style_property_register ("animation-play-state",
1370 GTK_CSS_PROPERTY_ANIMATION_PLAY_STATE,
1372 GTK_STYLE_PROPERTY_NO_RESIZE,
1373 parse_css_play_state,
1376 _gtk_css_array_value_new (_gtk_css_play_state_value_new (GTK_CSS_PLAY_STATE_RUNNING)));
1377 gtk_css_style_property_register ("animation-delay",
1378 GTK_CSS_PROPERTY_ANIMATION_DELAY,
1380 GTK_STYLE_PROPERTY_NO_RESIZE,
1381 transition_time_parse,
1384 _gtk_css_array_value_new (_gtk_css_number_value_new (0, GTK_CSS_S)));
1385 gtk_css_style_property_register ("animation-fill-mode",
1386 GTK_CSS_PROPERTY_ANIMATION_FILL_MODE,
1388 GTK_STYLE_PROPERTY_NO_RESIZE,
1389 parse_css_fill_mode,
1392 _gtk_css_array_value_new (_gtk_css_fill_mode_value_new (GTK_CSS_FILL_NONE)));
1393 gtk_css_style_property_register ("opacity",
1394 GTK_CSS_PROPERTY_OPACITY,
1396 GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
1400 _gtk_css_number_value_new (1, GTK_CSS_NUMBER));
1402 gtk_css_style_property_register ("engine",
1403 GTK_CSS_PROPERTY_ENGINE,
1404 GTK_TYPE_THEMING_ENGINE,
1405 GTK_STYLE_PROPERTY_NO_RESIZE,
1409 _gtk_css_engine_value_new (gtk_theming_engine_load (NULL)));
1411 /* Private property holding the binding sets */
1412 gtk_css_style_property_register ("gtk-key-bindings",
1413 GTK_CSS_PROPERTY_GTK_KEY_BINDINGS,
1415 GTK_STYLE_PROPERTY_NO_RESIZE,
1416 bindings_value_parse,
1417 bindings_value_query,
1418 bindings_value_assign,
1419 _gtk_css_array_value_new (_gtk_css_string_value_new (NULL)));