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 GtkCssStylePropertyPrintFunc print_value,
77 GtkCssStylePropertyComputeFunc compute_value,
78 GtkCssStylePropertyQueryFunc query_value,
79 GtkCssStylePropertyAssignFunc assign_value,
80 GtkCssValue * initial_value)
82 GtkCssStyleProperty *node;
84 g_assert (initial_value != NULL);
85 g_assert (parse_value != NULL);
86 g_assert (value_type == G_TYPE_NONE || query_value != NULL);
87 g_assert (value_type == G_TYPE_NONE || assign_value != NULL);
89 node = g_object_new (GTK_TYPE_CSS_STYLE_PROPERTY,
90 "value-type", value_type,
91 "animated", (flags & GTK_STYLE_PROPERTY_ANIMATED) ? TRUE : FALSE,
92 "inherit", (flags & GTK_STYLE_PROPERTY_INHERIT) ? TRUE : FALSE,
93 "initial-value", initial_value,
97 node->parse_value = parse_value;
99 node->print_value = print_value;
101 node->compute_value = compute_value;
102 node->query_value = query_value;
103 node->assign_value = assign_value;
105 _gtk_css_value_unref (initial_value);
107 g_assert (_gtk_css_style_property_get_id (node) == expected_id);
110 /*** IMPLEMENTATIONS ***/
113 query_length_as_int (GtkCssStyleProperty *property,
114 const GtkCssValue *css_value,
117 g_value_init (value, G_TYPE_INT);
118 g_value_set_int (value, round (_gtk_css_number_value_get (css_value, 100)));
122 assign_length_from_int (GtkCssStyleProperty *property,
125 return _gtk_css_number_value_new (g_value_get_int (value), GTK_CSS_PX);
129 query_length_as_double (GtkCssStyleProperty *property,
130 const GtkCssValue *css_value,
133 g_value_init (value, G_TYPE_DOUBLE);
134 g_value_set_double (value, _gtk_css_number_value_get (css_value, 100));
138 assign_length_from_double (GtkCssStyleProperty *property,
141 return _gtk_css_number_value_new (g_value_get_double (value), GTK_CSS_PX);
145 query_border (GtkCssStyleProperty *property,
146 const GtkCssValue *css_value,
151 g_value_init (value, GTK_TYPE_BORDER);
153 border.top = round (_gtk_css_number_value_get (_gtk_css_border_value_get_top (css_value), 100));
154 border.right = round (_gtk_css_number_value_get (_gtk_css_border_value_get_right (css_value), 100));
155 border.bottom = round (_gtk_css_number_value_get (_gtk_css_border_value_get_bottom (css_value), 100));
156 border.left = round (_gtk_css_number_value_get (_gtk_css_border_value_get_left (css_value), 100));
158 g_value_set_boxed (value, &border);
162 assign_border (GtkCssStyleProperty *property,
165 const GtkBorder *border = g_value_get_boxed (value);
168 return _gtk_css_value_ref (_gtk_css_style_property_get_initial_value (property));
170 return _gtk_css_border_value_new (_gtk_css_number_value_new (border->top, GTK_CSS_PX),
171 _gtk_css_number_value_new (border->right, GTK_CSS_PX),
172 _gtk_css_number_value_new (border->bottom, GTK_CSS_PX),
173 _gtk_css_number_value_new (border->left, GTK_CSS_PX));
177 color_parse (GtkCssStyleProperty *property,
178 GtkCssParser *parser)
180 return _gtk_css_symbolic_value_new (parser);
184 color_compute (GtkCssStyleProperty *property,
185 GtkStyleContext *context,
186 GtkCssValue *specified)
188 return _gtk_css_rgba_value_compute_from_symbolic (specified,
189 _gtk_css_style_property_get_initial_value (property),
195 color_property_compute (GtkCssStyleProperty *property,
196 GtkStyleContext *context,
197 GtkCssValue *specified)
201 value = _gtk_css_rgba_value_compute_from_symbolic (specified,
202 _gtk_css_style_property_get_initial_value (property),
205 _gtk_css_rgba_value_get_rgba (value);
210 color_query (GtkCssStyleProperty *property,
211 const GtkCssValue *css_value,
214 g_value_init (value, GDK_TYPE_RGBA);
215 g_value_set_boxed (value, _gtk_css_rgba_value_get_rgba (css_value));
219 color_assign (GtkCssStyleProperty *property,
222 return _gtk_css_rgba_value_new_from_rgba (g_value_get_boxed (value));
226 font_family_parse_one (GtkCssParser *parser)
230 name = _gtk_css_parser_try_ident (parser, TRUE);
233 GString *string = g_string_new (name);
235 while ((name = _gtk_css_parser_try_ident (parser, TRUE)))
237 g_string_append_c (string, ' ');
238 g_string_append (string, name);
241 name = g_string_free (string, FALSE);
245 name = _gtk_css_parser_read_string (parser);
250 return _gtk_css_string_value_new_take (name);
254 font_family_parse (GtkCssStyleProperty *property,
255 GtkCssParser *parser)
257 return _gtk_css_array_value_parse (parser, font_family_parse_one, FALSE);
261 font_family_query (GtkCssStyleProperty *property,
262 const GtkCssValue *css_value,
268 array = g_ptr_array_new ();
270 for (i = 0; i < _gtk_css_array_value_get_n_values (css_value); i++)
272 g_ptr_array_add (array, g_strdup (_gtk_css_string_value_get (_gtk_css_array_value_get_nth (css_value, i))));
276 g_ptr_array_add (array, NULL);
278 g_value_init (value, G_TYPE_STRV);
279 g_value_set_boxed (value, g_ptr_array_free (array, FALSE));
283 font_family_assign (GtkCssStyleProperty *property,
286 const char **names = g_value_get_boxed (value);
290 array = g_ptr_array_new ();
292 for (names = g_value_get_boxed (value); *names; names++)
294 g_ptr_array_add (array, _gtk_css_string_value_new (*names));
297 result = _gtk_css_array_value_new_from_array ((GtkCssValue **) array->pdata, array->len);
298 g_ptr_array_free (array, TRUE);
303 parse_pango_style (GtkCssStyleProperty *property,
304 GtkCssParser *parser)
306 GtkCssValue *value = _gtk_css_font_style_value_try_parse (parser);
309 _gtk_css_parser_error (parser, "unknown value for property");
315 query_pango_style (GtkCssStyleProperty *property,
316 const GtkCssValue *css_value,
319 g_value_init (value, PANGO_TYPE_STYLE);
320 g_value_set_enum (value, _gtk_css_font_style_value_get (css_value));
324 assign_pango_style (GtkCssStyleProperty *property,
327 return _gtk_css_font_style_value_new (g_value_get_enum (value));
331 parse_pango_weight (GtkCssStyleProperty *property,
332 GtkCssParser *parser)
334 GtkCssValue *value = _gtk_css_font_weight_value_try_parse (parser);
337 _gtk_css_parser_error (parser, "unknown value for property");
343 query_pango_weight (GtkCssStyleProperty *property,
344 const GtkCssValue *css_value,
347 g_value_init (value, PANGO_TYPE_WEIGHT);
348 g_value_set_enum (value, _gtk_css_font_weight_value_get (css_value));
352 assign_pango_weight (GtkCssStyleProperty *property,
355 return _gtk_css_font_weight_value_new (g_value_get_enum (value));
359 parse_pango_variant (GtkCssStyleProperty *property,
360 GtkCssParser *parser)
362 GtkCssValue *value = _gtk_css_font_variant_value_try_parse (parser);
365 _gtk_css_parser_error (parser, "unknown value for property");
371 query_pango_variant (GtkCssStyleProperty *property,
372 const GtkCssValue *css_value,
375 g_value_init (value, PANGO_TYPE_VARIANT);
376 g_value_set_enum (value, _gtk_css_font_variant_value_get (css_value));
380 assign_pango_variant (GtkCssStyleProperty *property,
383 return _gtk_css_font_variant_value_new (g_value_get_enum (value));
387 parse_border_style (GtkCssStyleProperty *property,
388 GtkCssParser *parser)
390 GtkCssValue *value = _gtk_css_border_style_value_try_parse (parser);
393 _gtk_css_parser_error (parser, "unknown value for property");
399 query_border_style (GtkCssStyleProperty *property,
400 const GtkCssValue *css_value,
403 g_value_init (value, GTK_TYPE_BORDER_STYLE);
404 g_value_set_enum (value, _gtk_css_border_style_value_get (css_value));
408 assign_border_style (GtkCssStyleProperty *property,
411 return _gtk_css_border_style_value_new (g_value_get_enum (value));
415 parse_css_area (GtkCssStyleProperty *property,
416 GtkCssParser *parser)
418 GtkCssValue *value = _gtk_css_area_value_try_parse (parser);
421 _gtk_css_parser_error (parser, "unknown value for property");
427 bindings_value_parse_one (GtkCssParser *parser)
431 name = _gtk_css_parser_try_ident (parser, TRUE);
434 _gtk_css_parser_error (parser, "Not a valid binding name");
439 if (!gtk_binding_set_find (name))
441 _gtk_css_parser_error (parser, "No binding set named '%s'", name);
446 return _gtk_css_string_value_new_take (name);
450 bindings_value_parse (GtkCssStyleProperty *property,
451 GtkCssParser *parser)
453 return _gtk_css_array_value_parse (parser, bindings_value_parse_one, TRUE);
457 bindings_value_query (GtkCssStyleProperty *property,
458 const GtkCssValue *css_value,
464 g_value_init (value, G_TYPE_PTR_ARRAY);
466 if (_gtk_css_array_value_get_n_values (css_value) == 0)
469 array = g_ptr_array_new ();
471 for (i = 0; i < _gtk_css_array_value_get_n_values (css_value); i++)
473 GtkBindingSet *binding_set = gtk_binding_set_find (_gtk_css_string_value_get (_gtk_css_array_value_get_nth (css_value, i)));
475 g_ptr_array_add (array, binding_set);
478 g_value_take_boxed (value, array);
482 bindings_value_assign (GtkCssStyleProperty *property,
485 GPtrArray *binding_sets = g_value_get_boxed (value);
486 GtkCssValue **values, *result;
489 if (binding_sets == NULL || binding_sets->len == 0)
490 return _gtk_css_array_value_new (NULL);
492 values = g_new (GtkCssValue *, binding_sets->len);
494 for (i = 0; i < binding_sets->len; i++)
496 GtkBindingSet *binding_set = g_ptr_array_index (binding_sets, i);
497 values[i] = _gtk_css_string_value_new (binding_set->set_name);
500 result = _gtk_css_array_value_new_from_array (values, binding_sets->len);
506 shadow_value_parse (GtkCssStyleProperty *property,
507 GtkCssParser *parser)
509 return _gtk_css_shadows_value_parse (parser);
513 shadow_value_compute (GtkCssStyleProperty *property,
514 GtkStyleContext *context,
515 GtkCssValue *specified)
517 return _gtk_css_shadows_value_compute (specified, context);
521 border_corner_radius_value_parse (GtkCssStyleProperty *property,
522 GtkCssParser *parser)
524 return _gtk_css_corner_value_parse (parser);
528 border_corner_radius_value_compute (GtkCssStyleProperty *property,
529 GtkStyleContext *context,
530 GtkCssValue *specified)
532 return _gtk_css_corner_value_compute (specified, context);
536 css_image_value_parse (GtkCssStyleProperty *property,
537 GtkCssParser *parser)
541 if (_gtk_css_parser_try (parser, "none", TRUE))
545 image = _gtk_css_image_new_parse (parser);
550 return _gtk_css_image_value_new (image);
554 css_image_value_compute (GtkCssStyleProperty *property,
555 GtkStyleContext *context,
556 GtkCssValue *specified)
558 GtkCssImage *image, *computed;
560 image = _gtk_css_image_value_get_image (specified);
563 return _gtk_css_value_ref (specified);
565 computed = _gtk_css_image_compute (image, context);
567 if (computed == image)
569 g_object_unref (computed);
570 return _gtk_css_value_ref (specified);
573 return _gtk_css_image_value_new (computed);
577 css_image_value_query (GtkCssStyleProperty *property,
578 const GtkCssValue *css_value,
581 GtkCssImage *image = _gtk_css_image_value_get_image (css_value);
582 cairo_pattern_t *pattern;
583 cairo_surface_t *surface;
584 cairo_matrix_t matrix;
586 g_value_init (value, CAIRO_GOBJECT_TYPE_PATTERN);
588 if (GTK_IS_CSS_IMAGE_GRADIENT (image))
589 g_value_set_boxed (value, GTK_CSS_IMAGE_GRADIENT (image)->pattern);
590 else if (image != NULL)
592 double width, height;
594 /* the 100, 100 is rather random */
595 _gtk_css_image_get_concrete_size (image, 0, 0, 100, 100, &width, &height);
596 surface = _gtk_css_image_get_surface (image, NULL, width, height);
597 pattern = cairo_pattern_create_for_surface (surface);
598 cairo_matrix_init_scale (&matrix, width, height);
599 cairo_pattern_set_matrix (pattern, &matrix);
600 cairo_surface_destroy (surface);
601 g_value_take_boxed (value, pattern);
606 css_image_value_assign (GtkCssStyleProperty *property,
609 g_warning ("FIXME: assigning images is not implemented");
610 return _gtk_css_image_value_new (NULL);
614 font_size_parse (GtkCssStyleProperty *property,
615 GtkCssParser *parser)
619 if (!_gtk_css_parser_try_double (parser, &d))
621 _gtk_css_parser_error (parser, "Expected a number");
625 return _gtk_css_number_value_new (d, GTK_CSS_PX);
629 font_size_compute (GtkCssStyleProperty *property,
630 GtkStyleContext *context,
631 GtkCssValue *specified)
633 return _gtk_css_number_value_compute (specified, context);
637 outline_parse (GtkCssStyleProperty *property,
638 GtkCssParser *parser)
640 return _gtk_css_number_value_parse (parser,
641 GTK_CSS_NUMBER_AS_PIXELS
642 | GTK_CSS_PARSE_LENGTH);
646 outline_compute (GtkCssStyleProperty *property,
647 GtkStyleContext *context,
648 GtkCssValue *specified)
650 return _gtk_css_number_value_compute (specified, context);
654 border_image_repeat_parse (GtkCssStyleProperty *property,
655 GtkCssParser *parser)
657 GtkCssValue *value = _gtk_css_border_repeat_value_try_parse (parser);
661 _gtk_css_parser_error (parser, "Not a valid value");
669 border_image_slice_parse (GtkCssStyleProperty *property,
670 GtkCssParser *parser)
672 return _gtk_css_border_value_parse (parser,
673 GTK_CSS_PARSE_PERCENT
674 | GTK_CSS_PARSE_NUMBER
675 | GTK_CSS_POSITIVE_ONLY,
681 border_image_width_parse (GtkCssStyleProperty *property,
682 GtkCssParser *parser)
684 return _gtk_css_border_value_parse (parser,
685 GTK_CSS_PARSE_PERCENT
686 | GTK_CSS_PARSE_LENGTH
687 | GTK_CSS_PARSE_NUMBER
688 | GTK_CSS_POSITIVE_ONLY,
694 compute_border (GtkCssStyleProperty *property,
695 GtkStyleContext *context,
696 GtkCssValue *specified)
698 return _gtk_css_border_value_compute (specified, context);
702 transition_property_parse_one (GtkCssParser *parser)
706 value = _gtk_css_ident_value_try_parse (parser);
710 _gtk_css_parser_error (parser, "Expected an identifier");
718 transition_property_parse (GtkCssStyleProperty *property,
719 GtkCssParser *parser)
721 return _gtk_css_array_value_parse (parser, transition_property_parse_one, FALSE);
725 transition_time_parse_one (GtkCssParser *parser)
727 return _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_TIME);
731 transition_time_parse (GtkCssStyleProperty *property,
732 GtkCssParser *parser)
734 return _gtk_css_array_value_parse (parser, transition_time_parse_one, FALSE);
738 transition_timing_function_parse (GtkCssStyleProperty *property,
739 GtkCssParser *parser)
741 return _gtk_css_array_value_parse (parser, _gtk_css_ease_value_parse, FALSE);
745 engine_parse (GtkCssStyleProperty *property,
746 GtkCssParser *parser)
748 return _gtk_css_engine_value_parse (parser);
752 engine_query (GtkCssStyleProperty *property,
753 const GtkCssValue *css_value,
756 g_value_init (value, GTK_TYPE_THEMING_ENGINE);
757 g_value_set_object (value, _gtk_css_engine_value_get_engine (css_value));
761 engine_assign (GtkCssStyleProperty *property,
764 return _gtk_css_engine_value_new (g_value_get_object (value));
768 parse_margin (GtkCssStyleProperty *property,
769 GtkCssParser *parser)
771 return _gtk_css_number_value_parse (parser,
772 GTK_CSS_NUMBER_AS_PIXELS
773 | GTK_CSS_PARSE_LENGTH);
777 compute_margin (GtkCssStyleProperty *property,
778 GtkStyleContext *context,
779 GtkCssValue *specified)
781 return _gtk_css_number_value_compute (specified, context);
785 parse_padding (GtkCssStyleProperty *property,
786 GtkCssParser *parser)
788 return _gtk_css_number_value_parse (parser,
789 GTK_CSS_POSITIVE_ONLY
790 | GTK_CSS_NUMBER_AS_PIXELS
791 | GTK_CSS_PARSE_LENGTH);
795 compute_padding (GtkCssStyleProperty *property,
796 GtkStyleContext *context,
797 GtkCssValue *specified)
799 return _gtk_css_number_value_compute (specified, context);
803 parse_border_width (GtkCssStyleProperty *property,
804 GtkCssParser *parser)
806 return _gtk_css_number_value_parse (parser,
807 GTK_CSS_POSITIVE_ONLY
808 | GTK_CSS_NUMBER_AS_PIXELS
809 | GTK_CSS_PARSE_LENGTH);
813 compute_border_width (GtkCssStyleProperty *property,
814 GtkStyleContext *context,
815 GtkCssValue *specified)
817 GtkBorderStyle border_style;
819 /* The -1 is magic that is only true because we register the style
820 * properties directly after the width properties.
822 border_style = _gtk_css_border_style_value_get (_gtk_style_context_peek_property (context, _gtk_css_style_property_get_id (property) - 1));
824 if (border_style == GTK_BORDER_STYLE_NONE ||
825 border_style == GTK_BORDER_STYLE_HIDDEN)
826 return _gtk_css_number_value_new (0, GTK_CSS_PX);
828 return _gtk_css_number_value_compute (specified, context);
832 background_repeat_value_parse (GtkCssStyleProperty *property,
833 GtkCssParser *parser)
835 GtkCssValue *value = _gtk_css_background_repeat_value_try_parse (parser);
839 _gtk_css_parser_error (parser, "Not a valid value");
847 background_size_parse (GtkCssStyleProperty *property,
848 GtkCssParser *parser)
850 return _gtk_css_bg_size_value_parse (parser);
854 background_size_compute (GtkCssStyleProperty *property,
855 GtkStyleContext *context,
856 GtkCssValue *specified)
858 return _gtk_css_bg_size_value_compute (specified, context);
862 background_position_parse (GtkCssStyleProperty *property,
863 GtkCssParser *parser)
865 return _gtk_css_position_value_parse (parser);
869 background_position_compute (GtkCssStyleProperty *property,
870 GtkStyleContext *context,
871 GtkCssValue *specified)
873 return _gtk_css_position_value_compute (specified, context);
876 /*** REGISTRATION ***/
878 static GtkSymbolicColor *
879 gtk_symbolic_color_new_rgba (double red,
884 GdkRGBA rgba = { red, green, blue, alpha };
886 return gtk_symbolic_color_new_literal (&rgba);
890 _gtk_css_style_property_init_properties (void)
892 /* Initialize "color" and "font-size" first,
893 * so that when computing values later they are
894 * done first. That way, 'currentColor' and font
895 * sizes in em can be looked up properly */
896 gtk_css_style_property_register ("color",
897 GTK_CSS_PROPERTY_COLOR,
899 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
902 color_property_compute,
905 _gtk_css_symbolic_value_new_take_symbolic_color (
906 gtk_symbolic_color_new_rgba (1, 1, 1, 1)));
907 gtk_css_style_property_register ("font-size",
908 GTK_CSS_PROPERTY_FONT_SIZE,
910 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
914 query_length_as_double,
915 assign_length_from_double,
916 /* XXX: This should be 'normal' */
917 _gtk_css_number_value_new (10.0, GTK_CSS_PX));
919 /* properties that aren't referenced when computing values
921 gtk_css_style_property_register ("background-color",
922 GTK_CSS_PROPERTY_BACKGROUND_COLOR,
924 GTK_STYLE_PROPERTY_ANIMATED,
930 _gtk_css_symbolic_value_new_take_symbolic_color (
931 gtk_symbolic_color_new_rgba (0, 0, 0, 0)));
933 gtk_css_style_property_register ("font-family",
934 GTK_CSS_PROPERTY_FONT_FAMILY,
936 GTK_STYLE_PROPERTY_INHERIT,
942 _gtk_css_array_value_new (_gtk_css_string_value_new ("Sans")));
943 gtk_css_style_property_register ("font-style",
944 GTK_CSS_PROPERTY_FONT_STYLE,
946 GTK_STYLE_PROPERTY_INHERIT,
952 _gtk_css_font_style_value_new (PANGO_STYLE_NORMAL));
953 gtk_css_style_property_register ("font-variant",
954 GTK_CSS_PROPERTY_FONT_VARIANT,
956 GTK_STYLE_PROPERTY_INHERIT,
961 assign_pango_variant,
962 _gtk_css_font_variant_value_new (PANGO_VARIANT_NORMAL));
963 gtk_css_style_property_register ("font-weight",
964 GTK_CSS_PROPERTY_FONT_WEIGHT,
966 GTK_STYLE_PROPERTY_INHERIT,
972 _gtk_css_font_weight_value_new (PANGO_WEIGHT_NORMAL));
974 gtk_css_style_property_register ("text-shadow",
975 GTK_CSS_PROPERTY_TEXT_SHADOW,
977 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
980 shadow_value_compute,
983 _gtk_css_shadows_value_new_none ());
985 gtk_css_style_property_register ("icon-shadow",
986 GTK_CSS_PROPERTY_ICON_SHADOW,
988 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
991 shadow_value_compute,
994 _gtk_css_shadows_value_new_none ());
996 gtk_css_style_property_register ("box-shadow",
997 GTK_CSS_PROPERTY_BOX_SHADOW,
999 GTK_STYLE_PROPERTY_ANIMATED,
1002 shadow_value_compute,
1005 _gtk_css_shadows_value_new_none ());
1007 gtk_css_style_property_register ("margin-top",
1008 GTK_CSS_PROPERTY_MARGIN_TOP,
1010 GTK_STYLE_PROPERTY_ANIMATED,
1014 query_length_as_int,
1015 assign_length_from_int,
1016 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1017 gtk_css_style_property_register ("margin-left",
1018 GTK_CSS_PROPERTY_MARGIN_LEFT,
1020 GTK_STYLE_PROPERTY_ANIMATED,
1024 query_length_as_int,
1025 assign_length_from_int,
1026 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1027 gtk_css_style_property_register ("margin-bottom",
1028 GTK_CSS_PROPERTY_MARGIN_BOTTOM,
1030 GTK_STYLE_PROPERTY_ANIMATED,
1034 query_length_as_int,
1035 assign_length_from_int,
1036 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1037 gtk_css_style_property_register ("margin-right",
1038 GTK_CSS_PROPERTY_MARGIN_RIGHT,
1040 GTK_STYLE_PROPERTY_ANIMATED,
1044 query_length_as_int,
1045 assign_length_from_int,
1046 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1047 gtk_css_style_property_register ("padding-top",
1048 GTK_CSS_PROPERTY_PADDING_TOP,
1050 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 ("padding-left",
1058 GTK_CSS_PROPERTY_PADDING_LEFT,
1060 GTK_STYLE_PROPERTY_ANIMATED,
1064 query_length_as_int,
1065 assign_length_from_int,
1066 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1067 gtk_css_style_property_register ("padding-bottom",
1068 GTK_CSS_PROPERTY_PADDING_BOTTOM,
1070 GTK_STYLE_PROPERTY_ANIMATED,
1074 query_length_as_int,
1075 assign_length_from_int,
1076 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1077 gtk_css_style_property_register ("padding-right",
1078 GTK_CSS_PROPERTY_PADDING_RIGHT,
1080 GTK_STYLE_PROPERTY_ANIMATED,
1084 query_length_as_int,
1085 assign_length_from_int,
1086 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1087 /* IMPORTANT: compute_border_width() requires that the border-width
1088 * properties be immeditaly followed by the border-style properties
1090 gtk_css_style_property_register ("border-top-style",
1091 GTK_CSS_PROPERTY_BORDER_TOP_STYLE,
1092 GTK_TYPE_BORDER_STYLE,
1098 assign_border_style,
1099 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1100 gtk_css_style_property_register ("border-top-width",
1101 GTK_CSS_PROPERTY_BORDER_TOP_WIDTH,
1103 GTK_STYLE_PROPERTY_ANIMATED,
1106 compute_border_width,
1107 query_length_as_int,
1108 assign_length_from_int,
1109 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1110 gtk_css_style_property_register ("border-left-style",
1111 GTK_CSS_PROPERTY_BORDER_LEFT_STYLE,
1112 GTK_TYPE_BORDER_STYLE,
1118 assign_border_style,
1119 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1120 gtk_css_style_property_register ("border-left-width",
1121 GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH,
1123 GTK_STYLE_PROPERTY_ANIMATED,
1126 compute_border_width,
1127 query_length_as_int,
1128 assign_length_from_int,
1129 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1130 gtk_css_style_property_register ("border-bottom-style",
1131 GTK_CSS_PROPERTY_BORDER_BOTTOM_STYLE,
1132 GTK_TYPE_BORDER_STYLE,
1138 assign_border_style,
1139 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1140 gtk_css_style_property_register ("border-bottom-width",
1141 GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH,
1143 GTK_STYLE_PROPERTY_ANIMATED,
1146 compute_border_width,
1147 query_length_as_int,
1148 assign_length_from_int,
1149 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1150 gtk_css_style_property_register ("border-right-style",
1151 GTK_CSS_PROPERTY_BORDER_RIGHT_STYLE,
1152 GTK_TYPE_BORDER_STYLE,
1158 assign_border_style,
1159 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1160 gtk_css_style_property_register ("border-right-width",
1161 GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH,
1163 GTK_STYLE_PROPERTY_ANIMATED,
1166 compute_border_width,
1167 query_length_as_int,
1168 assign_length_from_int,
1169 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1171 gtk_css_style_property_register ("border-top-left-radius",
1172 GTK_CSS_PROPERTY_BORDER_TOP_LEFT_RADIUS,
1174 GTK_STYLE_PROPERTY_ANIMATED,
1175 border_corner_radius_value_parse,
1177 border_corner_radius_value_compute,
1180 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1181 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1182 gtk_css_style_property_register ("border-top-right-radius",
1183 GTK_CSS_PROPERTY_BORDER_TOP_RIGHT_RADIUS,
1185 GTK_STYLE_PROPERTY_ANIMATED,
1186 border_corner_radius_value_parse,
1188 border_corner_radius_value_compute,
1191 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1192 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1193 gtk_css_style_property_register ("border-bottom-right-radius",
1194 GTK_CSS_PROPERTY_BORDER_BOTTOM_RIGHT_RADIUS,
1196 GTK_STYLE_PROPERTY_ANIMATED,
1197 border_corner_radius_value_parse,
1199 border_corner_radius_value_compute,
1202 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1203 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1204 gtk_css_style_property_register ("border-bottom-left-radius",
1205 GTK_CSS_PROPERTY_BORDER_BOTTOM_LEFT_RADIUS,
1207 GTK_STYLE_PROPERTY_ANIMATED,
1208 border_corner_radius_value_parse,
1210 border_corner_radius_value_compute,
1213 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1214 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1216 gtk_css_style_property_register ("outline-style",
1217 GTK_CSS_PROPERTY_OUTLINE_STYLE,
1218 GTK_TYPE_BORDER_STYLE,
1224 assign_border_style,
1225 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1226 gtk_css_style_property_register ("outline-width",
1227 GTK_CSS_PROPERTY_OUTLINE_WIDTH,
1229 GTK_STYLE_PROPERTY_ANIMATED,
1232 compute_border_width,
1233 query_length_as_int,
1234 assign_length_from_int,
1235 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1236 gtk_css_style_property_register ("outline-offset",
1237 GTK_CSS_PROPERTY_OUTLINE_OFFSET,
1243 query_length_as_int,
1244 assign_length_from_int,
1245 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1247 gtk_css_style_property_register ("background-clip",
1248 GTK_CSS_PROPERTY_BACKGROUND_CLIP,
1256 _gtk_css_area_value_new (GTK_CSS_AREA_BORDER_BOX));
1257 gtk_css_style_property_register ("background-origin",
1258 GTK_CSS_PROPERTY_BACKGROUND_ORIGIN,
1266 _gtk_css_area_value_new (GTK_CSS_AREA_PADDING_BOX));
1267 gtk_css_style_property_register ("background-size",
1268 GTK_CSS_PROPERTY_BACKGROUND_SIZE,
1271 background_size_parse,
1273 background_size_compute,
1276 _gtk_css_bg_size_value_new (NULL, NULL));
1277 gtk_css_style_property_register ("background-position",
1278 GTK_CSS_PROPERTY_BACKGROUND_POSITION,
1280 GTK_STYLE_PROPERTY_ANIMATED,
1281 background_position_parse,
1283 background_position_compute,
1286 _gtk_css_position_value_new (_gtk_css_number_value_new (0, GTK_CSS_PERCENT),
1287 _gtk_css_number_value_new (0, GTK_CSS_PERCENT)));
1289 gtk_css_style_property_register ("border-top-color",
1290 GTK_CSS_PROPERTY_BORDER_TOP_COLOR,
1292 GTK_STYLE_PROPERTY_ANIMATED,
1298 _gtk_css_symbolic_value_new_take_symbolic_color (
1299 gtk_symbolic_color_ref (
1300 _gtk_symbolic_color_get_current_color ())));
1301 gtk_css_style_property_register ("border-right-color",
1302 GTK_CSS_PROPERTY_BORDER_RIGHT_COLOR,
1304 GTK_STYLE_PROPERTY_ANIMATED,
1310 _gtk_css_symbolic_value_new_take_symbolic_color (
1311 gtk_symbolic_color_ref (
1312 _gtk_symbolic_color_get_current_color ())));
1313 gtk_css_style_property_register ("border-bottom-color",
1314 GTK_CSS_PROPERTY_BORDER_BOTTOM_COLOR,
1316 GTK_STYLE_PROPERTY_ANIMATED,
1322 _gtk_css_symbolic_value_new_take_symbolic_color (
1323 gtk_symbolic_color_ref (
1324 _gtk_symbolic_color_get_current_color ())));
1325 gtk_css_style_property_register ("border-left-color",
1326 GTK_CSS_PROPERTY_BORDER_LEFT_COLOR,
1328 GTK_STYLE_PROPERTY_ANIMATED,
1334 _gtk_css_symbolic_value_new_take_symbolic_color (
1335 gtk_symbolic_color_ref (
1336 _gtk_symbolic_color_get_current_color ())));
1337 gtk_css_style_property_register ("outline-color",
1338 GTK_CSS_PROPERTY_OUTLINE_COLOR,
1340 GTK_STYLE_PROPERTY_ANIMATED,
1346 _gtk_css_symbolic_value_new_take_symbolic_color (
1347 gtk_symbolic_color_ref (
1348 _gtk_symbolic_color_get_current_color ())));
1350 gtk_css_style_property_register ("background-repeat",
1351 GTK_CSS_PROPERTY_BACKGROUND_REPEAT,
1354 background_repeat_value_parse,
1359 _gtk_css_background_repeat_value_new (GTK_CSS_REPEAT_STYLE_REPEAT,
1360 GTK_CSS_REPEAT_STYLE_REPEAT));
1361 gtk_css_style_property_register ("background-image",
1362 GTK_CSS_PROPERTY_BACKGROUND_IMAGE,
1363 CAIRO_GOBJECT_TYPE_PATTERN,
1364 GTK_STYLE_PROPERTY_ANIMATED,
1365 css_image_value_parse,
1367 css_image_value_compute,
1368 css_image_value_query,
1369 css_image_value_assign,
1370 _gtk_css_image_value_new (NULL));
1372 gtk_css_style_property_register ("border-image-source",
1373 GTK_CSS_PROPERTY_BORDER_IMAGE_SOURCE,
1374 CAIRO_GOBJECT_TYPE_PATTERN,
1375 GTK_STYLE_PROPERTY_ANIMATED,
1376 css_image_value_parse,
1378 css_image_value_compute,
1379 css_image_value_query,
1380 css_image_value_assign,
1381 _gtk_css_image_value_new (NULL));
1382 gtk_css_style_property_register ("border-image-repeat",
1383 GTK_CSS_PROPERTY_BORDER_IMAGE_REPEAT,
1386 border_image_repeat_parse,
1391 _gtk_css_border_repeat_value_new (GTK_CSS_REPEAT_STYLE_STRETCH,
1392 GTK_CSS_REPEAT_STYLE_STRETCH));
1394 gtk_css_style_property_register ("border-image-slice",
1395 GTK_CSS_PROPERTY_BORDER_IMAGE_SLICE,
1398 border_image_slice_parse,
1403 _gtk_css_border_value_new (_gtk_css_number_value_new (100, GTK_CSS_PERCENT),
1404 _gtk_css_number_value_new (100, GTK_CSS_PERCENT),
1405 _gtk_css_number_value_new (100, GTK_CSS_PERCENT),
1406 _gtk_css_number_value_new (100, GTK_CSS_PERCENT)));
1407 gtk_css_style_property_register ("border-image-width",
1408 GTK_CSS_PROPERTY_BORDER_IMAGE_WIDTH,
1411 border_image_width_parse,
1416 _gtk_css_border_value_new (_gtk_css_number_value_new (1, GTK_CSS_NUMBER),
1417 _gtk_css_number_value_new (1, GTK_CSS_NUMBER),
1418 _gtk_css_number_value_new (1, GTK_CSS_NUMBER),
1419 _gtk_css_number_value_new (1, GTK_CSS_NUMBER)));
1421 gtk_css_style_property_register ("transition-property",
1422 GTK_CSS_PROPERTY_TRANSITION_PROPERTY,
1425 transition_property_parse,
1430 _gtk_css_array_value_new (_gtk_css_ident_value_new ("all")));
1431 gtk_css_style_property_register ("transition-duration",
1432 GTK_CSS_PROPERTY_TRANSITION_DURATION,
1435 transition_time_parse,
1440 _gtk_css_array_value_new (_gtk_css_number_value_new (0, GTK_CSS_S)));
1441 gtk_css_style_property_register ("transition-timing-function",
1442 GTK_CSS_PROPERTY_TRANSITION_TIMING_FUNCTION,
1445 transition_timing_function_parse,
1450 _gtk_css_array_value_new (
1451 _gtk_css_ease_value_new_cubic_bezier (0.25, 0.1, 0.25, 1.0)));
1452 gtk_css_style_property_register ("transition-delay",
1453 GTK_CSS_PROPERTY_TRANSITION_DELAY,
1456 transition_time_parse,
1461 _gtk_css_array_value_new (_gtk_css_number_value_new (0, GTK_CSS_S)));
1463 gtk_css_style_property_register ("engine",
1464 GTK_CSS_PROPERTY_ENGINE,
1465 GTK_TYPE_THEMING_ENGINE,
1472 _gtk_css_engine_value_new (gtk_theming_engine_load (NULL)));
1474 /* Private property holding the binding sets */
1475 gtk_css_style_property_register ("gtk-key-bindings",
1476 GTK_CSS_PROPERTY_GTK_KEY_BINDINGS,
1479 bindings_value_parse,
1482 bindings_value_query,
1483 bindings_value_assign,
1484 _gtk_css_array_value_new (NULL));