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, FALSE);
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, FALSE);
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");
413 if (!gtk_binding_set_find (name))
415 _gtk_css_parser_error (parser, "No binding set named '%s'", name);
420 return _gtk_css_string_value_new_take (name);
424 bindings_value_parse (GtkCssStyleProperty *property,
425 GtkCssParser *parser)
427 return _gtk_css_array_value_parse (parser, bindings_value_parse_one, TRUE);
431 bindings_value_query (GtkCssStyleProperty *property,
432 const GtkCssValue *css_value,
438 g_value_init (value, G_TYPE_PTR_ARRAY);
440 if (_gtk_css_array_value_get_n_values (css_value) == 0)
443 array = g_ptr_array_new ();
445 for (i = 0; i < _gtk_css_array_value_get_n_values (css_value); i++)
447 GtkBindingSet *binding_set = gtk_binding_set_find (_gtk_css_string_value_get (_gtk_css_array_value_get_nth (css_value, i)));
449 g_ptr_array_add (array, binding_set);
452 g_value_take_boxed (value, array);
456 bindings_value_assign (GtkCssStyleProperty *property,
459 GPtrArray *binding_sets = g_value_get_boxed (value);
460 GtkCssValue **values, *result;
463 if (binding_sets == NULL || binding_sets->len == 0)
464 return _gtk_css_array_value_new (NULL);
466 values = g_new (GtkCssValue *, binding_sets->len);
468 for (i = 0; i < binding_sets->len; i++)
470 GtkBindingSet *binding_set = g_ptr_array_index (binding_sets, i);
471 values[i] = _gtk_css_string_value_new (binding_set->set_name);
474 result = _gtk_css_array_value_new_from_array (values, binding_sets->len);
480 shadow_value_parse (GtkCssStyleProperty *property,
481 GtkCssParser *parser)
483 return _gtk_css_shadows_value_parse (parser);
487 border_corner_radius_value_parse (GtkCssStyleProperty *property,
488 GtkCssParser *parser)
490 return _gtk_css_corner_value_parse (parser);
494 css_image_value_parse (GtkCssStyleProperty *property,
495 GtkCssParser *parser)
499 if (_gtk_css_parser_try (parser, "none", TRUE))
503 image = _gtk_css_image_new_parse (parser);
508 return _gtk_css_image_value_new (image);
512 css_image_value_query (GtkCssStyleProperty *property,
513 const GtkCssValue *css_value,
516 GtkCssImage *image = _gtk_css_image_value_get_image (css_value);
517 cairo_pattern_t *pattern;
518 cairo_surface_t *surface;
519 cairo_matrix_t matrix;
521 g_value_init (value, CAIRO_GOBJECT_TYPE_PATTERN);
523 if (GTK_IS_CSS_IMAGE_GRADIENT (image))
524 g_value_set_boxed (value, GTK_CSS_IMAGE_GRADIENT (image)->pattern);
525 else if (image != NULL)
527 double width, height;
529 /* the 100, 100 is rather random */
530 _gtk_css_image_get_concrete_size (image, 0, 0, 100, 100, &width, &height);
531 surface = _gtk_css_image_get_surface (image, NULL, width, height);
532 pattern = cairo_pattern_create_for_surface (surface);
533 cairo_matrix_init_scale (&matrix, width, height);
534 cairo_pattern_set_matrix (pattern, &matrix);
535 cairo_surface_destroy (surface);
536 g_value_take_boxed (value, pattern);
541 css_image_value_assign (GtkCssStyleProperty *property,
544 g_warning ("FIXME: assigning images is not implemented");
545 return _gtk_css_image_value_new (NULL);
549 background_image_value_parse_one (GtkCssParser *parser)
551 return css_image_value_parse (NULL, parser);
555 background_image_value_parse (GtkCssStyleProperty *property,
556 GtkCssParser *parser)
558 return _gtk_css_array_value_parse (parser, background_image_value_parse_one, FALSE);
562 background_image_value_query (GtkCssStyleProperty *property,
563 const GtkCssValue *css_value,
566 css_image_value_query (property, _gtk_css_array_value_get_nth (css_value, 0), value);
570 background_image_value_assign (GtkCssStyleProperty *property,
573 return _gtk_css_array_value_new (css_image_value_assign (property, value));
577 font_size_parse (GtkCssStyleProperty *property,
578 GtkCssParser *parser)
582 if (!_gtk_css_parser_try_double (parser, &d))
584 _gtk_css_parser_error (parser, "Expected a number");
588 return _gtk_css_number_value_new (d, GTK_CSS_PX);
592 outline_parse (GtkCssStyleProperty *property,
593 GtkCssParser *parser)
595 return _gtk_css_number_value_parse (parser,
596 GTK_CSS_NUMBER_AS_PIXELS
597 | GTK_CSS_PARSE_LENGTH);
601 border_image_repeat_parse (GtkCssStyleProperty *property,
602 GtkCssParser *parser)
604 GtkCssValue *value = _gtk_css_border_repeat_value_try_parse (parser);
608 _gtk_css_parser_error (parser, "Not a valid value");
616 border_image_slice_parse (GtkCssStyleProperty *property,
617 GtkCssParser *parser)
619 return _gtk_css_border_value_parse (parser,
620 GTK_CSS_PARSE_PERCENT
621 | GTK_CSS_PARSE_NUMBER
622 | GTK_CSS_POSITIVE_ONLY,
628 border_image_width_parse (GtkCssStyleProperty *property,
629 GtkCssParser *parser)
631 return _gtk_css_border_value_parse (parser,
632 GTK_CSS_PARSE_PERCENT
633 | GTK_CSS_PARSE_LENGTH
634 | GTK_CSS_PARSE_NUMBER
635 | GTK_CSS_POSITIVE_ONLY,
641 transition_property_parse_one (GtkCssParser *parser)
645 value = _gtk_css_ident_value_try_parse (parser);
649 _gtk_css_parser_error (parser, "Expected an identifier");
657 transition_property_parse (GtkCssStyleProperty *property,
658 GtkCssParser *parser)
660 return _gtk_css_array_value_parse (parser, transition_property_parse_one, FALSE);
664 transition_time_parse_one (GtkCssParser *parser)
666 return _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_TIME);
670 transition_time_parse (GtkCssStyleProperty *property,
671 GtkCssParser *parser)
673 return _gtk_css_array_value_parse (parser, transition_time_parse_one, FALSE);
677 transition_timing_function_parse (GtkCssStyleProperty *property,
678 GtkCssParser *parser)
680 return _gtk_css_array_value_parse (parser, _gtk_css_ease_value_parse, FALSE);
684 engine_parse (GtkCssStyleProperty *property,
685 GtkCssParser *parser)
687 return _gtk_css_engine_value_parse (parser);
691 engine_query (GtkCssStyleProperty *property,
692 const GtkCssValue *css_value,
695 g_value_init (value, GTK_TYPE_THEMING_ENGINE);
696 g_value_set_object (value, _gtk_css_engine_value_get_engine (css_value));
700 engine_assign (GtkCssStyleProperty *property,
703 return _gtk_css_engine_value_new (g_value_get_object (value));
707 parse_margin (GtkCssStyleProperty *property,
708 GtkCssParser *parser)
710 return _gtk_css_number_value_parse (parser,
711 GTK_CSS_NUMBER_AS_PIXELS
712 | GTK_CSS_PARSE_LENGTH);
716 parse_padding (GtkCssStyleProperty *property,
717 GtkCssParser *parser)
719 return _gtk_css_number_value_parse (parser,
720 GTK_CSS_POSITIVE_ONLY
721 | GTK_CSS_NUMBER_AS_PIXELS
722 | GTK_CSS_PARSE_LENGTH);
726 parse_border_width (GtkCssStyleProperty *property,
727 GtkCssParser *parser)
729 return _gtk_css_number_value_parse (parser,
730 GTK_CSS_POSITIVE_ONLY
731 | GTK_CSS_NUMBER_AS_PIXELS
732 | GTK_CSS_PARSE_LENGTH);
736 background_repeat_value_parse_one (GtkCssParser *parser)
738 GtkCssValue *value = _gtk_css_background_repeat_value_try_parse (parser);
742 _gtk_css_parser_error (parser, "Not a valid value");
750 background_repeat_value_parse (GtkCssStyleProperty *property,
751 GtkCssParser *parser)
753 return _gtk_css_array_value_parse (parser, background_repeat_value_parse_one, FALSE);
757 background_size_parse (GtkCssStyleProperty *property,
758 GtkCssParser *parser)
760 return _gtk_css_array_value_parse (parser, _gtk_css_bg_size_value_parse, FALSE);
764 background_position_parse (GtkCssStyleProperty *property,
765 GtkCssParser *parser)
767 return _gtk_css_array_value_parse (parser, _gtk_css_position_value_parse, FALSE);
770 /*** REGISTRATION ***/
772 static GtkSymbolicColor *
773 gtk_symbolic_color_new_rgba (double red,
778 GdkRGBA rgba = { red, green, blue, alpha };
780 return gtk_symbolic_color_new_literal (&rgba);
784 _gtk_css_style_property_init_properties (void)
786 /* Initialize "color" and "font-size" first,
787 * so that when computing values later they are
788 * done first. That way, 'currentColor' and font
789 * sizes in em can be looked up properly */
790 gtk_css_style_property_register ("color",
791 GTK_CSS_PROPERTY_COLOR,
793 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
797 _gtk_css_symbolic_value_new_take_symbolic_color (
798 gtk_symbolic_color_new_rgba (1, 1, 1, 1)));
799 gtk_css_style_property_register ("font-size",
800 GTK_CSS_PROPERTY_FONT_SIZE,
802 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
804 query_length_as_double,
805 assign_length_from_double,
806 /* XXX: This should be 'normal' */
807 _gtk_css_number_value_new (10.0, GTK_CSS_PX));
809 /* properties that aren't referenced when computing values
811 gtk_css_style_property_register ("background-color",
812 GTK_CSS_PROPERTY_BACKGROUND_COLOR,
814 GTK_STYLE_PROPERTY_ANIMATED,
818 _gtk_css_symbolic_value_new_take_symbolic_color (
819 gtk_symbolic_color_new_rgba (0, 0, 0, 0)));
821 gtk_css_style_property_register ("font-family",
822 GTK_CSS_PROPERTY_FONT_FAMILY,
824 GTK_STYLE_PROPERTY_INHERIT,
828 _gtk_css_array_value_new (_gtk_css_string_value_new ("Sans")));
829 gtk_css_style_property_register ("font-style",
830 GTK_CSS_PROPERTY_FONT_STYLE,
832 GTK_STYLE_PROPERTY_INHERIT,
836 _gtk_css_font_style_value_new (PANGO_STYLE_NORMAL));
837 gtk_css_style_property_register ("font-variant",
838 GTK_CSS_PROPERTY_FONT_VARIANT,
840 GTK_STYLE_PROPERTY_INHERIT,
843 assign_pango_variant,
844 _gtk_css_font_variant_value_new (PANGO_VARIANT_NORMAL));
845 gtk_css_style_property_register ("font-weight",
846 GTK_CSS_PROPERTY_FONT_WEIGHT,
848 GTK_STYLE_PROPERTY_INHERIT,
852 _gtk_css_font_weight_value_new (PANGO_WEIGHT_NORMAL));
854 gtk_css_style_property_register ("text-shadow",
855 GTK_CSS_PROPERTY_TEXT_SHADOW,
857 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
861 _gtk_css_shadows_value_new_none ());
863 gtk_css_style_property_register ("icon-shadow",
864 GTK_CSS_PROPERTY_ICON_SHADOW,
866 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
870 _gtk_css_shadows_value_new_none ());
872 gtk_css_style_property_register ("box-shadow",
873 GTK_CSS_PROPERTY_BOX_SHADOW,
875 GTK_STYLE_PROPERTY_ANIMATED,
879 _gtk_css_shadows_value_new_none ());
881 gtk_css_style_property_register ("margin-top",
882 GTK_CSS_PROPERTY_MARGIN_TOP,
884 GTK_STYLE_PROPERTY_ANIMATED,
887 assign_length_from_int,
888 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
889 gtk_css_style_property_register ("margin-left",
890 GTK_CSS_PROPERTY_MARGIN_LEFT,
892 GTK_STYLE_PROPERTY_ANIMATED,
895 assign_length_from_int,
896 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
897 gtk_css_style_property_register ("margin-bottom",
898 GTK_CSS_PROPERTY_MARGIN_BOTTOM,
900 GTK_STYLE_PROPERTY_ANIMATED,
903 assign_length_from_int,
904 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
905 gtk_css_style_property_register ("margin-right",
906 GTK_CSS_PROPERTY_MARGIN_RIGHT,
908 GTK_STYLE_PROPERTY_ANIMATED,
911 assign_length_from_int,
912 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
913 gtk_css_style_property_register ("padding-top",
914 GTK_CSS_PROPERTY_PADDING_TOP,
916 GTK_STYLE_PROPERTY_ANIMATED,
919 assign_length_from_int,
920 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
921 gtk_css_style_property_register ("padding-left",
922 GTK_CSS_PROPERTY_PADDING_LEFT,
924 GTK_STYLE_PROPERTY_ANIMATED,
927 assign_length_from_int,
928 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
929 gtk_css_style_property_register ("padding-bottom",
930 GTK_CSS_PROPERTY_PADDING_BOTTOM,
932 GTK_STYLE_PROPERTY_ANIMATED,
935 assign_length_from_int,
936 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
937 gtk_css_style_property_register ("padding-right",
938 GTK_CSS_PROPERTY_PADDING_RIGHT,
940 GTK_STYLE_PROPERTY_ANIMATED,
943 assign_length_from_int,
944 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
945 /* IMPORTANT: the border-width properties must come after border-style properties,
946 * they depend on them for their value computation.
948 gtk_css_style_property_register ("border-top-style",
949 GTK_CSS_PROPERTY_BORDER_TOP_STYLE,
950 GTK_TYPE_BORDER_STYLE,
955 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
956 gtk_css_style_property_register ("border-top-width",
957 GTK_CSS_PROPERTY_BORDER_TOP_WIDTH,
959 GTK_STYLE_PROPERTY_ANIMATED,
962 assign_length_from_int,
963 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
964 gtk_css_style_property_register ("border-left-style",
965 GTK_CSS_PROPERTY_BORDER_LEFT_STYLE,
966 GTK_TYPE_BORDER_STYLE,
971 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
972 gtk_css_style_property_register ("border-left-width",
973 GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH,
975 GTK_STYLE_PROPERTY_ANIMATED,
978 assign_length_from_int,
979 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
980 gtk_css_style_property_register ("border-bottom-style",
981 GTK_CSS_PROPERTY_BORDER_BOTTOM_STYLE,
982 GTK_TYPE_BORDER_STYLE,
987 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
988 gtk_css_style_property_register ("border-bottom-width",
989 GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH,
991 GTK_STYLE_PROPERTY_ANIMATED,
994 assign_length_from_int,
995 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
996 gtk_css_style_property_register ("border-right-style",
997 GTK_CSS_PROPERTY_BORDER_RIGHT_STYLE,
998 GTK_TYPE_BORDER_STYLE,
1002 assign_border_style,
1003 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1004 gtk_css_style_property_register ("border-right-width",
1005 GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH,
1007 GTK_STYLE_PROPERTY_ANIMATED,
1009 query_length_as_int,
1010 assign_length_from_int,
1011 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1013 gtk_css_style_property_register ("border-top-left-radius",
1014 GTK_CSS_PROPERTY_BORDER_TOP_LEFT_RADIUS,
1016 GTK_STYLE_PROPERTY_ANIMATED,
1017 border_corner_radius_value_parse,
1020 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1021 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1022 gtk_css_style_property_register ("border-top-right-radius",
1023 GTK_CSS_PROPERTY_BORDER_TOP_RIGHT_RADIUS,
1025 GTK_STYLE_PROPERTY_ANIMATED,
1026 border_corner_radius_value_parse,
1029 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1030 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1031 gtk_css_style_property_register ("border-bottom-right-radius",
1032 GTK_CSS_PROPERTY_BORDER_BOTTOM_RIGHT_RADIUS,
1034 GTK_STYLE_PROPERTY_ANIMATED,
1035 border_corner_radius_value_parse,
1038 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1039 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1040 gtk_css_style_property_register ("border-bottom-left-radius",
1041 GTK_CSS_PROPERTY_BORDER_BOTTOM_LEFT_RADIUS,
1043 GTK_STYLE_PROPERTY_ANIMATED,
1044 border_corner_radius_value_parse,
1047 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1048 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1050 gtk_css_style_property_register ("outline-style",
1051 GTK_CSS_PROPERTY_OUTLINE_STYLE,
1052 GTK_TYPE_BORDER_STYLE,
1056 assign_border_style,
1057 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1058 gtk_css_style_property_register ("outline-width",
1059 GTK_CSS_PROPERTY_OUTLINE_WIDTH,
1061 GTK_STYLE_PROPERTY_ANIMATED,
1063 query_length_as_int,
1064 assign_length_from_int,
1065 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1066 gtk_css_style_property_register ("outline-offset",
1067 GTK_CSS_PROPERTY_OUTLINE_OFFSET,
1071 query_length_as_int,
1072 assign_length_from_int,
1073 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1075 gtk_css_style_property_register ("background-clip",
1076 GTK_CSS_PROPERTY_BACKGROUND_CLIP,
1082 _gtk_css_array_value_new (_gtk_css_area_value_new (GTK_CSS_AREA_BORDER_BOX)));
1083 gtk_css_style_property_register ("background-origin",
1084 GTK_CSS_PROPERTY_BACKGROUND_ORIGIN,
1090 _gtk_css_array_value_new (_gtk_css_area_value_new (GTK_CSS_AREA_PADDING_BOX)));
1091 gtk_css_style_property_register ("background-size",
1092 GTK_CSS_PROPERTY_BACKGROUND_SIZE,
1095 background_size_parse,
1098 _gtk_css_array_value_new (_gtk_css_bg_size_value_new (NULL, NULL)));
1099 gtk_css_style_property_register ("background-position",
1100 GTK_CSS_PROPERTY_BACKGROUND_POSITION,
1102 GTK_STYLE_PROPERTY_ANIMATED,
1103 background_position_parse,
1106 _gtk_css_array_value_new (_gtk_css_position_value_new (_gtk_css_number_value_new (0, GTK_CSS_PERCENT),
1107 _gtk_css_number_value_new (0, GTK_CSS_PERCENT))));
1109 gtk_css_style_property_register ("border-top-color",
1110 GTK_CSS_PROPERTY_BORDER_TOP_COLOR,
1112 GTK_STYLE_PROPERTY_ANIMATED,
1116 _gtk_css_symbolic_value_new_take_symbolic_color (
1117 gtk_symbolic_color_ref (
1118 _gtk_symbolic_color_get_current_color ())));
1119 gtk_css_style_property_register ("border-right-color",
1120 GTK_CSS_PROPERTY_BORDER_RIGHT_COLOR,
1122 GTK_STYLE_PROPERTY_ANIMATED,
1126 _gtk_css_symbolic_value_new_take_symbolic_color (
1127 gtk_symbolic_color_ref (
1128 _gtk_symbolic_color_get_current_color ())));
1129 gtk_css_style_property_register ("border-bottom-color",
1130 GTK_CSS_PROPERTY_BORDER_BOTTOM_COLOR,
1132 GTK_STYLE_PROPERTY_ANIMATED,
1136 _gtk_css_symbolic_value_new_take_symbolic_color (
1137 gtk_symbolic_color_ref (
1138 _gtk_symbolic_color_get_current_color ())));
1139 gtk_css_style_property_register ("border-left-color",
1140 GTK_CSS_PROPERTY_BORDER_LEFT_COLOR,
1142 GTK_STYLE_PROPERTY_ANIMATED,
1146 _gtk_css_symbolic_value_new_take_symbolic_color (
1147 gtk_symbolic_color_ref (
1148 _gtk_symbolic_color_get_current_color ())));
1149 gtk_css_style_property_register ("outline-color",
1150 GTK_CSS_PROPERTY_OUTLINE_COLOR,
1152 GTK_STYLE_PROPERTY_ANIMATED,
1156 _gtk_css_symbolic_value_new_take_symbolic_color (
1157 gtk_symbolic_color_ref (
1158 _gtk_symbolic_color_get_current_color ())));
1160 gtk_css_style_property_register ("background-repeat",
1161 GTK_CSS_PROPERTY_BACKGROUND_REPEAT,
1164 background_repeat_value_parse,
1167 _gtk_css_array_value_new (_gtk_css_background_repeat_value_new (GTK_CSS_REPEAT_STYLE_REPEAT,
1168 GTK_CSS_REPEAT_STYLE_REPEAT)));
1169 gtk_css_style_property_register ("background-image",
1170 GTK_CSS_PROPERTY_BACKGROUND_IMAGE,
1171 CAIRO_GOBJECT_TYPE_PATTERN,
1172 GTK_STYLE_PROPERTY_ANIMATED,
1173 background_image_value_parse,
1174 background_image_value_query,
1175 background_image_value_assign,
1176 _gtk_css_array_value_new (_gtk_css_image_value_new (NULL)));
1178 gtk_css_style_property_register ("border-image-source",
1179 GTK_CSS_PROPERTY_BORDER_IMAGE_SOURCE,
1180 CAIRO_GOBJECT_TYPE_PATTERN,
1181 GTK_STYLE_PROPERTY_ANIMATED,
1182 css_image_value_parse,
1183 css_image_value_query,
1184 css_image_value_assign,
1185 _gtk_css_image_value_new (NULL));
1186 gtk_css_style_property_register ("border-image-repeat",
1187 GTK_CSS_PROPERTY_BORDER_IMAGE_REPEAT,
1190 border_image_repeat_parse,
1193 _gtk_css_border_repeat_value_new (GTK_CSS_REPEAT_STYLE_STRETCH,
1194 GTK_CSS_REPEAT_STYLE_STRETCH));
1196 gtk_css_style_property_register ("border-image-slice",
1197 GTK_CSS_PROPERTY_BORDER_IMAGE_SLICE,
1200 border_image_slice_parse,
1203 _gtk_css_border_value_new (_gtk_css_number_value_new (100, GTK_CSS_PERCENT),
1204 _gtk_css_number_value_new (100, GTK_CSS_PERCENT),
1205 _gtk_css_number_value_new (100, GTK_CSS_PERCENT),
1206 _gtk_css_number_value_new (100, GTK_CSS_PERCENT)));
1207 gtk_css_style_property_register ("border-image-width",
1208 GTK_CSS_PROPERTY_BORDER_IMAGE_WIDTH,
1211 border_image_width_parse,
1214 _gtk_css_border_value_new (_gtk_css_number_value_new (1, GTK_CSS_NUMBER),
1215 _gtk_css_number_value_new (1, GTK_CSS_NUMBER),
1216 _gtk_css_number_value_new (1, GTK_CSS_NUMBER),
1217 _gtk_css_number_value_new (1, GTK_CSS_NUMBER)));
1219 gtk_css_style_property_register ("transition-property",
1220 GTK_CSS_PROPERTY_TRANSITION_PROPERTY,
1223 transition_property_parse,
1226 _gtk_css_array_value_new (_gtk_css_ident_value_new ("all")));
1227 gtk_css_style_property_register ("transition-duration",
1228 GTK_CSS_PROPERTY_TRANSITION_DURATION,
1231 transition_time_parse,
1234 _gtk_css_array_value_new (_gtk_css_number_value_new (0, GTK_CSS_S)));
1235 gtk_css_style_property_register ("transition-timing-function",
1236 GTK_CSS_PROPERTY_TRANSITION_TIMING_FUNCTION,
1239 transition_timing_function_parse,
1242 _gtk_css_array_value_new (
1243 _gtk_css_ease_value_new_cubic_bezier (0.25, 0.1, 0.25, 1.0)));
1244 gtk_css_style_property_register ("transition-delay",
1245 GTK_CSS_PROPERTY_TRANSITION_DELAY,
1248 transition_time_parse,
1251 _gtk_css_array_value_new (_gtk_css_number_value_new (0, GTK_CSS_S)));
1253 gtk_css_style_property_register ("engine",
1254 GTK_CSS_PROPERTY_ENGINE,
1255 GTK_TYPE_THEMING_ENGINE,
1260 _gtk_css_engine_value_new (gtk_theming_engine_load (NULL)));
1262 /* Private property holding the binding sets */
1263 gtk_css_style_property_register ("gtk-key-bindings",
1264 GTK_CSS_PROPERTY_GTK_KEY_BINDINGS,
1267 bindings_value_parse,
1268 bindings_value_query,
1269 bindings_value_assign,
1270 _gtk_css_array_value_new (NULL));