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 "gtkcsscornervalueprivate.h"
46 #include "gtkcsseasevalueprivate.h"
47 #include "gtkcssenginevalueprivate.h"
48 #include "gtkcssimagegradientprivate.h"
49 #include "gtkcssimageprivate.h"
50 #include "gtkcssimagevalueprivate.h"
51 #include "gtkcssenumvalueprivate.h"
52 #include "gtkcssnumbervalueprivate.h"
53 #include "gtkcsspositionvalueprivate.h"
54 #include "gtkcssrepeatvalueprivate.h"
55 #include "gtkcssrgbavalueprivate.h"
56 #include "gtkcssshadowsvalueprivate.h"
57 #include "gtkcssstringvalueprivate.h"
58 #include "gtksymboliccolorprivate.h"
59 #include "gtkthemingengine.h"
60 #include "gtktypebuiltins.h"
61 #include "gtkwin32themeprivate.h"
63 /*** REGISTRATION ***/
66 GTK_STYLE_PROPERTY_INHERIT = (1 << 0),
67 GTK_STYLE_PROPERTY_ANIMATED = (1 << 1)
68 } GtkStylePropertyFlags;
71 gtk_css_style_property_register (const char * name,
74 GtkStylePropertyFlags flags,
75 GtkCssStylePropertyParseFunc parse_value,
76 GtkCssStylePropertyQueryFunc query_value,
77 GtkCssStylePropertyAssignFunc assign_value,
78 GtkCssValue * initial_value)
80 GtkCssStyleProperty *node;
82 g_assert (initial_value != NULL);
83 g_assert (parse_value != NULL);
84 g_assert (value_type == G_TYPE_NONE || query_value != NULL);
85 g_assert (value_type == G_TYPE_NONE || assign_value != NULL);
87 node = g_object_new (GTK_TYPE_CSS_STYLE_PROPERTY,
88 "value-type", value_type,
89 "animated", (flags & GTK_STYLE_PROPERTY_ANIMATED) ? TRUE : FALSE,
90 "inherit", (flags & GTK_STYLE_PROPERTY_INHERIT) ? TRUE : FALSE,
91 "initial-value", initial_value,
95 node->parse_value = parse_value;
96 node->query_value = query_value;
97 node->assign_value = assign_value;
99 _gtk_css_value_unref (initial_value);
101 g_assert (_gtk_css_style_property_get_id (node) == expected_id);
104 /*** IMPLEMENTATIONS ***/
107 query_length_as_int (GtkCssStyleProperty *property,
108 const GtkCssValue *css_value,
111 g_value_init (value, G_TYPE_INT);
112 g_value_set_int (value, round (_gtk_css_number_value_get (css_value, 100)));
116 assign_length_from_int (GtkCssStyleProperty *property,
119 return _gtk_css_number_value_new (g_value_get_int (value), GTK_CSS_PX);
123 query_length_as_double (GtkCssStyleProperty *property,
124 const GtkCssValue *css_value,
127 g_value_init (value, G_TYPE_DOUBLE);
128 g_value_set_double (value, _gtk_css_number_value_get (css_value, 100));
132 assign_length_from_double (GtkCssStyleProperty *property,
135 return _gtk_css_number_value_new (g_value_get_double (value), GTK_CSS_PX);
139 query_border (GtkCssStyleProperty *property,
140 const GtkCssValue *css_value,
145 g_value_init (value, GTK_TYPE_BORDER);
147 border.top = round (_gtk_css_number_value_get (_gtk_css_border_value_get_top (css_value), 100));
148 border.right = round (_gtk_css_number_value_get (_gtk_css_border_value_get_right (css_value), 100));
149 border.bottom = round (_gtk_css_number_value_get (_gtk_css_border_value_get_bottom (css_value), 100));
150 border.left = round (_gtk_css_number_value_get (_gtk_css_border_value_get_left (css_value), 100));
152 g_value_set_boxed (value, &border);
156 assign_border (GtkCssStyleProperty *property,
159 const GtkBorder *border = g_value_get_boxed (value);
162 return _gtk_css_value_ref (_gtk_css_style_property_get_initial_value (property));
164 return _gtk_css_border_value_new (_gtk_css_number_value_new (border->top, GTK_CSS_PX),
165 _gtk_css_number_value_new (border->right, GTK_CSS_PX),
166 _gtk_css_number_value_new (border->bottom, GTK_CSS_PX),
167 _gtk_css_number_value_new (border->left, GTK_CSS_PX));
171 color_parse (GtkCssStyleProperty *property,
172 GtkCssParser *parser)
174 return _gtk_css_symbolic_value_new (parser);
178 color_query (GtkCssStyleProperty *property,
179 const GtkCssValue *css_value,
182 g_value_init (value, GDK_TYPE_RGBA);
183 g_value_set_boxed (value, _gtk_css_rgba_value_get_rgba (css_value));
187 color_assign (GtkCssStyleProperty *property,
190 return _gtk_css_rgba_value_new_from_rgba (g_value_get_boxed (value));
194 font_family_parse_one (GtkCssParser *parser)
198 name = _gtk_css_parser_try_ident (parser, TRUE);
201 GString *string = g_string_new (name);
203 while ((name = _gtk_css_parser_try_ident (parser, TRUE)))
205 g_string_append_c (string, ' ');
206 g_string_append (string, name);
209 name = g_string_free (string, FALSE);
213 name = _gtk_css_parser_read_string (parser);
218 return _gtk_css_string_value_new_take (name);
222 font_family_parse (GtkCssStyleProperty *property,
223 GtkCssParser *parser)
225 return _gtk_css_array_value_parse (parser, font_family_parse_one);
229 font_family_query (GtkCssStyleProperty *property,
230 const GtkCssValue *css_value,
236 array = g_ptr_array_new ();
238 for (i = 0; i < _gtk_css_array_value_get_n_values (css_value); i++)
240 g_ptr_array_add (array, g_strdup (_gtk_css_string_value_get (_gtk_css_array_value_get_nth (css_value, i))));
244 g_ptr_array_add (array, NULL);
246 g_value_init (value, G_TYPE_STRV);
247 g_value_set_boxed (value, g_ptr_array_free (array, FALSE));
251 font_family_assign (GtkCssStyleProperty *property,
254 const char **names = g_value_get_boxed (value);
258 array = g_ptr_array_new ();
260 for (names = g_value_get_boxed (value); *names; names++)
262 g_ptr_array_add (array, _gtk_css_string_value_new (*names));
265 result = _gtk_css_array_value_new_from_array ((GtkCssValue **) array->pdata, array->len);
266 g_ptr_array_free (array, TRUE);
271 parse_pango_style (GtkCssStyleProperty *property,
272 GtkCssParser *parser)
274 GtkCssValue *value = _gtk_css_font_style_value_try_parse (parser);
277 _gtk_css_parser_error (parser, "unknown value for property");
283 query_pango_style (GtkCssStyleProperty *property,
284 const GtkCssValue *css_value,
287 g_value_init (value, PANGO_TYPE_STYLE);
288 g_value_set_enum (value, _gtk_css_font_style_value_get (css_value));
292 assign_pango_style (GtkCssStyleProperty *property,
295 return _gtk_css_font_style_value_new (g_value_get_enum (value));
299 parse_pango_weight (GtkCssStyleProperty *property,
300 GtkCssParser *parser)
302 GtkCssValue *value = _gtk_css_font_weight_value_try_parse (parser);
305 _gtk_css_parser_error (parser, "unknown value for property");
311 query_pango_weight (GtkCssStyleProperty *property,
312 const GtkCssValue *css_value,
315 g_value_init (value, PANGO_TYPE_WEIGHT);
316 g_value_set_enum (value, _gtk_css_font_weight_value_get (css_value));
320 assign_pango_weight (GtkCssStyleProperty *property,
323 return _gtk_css_font_weight_value_new (g_value_get_enum (value));
327 parse_pango_variant (GtkCssStyleProperty *property,
328 GtkCssParser *parser)
330 GtkCssValue *value = _gtk_css_font_variant_value_try_parse (parser);
333 _gtk_css_parser_error (parser, "unknown value for property");
339 query_pango_variant (GtkCssStyleProperty *property,
340 const GtkCssValue *css_value,
343 g_value_init (value, PANGO_TYPE_VARIANT);
344 g_value_set_enum (value, _gtk_css_font_variant_value_get (css_value));
348 assign_pango_variant (GtkCssStyleProperty *property,
351 return _gtk_css_font_variant_value_new (g_value_get_enum (value));
355 parse_border_style (GtkCssStyleProperty *property,
356 GtkCssParser *parser)
358 GtkCssValue *value = _gtk_css_border_style_value_try_parse (parser);
361 _gtk_css_parser_error (parser, "unknown value for property");
367 query_border_style (GtkCssStyleProperty *property,
368 const GtkCssValue *css_value,
371 g_value_init (value, GTK_TYPE_BORDER_STYLE);
372 g_value_set_enum (value, _gtk_css_border_style_value_get (css_value));
376 assign_border_style (GtkCssStyleProperty *property,
379 return _gtk_css_border_style_value_new (g_value_get_enum (value));
383 parse_css_area_one (GtkCssParser *parser)
385 GtkCssValue *value = _gtk_css_area_value_try_parse (parser);
388 _gtk_css_parser_error (parser, "unknown value for property");
394 parse_css_area (GtkCssStyleProperty *property,
395 GtkCssParser *parser)
397 return _gtk_css_array_value_parse (parser, parse_css_area_one);
401 bindings_value_parse_one (GtkCssParser *parser)
405 name = _gtk_css_parser_try_ident (parser, TRUE);
408 _gtk_css_parser_error (parser, "Not a valid binding name");
412 if (g_ascii_strcasecmp (name, "none"))
416 else if (!gtk_binding_set_find (name))
418 _gtk_css_parser_error (parser, "No binding set named '%s'", name);
423 return _gtk_css_string_value_new_take (name);
427 bindings_value_parse (GtkCssStyleProperty *property,
428 GtkCssParser *parser)
430 return _gtk_css_array_value_parse (parser, bindings_value_parse_one);
434 bindings_value_query (GtkCssStyleProperty *property,
435 const GtkCssValue *css_value,
441 g_value_init (value, G_TYPE_PTR_ARRAY);
443 if (_gtk_css_array_value_get_n_values (css_value) == 0)
448 for (i = 0; i < _gtk_css_array_value_get_n_values (css_value); i++)
451 GtkBindingSet *binding_set;
453 name = _gtk_css_string_value_get (_gtk_css_array_value_get_nth (css_value, i));
457 binding_set = gtk_binding_set_find (name);
458 if (binding_set == NULL)
462 array = g_ptr_array_new ();
463 g_ptr_array_add (array, binding_set);
466 g_value_take_boxed (value, array);
470 bindings_value_assign (GtkCssStyleProperty *property,
473 GPtrArray *binding_sets = g_value_get_boxed (value);
474 GtkCssValue **values, *result;
477 if (binding_sets == NULL || binding_sets->len == 0)
478 return _gtk_css_array_value_new (_gtk_css_string_value_new (NULL));
480 values = g_new (GtkCssValue *, binding_sets->len);
482 for (i = 0; i < binding_sets->len; i++)
484 GtkBindingSet *binding_set = g_ptr_array_index (binding_sets, i);
485 values[i] = _gtk_css_string_value_new (binding_set->set_name);
488 result = _gtk_css_array_value_new_from_array (values, binding_sets->len);
494 shadow_value_parse (GtkCssStyleProperty *property,
495 GtkCssParser *parser)
497 return _gtk_css_shadows_value_parse (parser);
501 border_corner_radius_value_parse (GtkCssStyleProperty *property,
502 GtkCssParser *parser)
504 return _gtk_css_corner_value_parse (parser);
508 css_image_value_parse (GtkCssStyleProperty *property,
509 GtkCssParser *parser)
513 if (_gtk_css_parser_try (parser, "none", TRUE))
517 image = _gtk_css_image_new_parse (parser);
522 return _gtk_css_image_value_new (image);
526 css_image_value_query (GtkCssStyleProperty *property,
527 const GtkCssValue *css_value,
530 GtkCssImage *image = _gtk_css_image_value_get_image (css_value);
531 cairo_pattern_t *pattern;
532 cairo_surface_t *surface;
533 cairo_matrix_t matrix;
535 g_value_init (value, CAIRO_GOBJECT_TYPE_PATTERN);
537 if (GTK_IS_CSS_IMAGE_GRADIENT (image))
538 g_value_set_boxed (value, GTK_CSS_IMAGE_GRADIENT (image)->pattern);
539 else if (image != NULL)
541 double width, height;
543 /* the 100, 100 is rather random */
544 _gtk_css_image_get_concrete_size (image, 0, 0, 100, 100, &width, &height);
545 surface = _gtk_css_image_get_surface (image, NULL, width, height);
546 pattern = cairo_pattern_create_for_surface (surface);
547 cairo_matrix_init_scale (&matrix, width, height);
548 cairo_pattern_set_matrix (pattern, &matrix);
549 cairo_surface_destroy (surface);
550 g_value_take_boxed (value, pattern);
555 css_image_value_assign (GtkCssStyleProperty *property,
558 g_warning ("FIXME: assigning images is not implemented");
559 return _gtk_css_image_value_new (NULL);
563 background_image_value_parse_one (GtkCssParser *parser)
565 return css_image_value_parse (NULL, parser);
569 background_image_value_parse (GtkCssStyleProperty *property,
570 GtkCssParser *parser)
572 return _gtk_css_array_value_parse (parser, background_image_value_parse_one);
576 background_image_value_query (GtkCssStyleProperty *property,
577 const GtkCssValue *css_value,
580 css_image_value_query (property, _gtk_css_array_value_get_nth (css_value, 0), value);
584 background_image_value_assign (GtkCssStyleProperty *property,
587 return _gtk_css_array_value_new (css_image_value_assign (property, value));
591 font_size_parse (GtkCssStyleProperty *property,
592 GtkCssParser *parser)
596 if (!_gtk_css_parser_try_double (parser, &d))
598 _gtk_css_parser_error (parser, "Expected a number");
602 return _gtk_css_number_value_new (d, GTK_CSS_PX);
606 outline_parse (GtkCssStyleProperty *property,
607 GtkCssParser *parser)
609 return _gtk_css_number_value_parse (parser,
610 GTK_CSS_NUMBER_AS_PIXELS
611 | GTK_CSS_PARSE_LENGTH);
615 border_image_repeat_parse (GtkCssStyleProperty *property,
616 GtkCssParser *parser)
618 GtkCssValue *value = _gtk_css_border_repeat_value_try_parse (parser);
622 _gtk_css_parser_error (parser, "Not a valid value");
630 border_image_slice_parse (GtkCssStyleProperty *property,
631 GtkCssParser *parser)
633 return _gtk_css_border_value_parse (parser,
634 GTK_CSS_PARSE_PERCENT
635 | GTK_CSS_PARSE_NUMBER
636 | GTK_CSS_POSITIVE_ONLY,
642 border_image_width_parse (GtkCssStyleProperty *property,
643 GtkCssParser *parser)
645 return _gtk_css_border_value_parse (parser,
646 GTK_CSS_PARSE_PERCENT
647 | GTK_CSS_PARSE_LENGTH
648 | GTK_CSS_PARSE_NUMBER
649 | GTK_CSS_POSITIVE_ONLY,
655 transition_property_parse_one (GtkCssParser *parser)
659 value = _gtk_css_ident_value_try_parse (parser);
663 _gtk_css_parser_error (parser, "Expected an identifier");
671 transition_property_parse (GtkCssStyleProperty *property,
672 GtkCssParser *parser)
674 return _gtk_css_array_value_parse (parser, transition_property_parse_one);
678 transition_time_parse_one (GtkCssParser *parser)
680 return _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_TIME);
684 transition_time_parse (GtkCssStyleProperty *property,
685 GtkCssParser *parser)
687 return _gtk_css_array_value_parse (parser, transition_time_parse_one);
691 transition_timing_function_parse (GtkCssStyleProperty *property,
692 GtkCssParser *parser)
694 return _gtk_css_array_value_parse (parser, _gtk_css_ease_value_parse);
698 engine_parse (GtkCssStyleProperty *property,
699 GtkCssParser *parser)
701 return _gtk_css_engine_value_parse (parser);
705 engine_query (GtkCssStyleProperty *property,
706 const GtkCssValue *css_value,
709 g_value_init (value, GTK_TYPE_THEMING_ENGINE);
710 g_value_set_object (value, _gtk_css_engine_value_get_engine (css_value));
714 engine_assign (GtkCssStyleProperty *property,
717 return _gtk_css_engine_value_new (g_value_get_object (value));
721 parse_margin (GtkCssStyleProperty *property,
722 GtkCssParser *parser)
724 return _gtk_css_number_value_parse (parser,
725 GTK_CSS_NUMBER_AS_PIXELS
726 | GTK_CSS_PARSE_LENGTH);
730 parse_padding (GtkCssStyleProperty *property,
731 GtkCssParser *parser)
733 return _gtk_css_number_value_parse (parser,
734 GTK_CSS_POSITIVE_ONLY
735 | GTK_CSS_NUMBER_AS_PIXELS
736 | GTK_CSS_PARSE_LENGTH);
740 parse_border_width (GtkCssStyleProperty *property,
741 GtkCssParser *parser)
743 return _gtk_css_number_value_parse (parser,
744 GTK_CSS_POSITIVE_ONLY
745 | GTK_CSS_NUMBER_AS_PIXELS
746 | GTK_CSS_PARSE_LENGTH);
750 background_repeat_value_parse_one (GtkCssParser *parser)
752 GtkCssValue *value = _gtk_css_background_repeat_value_try_parse (parser);
756 _gtk_css_parser_error (parser, "Not a valid value");
764 background_repeat_value_parse (GtkCssStyleProperty *property,
765 GtkCssParser *parser)
767 return _gtk_css_array_value_parse (parser, background_repeat_value_parse_one);
771 background_size_parse (GtkCssStyleProperty *property,
772 GtkCssParser *parser)
774 return _gtk_css_array_value_parse (parser, _gtk_css_bg_size_value_parse);
778 background_position_parse (GtkCssStyleProperty *property,
779 GtkCssParser *parser)
781 return _gtk_css_array_value_parse (parser, _gtk_css_position_value_parse);
784 /*** REGISTRATION ***/
786 static GtkSymbolicColor *
787 gtk_symbolic_color_new_rgba (double red,
792 GdkRGBA rgba = { red, green, blue, alpha };
794 return gtk_symbolic_color_new_literal (&rgba);
798 _gtk_css_style_property_init_properties (void)
800 /* Initialize "color" and "font-size" first,
801 * so that when computing values later they are
802 * done first. That way, 'currentColor' and font
803 * sizes in em can be looked up properly */
804 gtk_css_style_property_register ("color",
805 GTK_CSS_PROPERTY_COLOR,
807 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
811 _gtk_css_symbolic_value_new_take_symbolic_color (
812 gtk_symbolic_color_new_rgba (1, 1, 1, 1)));
813 gtk_css_style_property_register ("font-size",
814 GTK_CSS_PROPERTY_FONT_SIZE,
816 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
818 query_length_as_double,
819 assign_length_from_double,
820 /* XXX: This should be 'normal' */
821 _gtk_css_number_value_new (10.0, GTK_CSS_PX));
823 /* properties that aren't referenced when computing values
825 gtk_css_style_property_register ("background-color",
826 GTK_CSS_PROPERTY_BACKGROUND_COLOR,
828 GTK_STYLE_PROPERTY_ANIMATED,
832 _gtk_css_symbolic_value_new_take_symbolic_color (
833 gtk_symbolic_color_new_rgba (0, 0, 0, 0)));
835 gtk_css_style_property_register ("font-family",
836 GTK_CSS_PROPERTY_FONT_FAMILY,
838 GTK_STYLE_PROPERTY_INHERIT,
842 _gtk_css_array_value_new (_gtk_css_string_value_new ("Sans")));
843 gtk_css_style_property_register ("font-style",
844 GTK_CSS_PROPERTY_FONT_STYLE,
846 GTK_STYLE_PROPERTY_INHERIT,
850 _gtk_css_font_style_value_new (PANGO_STYLE_NORMAL));
851 gtk_css_style_property_register ("font-variant",
852 GTK_CSS_PROPERTY_FONT_VARIANT,
854 GTK_STYLE_PROPERTY_INHERIT,
857 assign_pango_variant,
858 _gtk_css_font_variant_value_new (PANGO_VARIANT_NORMAL));
859 gtk_css_style_property_register ("font-weight",
860 GTK_CSS_PROPERTY_FONT_WEIGHT,
862 GTK_STYLE_PROPERTY_INHERIT,
866 _gtk_css_font_weight_value_new (PANGO_WEIGHT_NORMAL));
868 gtk_css_style_property_register ("text-shadow",
869 GTK_CSS_PROPERTY_TEXT_SHADOW,
871 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
875 _gtk_css_shadows_value_new_none ());
877 gtk_css_style_property_register ("icon-shadow",
878 GTK_CSS_PROPERTY_ICON_SHADOW,
880 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
884 _gtk_css_shadows_value_new_none ());
886 gtk_css_style_property_register ("box-shadow",
887 GTK_CSS_PROPERTY_BOX_SHADOW,
889 GTK_STYLE_PROPERTY_ANIMATED,
893 _gtk_css_shadows_value_new_none ());
895 gtk_css_style_property_register ("margin-top",
896 GTK_CSS_PROPERTY_MARGIN_TOP,
898 GTK_STYLE_PROPERTY_ANIMATED,
901 assign_length_from_int,
902 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
903 gtk_css_style_property_register ("margin-left",
904 GTK_CSS_PROPERTY_MARGIN_LEFT,
906 GTK_STYLE_PROPERTY_ANIMATED,
909 assign_length_from_int,
910 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
911 gtk_css_style_property_register ("margin-bottom",
912 GTK_CSS_PROPERTY_MARGIN_BOTTOM,
914 GTK_STYLE_PROPERTY_ANIMATED,
917 assign_length_from_int,
918 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
919 gtk_css_style_property_register ("margin-right",
920 GTK_CSS_PROPERTY_MARGIN_RIGHT,
922 GTK_STYLE_PROPERTY_ANIMATED,
925 assign_length_from_int,
926 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
927 gtk_css_style_property_register ("padding-top",
928 GTK_CSS_PROPERTY_PADDING_TOP,
930 GTK_STYLE_PROPERTY_ANIMATED,
933 assign_length_from_int,
934 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
935 gtk_css_style_property_register ("padding-left",
936 GTK_CSS_PROPERTY_PADDING_LEFT,
938 GTK_STYLE_PROPERTY_ANIMATED,
941 assign_length_from_int,
942 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
943 gtk_css_style_property_register ("padding-bottom",
944 GTK_CSS_PROPERTY_PADDING_BOTTOM,
946 GTK_STYLE_PROPERTY_ANIMATED,
949 assign_length_from_int,
950 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
951 gtk_css_style_property_register ("padding-right",
952 GTK_CSS_PROPERTY_PADDING_RIGHT,
954 GTK_STYLE_PROPERTY_ANIMATED,
957 assign_length_from_int,
958 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
959 /* IMPORTANT: the border-width properties must come after border-style properties,
960 * they depend on them for their value computation.
962 gtk_css_style_property_register ("border-top-style",
963 GTK_CSS_PROPERTY_BORDER_TOP_STYLE,
964 GTK_TYPE_BORDER_STYLE,
969 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
970 gtk_css_style_property_register ("border-top-width",
971 GTK_CSS_PROPERTY_BORDER_TOP_WIDTH,
973 GTK_STYLE_PROPERTY_ANIMATED,
976 assign_length_from_int,
977 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
978 gtk_css_style_property_register ("border-left-style",
979 GTK_CSS_PROPERTY_BORDER_LEFT_STYLE,
980 GTK_TYPE_BORDER_STYLE,
985 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
986 gtk_css_style_property_register ("border-left-width",
987 GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH,
989 GTK_STYLE_PROPERTY_ANIMATED,
992 assign_length_from_int,
993 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
994 gtk_css_style_property_register ("border-bottom-style",
995 GTK_CSS_PROPERTY_BORDER_BOTTOM_STYLE,
996 GTK_TYPE_BORDER_STYLE,
1000 assign_border_style,
1001 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1002 gtk_css_style_property_register ("border-bottom-width",
1003 GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH,
1005 GTK_STYLE_PROPERTY_ANIMATED,
1007 query_length_as_int,
1008 assign_length_from_int,
1009 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1010 gtk_css_style_property_register ("border-right-style",
1011 GTK_CSS_PROPERTY_BORDER_RIGHT_STYLE,
1012 GTK_TYPE_BORDER_STYLE,
1016 assign_border_style,
1017 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1018 gtk_css_style_property_register ("border-right-width",
1019 GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH,
1021 GTK_STYLE_PROPERTY_ANIMATED,
1023 query_length_as_int,
1024 assign_length_from_int,
1025 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1027 gtk_css_style_property_register ("border-top-left-radius",
1028 GTK_CSS_PROPERTY_BORDER_TOP_LEFT_RADIUS,
1030 GTK_STYLE_PROPERTY_ANIMATED,
1031 border_corner_radius_value_parse,
1034 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1035 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1036 gtk_css_style_property_register ("border-top-right-radius",
1037 GTK_CSS_PROPERTY_BORDER_TOP_RIGHT_RADIUS,
1039 GTK_STYLE_PROPERTY_ANIMATED,
1040 border_corner_radius_value_parse,
1043 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1044 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1045 gtk_css_style_property_register ("border-bottom-right-radius",
1046 GTK_CSS_PROPERTY_BORDER_BOTTOM_RIGHT_RADIUS,
1048 GTK_STYLE_PROPERTY_ANIMATED,
1049 border_corner_radius_value_parse,
1052 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1053 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1054 gtk_css_style_property_register ("border-bottom-left-radius",
1055 GTK_CSS_PROPERTY_BORDER_BOTTOM_LEFT_RADIUS,
1057 GTK_STYLE_PROPERTY_ANIMATED,
1058 border_corner_radius_value_parse,
1061 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1062 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1064 gtk_css_style_property_register ("outline-style",
1065 GTK_CSS_PROPERTY_OUTLINE_STYLE,
1066 GTK_TYPE_BORDER_STYLE,
1070 assign_border_style,
1071 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1072 gtk_css_style_property_register ("outline-width",
1073 GTK_CSS_PROPERTY_OUTLINE_WIDTH,
1075 GTK_STYLE_PROPERTY_ANIMATED,
1077 query_length_as_int,
1078 assign_length_from_int,
1079 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1080 gtk_css_style_property_register ("outline-offset",
1081 GTK_CSS_PROPERTY_OUTLINE_OFFSET,
1085 query_length_as_int,
1086 assign_length_from_int,
1087 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1089 gtk_css_style_property_register ("background-clip",
1090 GTK_CSS_PROPERTY_BACKGROUND_CLIP,
1096 _gtk_css_array_value_new (_gtk_css_area_value_new (GTK_CSS_AREA_BORDER_BOX)));
1097 gtk_css_style_property_register ("background-origin",
1098 GTK_CSS_PROPERTY_BACKGROUND_ORIGIN,
1104 _gtk_css_array_value_new (_gtk_css_area_value_new (GTK_CSS_AREA_PADDING_BOX)));
1105 gtk_css_style_property_register ("background-size",
1106 GTK_CSS_PROPERTY_BACKGROUND_SIZE,
1109 background_size_parse,
1112 _gtk_css_array_value_new (_gtk_css_bg_size_value_new (NULL, NULL)));
1113 gtk_css_style_property_register ("background-position",
1114 GTK_CSS_PROPERTY_BACKGROUND_POSITION,
1116 GTK_STYLE_PROPERTY_ANIMATED,
1117 background_position_parse,
1120 _gtk_css_array_value_new (_gtk_css_position_value_new (_gtk_css_number_value_new (0, GTK_CSS_PERCENT),
1121 _gtk_css_number_value_new (0, GTK_CSS_PERCENT))));
1123 gtk_css_style_property_register ("border-top-color",
1124 GTK_CSS_PROPERTY_BORDER_TOP_COLOR,
1126 GTK_STYLE_PROPERTY_ANIMATED,
1130 _gtk_css_symbolic_value_new_take_symbolic_color (
1131 gtk_symbolic_color_ref (
1132 _gtk_symbolic_color_get_current_color ())));
1133 gtk_css_style_property_register ("border-right-color",
1134 GTK_CSS_PROPERTY_BORDER_RIGHT_COLOR,
1136 GTK_STYLE_PROPERTY_ANIMATED,
1140 _gtk_css_symbolic_value_new_take_symbolic_color (
1141 gtk_symbolic_color_ref (
1142 _gtk_symbolic_color_get_current_color ())));
1143 gtk_css_style_property_register ("border-bottom-color",
1144 GTK_CSS_PROPERTY_BORDER_BOTTOM_COLOR,
1146 GTK_STYLE_PROPERTY_ANIMATED,
1150 _gtk_css_symbolic_value_new_take_symbolic_color (
1151 gtk_symbolic_color_ref (
1152 _gtk_symbolic_color_get_current_color ())));
1153 gtk_css_style_property_register ("border-left-color",
1154 GTK_CSS_PROPERTY_BORDER_LEFT_COLOR,
1156 GTK_STYLE_PROPERTY_ANIMATED,
1160 _gtk_css_symbolic_value_new_take_symbolic_color (
1161 gtk_symbolic_color_ref (
1162 _gtk_symbolic_color_get_current_color ())));
1163 gtk_css_style_property_register ("outline-color",
1164 GTK_CSS_PROPERTY_OUTLINE_COLOR,
1166 GTK_STYLE_PROPERTY_ANIMATED,
1170 _gtk_css_symbolic_value_new_take_symbolic_color (
1171 gtk_symbolic_color_ref (
1172 _gtk_symbolic_color_get_current_color ())));
1174 gtk_css_style_property_register ("background-repeat",
1175 GTK_CSS_PROPERTY_BACKGROUND_REPEAT,
1178 background_repeat_value_parse,
1181 _gtk_css_array_value_new (_gtk_css_background_repeat_value_new (GTK_CSS_REPEAT_STYLE_REPEAT,
1182 GTK_CSS_REPEAT_STYLE_REPEAT)));
1183 gtk_css_style_property_register ("background-image",
1184 GTK_CSS_PROPERTY_BACKGROUND_IMAGE,
1185 CAIRO_GOBJECT_TYPE_PATTERN,
1186 GTK_STYLE_PROPERTY_ANIMATED,
1187 background_image_value_parse,
1188 background_image_value_query,
1189 background_image_value_assign,
1190 _gtk_css_array_value_new (_gtk_css_image_value_new (NULL)));
1192 gtk_css_style_property_register ("border-image-source",
1193 GTK_CSS_PROPERTY_BORDER_IMAGE_SOURCE,
1194 CAIRO_GOBJECT_TYPE_PATTERN,
1195 GTK_STYLE_PROPERTY_ANIMATED,
1196 css_image_value_parse,
1197 css_image_value_query,
1198 css_image_value_assign,
1199 _gtk_css_image_value_new (NULL));
1200 gtk_css_style_property_register ("border-image-repeat",
1201 GTK_CSS_PROPERTY_BORDER_IMAGE_REPEAT,
1204 border_image_repeat_parse,
1207 _gtk_css_border_repeat_value_new (GTK_CSS_REPEAT_STYLE_STRETCH,
1208 GTK_CSS_REPEAT_STYLE_STRETCH));
1210 gtk_css_style_property_register ("border-image-slice",
1211 GTK_CSS_PROPERTY_BORDER_IMAGE_SLICE,
1214 border_image_slice_parse,
1217 _gtk_css_border_value_new (_gtk_css_number_value_new (100, GTK_CSS_PERCENT),
1218 _gtk_css_number_value_new (100, GTK_CSS_PERCENT),
1219 _gtk_css_number_value_new (100, GTK_CSS_PERCENT),
1220 _gtk_css_number_value_new (100, GTK_CSS_PERCENT)));
1221 gtk_css_style_property_register ("border-image-width",
1222 GTK_CSS_PROPERTY_BORDER_IMAGE_WIDTH,
1225 border_image_width_parse,
1228 _gtk_css_border_value_new (_gtk_css_number_value_new (1, GTK_CSS_NUMBER),
1229 _gtk_css_number_value_new (1, GTK_CSS_NUMBER),
1230 _gtk_css_number_value_new (1, GTK_CSS_NUMBER),
1231 _gtk_css_number_value_new (1, GTK_CSS_NUMBER)));
1233 gtk_css_style_property_register ("transition-property",
1234 GTK_CSS_PROPERTY_TRANSITION_PROPERTY,
1237 transition_property_parse,
1240 _gtk_css_array_value_new (_gtk_css_ident_value_new ("all")));
1241 gtk_css_style_property_register ("transition-duration",
1242 GTK_CSS_PROPERTY_TRANSITION_DURATION,
1245 transition_time_parse,
1248 _gtk_css_array_value_new (_gtk_css_number_value_new (0, GTK_CSS_S)));
1249 gtk_css_style_property_register ("transition-timing-function",
1250 GTK_CSS_PROPERTY_TRANSITION_TIMING_FUNCTION,
1253 transition_timing_function_parse,
1256 _gtk_css_array_value_new (
1257 _gtk_css_ease_value_new_cubic_bezier (0.25, 0.1, 0.25, 1.0)));
1258 gtk_css_style_property_register ("transition-delay",
1259 GTK_CSS_PROPERTY_TRANSITION_DELAY,
1262 transition_time_parse,
1265 _gtk_css_array_value_new (_gtk_css_number_value_new (0, GTK_CSS_S)));
1267 gtk_css_style_property_register ("engine",
1268 GTK_CSS_PROPERTY_ENGINE,
1269 GTK_TYPE_THEMING_ENGINE,
1274 _gtk_css_engine_value_new (gtk_theming_engine_load (NULL)));
1276 /* Private property holding the binding sets */
1277 gtk_css_style_property_register ("gtk-key-bindings",
1278 GTK_CSS_PROPERTY_GTK_KEY_BINDINGS,
1281 bindings_value_parse,
1282 bindings_value_query,
1283 bindings_value_assign,
1284 _gtk_css_array_value_new (_gtk_css_string_value_new (NULL)));