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_one (GtkCssParser *parser)
417 GtkCssValue *value = _gtk_css_area_value_try_parse (parser);
420 _gtk_css_parser_error (parser, "unknown value for property");
426 parse_css_area (GtkCssStyleProperty *property,
427 GtkCssParser *parser)
429 return _gtk_css_array_value_parse (parser, parse_css_area_one, FALSE);
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)
459 return _gtk_css_array_value_parse (parser, bindings_value_parse_one, TRUE);
463 bindings_value_query (GtkCssStyleProperty *property,
464 const GtkCssValue *css_value,
470 g_value_init (value, G_TYPE_PTR_ARRAY);
472 if (_gtk_css_array_value_get_n_values (css_value) == 0)
475 array = g_ptr_array_new ();
477 for (i = 0; i < _gtk_css_array_value_get_n_values (css_value); i++)
479 GtkBindingSet *binding_set = gtk_binding_set_find (_gtk_css_string_value_get (_gtk_css_array_value_get_nth (css_value, i)));
481 g_ptr_array_add (array, binding_set);
484 g_value_take_boxed (value, array);
488 bindings_value_assign (GtkCssStyleProperty *property,
491 GPtrArray *binding_sets = g_value_get_boxed (value);
492 GtkCssValue **values, *result;
495 if (binding_sets == NULL || binding_sets->len == 0)
496 return _gtk_css_array_value_new (NULL);
498 values = g_new (GtkCssValue *, binding_sets->len);
500 for (i = 0; i < binding_sets->len; i++)
502 GtkBindingSet *binding_set = g_ptr_array_index (binding_sets, i);
503 values[i] = _gtk_css_string_value_new (binding_set->set_name);
506 result = _gtk_css_array_value_new_from_array (values, binding_sets->len);
512 shadow_value_parse (GtkCssStyleProperty *property,
513 GtkCssParser *parser)
515 return _gtk_css_shadows_value_parse (parser);
519 shadow_value_compute (GtkCssStyleProperty *property,
520 GtkStyleContext *context,
521 GtkCssValue *specified)
523 return _gtk_css_shadows_value_compute (specified, context);
527 border_corner_radius_value_parse (GtkCssStyleProperty *property,
528 GtkCssParser *parser)
530 return _gtk_css_corner_value_parse (parser);
534 border_corner_radius_value_compute (GtkCssStyleProperty *property,
535 GtkStyleContext *context,
536 GtkCssValue *specified)
538 return _gtk_css_corner_value_compute (specified, context);
542 css_image_value_parse (GtkCssStyleProperty *property,
543 GtkCssParser *parser)
547 if (_gtk_css_parser_try (parser, "none", TRUE))
551 image = _gtk_css_image_new_parse (parser);
556 return _gtk_css_image_value_new (image);
560 css_image_value_compute (GtkCssStyleProperty *property,
561 GtkStyleContext *context,
562 GtkCssValue *specified)
564 GtkCssImage *image, *computed;
566 image = _gtk_css_image_value_get_image (specified);
569 return _gtk_css_value_ref (specified);
571 computed = _gtk_css_image_compute (image, context);
573 if (computed == image)
575 g_object_unref (computed);
576 return _gtk_css_value_ref (specified);
579 return _gtk_css_image_value_new (computed);
583 css_image_value_query (GtkCssStyleProperty *property,
584 const GtkCssValue *css_value,
587 GtkCssImage *image = _gtk_css_image_value_get_image (css_value);
588 cairo_pattern_t *pattern;
589 cairo_surface_t *surface;
590 cairo_matrix_t matrix;
592 g_value_init (value, CAIRO_GOBJECT_TYPE_PATTERN);
594 if (GTK_IS_CSS_IMAGE_GRADIENT (image))
595 g_value_set_boxed (value, GTK_CSS_IMAGE_GRADIENT (image)->pattern);
596 else if (image != NULL)
598 double width, height;
600 /* the 100, 100 is rather random */
601 _gtk_css_image_get_concrete_size (image, 0, 0, 100, 100, &width, &height);
602 surface = _gtk_css_image_get_surface (image, NULL, width, height);
603 pattern = cairo_pattern_create_for_surface (surface);
604 cairo_matrix_init_scale (&matrix, width, height);
605 cairo_pattern_set_matrix (pattern, &matrix);
606 cairo_surface_destroy (surface);
607 g_value_take_boxed (value, pattern);
612 css_image_value_assign (GtkCssStyleProperty *property,
615 g_warning ("FIXME: assigning images is not implemented");
616 return _gtk_css_image_value_new (NULL);
620 background_image_value_parse_one (GtkCssParser *parser)
622 return css_image_value_parse (NULL, parser);
626 background_image_value_parse (GtkCssStyleProperty *property,
627 GtkCssParser *parser)
629 return _gtk_css_array_value_parse (parser, background_image_value_parse_one, FALSE);
633 background_image_value_compute_one (GtkCssValue *value,
634 GtkStyleContext *context)
636 return css_image_value_compute (NULL, context, value);
640 background_image_value_compute (GtkCssStyleProperty *property,
641 GtkStyleContext *context,
642 GtkCssValue *specified)
644 return _gtk_css_array_value_compute (specified, background_image_value_compute_one, context);
648 background_image_value_query (GtkCssStyleProperty *property,
649 const GtkCssValue *css_value,
652 css_image_value_query (property, _gtk_css_array_value_get_nth (css_value, 0), value);
656 background_image_value_assign (GtkCssStyleProperty *property,
659 return _gtk_css_array_value_new (css_image_value_assign (property, value));
663 font_size_parse (GtkCssStyleProperty *property,
664 GtkCssParser *parser)
668 if (!_gtk_css_parser_try_double (parser, &d))
670 _gtk_css_parser_error (parser, "Expected a number");
674 return _gtk_css_number_value_new (d, GTK_CSS_PX);
678 font_size_compute (GtkCssStyleProperty *property,
679 GtkStyleContext *context,
680 GtkCssValue *specified)
682 return _gtk_css_number_value_compute (specified, context);
686 outline_parse (GtkCssStyleProperty *property,
687 GtkCssParser *parser)
689 return _gtk_css_number_value_parse (parser,
690 GTK_CSS_NUMBER_AS_PIXELS
691 | GTK_CSS_PARSE_LENGTH);
695 outline_compute (GtkCssStyleProperty *property,
696 GtkStyleContext *context,
697 GtkCssValue *specified)
699 return _gtk_css_number_value_compute (specified, context);
703 border_image_repeat_parse (GtkCssStyleProperty *property,
704 GtkCssParser *parser)
706 GtkCssValue *value = _gtk_css_border_repeat_value_try_parse (parser);
710 _gtk_css_parser_error (parser, "Not a valid value");
718 border_image_slice_parse (GtkCssStyleProperty *property,
719 GtkCssParser *parser)
721 return _gtk_css_border_value_parse (parser,
722 GTK_CSS_PARSE_PERCENT
723 | GTK_CSS_PARSE_NUMBER
724 | GTK_CSS_POSITIVE_ONLY,
730 border_image_width_parse (GtkCssStyleProperty *property,
731 GtkCssParser *parser)
733 return _gtk_css_border_value_parse (parser,
734 GTK_CSS_PARSE_PERCENT
735 | GTK_CSS_PARSE_LENGTH
736 | GTK_CSS_PARSE_NUMBER
737 | GTK_CSS_POSITIVE_ONLY,
743 compute_border (GtkCssStyleProperty *property,
744 GtkStyleContext *context,
745 GtkCssValue *specified)
747 return _gtk_css_border_value_compute (specified, context);
751 transition_property_parse_one (GtkCssParser *parser)
755 value = _gtk_css_ident_value_try_parse (parser);
759 _gtk_css_parser_error (parser, "Expected an identifier");
767 transition_property_parse (GtkCssStyleProperty *property,
768 GtkCssParser *parser)
770 return _gtk_css_array_value_parse (parser, transition_property_parse_one, FALSE);
774 transition_time_parse_one (GtkCssParser *parser)
776 return _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_TIME);
780 transition_time_parse (GtkCssStyleProperty *property,
781 GtkCssParser *parser)
783 return _gtk_css_array_value_parse (parser, transition_time_parse_one, FALSE);
787 transition_timing_function_parse (GtkCssStyleProperty *property,
788 GtkCssParser *parser)
790 return _gtk_css_array_value_parse (parser, _gtk_css_ease_value_parse, FALSE);
794 engine_parse (GtkCssStyleProperty *property,
795 GtkCssParser *parser)
797 return _gtk_css_engine_value_parse (parser);
801 engine_query (GtkCssStyleProperty *property,
802 const GtkCssValue *css_value,
805 g_value_init (value, GTK_TYPE_THEMING_ENGINE);
806 g_value_set_object (value, _gtk_css_engine_value_get_engine (css_value));
810 engine_assign (GtkCssStyleProperty *property,
813 return _gtk_css_engine_value_new (g_value_get_object (value));
817 parse_margin (GtkCssStyleProperty *property,
818 GtkCssParser *parser)
820 return _gtk_css_number_value_parse (parser,
821 GTK_CSS_NUMBER_AS_PIXELS
822 | GTK_CSS_PARSE_LENGTH);
826 compute_margin (GtkCssStyleProperty *property,
827 GtkStyleContext *context,
828 GtkCssValue *specified)
830 return _gtk_css_number_value_compute (specified, context);
834 parse_padding (GtkCssStyleProperty *property,
835 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)
855 return _gtk_css_number_value_parse (parser,
856 GTK_CSS_POSITIVE_ONLY
857 | GTK_CSS_NUMBER_AS_PIXELS
858 | GTK_CSS_PARSE_LENGTH);
862 compute_border_width (GtkCssStyleProperty *property,
863 GtkStyleContext *context,
864 GtkCssValue *specified)
866 GtkBorderStyle border_style;
868 /* The -1 is magic that is only true because we register the style
869 * properties directly after the width properties.
871 border_style = _gtk_css_border_style_value_get (_gtk_style_context_peek_property (context, _gtk_css_style_property_get_id (property) - 1));
873 if (border_style == GTK_BORDER_STYLE_NONE ||
874 border_style == GTK_BORDER_STYLE_HIDDEN)
875 return _gtk_css_number_value_new (0, GTK_CSS_PX);
877 return _gtk_css_number_value_compute (specified, context);
881 background_repeat_value_parse_one (GtkCssParser *parser)
883 GtkCssValue *value = _gtk_css_background_repeat_value_try_parse (parser);
887 _gtk_css_parser_error (parser, "Not a valid value");
895 background_repeat_value_parse (GtkCssStyleProperty *property,
896 GtkCssParser *parser)
898 return _gtk_css_array_value_parse (parser, background_repeat_value_parse_one, FALSE);
902 background_size_parse (GtkCssStyleProperty *property,
903 GtkCssParser *parser)
905 return _gtk_css_array_value_parse (parser, _gtk_css_bg_size_value_parse, FALSE);
909 background_size_compute (GtkCssStyleProperty *property,
910 GtkStyleContext *context,
911 GtkCssValue *specified)
913 return _gtk_css_array_value_compute (specified, _gtk_css_bg_size_value_compute, context);
917 background_position_parse (GtkCssStyleProperty *property,
918 GtkCssParser *parser)
920 return _gtk_css_array_value_parse (parser, _gtk_css_position_value_parse, FALSE);
924 background_position_compute (GtkCssStyleProperty *property,
925 GtkStyleContext *context,
926 GtkCssValue *specified)
928 return _gtk_css_array_value_compute (specified, _gtk_css_position_value_compute, context);
931 /*** REGISTRATION ***/
933 static GtkSymbolicColor *
934 gtk_symbolic_color_new_rgba (double red,
939 GdkRGBA rgba = { red, green, blue, alpha };
941 return gtk_symbolic_color_new_literal (&rgba);
945 _gtk_css_style_property_init_properties (void)
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,
960 _gtk_css_symbolic_value_new_take_symbolic_color (
961 gtk_symbolic_color_new_rgba (1, 1, 1, 1)));
962 gtk_css_style_property_register ("font-size",
963 GTK_CSS_PROPERTY_FONT_SIZE,
965 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
969 query_length_as_double,
970 assign_length_from_double,
971 /* XXX: This should be 'normal' */
972 _gtk_css_number_value_new (10.0, GTK_CSS_PX));
974 /* properties that aren't referenced when computing values
976 gtk_css_style_property_register ("background-color",
977 GTK_CSS_PROPERTY_BACKGROUND_COLOR,
979 GTK_STYLE_PROPERTY_ANIMATED,
985 _gtk_css_symbolic_value_new_take_symbolic_color (
986 gtk_symbolic_color_new_rgba (0, 0, 0, 0)));
988 gtk_css_style_property_register ("font-family",
989 GTK_CSS_PROPERTY_FONT_FAMILY,
991 GTK_STYLE_PROPERTY_INHERIT,
997 _gtk_css_array_value_new (_gtk_css_string_value_new ("Sans")));
998 gtk_css_style_property_register ("font-style",
999 GTK_CSS_PROPERTY_FONT_STYLE,
1001 GTK_STYLE_PROPERTY_INHERIT,
1007 _gtk_css_font_style_value_new (PANGO_STYLE_NORMAL));
1008 gtk_css_style_property_register ("font-variant",
1009 GTK_CSS_PROPERTY_FONT_VARIANT,
1011 GTK_STYLE_PROPERTY_INHERIT,
1012 parse_pango_variant,
1015 query_pango_variant,
1016 assign_pango_variant,
1017 _gtk_css_font_variant_value_new (PANGO_VARIANT_NORMAL));
1018 gtk_css_style_property_register ("font-weight",
1019 GTK_CSS_PROPERTY_FONT_WEIGHT,
1021 GTK_STYLE_PROPERTY_INHERIT,
1026 assign_pango_weight,
1027 _gtk_css_font_weight_value_new (PANGO_WEIGHT_NORMAL));
1029 gtk_css_style_property_register ("text-shadow",
1030 GTK_CSS_PROPERTY_TEXT_SHADOW,
1032 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
1035 shadow_value_compute,
1038 _gtk_css_shadows_value_new_none ());
1040 gtk_css_style_property_register ("icon-shadow",
1041 GTK_CSS_PROPERTY_ICON_SHADOW,
1043 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
1046 shadow_value_compute,
1049 _gtk_css_shadows_value_new_none ());
1051 gtk_css_style_property_register ("box-shadow",
1052 GTK_CSS_PROPERTY_BOX_SHADOW,
1054 GTK_STYLE_PROPERTY_ANIMATED,
1057 shadow_value_compute,
1060 _gtk_css_shadows_value_new_none ());
1062 gtk_css_style_property_register ("margin-top",
1063 GTK_CSS_PROPERTY_MARGIN_TOP,
1065 GTK_STYLE_PROPERTY_ANIMATED,
1069 query_length_as_int,
1070 assign_length_from_int,
1071 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1072 gtk_css_style_property_register ("margin-left",
1073 GTK_CSS_PROPERTY_MARGIN_LEFT,
1075 GTK_STYLE_PROPERTY_ANIMATED,
1079 query_length_as_int,
1080 assign_length_from_int,
1081 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1082 gtk_css_style_property_register ("margin-bottom",
1083 GTK_CSS_PROPERTY_MARGIN_BOTTOM,
1085 GTK_STYLE_PROPERTY_ANIMATED,
1089 query_length_as_int,
1090 assign_length_from_int,
1091 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1092 gtk_css_style_property_register ("margin-right",
1093 GTK_CSS_PROPERTY_MARGIN_RIGHT,
1095 GTK_STYLE_PROPERTY_ANIMATED,
1099 query_length_as_int,
1100 assign_length_from_int,
1101 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1102 gtk_css_style_property_register ("padding-top",
1103 GTK_CSS_PROPERTY_PADDING_TOP,
1105 GTK_STYLE_PROPERTY_ANIMATED,
1109 query_length_as_int,
1110 assign_length_from_int,
1111 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1112 gtk_css_style_property_register ("padding-left",
1113 GTK_CSS_PROPERTY_PADDING_LEFT,
1115 GTK_STYLE_PROPERTY_ANIMATED,
1119 query_length_as_int,
1120 assign_length_from_int,
1121 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1122 gtk_css_style_property_register ("padding-bottom",
1123 GTK_CSS_PROPERTY_PADDING_BOTTOM,
1125 GTK_STYLE_PROPERTY_ANIMATED,
1129 query_length_as_int,
1130 assign_length_from_int,
1131 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1132 gtk_css_style_property_register ("padding-right",
1133 GTK_CSS_PROPERTY_PADDING_RIGHT,
1135 GTK_STYLE_PROPERTY_ANIMATED,
1139 query_length_as_int,
1140 assign_length_from_int,
1141 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1142 /* IMPORTANT: compute_border_width() requires that the border-width
1143 * properties be immeditaly followed by the border-style properties
1145 gtk_css_style_property_register ("border-top-style",
1146 GTK_CSS_PROPERTY_BORDER_TOP_STYLE,
1147 GTK_TYPE_BORDER_STYLE,
1153 assign_border_style,
1154 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1155 gtk_css_style_property_register ("border-top-width",
1156 GTK_CSS_PROPERTY_BORDER_TOP_WIDTH,
1158 GTK_STYLE_PROPERTY_ANIMATED,
1161 compute_border_width,
1162 query_length_as_int,
1163 assign_length_from_int,
1164 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1165 gtk_css_style_property_register ("border-left-style",
1166 GTK_CSS_PROPERTY_BORDER_LEFT_STYLE,
1167 GTK_TYPE_BORDER_STYLE,
1173 assign_border_style,
1174 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1175 gtk_css_style_property_register ("border-left-width",
1176 GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH,
1178 GTK_STYLE_PROPERTY_ANIMATED,
1181 compute_border_width,
1182 query_length_as_int,
1183 assign_length_from_int,
1184 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1185 gtk_css_style_property_register ("border-bottom-style",
1186 GTK_CSS_PROPERTY_BORDER_BOTTOM_STYLE,
1187 GTK_TYPE_BORDER_STYLE,
1193 assign_border_style,
1194 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1195 gtk_css_style_property_register ("border-bottom-width",
1196 GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH,
1198 GTK_STYLE_PROPERTY_ANIMATED,
1201 compute_border_width,
1202 query_length_as_int,
1203 assign_length_from_int,
1204 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1205 gtk_css_style_property_register ("border-right-style",
1206 GTK_CSS_PROPERTY_BORDER_RIGHT_STYLE,
1207 GTK_TYPE_BORDER_STYLE,
1213 assign_border_style,
1214 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1215 gtk_css_style_property_register ("border-right-width",
1216 GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH,
1218 GTK_STYLE_PROPERTY_ANIMATED,
1221 compute_border_width,
1222 query_length_as_int,
1223 assign_length_from_int,
1224 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1226 gtk_css_style_property_register ("border-top-left-radius",
1227 GTK_CSS_PROPERTY_BORDER_TOP_LEFT_RADIUS,
1229 GTK_STYLE_PROPERTY_ANIMATED,
1230 border_corner_radius_value_parse,
1232 border_corner_radius_value_compute,
1235 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1236 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1237 gtk_css_style_property_register ("border-top-right-radius",
1238 GTK_CSS_PROPERTY_BORDER_TOP_RIGHT_RADIUS,
1240 GTK_STYLE_PROPERTY_ANIMATED,
1241 border_corner_radius_value_parse,
1243 border_corner_radius_value_compute,
1246 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1247 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1248 gtk_css_style_property_register ("border-bottom-right-radius",
1249 GTK_CSS_PROPERTY_BORDER_BOTTOM_RIGHT_RADIUS,
1251 GTK_STYLE_PROPERTY_ANIMATED,
1252 border_corner_radius_value_parse,
1254 border_corner_radius_value_compute,
1257 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1258 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1259 gtk_css_style_property_register ("border-bottom-left-radius",
1260 GTK_CSS_PROPERTY_BORDER_BOTTOM_LEFT_RADIUS,
1262 GTK_STYLE_PROPERTY_ANIMATED,
1263 border_corner_radius_value_parse,
1265 border_corner_radius_value_compute,
1268 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1269 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1271 gtk_css_style_property_register ("outline-style",
1272 GTK_CSS_PROPERTY_OUTLINE_STYLE,
1273 GTK_TYPE_BORDER_STYLE,
1279 assign_border_style,
1280 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1281 gtk_css_style_property_register ("outline-width",
1282 GTK_CSS_PROPERTY_OUTLINE_WIDTH,
1284 GTK_STYLE_PROPERTY_ANIMATED,
1287 compute_border_width,
1288 query_length_as_int,
1289 assign_length_from_int,
1290 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1291 gtk_css_style_property_register ("outline-offset",
1292 GTK_CSS_PROPERTY_OUTLINE_OFFSET,
1298 query_length_as_int,
1299 assign_length_from_int,
1300 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1302 gtk_css_style_property_register ("background-clip",
1303 GTK_CSS_PROPERTY_BACKGROUND_CLIP,
1311 _gtk_css_array_value_new (_gtk_css_area_value_new (GTK_CSS_AREA_BORDER_BOX)));
1312 gtk_css_style_property_register ("background-origin",
1313 GTK_CSS_PROPERTY_BACKGROUND_ORIGIN,
1321 _gtk_css_array_value_new (_gtk_css_area_value_new (GTK_CSS_AREA_PADDING_BOX)));
1322 gtk_css_style_property_register ("background-size",
1323 GTK_CSS_PROPERTY_BACKGROUND_SIZE,
1326 background_size_parse,
1328 background_size_compute,
1331 _gtk_css_array_value_new (_gtk_css_bg_size_value_new (NULL, NULL)));
1332 gtk_css_style_property_register ("background-position",
1333 GTK_CSS_PROPERTY_BACKGROUND_POSITION,
1335 GTK_STYLE_PROPERTY_ANIMATED,
1336 background_position_parse,
1338 background_position_compute,
1341 _gtk_css_array_value_new (_gtk_css_position_value_new (_gtk_css_number_value_new (0, GTK_CSS_PERCENT),
1342 _gtk_css_number_value_new (0, GTK_CSS_PERCENT))));
1344 gtk_css_style_property_register ("border-top-color",
1345 GTK_CSS_PROPERTY_BORDER_TOP_COLOR,
1347 GTK_STYLE_PROPERTY_ANIMATED,
1353 _gtk_css_symbolic_value_new_take_symbolic_color (
1354 gtk_symbolic_color_ref (
1355 _gtk_symbolic_color_get_current_color ())));
1356 gtk_css_style_property_register ("border-right-color",
1357 GTK_CSS_PROPERTY_BORDER_RIGHT_COLOR,
1359 GTK_STYLE_PROPERTY_ANIMATED,
1365 _gtk_css_symbolic_value_new_take_symbolic_color (
1366 gtk_symbolic_color_ref (
1367 _gtk_symbolic_color_get_current_color ())));
1368 gtk_css_style_property_register ("border-bottom-color",
1369 GTK_CSS_PROPERTY_BORDER_BOTTOM_COLOR,
1371 GTK_STYLE_PROPERTY_ANIMATED,
1377 _gtk_css_symbolic_value_new_take_symbolic_color (
1378 gtk_symbolic_color_ref (
1379 _gtk_symbolic_color_get_current_color ())));
1380 gtk_css_style_property_register ("border-left-color",
1381 GTK_CSS_PROPERTY_BORDER_LEFT_COLOR,
1383 GTK_STYLE_PROPERTY_ANIMATED,
1389 _gtk_css_symbolic_value_new_take_symbolic_color (
1390 gtk_symbolic_color_ref (
1391 _gtk_symbolic_color_get_current_color ())));
1392 gtk_css_style_property_register ("outline-color",
1393 GTK_CSS_PROPERTY_OUTLINE_COLOR,
1395 GTK_STYLE_PROPERTY_ANIMATED,
1401 _gtk_css_symbolic_value_new_take_symbolic_color (
1402 gtk_symbolic_color_ref (
1403 _gtk_symbolic_color_get_current_color ())));
1405 gtk_css_style_property_register ("background-repeat",
1406 GTK_CSS_PROPERTY_BACKGROUND_REPEAT,
1409 background_repeat_value_parse,
1414 _gtk_css_array_value_new (_gtk_css_background_repeat_value_new (GTK_CSS_REPEAT_STYLE_REPEAT,
1415 GTK_CSS_REPEAT_STYLE_REPEAT)));
1416 gtk_css_style_property_register ("background-image",
1417 GTK_CSS_PROPERTY_BACKGROUND_IMAGE,
1418 CAIRO_GOBJECT_TYPE_PATTERN,
1419 GTK_STYLE_PROPERTY_ANIMATED,
1420 background_image_value_parse,
1422 background_image_value_compute,
1423 background_image_value_query,
1424 background_image_value_assign,
1425 _gtk_css_array_value_new (_gtk_css_image_value_new (NULL)));
1427 gtk_css_style_property_register ("border-image-source",
1428 GTK_CSS_PROPERTY_BORDER_IMAGE_SOURCE,
1429 CAIRO_GOBJECT_TYPE_PATTERN,
1430 GTK_STYLE_PROPERTY_ANIMATED,
1431 css_image_value_parse,
1433 css_image_value_compute,
1434 css_image_value_query,
1435 css_image_value_assign,
1436 _gtk_css_image_value_new (NULL));
1437 gtk_css_style_property_register ("border-image-repeat",
1438 GTK_CSS_PROPERTY_BORDER_IMAGE_REPEAT,
1441 border_image_repeat_parse,
1446 _gtk_css_border_repeat_value_new (GTK_CSS_REPEAT_STYLE_STRETCH,
1447 GTK_CSS_REPEAT_STYLE_STRETCH));
1449 gtk_css_style_property_register ("border-image-slice",
1450 GTK_CSS_PROPERTY_BORDER_IMAGE_SLICE,
1453 border_image_slice_parse,
1458 _gtk_css_border_value_new (_gtk_css_number_value_new (100, GTK_CSS_PERCENT),
1459 _gtk_css_number_value_new (100, GTK_CSS_PERCENT),
1460 _gtk_css_number_value_new (100, GTK_CSS_PERCENT),
1461 _gtk_css_number_value_new (100, GTK_CSS_PERCENT)));
1462 gtk_css_style_property_register ("border-image-width",
1463 GTK_CSS_PROPERTY_BORDER_IMAGE_WIDTH,
1466 border_image_width_parse,
1471 _gtk_css_border_value_new (_gtk_css_number_value_new (1, GTK_CSS_NUMBER),
1472 _gtk_css_number_value_new (1, GTK_CSS_NUMBER),
1473 _gtk_css_number_value_new (1, GTK_CSS_NUMBER),
1474 _gtk_css_number_value_new (1, GTK_CSS_NUMBER)));
1476 gtk_css_style_property_register ("transition-property",
1477 GTK_CSS_PROPERTY_TRANSITION_PROPERTY,
1480 transition_property_parse,
1485 _gtk_css_array_value_new (_gtk_css_ident_value_new ("all")));
1486 gtk_css_style_property_register ("transition-duration",
1487 GTK_CSS_PROPERTY_TRANSITION_DURATION,
1490 transition_time_parse,
1495 _gtk_css_array_value_new (_gtk_css_number_value_new (0, GTK_CSS_S)));
1496 gtk_css_style_property_register ("transition-timing-function",
1497 GTK_CSS_PROPERTY_TRANSITION_TIMING_FUNCTION,
1500 transition_timing_function_parse,
1505 _gtk_css_array_value_new (
1506 _gtk_css_ease_value_new_cubic_bezier (0.25, 0.1, 0.25, 1.0)));
1507 gtk_css_style_property_register ("transition-delay",
1508 GTK_CSS_PROPERTY_TRANSITION_DELAY,
1511 transition_time_parse,
1516 _gtk_css_array_value_new (_gtk_css_number_value_new (0, GTK_CSS_S)));
1518 gtk_css_style_property_register ("engine",
1519 GTK_CSS_PROPERTY_ENGINE,
1520 GTK_TYPE_THEMING_ENGINE,
1527 _gtk_css_engine_value_new (gtk_theming_engine_load (NULL)));
1529 /* Private property holding the binding sets */
1530 gtk_css_style_property_register ("gtk-key-bindings",
1531 GTK_CSS_PROPERTY_GTK_KEY_BINDINGS,
1534 bindings_value_parse,
1537 bindings_value_query,
1538 bindings_value_assign,
1539 _gtk_css_array_value_new (NULL));