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 "gtkanimationdescription.h"
42 #include "gtkbindings.h"
43 #include "gtkcssarrayvalueprivate.h"
44 #include "gtkcssbgsizevalueprivate.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 GtkCssStylePropertyEqualFunc equal_func,
81 GtkCssValue * initial_value)
83 GtkCssStyleProperty *node;
85 g_assert (initial_value != NULL);
86 g_assert (parse_value != NULL);
87 g_assert (value_type == G_TYPE_NONE || query_value != NULL);
88 g_assert (value_type == G_TYPE_NONE || assign_value != NULL);
90 node = g_object_new (GTK_TYPE_CSS_STYLE_PROPERTY,
91 "value-type", value_type,
92 "animated", (flags & GTK_STYLE_PROPERTY_ANIMATED) ? TRUE : FALSE,
93 "inherit", (flags & GTK_STYLE_PROPERTY_INHERIT) ? TRUE : FALSE,
94 "initial-value", initial_value,
98 node->parse_value = parse_value;
100 node->print_value = print_value;
102 node->compute_value = compute_value;
103 node->query_value = query_value;
104 node->assign_value = assign_value;
106 node->equal_func = equal_func;
108 _gtk_css_value_unref (initial_value);
110 g_assert (_gtk_css_style_property_get_id (node) == expected_id);
113 /*** IMPLEMENTATIONS ***/
116 query_simple (GtkCssStyleProperty *property,
117 const GtkCssValue *css_value,
120 _gtk_css_value_init_gvalue (css_value, value);
124 assign_simple (GtkCssStyleProperty *property,
127 return _gtk_css_value_new_from_gvalue (value);
131 query_length_as_int (GtkCssStyleProperty *property,
132 const GtkCssValue *css_value,
135 g_value_init (value, G_TYPE_INT);
136 g_value_set_int (value, round (_gtk_css_number_value_get (css_value, 100)));
140 assign_length_from_int (GtkCssStyleProperty *property,
143 return _gtk_css_number_value_new (g_value_get_int (value), GTK_CSS_PX);
147 query_length_as_double (GtkCssStyleProperty *property,
148 const GtkCssValue *css_value,
151 g_value_init (value, G_TYPE_DOUBLE);
152 g_value_set_double (value, _gtk_css_number_value_get (css_value, 100));
156 assign_length_from_double (GtkCssStyleProperty *property,
159 return _gtk_css_number_value_new (g_value_get_double (value), GTK_CSS_PX);
163 color_parse (GtkCssStyleProperty *property,
164 GtkCssParser *parser,
167 GtkSymbolicColor *symbolic;
169 if (_gtk_css_parser_try (parser, "currentcolor", TRUE))
171 symbolic = gtk_symbolic_color_ref (_gtk_symbolic_color_get_current_color ());
175 symbolic = _gtk_css_parser_read_symbolic_color (parser);
176 if (symbolic == NULL)
180 return _gtk_css_value_new_take_symbolic_color (symbolic);
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,
258 return _gtk_css_array_value_parse (parser, font_family_parse_one, FALSE);
262 font_family_query (GtkCssStyleProperty *property,
263 const GtkCssValue *css_value,
269 array = g_ptr_array_new ();
271 for (i = 0; i < _gtk_css_array_value_get_n_values (css_value); i++)
273 g_ptr_array_add (array, g_strdup (_gtk_css_string_value_get (_gtk_css_array_value_get_nth (css_value, i))));
277 g_ptr_array_add (array, NULL);
279 g_value_init (value, G_TYPE_STRV);
280 g_value_set_boxed (value, g_ptr_array_free (array, FALSE));
284 font_family_assign (GtkCssStyleProperty *property,
287 const char **names = g_value_get_boxed (value);
291 array = g_ptr_array_new ();
293 for (names = g_value_get_boxed (value); *names; names++)
295 g_ptr_array_add (array, _gtk_css_string_value_new (*names));
298 result = _gtk_css_array_value_new_from_array ((GtkCssValue **) array->pdata, array->len);
299 g_ptr_array_free (array, TRUE);
304 parse_pango_style (GtkCssStyleProperty *property,
305 GtkCssParser *parser,
308 GtkCssValue *value = _gtk_css_font_style_value_try_parse (parser);
311 _gtk_css_parser_error (parser, "unknown value for property");
317 query_pango_style (GtkCssStyleProperty *property,
318 const GtkCssValue *css_value,
321 g_value_init (value, PANGO_TYPE_STYLE);
322 g_value_set_enum (value, _gtk_css_font_style_value_get (css_value));
326 assign_pango_style (GtkCssStyleProperty *property,
329 return _gtk_css_font_style_value_new (g_value_get_enum (value));
333 parse_pango_weight (GtkCssStyleProperty *property,
334 GtkCssParser *parser,
337 GtkCssValue *value = _gtk_css_font_weight_value_try_parse (parser);
340 _gtk_css_parser_error (parser, "unknown value for property");
346 query_pango_weight (GtkCssStyleProperty *property,
347 const GtkCssValue *css_value,
350 g_value_init (value, PANGO_TYPE_WEIGHT);
351 g_value_set_enum (value, _gtk_css_font_weight_value_get (css_value));
355 assign_pango_weight (GtkCssStyleProperty *property,
358 return _gtk_css_font_weight_value_new (g_value_get_enum (value));
362 parse_pango_variant (GtkCssStyleProperty *property,
363 GtkCssParser *parser,
366 GtkCssValue *value = _gtk_css_font_variant_value_try_parse (parser);
369 _gtk_css_parser_error (parser, "unknown value for property");
375 query_pango_variant (GtkCssStyleProperty *property,
376 const GtkCssValue *css_value,
379 g_value_init (value, PANGO_TYPE_VARIANT);
380 g_value_set_enum (value, _gtk_css_font_variant_value_get (css_value));
384 assign_pango_variant (GtkCssStyleProperty *property,
387 return _gtk_css_font_variant_value_new (g_value_get_enum (value));
391 parse_border_style (GtkCssStyleProperty *property,
392 GtkCssParser *parser,
395 GtkCssValue *value = _gtk_css_border_style_value_try_parse (parser);
398 _gtk_css_parser_error (parser, "unknown value for property");
404 query_border_style (GtkCssStyleProperty *property,
405 const GtkCssValue *css_value,
408 g_value_init (value, GTK_TYPE_BORDER_STYLE);
409 g_value_set_enum (value, _gtk_css_border_style_value_get (css_value));
413 assign_border_style (GtkCssStyleProperty *property,
416 return _gtk_css_border_style_value_new (g_value_get_enum (value));
420 parse_css_area (GtkCssStyleProperty *property,
421 GtkCssParser *parser,
424 GtkCssValue *value = _gtk_css_area_value_try_parse (parser);
427 _gtk_css_parser_error (parser, "unknown value for property");
433 bindings_value_parse_one (GtkCssParser *parser)
437 name = _gtk_css_parser_try_ident (parser, TRUE);
440 _gtk_css_parser_error (parser, "Not a valid binding name");
445 if (!gtk_binding_set_find (name))
447 _gtk_css_parser_error (parser, "No binding set named '%s'", name);
452 return _gtk_css_string_value_new_take (name);
456 bindings_value_parse (GtkCssStyleProperty *property,
457 GtkCssParser *parser,
460 return _gtk_css_array_value_parse (parser, bindings_value_parse_one, TRUE);
464 bindings_value_query (GtkCssStyleProperty *property,
465 const GtkCssValue *css_value,
471 g_value_init (value, G_TYPE_PTR_ARRAY);
473 if (_gtk_css_array_value_get_n_values (css_value) == 0)
476 array = g_ptr_array_new ();
478 for (i = 0; i < _gtk_css_array_value_get_n_values (css_value); i++)
480 GtkBindingSet *binding_set = gtk_binding_set_find (_gtk_css_string_value_get (_gtk_css_array_value_get_nth (css_value, i)));
482 g_ptr_array_add (array, binding_set);
485 g_value_take_boxed (value, array);
489 bindings_value_assign (GtkCssStyleProperty *property,
492 GPtrArray *binding_sets = g_value_get_boxed (value);
493 GtkCssValue **values, *result;
496 if (binding_sets == NULL || binding_sets->len == 0)
497 return _gtk_css_array_value_new (NULL);
499 values = g_new (GtkCssValue *, binding_sets->len);
501 for (i = 0; i < binding_sets->len; i++)
503 GtkBindingSet *binding_set = g_ptr_array_index (binding_sets, i);
504 values[i] = _gtk_css_string_value_new (binding_set->set_name);
507 result = _gtk_css_array_value_new_from_array (values, binding_sets->len);
513 shadow_value_parse (GtkCssStyleProperty *property,
514 GtkCssParser *parser,
517 return _gtk_css_shadows_value_parse (parser);
521 shadow_value_compute (GtkCssStyleProperty *property,
522 GtkStyleContext *context,
523 GtkCssValue *specified)
525 return _gtk_css_shadows_value_compute (specified, context);
529 border_corner_radius_value_parse (GtkCssStyleProperty *property,
530 GtkCssParser *parser,
533 return _gtk_css_corner_value_parse (parser);
537 border_corner_radius_value_compute (GtkCssStyleProperty *property,
538 GtkStyleContext *context,
539 GtkCssValue *specified)
541 return _gtk_css_corner_value_compute (specified, context);
545 css_image_value_parse (GtkCssStyleProperty *property,
546 GtkCssParser *parser,
551 if (_gtk_css_parser_try (parser, "none", TRUE))
555 image = _gtk_css_image_new_parse (parser, base);
560 return _gtk_css_image_value_new (image);
564 css_image_value_compute (GtkCssStyleProperty *property,
565 GtkStyleContext *context,
566 GtkCssValue *specified)
568 GtkCssImage *image, *computed;
570 image = _gtk_css_image_value_get_image (specified);
573 return _gtk_css_value_ref (specified);
575 computed = _gtk_css_image_compute (image, context);
577 if (computed == image)
579 g_object_unref (computed);
580 return _gtk_css_value_ref (specified);
583 return _gtk_css_image_value_new (computed);
587 css_image_value_query (GtkCssStyleProperty *property,
588 const GtkCssValue *css_value,
591 GtkCssImage *image = _gtk_css_image_value_get_image (css_value);
592 cairo_pattern_t *pattern;
593 cairo_surface_t *surface;
594 cairo_matrix_t matrix;
596 g_value_init (value, CAIRO_GOBJECT_TYPE_PATTERN);
598 if (GTK_IS_CSS_IMAGE_GRADIENT (image))
599 g_value_set_boxed (value, GTK_CSS_IMAGE_GRADIENT (image)->pattern);
600 else if (image != NULL)
602 double width, height;
604 /* the 100, 100 is rather random */
605 _gtk_css_image_get_concrete_size (image, 0, 0, 100, 100, &width, &height);
606 surface = _gtk_css_image_get_surface (image, NULL, width, height);
607 pattern = cairo_pattern_create_for_surface (surface);
608 cairo_matrix_init_scale (&matrix, width, height);
609 cairo_pattern_set_matrix (pattern, &matrix);
610 cairo_surface_destroy (surface);
611 g_value_take_boxed (value, pattern);
616 css_image_value_assign (GtkCssStyleProperty *property,
619 g_warning ("FIXME: assigning images is not implemented");
620 return _gtk_css_image_value_new (NULL);
624 font_size_parse (GtkCssStyleProperty *property,
625 GtkCssParser *parser,
630 if (!_gtk_css_parser_try_double (parser, &d))
632 _gtk_css_parser_error (parser, "Expected a number");
636 return _gtk_css_number_value_new (d, GTK_CSS_PX);
640 font_size_compute (GtkCssStyleProperty *property,
641 GtkStyleContext *context,
642 GtkCssValue *specified)
644 return _gtk_css_number_value_compute (specified, context);
648 outline_parse (GtkCssStyleProperty *property,
649 GtkCssParser *parser,
652 return _gtk_css_number_value_parse (parser,
653 GTK_CSS_NUMBER_AS_PIXELS
654 | GTK_CSS_PARSE_LENGTH);
658 outline_compute (GtkCssStyleProperty *property,
659 GtkStyleContext *context,
660 GtkCssValue *specified)
662 return _gtk_css_number_value_compute (specified, context);
666 border_image_repeat_parse (GtkCssStyleProperty *property,
667 GtkCssParser *parser,
670 GtkCssValue *value = _gtk_css_border_repeat_value_try_parse (parser);
674 _gtk_css_parser_error (parser, "Not a valid value");
682 border_image_slice_parse (GtkCssStyleProperty *property,
683 GtkCssParser *parser,
686 GValue value = G_VALUE_INIT;
689 g_value_init (&value, GTK_TYPE_BORDER);
690 if (!_gtk_css_style_parse_value (&value, parser, base))
692 g_value_unset (&value);
696 result = _gtk_css_value_new_from_gvalue (&value);
697 g_value_unset (&value);
703 border_image_width_parse (GtkCssStyleProperty *property,
704 GtkCssParser *parser,
707 GValue value = G_VALUE_INIT;
710 g_value_init (&value, GTK_TYPE_BORDER);
711 if (!_gtk_css_style_parse_value (&value, parser, base))
713 g_value_unset (&value);
717 result = _gtk_css_value_new_from_gvalue (&value);
718 g_value_unset (&value);
724 transition_property_parse_one (GtkCssParser *parser)
728 value = _gtk_css_ident_value_try_parse (parser);
732 _gtk_css_parser_error (parser, "Expected an identifier");
740 transition_property_parse (GtkCssStyleProperty *property,
741 GtkCssParser *parser,
744 return _gtk_css_array_value_parse (parser, transition_property_parse_one, FALSE);
748 transition_time_parse_one (GtkCssParser *parser)
750 return _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_TIME);
754 transition_time_parse (GtkCssStyleProperty *property,
755 GtkCssParser *parser,
758 return _gtk_css_array_value_parse (parser, transition_time_parse_one, FALSE);
762 transition_timing_function_parse (GtkCssStyleProperty *property,
763 GtkCssParser *parser,
766 return _gtk_css_array_value_parse (parser, _gtk_css_ease_value_parse, FALSE);
770 engine_parse (GtkCssStyleProperty *property,
771 GtkCssParser *parser,
774 return _gtk_css_engine_value_parse (parser);
778 engine_query (GtkCssStyleProperty *property,
779 const GtkCssValue *css_value,
782 g_value_init (value, GTK_TYPE_THEMING_ENGINE);
783 g_value_set_object (value, _gtk_css_engine_value_get_engine (css_value));
787 engine_assign (GtkCssStyleProperty *property,
790 return _gtk_css_engine_value_new (g_value_get_object (value));
794 transition_parse (GtkCssStyleProperty *property,
795 GtkCssParser *parser,
798 GValue value = G_VALUE_INIT;
801 g_value_init (&value, GTK_TYPE_ANIMATION_DESCRIPTION);
802 if (!_gtk_css_style_parse_value (&value, parser, base))
804 g_value_unset (&value);
808 result = _gtk_css_value_new_from_gvalue (&value);
809 g_value_unset (&value);
815 parse_margin (GtkCssStyleProperty *property,
816 GtkCssParser *parser,
819 return _gtk_css_number_value_parse (parser,
820 GTK_CSS_NUMBER_AS_PIXELS
821 | GTK_CSS_PARSE_LENGTH);
825 compute_margin (GtkCssStyleProperty *property,
826 GtkStyleContext *context,
827 GtkCssValue *specified)
829 return _gtk_css_number_value_compute (specified, context);
833 parse_padding (GtkCssStyleProperty *property,
834 GtkCssParser *parser,
837 return _gtk_css_number_value_parse (parser,
838 GTK_CSS_POSITIVE_ONLY
839 | GTK_CSS_NUMBER_AS_PIXELS
840 | GTK_CSS_PARSE_LENGTH);
844 compute_padding (GtkCssStyleProperty *property,
845 GtkStyleContext *context,
846 GtkCssValue *specified)
848 return _gtk_css_number_value_compute (specified, context);
852 parse_border_width (GtkCssStyleProperty *property,
853 GtkCssParser *parser,
856 return _gtk_css_number_value_parse (parser,
857 GTK_CSS_POSITIVE_ONLY
858 | GTK_CSS_NUMBER_AS_PIXELS
859 | GTK_CSS_PARSE_LENGTH);
863 compute_border_width (GtkCssStyleProperty *property,
864 GtkStyleContext *context,
865 GtkCssValue *specified)
867 GtkBorderStyle border_style;
869 /* The -1 is magic that is only true because we register the style
870 * properties directly after the width properties.
872 border_style = _gtk_css_border_style_value_get (_gtk_style_context_peek_property (context, _gtk_css_style_property_get_id (property) - 1));
874 if (border_style == GTK_BORDER_STYLE_NONE ||
875 border_style == GTK_BORDER_STYLE_HIDDEN)
876 return _gtk_css_number_value_new (0, GTK_CSS_PX);
878 return _gtk_css_number_value_compute (specified, context);
882 background_repeat_value_parse (GtkCssStyleProperty *property,
883 GtkCssParser *parser,
886 GtkCssValue *value = _gtk_css_background_repeat_value_try_parse (parser);
890 _gtk_css_parser_error (parser, "Not a valid value");
898 background_size_parse (GtkCssStyleProperty *property,
899 GtkCssParser *parser,
902 return _gtk_css_bg_size_value_parse (parser);
906 background_size_compute (GtkCssStyleProperty *property,
907 GtkStyleContext *context,
908 GtkCssValue *specified)
910 return _gtk_css_bg_size_value_compute (specified, context);
914 background_position_parse (GtkCssStyleProperty *property,
915 GtkCssParser *parser,
918 return _gtk_css_position_value_parse (parser);
922 background_position_compute (GtkCssStyleProperty *property,
923 GtkStyleContext *context,
924 GtkCssValue *specified)
926 return _gtk_css_position_value_compute (specified, context);
929 /*** REGISTRATION ***/
931 static GtkSymbolicColor *
932 gtk_symbolic_color_new_rgba (double red,
937 GdkRGBA rgba = { red, green, blue, alpha };
939 return gtk_symbolic_color_new_literal (&rgba);
943 _gtk_css_style_property_init_properties (void)
945 GtkBorder border_of_ones = { 1, 1, 1, 1 };
947 /* Initialize "color" and "font-size" first,
948 * so that when computing values later they are
949 * done first. That way, 'currentColor' and font
950 * sizes in em can be looked up properly */
951 gtk_css_style_property_register ("color",
952 GTK_CSS_PROPERTY_COLOR,
954 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
957 color_property_compute,
961 _gtk_css_value_new_take_symbolic_color (
962 gtk_symbolic_color_new_rgba (1, 1, 1, 1)));
963 gtk_css_style_property_register ("font-size",
964 GTK_CSS_PROPERTY_FONT_SIZE,
966 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
970 query_length_as_double,
971 assign_length_from_double,
973 /* XXX: This should be 'normal' */
974 _gtk_css_number_value_new (10.0, GTK_CSS_PX));
976 /* properties that aren't referenced when computing values
978 gtk_css_style_property_register ("background-color",
979 GTK_CSS_PROPERTY_BACKGROUND_COLOR,
981 GTK_STYLE_PROPERTY_ANIMATED,
988 _gtk_css_value_new_take_symbolic_color (
989 gtk_symbolic_color_new_rgba (0, 0, 0, 0)));
991 gtk_css_style_property_register ("font-family",
992 GTK_CSS_PROPERTY_FONT_FAMILY,
994 GTK_STYLE_PROPERTY_INHERIT,
1001 _gtk_css_array_value_new (_gtk_css_string_value_new ("Sans")));
1002 gtk_css_style_property_register ("font-style",
1003 GTK_CSS_PROPERTY_FONT_STYLE,
1005 GTK_STYLE_PROPERTY_INHERIT,
1012 _gtk_css_font_style_value_new (PANGO_STYLE_NORMAL));
1013 gtk_css_style_property_register ("font-variant",
1014 GTK_CSS_PROPERTY_FONT_VARIANT,
1016 GTK_STYLE_PROPERTY_INHERIT,
1017 parse_pango_variant,
1020 query_pango_variant,
1021 assign_pango_variant,
1023 _gtk_css_font_variant_value_new (PANGO_VARIANT_NORMAL));
1024 gtk_css_style_property_register ("font-weight",
1025 GTK_CSS_PROPERTY_FONT_WEIGHT,
1027 GTK_STYLE_PROPERTY_INHERIT,
1032 assign_pango_weight,
1034 _gtk_css_font_weight_value_new (PANGO_WEIGHT_NORMAL));
1036 gtk_css_style_property_register ("text-shadow",
1037 GTK_CSS_PROPERTY_TEXT_SHADOW,
1039 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
1042 shadow_value_compute,
1046 _gtk_css_shadows_value_new_none ());
1048 gtk_css_style_property_register ("icon-shadow",
1049 GTK_CSS_PROPERTY_ICON_SHADOW,
1051 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
1054 shadow_value_compute,
1058 _gtk_css_shadows_value_new_none ());
1060 gtk_css_style_property_register ("box-shadow",
1061 GTK_CSS_PROPERTY_BOX_SHADOW,
1063 GTK_STYLE_PROPERTY_ANIMATED,
1066 shadow_value_compute,
1070 _gtk_css_shadows_value_new_none ());
1072 gtk_css_style_property_register ("margin-top",
1073 GTK_CSS_PROPERTY_MARGIN_TOP,
1075 GTK_STYLE_PROPERTY_ANIMATED,
1079 query_length_as_int,
1080 assign_length_from_int,
1082 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1083 gtk_css_style_property_register ("margin-left",
1084 GTK_CSS_PROPERTY_MARGIN_LEFT,
1086 GTK_STYLE_PROPERTY_ANIMATED,
1090 query_length_as_int,
1091 assign_length_from_int,
1093 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1094 gtk_css_style_property_register ("margin-bottom",
1095 GTK_CSS_PROPERTY_MARGIN_BOTTOM,
1097 GTK_STYLE_PROPERTY_ANIMATED,
1101 query_length_as_int,
1102 assign_length_from_int,
1104 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1105 gtk_css_style_property_register ("margin-right",
1106 GTK_CSS_PROPERTY_MARGIN_RIGHT,
1108 GTK_STYLE_PROPERTY_ANIMATED,
1112 query_length_as_int,
1113 assign_length_from_int,
1115 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1116 gtk_css_style_property_register ("padding-top",
1117 GTK_CSS_PROPERTY_PADDING_TOP,
1119 GTK_STYLE_PROPERTY_ANIMATED,
1123 query_length_as_int,
1124 assign_length_from_int,
1126 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1127 gtk_css_style_property_register ("padding-left",
1128 GTK_CSS_PROPERTY_PADDING_LEFT,
1130 GTK_STYLE_PROPERTY_ANIMATED,
1134 query_length_as_int,
1135 assign_length_from_int,
1137 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1138 gtk_css_style_property_register ("padding-bottom",
1139 GTK_CSS_PROPERTY_PADDING_BOTTOM,
1141 GTK_STYLE_PROPERTY_ANIMATED,
1145 query_length_as_int,
1146 assign_length_from_int,
1148 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1149 gtk_css_style_property_register ("padding-right",
1150 GTK_CSS_PROPERTY_PADDING_RIGHT,
1152 GTK_STYLE_PROPERTY_ANIMATED,
1156 query_length_as_int,
1157 assign_length_from_int,
1159 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1160 /* IMPORTANT: compute_border_width() requires that the border-width
1161 * properties be immeditaly followed by the border-style properties
1163 gtk_css_style_property_register ("border-top-style",
1164 GTK_CSS_PROPERTY_BORDER_TOP_STYLE,
1165 GTK_TYPE_BORDER_STYLE,
1171 assign_border_style,
1173 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1174 gtk_css_style_property_register ("border-top-width",
1175 GTK_CSS_PROPERTY_BORDER_TOP_WIDTH,
1177 GTK_STYLE_PROPERTY_ANIMATED,
1180 compute_border_width,
1181 query_length_as_int,
1182 assign_length_from_int,
1184 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1185 gtk_css_style_property_register ("border-left-style",
1186 GTK_CSS_PROPERTY_BORDER_LEFT_STYLE,
1187 GTK_TYPE_BORDER_STYLE,
1193 assign_border_style,
1195 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1196 gtk_css_style_property_register ("border-left-width",
1197 GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH,
1199 GTK_STYLE_PROPERTY_ANIMATED,
1202 compute_border_width,
1203 query_length_as_int,
1204 assign_length_from_int,
1206 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1207 gtk_css_style_property_register ("border-bottom-style",
1208 GTK_CSS_PROPERTY_BORDER_BOTTOM_STYLE,
1209 GTK_TYPE_BORDER_STYLE,
1215 assign_border_style,
1217 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1218 gtk_css_style_property_register ("border-bottom-width",
1219 GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH,
1221 GTK_STYLE_PROPERTY_ANIMATED,
1224 compute_border_width,
1225 query_length_as_int,
1226 assign_length_from_int,
1228 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1229 gtk_css_style_property_register ("border-right-style",
1230 GTK_CSS_PROPERTY_BORDER_RIGHT_STYLE,
1231 GTK_TYPE_BORDER_STYLE,
1237 assign_border_style,
1239 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1240 gtk_css_style_property_register ("border-right-width",
1241 GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH,
1243 GTK_STYLE_PROPERTY_ANIMATED,
1246 compute_border_width,
1247 query_length_as_int,
1248 assign_length_from_int,
1250 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1252 gtk_css_style_property_register ("border-top-left-radius",
1253 GTK_CSS_PROPERTY_BORDER_TOP_LEFT_RADIUS,
1255 GTK_STYLE_PROPERTY_ANIMATED,
1256 border_corner_radius_value_parse,
1258 border_corner_radius_value_compute,
1262 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1263 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1264 gtk_css_style_property_register ("border-top-right-radius",
1265 GTK_CSS_PROPERTY_BORDER_TOP_RIGHT_RADIUS,
1267 GTK_STYLE_PROPERTY_ANIMATED,
1268 border_corner_radius_value_parse,
1270 border_corner_radius_value_compute,
1274 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1275 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1276 gtk_css_style_property_register ("border-bottom-right-radius",
1277 GTK_CSS_PROPERTY_BORDER_BOTTOM_RIGHT_RADIUS,
1279 GTK_STYLE_PROPERTY_ANIMATED,
1280 border_corner_radius_value_parse,
1282 border_corner_radius_value_compute,
1286 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1287 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1288 gtk_css_style_property_register ("border-bottom-left-radius",
1289 GTK_CSS_PROPERTY_BORDER_BOTTOM_LEFT_RADIUS,
1291 GTK_STYLE_PROPERTY_ANIMATED,
1292 border_corner_radius_value_parse,
1294 border_corner_radius_value_compute,
1298 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1299 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1301 gtk_css_style_property_register ("outline-style",
1302 GTK_CSS_PROPERTY_OUTLINE_STYLE,
1303 GTK_TYPE_BORDER_STYLE,
1309 assign_border_style,
1311 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1312 gtk_css_style_property_register ("outline-width",
1313 GTK_CSS_PROPERTY_OUTLINE_WIDTH,
1315 GTK_STYLE_PROPERTY_ANIMATED,
1318 compute_border_width,
1319 query_length_as_int,
1320 assign_length_from_int,
1322 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1323 gtk_css_style_property_register ("outline-offset",
1324 GTK_CSS_PROPERTY_OUTLINE_OFFSET,
1330 query_length_as_int,
1331 assign_length_from_int,
1333 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1335 gtk_css_style_property_register ("background-clip",
1336 GTK_CSS_PROPERTY_BACKGROUND_CLIP,
1345 _gtk_css_area_value_new (GTK_CSS_AREA_BORDER_BOX));
1346 gtk_css_style_property_register ("background-origin",
1347 GTK_CSS_PROPERTY_BACKGROUND_ORIGIN,
1356 _gtk_css_area_value_new (GTK_CSS_AREA_PADDING_BOX));
1357 gtk_css_style_property_register ("background-size",
1358 GTK_CSS_PROPERTY_BACKGROUND_SIZE,
1361 background_size_parse,
1363 background_size_compute,
1367 _gtk_css_bg_size_value_new (NULL, NULL));
1368 gtk_css_style_property_register ("background-position",
1369 GTK_CSS_PROPERTY_BACKGROUND_POSITION,
1371 GTK_STYLE_PROPERTY_ANIMATED,
1372 background_position_parse,
1374 background_position_compute,
1378 _gtk_css_position_value_new (_gtk_css_number_value_new (0, GTK_CSS_PERCENT),
1379 _gtk_css_number_value_new (0, GTK_CSS_PERCENT)));
1381 gtk_css_style_property_register ("border-top-color",
1382 GTK_CSS_PROPERTY_BORDER_TOP_COLOR,
1384 GTK_STYLE_PROPERTY_ANIMATED,
1391 _gtk_css_value_new_take_symbolic_color (
1392 gtk_symbolic_color_ref (
1393 _gtk_symbolic_color_get_current_color ())));
1394 gtk_css_style_property_register ("border-right-color",
1395 GTK_CSS_PROPERTY_BORDER_RIGHT_COLOR,
1397 GTK_STYLE_PROPERTY_ANIMATED,
1404 _gtk_css_value_new_take_symbolic_color (
1405 gtk_symbolic_color_ref (
1406 _gtk_symbolic_color_get_current_color ())));
1407 gtk_css_style_property_register ("border-bottom-color",
1408 GTK_CSS_PROPERTY_BORDER_BOTTOM_COLOR,
1410 GTK_STYLE_PROPERTY_ANIMATED,
1417 _gtk_css_value_new_take_symbolic_color (
1418 gtk_symbolic_color_ref (
1419 _gtk_symbolic_color_get_current_color ())));
1420 gtk_css_style_property_register ("border-left-color",
1421 GTK_CSS_PROPERTY_BORDER_LEFT_COLOR,
1423 GTK_STYLE_PROPERTY_ANIMATED,
1430 _gtk_css_value_new_take_symbolic_color (
1431 gtk_symbolic_color_ref (
1432 _gtk_symbolic_color_get_current_color ())));
1433 gtk_css_style_property_register ("outline-color",
1434 GTK_CSS_PROPERTY_OUTLINE_COLOR,
1436 GTK_STYLE_PROPERTY_ANIMATED,
1443 _gtk_css_value_new_take_symbolic_color (
1444 gtk_symbolic_color_ref (
1445 _gtk_symbolic_color_get_current_color ())));
1447 gtk_css_style_property_register ("background-repeat",
1448 GTK_CSS_PROPERTY_BACKGROUND_REPEAT,
1451 background_repeat_value_parse,
1457 _gtk_css_background_repeat_value_new (GTK_CSS_REPEAT_STYLE_REPEAT,
1458 GTK_CSS_REPEAT_STYLE_REPEAT));
1459 gtk_css_style_property_register ("background-image",
1460 GTK_CSS_PROPERTY_BACKGROUND_IMAGE,
1461 CAIRO_GOBJECT_TYPE_PATTERN,
1462 GTK_STYLE_PROPERTY_ANIMATED,
1463 css_image_value_parse,
1465 css_image_value_compute,
1466 css_image_value_query,
1467 css_image_value_assign,
1469 _gtk_css_image_value_new (NULL));
1471 gtk_css_style_property_register ("border-image-source",
1472 GTK_CSS_PROPERTY_BORDER_IMAGE_SOURCE,
1473 CAIRO_GOBJECT_TYPE_PATTERN,
1474 GTK_STYLE_PROPERTY_ANIMATED,
1475 css_image_value_parse,
1477 css_image_value_compute,
1478 css_image_value_query,
1479 css_image_value_assign,
1481 _gtk_css_image_value_new (NULL));
1482 gtk_css_style_property_register ("border-image-repeat",
1483 GTK_CSS_PROPERTY_BORDER_IMAGE_REPEAT,
1486 border_image_repeat_parse,
1492 _gtk_css_border_repeat_value_new (GTK_CSS_REPEAT_STYLE_STRETCH,
1493 GTK_CSS_REPEAT_STYLE_STRETCH));
1495 /* XXX: The initial value is wrong, it should be 100% */
1496 gtk_css_style_property_register ("border-image-slice",
1497 GTK_CSS_PROPERTY_BORDER_IMAGE_SLICE,
1500 border_image_slice_parse,
1506 _gtk_css_value_new_from_boxed (GTK_TYPE_BORDER, &border_of_ones));
1507 gtk_css_style_property_register ("border-image-width",
1508 GTK_CSS_PROPERTY_BORDER_IMAGE_WIDTH,
1511 border_image_width_parse,
1517 _gtk_css_value_new_from_boxed (GTK_TYPE_BORDER, NULL));
1519 gtk_css_style_property_register ("transition-property",
1520 GTK_CSS_PROPERTY_TRANSITION_PROPERTY,
1523 transition_property_parse,
1529 _gtk_css_array_value_new (_gtk_css_ident_value_new ("all")));
1530 gtk_css_style_property_register ("transition-duration",
1531 GTK_CSS_PROPERTY_TRANSITION_DURATION,
1534 transition_time_parse,
1540 _gtk_css_array_value_new (_gtk_css_number_value_new (0, GTK_CSS_S)));
1541 gtk_css_style_property_register ("transition-timing-function",
1542 GTK_CSS_PROPERTY_TRANSITION_TIMING_FUNCTION,
1545 transition_timing_function_parse,
1551 _gtk_css_array_value_new (
1552 _gtk_css_ease_value_new_cubic_bezier (0.25, 0.1, 0.25, 1.0)));
1553 gtk_css_style_property_register ("transition-delay",
1554 GTK_CSS_PROPERTY_TRANSITION_DELAY,
1557 transition_time_parse,
1563 _gtk_css_array_value_new (_gtk_css_number_value_new (0, GTK_CSS_S)));
1565 gtk_css_style_property_register ("engine",
1566 GTK_CSS_PROPERTY_ENGINE,
1567 GTK_TYPE_THEMING_ENGINE,
1575 _gtk_css_engine_value_new (gtk_theming_engine_load (NULL)));
1576 gtk_css_style_property_register ("transition",
1577 GTK_CSS_PROPERTY_TRANSITION,
1578 GTK_TYPE_ANIMATION_DESCRIPTION,
1586 _gtk_css_value_new_from_boxed (GTK_TYPE_ANIMATION_DESCRIPTION, NULL));
1588 /* Private property holding the binding sets */
1589 gtk_css_style_property_register ("gtk-key-bindings",
1590 GTK_CSS_PROPERTY_GTK_KEY_BINDINGS,
1593 bindings_value_parse,
1596 bindings_value_query,
1597 bindings_value_assign,
1599 _gtk_css_array_value_new (NULL));