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 parse_one_css_play_state (GtkCssParser *parser)
426 GtkCssValue *value = _gtk_css_play_state_value_try_parse (parser);
429 _gtk_css_parser_error (parser, "unknown value for property");
435 parse_css_play_state (GtkCssStyleProperty *property,
436 GtkCssParser *parser)
438 return _gtk_css_array_value_parse (parser, parse_one_css_play_state);
442 parse_one_css_fill_mode (GtkCssParser *parser)
444 GtkCssValue *value = _gtk_css_fill_mode_value_try_parse (parser);
447 _gtk_css_parser_error (parser, "unknown value for property");
453 parse_css_fill_mode (GtkCssStyleProperty *property,
454 GtkCssParser *parser)
456 return _gtk_css_array_value_parse (parser, parse_one_css_fill_mode);
460 bindings_value_parse_one (GtkCssParser *parser)
464 name = _gtk_css_parser_try_ident (parser, TRUE);
467 _gtk_css_parser_error (parser, "Not a valid binding name");
471 if (g_ascii_strcasecmp (name, "none"))
475 else if (!gtk_binding_set_find (name))
477 _gtk_css_parser_error (parser, "No binding set named '%s'", name);
482 return _gtk_css_string_value_new_take (name);
486 bindings_value_parse (GtkCssStyleProperty *property,
487 GtkCssParser *parser)
489 return _gtk_css_array_value_parse (parser, bindings_value_parse_one);
493 bindings_value_query (GtkCssStyleProperty *property,
494 const GtkCssValue *css_value,
500 g_value_init (value, G_TYPE_PTR_ARRAY);
502 if (_gtk_css_array_value_get_n_values (css_value) == 0)
507 for (i = 0; i < _gtk_css_array_value_get_n_values (css_value); i++)
510 GtkBindingSet *binding_set;
512 name = _gtk_css_string_value_get (_gtk_css_array_value_get_nth (css_value, i));
516 binding_set = gtk_binding_set_find (name);
517 if (binding_set == NULL)
521 array = g_ptr_array_new ();
522 g_ptr_array_add (array, binding_set);
525 g_value_take_boxed (value, array);
529 bindings_value_assign (GtkCssStyleProperty *property,
532 GPtrArray *binding_sets = g_value_get_boxed (value);
533 GtkCssValue **values, *result;
536 if (binding_sets == NULL || binding_sets->len == 0)
537 return _gtk_css_array_value_new (_gtk_css_string_value_new (NULL));
539 values = g_new (GtkCssValue *, binding_sets->len);
541 for (i = 0; i < binding_sets->len; i++)
543 GtkBindingSet *binding_set = g_ptr_array_index (binding_sets, i);
544 values[i] = _gtk_css_string_value_new (binding_set->set_name);
547 result = _gtk_css_array_value_new_from_array (values, binding_sets->len);
553 shadow_value_parse (GtkCssStyleProperty *property,
554 GtkCssParser *parser)
556 return _gtk_css_shadows_value_parse (parser);
560 border_corner_radius_value_parse (GtkCssStyleProperty *property,
561 GtkCssParser *parser)
563 return _gtk_css_corner_value_parse (parser);
567 css_image_value_parse (GtkCssStyleProperty *property,
568 GtkCssParser *parser)
572 if (_gtk_css_parser_try (parser, "none", TRUE))
576 image = _gtk_css_image_new_parse (parser);
581 return _gtk_css_image_value_new (image);
585 css_image_value_query (GtkCssStyleProperty *property,
586 const GtkCssValue *css_value,
589 GtkCssImage *image = _gtk_css_image_value_get_image (css_value);
590 cairo_pattern_t *pattern;
591 cairo_surface_t *surface;
592 cairo_matrix_t matrix;
594 g_value_init (value, CAIRO_GOBJECT_TYPE_PATTERN);
596 if (GTK_IS_CSS_IMAGE_GRADIENT (image))
597 g_value_set_boxed (value, GTK_CSS_IMAGE_GRADIENT (image)->pattern);
598 else if (image != NULL)
600 double width, height;
602 /* the 100, 100 is rather random */
603 _gtk_css_image_get_concrete_size (image, 0, 0, 100, 100, &width, &height);
604 surface = _gtk_css_image_get_surface (image, NULL, width, height);
605 pattern = cairo_pattern_create_for_surface (surface);
606 cairo_matrix_init_scale (&matrix, width, height);
607 cairo_pattern_set_matrix (pattern, &matrix);
608 cairo_surface_destroy (surface);
609 g_value_take_boxed (value, pattern);
614 css_image_value_assign (GtkCssStyleProperty *property,
617 g_warning ("FIXME: assigning images is not implemented");
618 return _gtk_css_image_value_new (NULL);
622 background_image_value_parse_one (GtkCssParser *parser)
624 return css_image_value_parse (NULL, parser);
628 background_image_value_parse (GtkCssStyleProperty *property,
629 GtkCssParser *parser)
631 return _gtk_css_array_value_parse (parser, background_image_value_parse_one);
635 background_image_value_query (GtkCssStyleProperty *property,
636 const GtkCssValue *css_value,
639 css_image_value_query (property, _gtk_css_array_value_get_nth (css_value, 0), value);
643 background_image_value_assign (GtkCssStyleProperty *property,
646 return _gtk_css_array_value_new (css_image_value_assign (property, value));
650 font_size_parse (GtkCssStyleProperty *property,
651 GtkCssParser *parser)
655 value = _gtk_css_font_size_value_try_parse (parser);
659 return _gtk_css_number_value_parse (parser,
661 | GTK_CSS_PARSE_PERCENT
662 | GTK_CSS_POSITIVE_ONLY
663 | GTK_CSS_NUMBER_AS_PIXELS);
667 outline_parse (GtkCssStyleProperty *property,
668 GtkCssParser *parser)
670 return _gtk_css_number_value_parse (parser,
671 GTK_CSS_NUMBER_AS_PIXELS
672 | GTK_CSS_PARSE_LENGTH);
676 border_image_repeat_parse (GtkCssStyleProperty *property,
677 GtkCssParser *parser)
679 GtkCssValue *value = _gtk_css_border_repeat_value_try_parse (parser);
683 _gtk_css_parser_error (parser, "Not a valid value");
691 border_image_slice_parse (GtkCssStyleProperty *property,
692 GtkCssParser *parser)
694 return _gtk_css_border_value_parse (parser,
695 GTK_CSS_PARSE_PERCENT
696 | GTK_CSS_PARSE_NUMBER
697 | GTK_CSS_POSITIVE_ONLY,
703 border_image_width_parse (GtkCssStyleProperty *property,
704 GtkCssParser *parser)
706 return _gtk_css_border_value_parse (parser,
707 GTK_CSS_PARSE_PERCENT
708 | GTK_CSS_PARSE_LENGTH
709 | GTK_CSS_PARSE_NUMBER
710 | GTK_CSS_POSITIVE_ONLY,
716 transition_property_parse_one (GtkCssParser *parser)
720 value = _gtk_css_ident_value_try_parse (parser);
724 _gtk_css_parser_error (parser, "Expected an identifier");
732 transition_property_parse (GtkCssStyleProperty *property,
733 GtkCssParser *parser)
735 return _gtk_css_array_value_parse (parser, transition_property_parse_one);
739 transition_time_parse_one (GtkCssParser *parser)
741 return _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_TIME);
745 transition_time_parse (GtkCssStyleProperty *property,
746 GtkCssParser *parser)
748 return _gtk_css_array_value_parse (parser, transition_time_parse_one);
752 transition_timing_function_parse (GtkCssStyleProperty *property,
753 GtkCssParser *parser)
755 return _gtk_css_array_value_parse (parser, _gtk_css_ease_value_parse);
759 iteration_count_parse_one (GtkCssParser *parser)
761 if (_gtk_css_parser_try (parser, "infinite", TRUE))
762 return _gtk_css_number_value_new (HUGE_VAL, GTK_CSS_NUMBER);
764 return _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_NUMBER | GTK_CSS_POSITIVE_ONLY);
768 iteration_count_parse (GtkCssStyleProperty *property,
769 GtkCssParser *parser)
771 return _gtk_css_array_value_parse (parser, iteration_count_parse_one);
775 engine_parse (GtkCssStyleProperty *property,
776 GtkCssParser *parser)
778 return _gtk_css_engine_value_parse (parser);
782 engine_query (GtkCssStyleProperty *property,
783 const GtkCssValue *css_value,
786 g_value_init (value, GTK_TYPE_THEMING_ENGINE);
787 g_value_set_object (value, _gtk_css_engine_value_get_engine (css_value));
791 engine_assign (GtkCssStyleProperty *property,
794 return _gtk_css_engine_value_new (g_value_get_object (value));
798 parse_margin (GtkCssStyleProperty *property,
799 GtkCssParser *parser)
801 return _gtk_css_number_value_parse (parser,
802 GTK_CSS_NUMBER_AS_PIXELS
803 | GTK_CSS_PARSE_LENGTH);
807 parse_padding (GtkCssStyleProperty *property,
808 GtkCssParser *parser)
810 return _gtk_css_number_value_parse (parser,
811 GTK_CSS_POSITIVE_ONLY
812 | GTK_CSS_NUMBER_AS_PIXELS
813 | GTK_CSS_PARSE_LENGTH);
817 parse_border_width (GtkCssStyleProperty *property,
818 GtkCssParser *parser)
820 return _gtk_css_number_value_parse (parser,
821 GTK_CSS_POSITIVE_ONLY
822 | GTK_CSS_NUMBER_AS_PIXELS
823 | GTK_CSS_PARSE_LENGTH);
827 background_repeat_value_parse_one (GtkCssParser *parser)
829 GtkCssValue *value = _gtk_css_background_repeat_value_try_parse (parser);
833 _gtk_css_parser_error (parser, "Not a valid value");
841 background_repeat_value_parse (GtkCssStyleProperty *property,
842 GtkCssParser *parser)
844 return _gtk_css_array_value_parse (parser, background_repeat_value_parse_one);
848 background_size_parse (GtkCssStyleProperty *property,
849 GtkCssParser *parser)
851 return _gtk_css_array_value_parse (parser, _gtk_css_bg_size_value_parse);
855 background_position_parse (GtkCssStyleProperty *property,
856 GtkCssParser *parser)
858 return _gtk_css_array_value_parse (parser, _gtk_css_position_value_parse);
861 /*** REGISTRATION ***/
864 _gtk_css_style_property_init_properties (void)
866 /* Initialize "color" and "font-size" first,
867 * so that when computing values later they are
868 * done first. That way, 'currentColor' and font
869 * sizes in em can be looked up properly */
870 gtk_css_style_property_register ("color",
871 GTK_CSS_PROPERTY_COLOR,
873 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
877 _gtk_css_color_value_new_rgba (1, 1, 1, 1));
878 gtk_css_style_property_register ("font-size",
879 GTK_CSS_PROPERTY_FONT_SIZE,
881 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_AFFECTS_FONT,
883 query_length_as_double,
884 assign_length_from_double,
885 _gtk_css_font_size_value_new (GTK_CSS_FONT_SIZE_MEDIUM));
887 /* properties that aren't referenced when computing values
889 gtk_css_style_property_register ("background-color",
890 GTK_CSS_PROPERTY_BACKGROUND_COLOR,
892 GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
896 _gtk_css_color_value_new_rgba (0, 0, 0, 0));
898 gtk_css_style_property_register ("font-family",
899 GTK_CSS_PROPERTY_FONT_FAMILY,
901 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_AFFECTS_FONT,
905 _gtk_css_array_value_new (_gtk_css_string_value_new ("Sans")));
906 gtk_css_style_property_register ("font-style",
907 GTK_CSS_PROPERTY_FONT_STYLE,
909 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_AFFECTS_FONT,
913 _gtk_css_font_style_value_new (PANGO_STYLE_NORMAL));
914 gtk_css_style_property_register ("font-variant",
915 GTK_CSS_PROPERTY_FONT_VARIANT,
917 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_AFFECTS_FONT,
920 assign_pango_variant,
921 _gtk_css_font_variant_value_new (PANGO_VARIANT_NORMAL));
922 gtk_css_style_property_register ("font-weight",
923 GTK_CSS_PROPERTY_FONT_WEIGHT,
925 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_AFFECTS_FONT,
929 _gtk_css_font_weight_value_new (PANGO_WEIGHT_NORMAL));
931 gtk_css_style_property_register ("text-shadow",
932 GTK_CSS_PROPERTY_TEXT_SHADOW,
934 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
938 _gtk_css_shadows_value_new_none ());
940 gtk_css_style_property_register ("icon-shadow",
941 GTK_CSS_PROPERTY_ICON_SHADOW,
943 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
947 _gtk_css_shadows_value_new_none ());
949 gtk_css_style_property_register ("box-shadow",
950 GTK_CSS_PROPERTY_BOX_SHADOW,
952 GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
956 _gtk_css_shadows_value_new_none ());
958 gtk_css_style_property_register ("margin-top",
959 GTK_CSS_PROPERTY_MARGIN_TOP,
961 GTK_STYLE_PROPERTY_ANIMATED,
964 assign_length_from_int,
965 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
966 gtk_css_style_property_register ("margin-left",
967 GTK_CSS_PROPERTY_MARGIN_LEFT,
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-bottom",
975 GTK_CSS_PROPERTY_MARGIN_BOTTOM,
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-right",
983 GTK_CSS_PROPERTY_MARGIN_RIGHT,
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 ("padding-top",
991 GTK_CSS_PROPERTY_PADDING_TOP,
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-left",
999 GTK_CSS_PROPERTY_PADDING_LEFT,
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-bottom",
1007 GTK_CSS_PROPERTY_PADDING_BOTTOM,
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-right",
1015 GTK_CSS_PROPERTY_PADDING_RIGHT,
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 /* IMPORTANT: the border-width properties must come after border-style properties,
1023 * they depend on them for their value computation.
1025 gtk_css_style_property_register ("border-top-style",
1026 GTK_CSS_PROPERTY_BORDER_TOP_STYLE,
1027 GTK_TYPE_BORDER_STYLE,
1028 GTK_STYLE_PROPERTY_NO_RESIZE,
1031 assign_border_style,
1032 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1033 gtk_css_style_property_register ("border-top-width",
1034 GTK_CSS_PROPERTY_BORDER_TOP_WIDTH,
1036 GTK_STYLE_PROPERTY_ANIMATED,
1038 query_length_as_int,
1039 assign_length_from_int,
1040 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1041 gtk_css_style_property_register ("border-left-style",
1042 GTK_CSS_PROPERTY_BORDER_LEFT_STYLE,
1043 GTK_TYPE_BORDER_STYLE,
1044 GTK_STYLE_PROPERTY_NO_RESIZE,
1047 assign_border_style,
1048 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1049 gtk_css_style_property_register ("border-left-width",
1050 GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH,
1052 GTK_STYLE_PROPERTY_ANIMATED,
1054 query_length_as_int,
1055 assign_length_from_int,
1056 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1057 gtk_css_style_property_register ("border-bottom-style",
1058 GTK_CSS_PROPERTY_BORDER_BOTTOM_STYLE,
1059 GTK_TYPE_BORDER_STYLE,
1060 GTK_STYLE_PROPERTY_NO_RESIZE,
1063 assign_border_style,
1064 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1065 gtk_css_style_property_register ("border-bottom-width",
1066 GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH,
1068 GTK_STYLE_PROPERTY_ANIMATED,
1070 query_length_as_int,
1071 assign_length_from_int,
1072 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1073 gtk_css_style_property_register ("border-right-style",
1074 GTK_CSS_PROPERTY_BORDER_RIGHT_STYLE,
1075 GTK_TYPE_BORDER_STYLE,
1076 GTK_STYLE_PROPERTY_NO_RESIZE,
1079 assign_border_style,
1080 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1081 gtk_css_style_property_register ("border-right-width",
1082 GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH,
1084 GTK_STYLE_PROPERTY_ANIMATED,
1086 query_length_as_int,
1087 assign_length_from_int,
1088 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1090 gtk_css_style_property_register ("border-top-left-radius",
1091 GTK_CSS_PROPERTY_BORDER_TOP_LEFT_RADIUS,
1093 GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
1094 border_corner_radius_value_parse,
1097 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1098 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1099 gtk_css_style_property_register ("border-top-right-radius",
1100 GTK_CSS_PROPERTY_BORDER_TOP_RIGHT_RADIUS,
1102 GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
1103 border_corner_radius_value_parse,
1106 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1107 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1108 gtk_css_style_property_register ("border-bottom-right-radius",
1109 GTK_CSS_PROPERTY_BORDER_BOTTOM_RIGHT_RADIUS,
1111 GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
1112 border_corner_radius_value_parse,
1115 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1116 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1117 gtk_css_style_property_register ("border-bottom-left-radius",
1118 GTK_CSS_PROPERTY_BORDER_BOTTOM_LEFT_RADIUS,
1120 GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
1121 border_corner_radius_value_parse,
1124 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1125 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1127 gtk_css_style_property_register ("outline-style",
1128 GTK_CSS_PROPERTY_OUTLINE_STYLE,
1129 GTK_TYPE_BORDER_STYLE,
1130 GTK_STYLE_PROPERTY_NO_RESIZE,
1133 assign_border_style,
1134 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1135 gtk_css_style_property_register ("outline-width",
1136 GTK_CSS_PROPERTY_OUTLINE_WIDTH,
1138 GTK_STYLE_PROPERTY_ANIMATED,
1140 query_length_as_int,
1141 assign_length_from_int,
1142 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1143 gtk_css_style_property_register ("outline-offset",
1144 GTK_CSS_PROPERTY_OUTLINE_OFFSET,
1146 GTK_STYLE_PROPERTY_NO_RESIZE,
1148 query_length_as_int,
1149 assign_length_from_int,
1150 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1152 gtk_css_style_property_register ("background-clip",
1153 GTK_CSS_PROPERTY_BACKGROUND_CLIP,
1155 GTK_STYLE_PROPERTY_NO_RESIZE,
1159 _gtk_css_array_value_new (_gtk_css_area_value_new (GTK_CSS_AREA_BORDER_BOX)));
1160 gtk_css_style_property_register ("background-origin",
1161 GTK_CSS_PROPERTY_BACKGROUND_ORIGIN,
1163 GTK_STYLE_PROPERTY_NO_RESIZE,
1167 _gtk_css_array_value_new (_gtk_css_area_value_new (GTK_CSS_AREA_PADDING_BOX)));
1168 gtk_css_style_property_register ("background-size",
1169 GTK_CSS_PROPERTY_BACKGROUND_SIZE,
1171 GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
1172 background_size_parse,
1175 _gtk_css_array_value_new (_gtk_css_bg_size_value_new (NULL, NULL)));
1176 gtk_css_style_property_register ("background-position",
1177 GTK_CSS_PROPERTY_BACKGROUND_POSITION,
1179 GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
1180 background_position_parse,
1183 _gtk_css_array_value_new (_gtk_css_position_value_new (_gtk_css_number_value_new (0, GTK_CSS_PERCENT),
1184 _gtk_css_number_value_new (0, GTK_CSS_PERCENT))));
1186 gtk_css_style_property_register ("border-top-color",
1187 GTK_CSS_PROPERTY_BORDER_TOP_COLOR,
1189 GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
1193 _gtk_css_color_value_new_current_color ());
1194 gtk_css_style_property_register ("border-right-color",
1195 GTK_CSS_PROPERTY_BORDER_RIGHT_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-bottom-color",
1203 GTK_CSS_PROPERTY_BORDER_BOTTOM_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-left-color",
1211 GTK_CSS_PROPERTY_BORDER_LEFT_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 ("outline-color",
1219 GTK_CSS_PROPERTY_OUTLINE_COLOR,
1221 GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
1225 _gtk_css_color_value_new_current_color ());
1227 gtk_css_style_property_register ("background-repeat",
1228 GTK_CSS_PROPERTY_BACKGROUND_REPEAT,
1230 GTK_STYLE_PROPERTY_NO_RESIZE,
1231 background_repeat_value_parse,
1234 _gtk_css_array_value_new (_gtk_css_background_repeat_value_new (GTK_CSS_REPEAT_STYLE_REPEAT,
1235 GTK_CSS_REPEAT_STYLE_REPEAT)));
1236 gtk_css_style_property_register ("background-image",
1237 GTK_CSS_PROPERTY_BACKGROUND_IMAGE,
1238 CAIRO_GOBJECT_TYPE_PATTERN,
1239 GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
1240 background_image_value_parse,
1241 background_image_value_query,
1242 background_image_value_assign,
1243 _gtk_css_array_value_new (_gtk_css_image_value_new (NULL)));
1245 gtk_css_style_property_register ("border-image-source",
1246 GTK_CSS_PROPERTY_BORDER_IMAGE_SOURCE,
1247 CAIRO_GOBJECT_TYPE_PATTERN,
1248 GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_NO_RESIZE,
1249 css_image_value_parse,
1250 css_image_value_query,
1251 css_image_value_assign,
1252 _gtk_css_image_value_new (NULL));
1253 gtk_css_style_property_register ("border-image-repeat",
1254 GTK_CSS_PROPERTY_BORDER_IMAGE_REPEAT,
1256 GTK_STYLE_PROPERTY_NO_RESIZE,
1257 border_image_repeat_parse,
1260 _gtk_css_border_repeat_value_new (GTK_CSS_REPEAT_STYLE_STRETCH,
1261 GTK_CSS_REPEAT_STYLE_STRETCH));
1263 gtk_css_style_property_register ("border-image-slice",
1264 GTK_CSS_PROPERTY_BORDER_IMAGE_SLICE,
1266 GTK_STYLE_PROPERTY_NO_RESIZE,
1267 border_image_slice_parse,
1270 _gtk_css_border_value_new (_gtk_css_number_value_new (100, GTK_CSS_PERCENT),
1271 _gtk_css_number_value_new (100, GTK_CSS_PERCENT),
1272 _gtk_css_number_value_new (100, GTK_CSS_PERCENT),
1273 _gtk_css_number_value_new (100, GTK_CSS_PERCENT)));
1274 gtk_css_style_property_register ("border-image-width",
1275 GTK_CSS_PROPERTY_BORDER_IMAGE_WIDTH,
1277 GTK_STYLE_PROPERTY_NO_RESIZE,
1278 border_image_width_parse,
1281 _gtk_css_border_value_new (_gtk_css_number_value_new (1, GTK_CSS_NUMBER),
1282 _gtk_css_number_value_new (1, GTK_CSS_NUMBER),
1283 _gtk_css_number_value_new (1, GTK_CSS_NUMBER),
1284 _gtk_css_number_value_new (1, GTK_CSS_NUMBER)));
1286 gtk_css_style_property_register ("transition-property",
1287 GTK_CSS_PROPERTY_TRANSITION_PROPERTY,
1289 GTK_STYLE_PROPERTY_NO_RESIZE,
1290 transition_property_parse,
1293 _gtk_css_array_value_new (_gtk_css_ident_value_new ("all")));
1294 gtk_css_style_property_register ("transition-duration",
1295 GTK_CSS_PROPERTY_TRANSITION_DURATION,
1297 GTK_STYLE_PROPERTY_NO_RESIZE,
1298 transition_time_parse,
1301 _gtk_css_array_value_new (_gtk_css_number_value_new (0, GTK_CSS_S)));
1302 gtk_css_style_property_register ("transition-timing-function",
1303 GTK_CSS_PROPERTY_TRANSITION_TIMING_FUNCTION,
1305 GTK_STYLE_PROPERTY_NO_RESIZE,
1306 transition_timing_function_parse,
1309 _gtk_css_array_value_new (
1310 _gtk_css_ease_value_new_cubic_bezier (0.25, 0.1, 0.25, 1.0)));
1311 gtk_css_style_property_register ("transition-delay",
1312 GTK_CSS_PROPERTY_TRANSITION_DELAY,
1314 GTK_STYLE_PROPERTY_NO_RESIZE,
1315 transition_time_parse,
1318 _gtk_css_array_value_new (_gtk_css_number_value_new (0, GTK_CSS_S)));
1320 gtk_css_style_property_register ("animation-name",
1321 GTK_CSS_PROPERTY_ANIMATION_NAME,
1323 GTK_STYLE_PROPERTY_NO_RESIZE,
1324 transition_property_parse,
1327 _gtk_css_array_value_new (_gtk_css_ident_value_new ("none")));
1328 gtk_css_style_property_register ("animation-duration",
1329 GTK_CSS_PROPERTY_ANIMATION_DURATION,
1331 GTK_STYLE_PROPERTY_NO_RESIZE,
1332 transition_time_parse,
1335 _gtk_css_array_value_new (_gtk_css_number_value_new (0, GTK_CSS_S)));
1336 gtk_css_style_property_register ("animation-timing-function",
1337 GTK_CSS_PROPERTY_ANIMATION_TIMING_FUNCTION,
1339 GTK_STYLE_PROPERTY_NO_RESIZE,
1340 transition_timing_function_parse,
1343 _gtk_css_array_value_new (
1344 _gtk_css_ease_value_new_cubic_bezier (0.25, 0.1, 0.25, 1.0)));
1345 gtk_css_style_property_register ("animation-iteration-count",
1346 GTK_CSS_PROPERTY_ANIMATION_ITERATION_COUNT,
1348 GTK_STYLE_PROPERTY_NO_RESIZE,
1349 iteration_count_parse,
1352 _gtk_css_array_value_new (_gtk_css_number_value_new (1, GTK_CSS_NUMBER)));
1353 gtk_css_style_property_register ("animation-direction",
1354 GTK_CSS_PROPERTY_ANIMATION_DIRECTION,
1356 GTK_STYLE_PROPERTY_NO_RESIZE,
1357 parse_css_direction,
1360 _gtk_css_array_value_new (_gtk_css_direction_value_new (GTK_CSS_DIRECTION_NORMAL)));
1361 gtk_css_style_property_register ("animation-play-state",
1362 GTK_CSS_PROPERTY_ANIMATION_PLAY_STATE,
1364 GTK_STYLE_PROPERTY_NO_RESIZE,
1365 parse_css_play_state,
1368 _gtk_css_array_value_new (_gtk_css_play_state_value_new (GTK_CSS_PLAY_STATE_RUNNING)));
1369 gtk_css_style_property_register ("animation-delay",
1370 GTK_CSS_PROPERTY_ANIMATION_DELAY,
1372 GTK_STYLE_PROPERTY_NO_RESIZE,
1373 transition_time_parse,
1376 _gtk_css_array_value_new (_gtk_css_number_value_new (0, GTK_CSS_S)));
1377 gtk_css_style_property_register ("animation-fill-mode",
1378 GTK_CSS_PROPERTY_ANIMATION_FILL_MODE,
1380 GTK_STYLE_PROPERTY_NO_RESIZE,
1381 parse_css_fill_mode,
1384 _gtk_css_array_value_new (_gtk_css_fill_mode_value_new (GTK_CSS_FILL_NONE)));
1386 gtk_css_style_property_register ("engine",
1387 GTK_CSS_PROPERTY_ENGINE,
1388 GTK_TYPE_THEMING_ENGINE,
1389 GTK_STYLE_PROPERTY_NO_RESIZE,
1393 _gtk_css_engine_value_new (gtk_theming_engine_load (NULL)));
1395 /* Private property holding the binding sets */
1396 gtk_css_style_property_register ("gtk-key-bindings",
1397 GTK_CSS_PROPERTY_GTK_KEY_BINDINGS,
1399 GTK_STYLE_PROPERTY_NO_RESIZE,
1400 bindings_value_parse,
1401 bindings_value_query,
1402 bindings_value_assign,
1403 _gtk_css_array_value_new (_gtk_css_string_value_new (NULL)));