1 /*
2  * Copyright (C) 2010 Carlos Garnacho <carlosg@gnome.org>
3  *
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.
8  *
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.
13  *
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/>.
16  */
17 
18 #include "config.h"
19 
20 #include "gtkstylepropertyprivate.h"
21 
22 #include <gobject/gvaluecollector.h>
23 #include <gdk-pixbuf/gdk-pixbuf.h>
24 #include <math.h>
25 
26 #include <gtk/css/gtkcss.h>
27 #include "gtk/css/gtkcsstokenizerprivate.h"
28 #include "gtk/css/gtkcssparserprivate.h"
29 #include "gtkcssstylepropertyprivate.h"
30 #include "gtkcsstypesprivate.h"
31 #include "gtkintl.h"
32 #include "gtkprivatetypebuiltins.h"
33 
34 /* the actual parsers we have */
35 #include "gtkcssarrayvalueprivate.h"
36 #include "gtkcssbgsizevalueprivate.h"
37 #include "gtkcssbordervalueprivate.h"
38 #include "gtkcsscolorvalueprivate.h"
39 #include "gtkcsscornervalueprivate.h"
40 #include "gtkcsseasevalueprivate.h"
41 #include "gtkcssfiltervalueprivate.h"
42 #include "gtkcssfontfeaturesvalueprivate.h"
43 #include "gtkcssimageprivate.h"
44 #include "gtkcssimagevalueprivate.h"
45 #include "gtkcssinitialvalueprivate.h"
46 #include "gtkcssenumvalueprivate.h"
47 #include "gtkcssnumbervalueprivate.h"
48 #include "gtkcsspalettevalueprivate.h"
49 #include "gtkcsspositionvalueprivate.h"
50 #include "gtkcssrepeatvalueprivate.h"
51 #include "gtkcssshadowvalueprivate.h"
52 #include "gtkcssstringvalueprivate.h"
53 #include "gtkcsstransformvalueprivate.h"
54 #include "gtkcssfontvariationsvalueprivate.h"
55 #include "gtktypebuiltins.h"
56 
57 /*** REGISTRATION ***/
58 
59 typedef enum {
60   GTK_STYLE_PROPERTY_INHERIT = (1 << 0),
61   GTK_STYLE_PROPERTY_ANIMATED = (1 << 1),
62 } GtkStylePropertyFlags;
63 
64 static void
gtk_css_style_property_register(const char * name,guint expected_id,GtkStylePropertyFlags flags,GtkCssAffects affects,GtkCssStylePropertyParseFunc parse_value,GtkCssValue * initial_value)65 gtk_css_style_property_register (const char *                   name,
66                                  guint                          expected_id,
67                                  GtkStylePropertyFlags          flags,
68                                  GtkCssAffects                  affects,
69                                  GtkCssStylePropertyParseFunc   parse_value,
70                                  GtkCssValue *                  initial_value)
71 {
72   GtkCssStyleProperty *node;
73 
74   g_assert (initial_value != NULL);
75   g_assert (parse_value != NULL);
76 
77   node = g_object_new (GTK_TYPE_CSS_STYLE_PROPERTY,
78                        "affects", affects,
79                        "animated", (flags & GTK_STYLE_PROPERTY_ANIMATED) ? TRUE : FALSE,
80                        "inherit", (flags & GTK_STYLE_PROPERTY_INHERIT) ? TRUE : FALSE,
81                        "initial-value", initial_value,
82                        "name", name,
83                        NULL);
84 
85   node->parse_value = parse_value;
86 
87   _gtk_css_value_unref (initial_value);
88 
89   g_assert (_gtk_css_style_property_get_id (node) == expected_id);
90 }
91 
92 /*** IMPLEMENTATIONS ***/
93 
94 static GtkCssValue *
color_parse(GtkCssStyleProperty * property,GtkCssParser * parser)95 color_parse (GtkCssStyleProperty *property,
96              GtkCssParser        *parser)
97 {
98   return _gtk_css_color_value_parse (parser);
99 }
100 
101 static GtkCssValue *
font_family_parse_one(GtkCssParser * parser)102 font_family_parse_one (GtkCssParser *parser)
103 {
104   char *name;
105 
106   if (gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_IDENT))
107     {
108       GString *string = g_string_new (NULL);
109 
110       name = gtk_css_parser_consume_ident (parser);
111       g_string_append (string, name);
112       g_free (name);
113       while (gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_IDENT))
114         {
115           name = gtk_css_parser_consume_ident (parser);
116           g_string_append_c (string, ' ');
117           g_string_append (string, name);
118           g_free (name);
119         }
120       name = g_string_free (string, FALSE);
121     }
122   else
123     {
124       name = gtk_css_parser_consume_string (parser);
125       if (name == NULL)
126         return NULL;
127     }
128 
129   return _gtk_css_string_value_new_take (name);
130 }
131 
132 GtkCssValue *
gtk_css_font_family_value_parse(GtkCssParser * parser)133 gtk_css_font_family_value_parse (GtkCssParser *parser)
134 {
135   return _gtk_css_array_value_parse (parser, font_family_parse_one);
136 }
137 
138 static GtkCssValue *
font_family_parse(GtkCssStyleProperty * property,GtkCssParser * parser)139 font_family_parse (GtkCssStyleProperty *property,
140                    GtkCssParser        *parser)
141 {
142   return gtk_css_font_family_value_parse (parser);
143 }
144 
145 static GtkCssValue *
font_style_parse(GtkCssStyleProperty * property,GtkCssParser * parser)146 font_style_parse (GtkCssStyleProperty *property,
147                   GtkCssParser        *parser)
148 {
149   GtkCssValue *value = _gtk_css_font_style_value_try_parse (parser);
150 
151   if (value == NULL)
152     gtk_css_parser_error_syntax (parser, "unknown font style value");
153 
154   return value;
155 }
156 
157 static GtkCssValue *
font_weight_parse(GtkCssStyleProperty * property,GtkCssParser * parser)158 font_weight_parse (GtkCssStyleProperty *property,
159                    GtkCssParser        *parser)
160 {
161   GtkCssValue *value;
162 
163   value = gtk_css_font_weight_value_try_parse (parser);
164   if (value == NULL)
165     {
166       value = _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_NUMBER | GTK_CSS_POSITIVE_ONLY);
167       if (value == NULL)
168         return NULL;
169 
170       if (_gtk_css_number_value_get (value, 100) < 1 ||
171           _gtk_css_number_value_get (value, 100) > 1000)
172         {
173           gtk_css_parser_error_value (parser, "Font weight values must be between 1 and 1000");
174           g_clear_pointer (&value, gtk_css_value_unref);
175         }
176     }
177 
178   return value;
179 }
180 
181 static GtkCssValue *
font_stretch_parse(GtkCssStyleProperty * property,GtkCssParser * parser)182 font_stretch_parse (GtkCssStyleProperty *property,
183                     GtkCssParser        *parser)
184 {
185   GtkCssValue *value = _gtk_css_font_stretch_value_try_parse (parser);
186 
187   if (value == NULL)
188     gtk_css_parser_error_syntax (parser, "unknown font stretch value");
189 
190   return value;
191 }
192 
193 static GtkCssValue *
parse_border_style(GtkCssStyleProperty * property,GtkCssParser * parser)194 parse_border_style (GtkCssStyleProperty *property,
195                     GtkCssParser        *parser)
196 {
197   GtkCssValue *value = _gtk_css_border_style_value_try_parse (parser);
198 
199   if (value == NULL)
200     gtk_css_parser_error_syntax (parser, "unknown border style value");
201 
202   return value;
203 }
204 
205 static GtkCssValue *
parse_css_area_one(GtkCssParser * parser)206 parse_css_area_one (GtkCssParser *parser)
207 {
208   GtkCssValue *value = _gtk_css_area_value_try_parse (parser);
209 
210   if (value == NULL)
211     gtk_css_parser_error_syntax (parser, "unknown box value");
212 
213   return value;
214 }
215 
216 static GtkCssValue *
parse_css_area(GtkCssStyleProperty * property,GtkCssParser * parser)217 parse_css_area (GtkCssStyleProperty *property,
218                 GtkCssParser        *parser)
219 {
220   return _gtk_css_array_value_parse (parser, parse_css_area_one);
221 }
222 
223 static GtkCssValue *
parse_one_css_direction(GtkCssParser * parser)224 parse_one_css_direction (GtkCssParser *parser)
225 {
226   GtkCssValue *value = _gtk_css_direction_value_try_parse (parser);
227 
228   if (value == NULL)
229     gtk_css_parser_error_syntax (parser, "unknown direction value");
230 
231   return value;
232 }
233 
234 static GtkCssValue *
parse_css_direction(GtkCssStyleProperty * property,GtkCssParser * parser)235 parse_css_direction (GtkCssStyleProperty *property,
236                      GtkCssParser        *parser)
237 {
238   return _gtk_css_array_value_parse (parser, parse_one_css_direction);
239 }
240 
241 static GtkCssValue *
opacity_parse(GtkCssStyleProperty * property,GtkCssParser * parser)242 opacity_parse (GtkCssStyleProperty *property,
243 	       GtkCssParser        *parser)
244 {
245   return _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_NUMBER);
246 }
247 
248 static GtkCssValue *
parse_one_css_play_state(GtkCssParser * parser)249 parse_one_css_play_state (GtkCssParser *parser)
250 {
251   GtkCssValue *value = _gtk_css_play_state_value_try_parse (parser);
252 
253   if (value == NULL)
254     gtk_css_parser_error_syntax (parser, "unknown play state value");
255 
256   return value;
257 }
258 
259 static GtkCssValue *
parse_css_play_state(GtkCssStyleProperty * property,GtkCssParser * parser)260 parse_css_play_state (GtkCssStyleProperty *property,
261                       GtkCssParser        *parser)
262 {
263   return _gtk_css_array_value_parse (parser, parse_one_css_play_state);
264 }
265 
266 static GtkCssValue *
parse_one_css_fill_mode(GtkCssParser * parser)267 parse_one_css_fill_mode (GtkCssParser *parser)
268 {
269   GtkCssValue *value = _gtk_css_fill_mode_value_try_parse (parser);
270 
271   if (value == NULL)
272     gtk_css_parser_error_syntax (parser, "unknown fill mode value");
273 
274   return value;
275 }
276 
277 static GtkCssValue *
parse_css_fill_mode(GtkCssStyleProperty * property,GtkCssParser * parser)278 parse_css_fill_mode (GtkCssStyleProperty *property,
279                      GtkCssParser        *parser)
280 {
281   return _gtk_css_array_value_parse (parser, parse_one_css_fill_mode);
282 }
283 
284 static GtkCssValue *
icon_size_parse(GtkCssStyleProperty * property,GtkCssParser * parser)285 icon_size_parse (GtkCssStyleProperty *property,
286 		 GtkCssParser        *parser)
287 {
288   return _gtk_css_number_value_parse (parser,
289                                       GTK_CSS_PARSE_LENGTH
290                                       | GTK_CSS_PARSE_PERCENT
291                                       | GTK_CSS_POSITIVE_ONLY);
292 }
293 
294 static GtkCssValue *
icon_palette_parse(GtkCssStyleProperty * property,GtkCssParser * parser)295 icon_palette_parse (GtkCssStyleProperty *property,
296 		    GtkCssParser        *parser)
297 {
298   return gtk_css_palette_value_parse (parser);
299 }
300 
301 static GtkCssValue *
icon_style_parse(GtkCssStyleProperty * property,GtkCssParser * parser)302 icon_style_parse (GtkCssStyleProperty *property,
303 		  GtkCssParser        *parser)
304 {
305   GtkCssValue *value = _gtk_css_icon_style_value_try_parse (parser);
306 
307   if (value == NULL)
308     gtk_css_parser_error_syntax (parser, "unknown icon style value");
309 
310   return value;
311 }
312 
313 static GtkCssValue *
parse_letter_spacing(GtkCssStyleProperty * property,GtkCssParser * parser)314 parse_letter_spacing (GtkCssStyleProperty *property,
315                       GtkCssParser        *parser)
316 {
317   return _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_LENGTH);
318 }
319 
320 static gboolean
value_is_done_parsing(GtkCssParser * parser)321 value_is_done_parsing (GtkCssParser *parser)
322 {
323   return gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_EOF) ||
324          gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_COMMA) ||
325          gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_SEMICOLON) ||
326          gtk_css_parser_has_token (parser, GTK_CSS_TOKEN_CLOSE_CURLY);
327 }
328 
329 static GtkCssValue *
parse_text_decoration_line(GtkCssStyleProperty * property,GtkCssParser * parser)330 parse_text_decoration_line (GtkCssStyleProperty *property,
331                             GtkCssParser        *parser)
332 {
333   GtkCssValue *value = NULL;
334   GtkTextDecorationLine line;
335 
336   line = 0;
337   do {
338     GtkTextDecorationLine parsed;
339 
340     parsed = _gtk_css_text_decoration_line_try_parse_one (parser, line);
341     if (parsed == 0 || parsed == line)
342       {
343         gtk_css_parser_error_syntax (parser, "Not a valid value");
344         return NULL;
345       }
346     line = parsed;
347   } while (!value_is_done_parsing (parser));
348 
349   value = _gtk_css_text_decoration_line_value_new (line);
350   if (value == NULL)
351     gtk_css_parser_error_syntax (parser, "Invalid combination of values");
352 
353   return value;
354 }
355 
356 static GtkCssValue *
parse_text_decoration_style(GtkCssStyleProperty * property,GtkCssParser * parser)357 parse_text_decoration_style (GtkCssStyleProperty *property,
358                              GtkCssParser        *parser)
359 {
360   GtkCssValue *value = _gtk_css_text_decoration_style_value_try_parse (parser);
361 
362   if (value == NULL)
363     gtk_css_parser_error_syntax (parser, "unknown text decoration style value");
364 
365   return value;
366 }
367 
368 static GtkCssValue *
parse_font_kerning(GtkCssStyleProperty * property,GtkCssParser * parser)369 parse_font_kerning (GtkCssStyleProperty *property,
370                     GtkCssParser        *parser)
371 {
372   GtkCssValue *value = _gtk_css_font_kerning_value_try_parse (parser);
373 
374   if (value == NULL)
375     gtk_css_parser_error_syntax (parser, "unknown font kerning value");
376 
377   return value;
378 }
379 
380 static GtkCssValue *
parse_font_variant_ligatures(GtkCssStyleProperty * property,GtkCssParser * parser)381 parse_font_variant_ligatures (GtkCssStyleProperty *property,
382                               GtkCssParser        *parser)
383 {
384   GtkCssValue *value = NULL;
385   GtkCssFontVariantLigature ligatures;
386 
387   ligatures = 0;
388   do {
389     GtkCssFontVariantLigature parsed;
390 
391     parsed = _gtk_css_font_variant_ligature_try_parse_one (parser, ligatures);
392     if (parsed == 0 || parsed == ligatures)
393       {
394         gtk_css_parser_error_syntax (parser, "Not a valid value");
395         return NULL;
396       }
397     ligatures = parsed;
398   } while (!value_is_done_parsing (parser));
399 
400   value = _gtk_css_font_variant_ligature_value_new (ligatures);
401   if (value == NULL)
402     gtk_css_parser_error_syntax (parser, "Invalid combination of values");
403 
404   return value;
405 }
406 
407 static GtkCssValue *
parse_font_variant_position(GtkCssStyleProperty * property,GtkCssParser * parser)408 parse_font_variant_position (GtkCssStyleProperty *property,
409                              GtkCssParser        *parser)
410 {
411   GtkCssValue *value = _gtk_css_font_variant_position_value_try_parse (parser);
412 
413   if (value == NULL)
414     gtk_css_parser_error_syntax (parser, "unknown font variant position value");
415 
416   return value;
417 }
418 
419 static GtkCssValue *
parse_font_variant_caps(GtkCssStyleProperty * property,GtkCssParser * parser)420 parse_font_variant_caps (GtkCssStyleProperty *property,
421                          GtkCssParser        *parser)
422 {
423   GtkCssValue *value = _gtk_css_font_variant_caps_value_try_parse (parser);
424 
425   if (value == NULL)
426     gtk_css_parser_error_syntax (parser, "unknown font variant caps value");
427 
428   return value;
429 }
430 
431 static GtkCssValue *
parse_font_variant_numeric(GtkCssStyleProperty * property,GtkCssParser * parser)432 parse_font_variant_numeric (GtkCssStyleProperty *property,
433                             GtkCssParser        *parser)
434 {
435   GtkCssValue *value = NULL;
436   GtkCssFontVariantNumeric numeric;
437 
438   numeric = 0;
439   do {
440     GtkCssFontVariantNumeric parsed;
441 
442     parsed = _gtk_css_font_variant_numeric_try_parse_one (parser, numeric);
443     if (parsed == 0 || parsed == numeric)
444       {
445         gtk_css_parser_error_syntax (parser, "Not a valid value");
446         return NULL;
447       }
448     numeric = parsed;
449   } while (!value_is_done_parsing (parser));
450 
451   value = _gtk_css_font_variant_numeric_value_new (numeric);
452   if (value == NULL)
453     gtk_css_parser_error_syntax (parser, "Invalid combination of values");
454 
455   return value;
456 }
457 
458 static GtkCssValue *
parse_font_variant_alternates(GtkCssStyleProperty * property,GtkCssParser * parser)459 parse_font_variant_alternates (GtkCssStyleProperty *property,
460                                GtkCssParser        *parser)
461 {
462   GtkCssValue *value = _gtk_css_font_variant_alternate_value_try_parse (parser);
463 
464   if (value == NULL)
465     gtk_css_parser_error_syntax (parser, "unknown font variant alternate value");
466 
467   return value;
468 }
469 
470 static GtkCssValue *
parse_font_variant_east_asian(GtkCssStyleProperty * property,GtkCssParser * parser)471 parse_font_variant_east_asian (GtkCssStyleProperty *property,
472                                GtkCssParser        *parser)
473 {
474   GtkCssValue *value = NULL;
475   GtkCssFontVariantEastAsian east_asian;
476 
477   east_asian = 0;
478   do {
479     GtkCssFontVariantEastAsian parsed;
480 
481     parsed = _gtk_css_font_variant_east_asian_try_parse_one (parser, east_asian);
482     if (parsed == 0 || parsed == east_asian)
483       {
484         gtk_css_parser_error_syntax (parser, "Not a valid value");
485         return NULL;
486       }
487     east_asian = parsed;
488   } while (!value_is_done_parsing (parser));
489 
490   value = _gtk_css_font_variant_east_asian_value_new (east_asian);
491   if (value == NULL)
492     gtk_css_parser_error_syntax (parser, "Invalid combination of values");
493 
494   return value;
495 }
496 
497 static GtkCssValue *
parse_font_feature_settings(GtkCssStyleProperty * property,GtkCssParser * parser)498 parse_font_feature_settings (GtkCssStyleProperty *property,
499                              GtkCssParser        *parser)
500 {
501   return gtk_css_font_features_value_parse (parser);
502 }
503 
504 static GtkCssValue *
parse_font_variation_settings(GtkCssStyleProperty * property,GtkCssParser * parser)505 parse_font_variation_settings (GtkCssStyleProperty *property,
506                                GtkCssParser        *parser)
507 {
508   return gtk_css_font_variations_value_parse (parser);
509 }
510 
511 static GtkCssValue *
box_shadow_value_parse(GtkCssStyleProperty * property,GtkCssParser * parser)512 box_shadow_value_parse (GtkCssStyleProperty *property,
513                         GtkCssParser        *parser)
514 {
515   return gtk_css_shadow_value_parse (parser, TRUE);
516 }
517 
518 static GtkCssValue *
shadow_value_parse(GtkCssStyleProperty * property,GtkCssParser * parser)519 shadow_value_parse (GtkCssStyleProperty *property,
520                     GtkCssParser        *parser)
521 {
522   return gtk_css_shadow_value_parse (parser, FALSE);
523 }
524 
525 static GtkCssValue *
transform_value_parse(GtkCssStyleProperty * property,GtkCssParser * parser)526 transform_value_parse (GtkCssStyleProperty *property,
527                        GtkCssParser        *parser)
528 {
529   return _gtk_css_transform_value_parse (parser);
530 }
531 
532 static GtkCssValue *
filter_value_parse(GtkCssStyleProperty * property,GtkCssParser * parser)533 filter_value_parse (GtkCssStyleProperty *property,
534                     GtkCssParser        *parser)
535 {
536   return gtk_css_filter_value_parse (parser);
537 }
538 
539 static GtkCssValue *
border_spacing_value_parse(GtkCssStyleProperty * property,GtkCssParser * parser)540 border_spacing_value_parse (GtkCssStyleProperty *property,
541                             GtkCssParser        *parser)
542 {
543   return gtk_css_position_value_parse_spacing (parser);
544 }
545 
546 static GtkCssValue *
border_corner_radius_value_parse(GtkCssStyleProperty * property,GtkCssParser * parser)547 border_corner_radius_value_parse (GtkCssStyleProperty *property,
548                                   GtkCssParser        *parser)
549 {
550   return _gtk_css_corner_value_parse (parser);
551 }
552 
553 static GtkCssValue *
css_image_value_parse(GtkCssStyleProperty * property,GtkCssParser * parser)554 css_image_value_parse (GtkCssStyleProperty *property,
555                        GtkCssParser        *parser)
556 {
557   GtkCssImage *image;
558 
559   if (gtk_css_parser_try_ident (parser, "none"))
560     image = NULL;
561   else
562     {
563       image = _gtk_css_image_new_parse (parser);
564       if (image == NULL)
565         return NULL;
566     }
567 
568   return _gtk_css_image_value_new (image);
569 }
570 
571 static GtkCssValue *
background_image_value_parse_one(GtkCssParser * parser)572 background_image_value_parse_one (GtkCssParser *parser)
573 {
574   return css_image_value_parse (NULL, parser);
575 }
576 
577 static GtkCssValue *
background_image_value_parse(GtkCssStyleProperty * property,GtkCssParser * parser)578 background_image_value_parse (GtkCssStyleProperty *property,
579                               GtkCssParser        *parser)
580 {
581   return _gtk_css_array_value_parse (parser, background_image_value_parse_one);
582 }
583 
584 static GtkCssValue *
dpi_parse(GtkCssStyleProperty * property,GtkCssParser * parser)585 dpi_parse (GtkCssStyleProperty *property,
586 	   GtkCssParser        *parser)
587 {
588   return _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_NUMBER);
589 }
590 
591 GtkCssValue *
gtk_css_font_size_value_parse(GtkCssParser * parser)592 gtk_css_font_size_value_parse (GtkCssParser *parser)
593 {
594   GtkCssValue *value;
595 
596   value = _gtk_css_font_size_value_try_parse (parser);
597   if (value)
598     return value;
599 
600   return _gtk_css_number_value_parse (parser,
601                                       GTK_CSS_PARSE_LENGTH
602                                       | GTK_CSS_PARSE_PERCENT
603                                       | GTK_CSS_POSITIVE_ONLY);
604 }
605 
606 static GtkCssValue *
font_size_parse(GtkCssStyleProperty * property,GtkCssParser * parser)607 font_size_parse (GtkCssStyleProperty *property,
608                  GtkCssParser        *parser)
609 {
610   return gtk_css_font_size_value_parse (parser);
611 }
612 
613 static GtkCssValue *
outline_parse(GtkCssStyleProperty * property,GtkCssParser * parser)614 outline_parse (GtkCssStyleProperty *property,
615                GtkCssParser        *parser)
616 {
617   return _gtk_css_number_value_parse (parser,
618                                       GTK_CSS_PARSE_LENGTH);
619 }
620 
621 static GtkCssValue *
border_image_repeat_parse(GtkCssStyleProperty * property,GtkCssParser * parser)622 border_image_repeat_parse (GtkCssStyleProperty *property,
623                            GtkCssParser        *parser)
624 {
625   GtkCssValue *value = _gtk_css_border_repeat_value_try_parse (parser);
626 
627   if (value == NULL)
628     {
629       gtk_css_parser_error_syntax (parser, "Not a valid border repeat value");
630       return NULL;
631     }
632 
633   return value;
634 }
635 
636 static GtkCssValue *
border_image_slice_parse(GtkCssStyleProperty * property,GtkCssParser * parser)637 border_image_slice_parse (GtkCssStyleProperty *property,
638                           GtkCssParser        *parser)
639 {
640   return _gtk_css_border_value_parse (parser,
641                                       GTK_CSS_PARSE_PERCENT
642                                       | GTK_CSS_PARSE_NUMBER
643                                       | GTK_CSS_POSITIVE_ONLY,
644                                       FALSE,
645                                       TRUE);
646 }
647 
648 static GtkCssValue *
border_image_width_parse(GtkCssStyleProperty * property,GtkCssParser * parser)649 border_image_width_parse (GtkCssStyleProperty *property,
650                           GtkCssParser        *parser)
651 {
652   return _gtk_css_border_value_parse (parser,
653                                       GTK_CSS_PARSE_PERCENT
654                                       | GTK_CSS_PARSE_LENGTH
655                                       | GTK_CSS_PARSE_NUMBER
656                                       | GTK_CSS_POSITIVE_ONLY,
657                                       TRUE,
658                                       FALSE);
659 }
660 
661 static GtkCssValue *
minmax_parse(GtkCssStyleProperty * property,GtkCssParser * parser)662 minmax_parse (GtkCssStyleProperty *property,
663               GtkCssParser        *parser)
664 {
665   return _gtk_css_number_value_parse (parser,
666                                       GTK_CSS_PARSE_LENGTH
667                                       | GTK_CSS_POSITIVE_ONLY);
668 }
669 
670 static GtkCssValue *
transition_property_parse_one(GtkCssParser * parser)671 transition_property_parse_one (GtkCssParser *parser)
672 {
673   GtkCssValue *value;
674 
675   value = _gtk_css_ident_value_try_parse (parser);
676 
677   if (value == NULL)
678     {
679       gtk_css_parser_error_syntax (parser, "Expected an identifier");
680       return NULL;
681     }
682 
683   return value;
684 }
685 
686 static GtkCssValue *
transition_property_parse(GtkCssStyleProperty * property,GtkCssParser * parser)687 transition_property_parse (GtkCssStyleProperty *property,
688                            GtkCssParser        *parser)
689 {
690   return _gtk_css_array_value_parse (parser, transition_property_parse_one);
691 }
692 
693 static GtkCssValue *
transition_time_parse_one(GtkCssParser * parser)694 transition_time_parse_one (GtkCssParser *parser)
695 {
696   return _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_TIME);
697 }
698 
699 static GtkCssValue *
transition_time_parse(GtkCssStyleProperty * property,GtkCssParser * parser)700 transition_time_parse (GtkCssStyleProperty *property,
701                        GtkCssParser        *parser)
702 {
703   return _gtk_css_array_value_parse (parser, transition_time_parse_one);
704 }
705 
706 static GtkCssValue *
transition_timing_function_parse(GtkCssStyleProperty * property,GtkCssParser * parser)707 transition_timing_function_parse (GtkCssStyleProperty *property,
708                                   GtkCssParser        *parser)
709 {
710   return _gtk_css_array_value_parse (parser, _gtk_css_ease_value_parse);
711 }
712 
713 static GtkCssValue *
iteration_count_parse_one(GtkCssParser * parser)714 iteration_count_parse_one (GtkCssParser *parser)
715 {
716   if (gtk_css_parser_try_ident (parser, "infinite"))
717     return _gtk_css_number_value_new (HUGE_VAL, GTK_CSS_NUMBER);
718 
719   return _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_NUMBER | GTK_CSS_POSITIVE_ONLY);
720 }
721 
722 static GtkCssValue *
iteration_count_parse(GtkCssStyleProperty * property,GtkCssParser * parser)723 iteration_count_parse (GtkCssStyleProperty *property,
724                        GtkCssParser        *parser)
725 {
726   return _gtk_css_array_value_parse (parser, iteration_count_parse_one);
727 }
728 
729 static GtkCssValue *
parse_margin(GtkCssStyleProperty * property,GtkCssParser * parser)730 parse_margin (GtkCssStyleProperty *property,
731               GtkCssParser        *parser)
732 {
733   return _gtk_css_number_value_parse (parser,
734                                       GTK_CSS_PARSE_LENGTH);
735 }
736 
737 static GtkCssValue *
parse_padding(GtkCssStyleProperty * property,GtkCssParser * parser)738 parse_padding (GtkCssStyleProperty *property,
739                GtkCssParser        *parser)
740 {
741   return _gtk_css_number_value_parse (parser,
742                                       GTK_CSS_POSITIVE_ONLY
743                                       | GTK_CSS_PARSE_LENGTH);
744 }
745 
746 static GtkCssValue *
parse_border_width(GtkCssStyleProperty * property,GtkCssParser * parser)747 parse_border_width (GtkCssStyleProperty *property,
748                     GtkCssParser        *parser)
749 {
750   return _gtk_css_number_value_parse (parser,
751                                       GTK_CSS_POSITIVE_ONLY
752                                       | GTK_CSS_PARSE_LENGTH);
753 }
754 
755 static GtkCssValue *
blend_mode_value_parse_one(GtkCssParser * parser)756 blend_mode_value_parse_one (GtkCssParser        *parser)
757 {
758   GtkCssValue *value = _gtk_css_blend_mode_value_try_parse (parser);
759 
760   if (value == NULL)
761     gtk_css_parser_error_syntax (parser, "Unknown blend mode value");
762 
763   return value;
764 }
765 
766 static GtkCssValue *
blend_mode_value_parse(GtkCssStyleProperty * property,GtkCssParser * parser)767 blend_mode_value_parse (GtkCssStyleProperty *property,
768                         GtkCssParser        *parser)
769 {
770   return _gtk_css_array_value_parse (parser, blend_mode_value_parse_one);
771 }
772 
773 static GtkCssValue *
background_repeat_value_parse_one(GtkCssParser * parser)774 background_repeat_value_parse_one (GtkCssParser *parser)
775 {
776   GtkCssValue *value = _gtk_css_background_repeat_value_try_parse (parser);
777 
778   if (value == NULL)
779     {
780       gtk_css_parser_error_syntax (parser, "Unknown repeat value");
781       return NULL;
782     }
783 
784   return value;
785 }
786 
787 static GtkCssValue *
background_repeat_value_parse(GtkCssStyleProperty * property,GtkCssParser * parser)788 background_repeat_value_parse (GtkCssStyleProperty *property,
789                                GtkCssParser        *parser)
790 {
791   return _gtk_css_array_value_parse (parser, background_repeat_value_parse_one);
792 }
793 
794 static GtkCssValue *
background_size_parse(GtkCssStyleProperty * property,GtkCssParser * parser)795 background_size_parse (GtkCssStyleProperty *property,
796                        GtkCssParser        *parser)
797 {
798   return _gtk_css_array_value_parse (parser, _gtk_css_bg_size_value_parse);
799 }
800 
801 static GtkCssValue *
background_position_parse(GtkCssStyleProperty * property,GtkCssParser * parser)802 background_position_parse (GtkCssStyleProperty *property,
803 			   GtkCssParser        *parser)
804 {
805   return _gtk_css_array_value_parse (parser, _gtk_css_position_value_parse);
806 }
807 
808 static GtkCssValue *
transform_origin_parse(GtkCssStyleProperty * property,GtkCssParser * parser)809 transform_origin_parse (GtkCssStyleProperty *property,
810                         GtkCssParser        *parser)
811 {
812   return _gtk_css_position_value_parse (parser);
813 }
814 
815 /*** REGISTRATION ***/
816 
817 G_STATIC_ASSERT (GTK_CSS_PROPERTY_COLOR == 0);
818 G_STATIC_ASSERT (GTK_CSS_PROPERTY_DPI < GTK_CSS_PROPERTY_FONT_SIZE);
819 
820 void
_gtk_css_style_property_init_properties(void)821 _gtk_css_style_property_init_properties (void)
822 {
823   /* Initialize "color", "-gtk-dpi" and "font-size" first,
824    * so that when computing values later they are
825    * done first. That way, 'currentColor' and font
826    * sizes in em can be looked up properly */
827   gtk_css_style_property_register        ("color",
828                                           GTK_CSS_PROPERTY_COLOR,
829                                           GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
830                                           GTK_CSS_AFFECTS_CONTENT | GTK_CSS_AFFECTS_ICON_REDRAW_SYMBOLIC,
831                                           color_parse,
832                                           gtk_css_color_value_new_white ());
833   gtk_css_style_property_register        ("-gtk-dpi",
834                                           GTK_CSS_PROPERTY_DPI,
835                                           GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
836                                           GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_TEXT_SIZE,
837                                           dpi_parse,
838                                           _gtk_css_number_value_new (96.0, GTK_CSS_NUMBER));
839   gtk_css_style_property_register        ("font-size",
840                                           GTK_CSS_PROPERTY_FONT_SIZE,
841                                           GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
842                                           GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_TEXT_SIZE,
843                                           font_size_parse,
844                                           _gtk_css_font_size_value_new (GTK_CSS_FONT_SIZE_MEDIUM));
845   gtk_css_style_property_register        ("-gtk-icon-palette",
846 					  GTK_CSS_PROPERTY_ICON_PALETTE,
847 					  GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_INHERIT,
848                                           GTK_CSS_AFFECTS_ICON_REDRAW_SYMBOLIC,
849 					  icon_palette_parse,
850 					  gtk_css_palette_value_new_default ());
851 
852 
853   /* properties that aren't referenced when computing values
854    * start here */
855   gtk_css_style_property_register        ("background-color",
856                                           GTK_CSS_PROPERTY_BACKGROUND_COLOR,
857                                           GTK_STYLE_PROPERTY_ANIMATED,
858                                           GTK_CSS_AFFECTS_BACKGROUND,
859                                           color_parse,
860                                           gtk_css_color_value_new_transparent ());
861 
862   gtk_css_style_property_register        ("font-family",
863                                           GTK_CSS_PROPERTY_FONT_FAMILY,
864                                           GTK_STYLE_PROPERTY_INHERIT,
865                                           GTK_CSS_AFFECTS_TEXT_SIZE,
866                                           font_family_parse,
867                                           _gtk_css_string_value_new ("Sans"));
868   gtk_css_style_property_register        ("font-style",
869                                           GTK_CSS_PROPERTY_FONT_STYLE,
870                                           GTK_STYLE_PROPERTY_INHERIT,
871                                           GTK_CSS_AFFECTS_TEXT_SIZE,
872                                           font_style_parse,
873                                           _gtk_css_font_style_value_new (PANGO_STYLE_NORMAL));
874   gtk_css_style_property_register        ("font-weight",
875                                           GTK_CSS_PROPERTY_FONT_WEIGHT,
876                                           GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
877                                           GTK_CSS_AFFECTS_TEXT_SIZE,
878                                           font_weight_parse,
879                                           _gtk_css_number_value_new (PANGO_WEIGHT_NORMAL, GTK_CSS_NUMBER));
880   gtk_css_style_property_register        ("font-stretch",
881                                           GTK_CSS_PROPERTY_FONT_STRETCH,
882                                           GTK_STYLE_PROPERTY_INHERIT,
883                                           GTK_CSS_AFFECTS_TEXT_SIZE,
884                                           font_stretch_parse,
885                                           _gtk_css_font_stretch_value_new (PANGO_STRETCH_NORMAL));
886 
887   gtk_css_style_property_register        ("letter-spacing",
888                                           GTK_CSS_PROPERTY_LETTER_SPACING,
889                                           GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
890                                           GTK_CSS_AFFECTS_TEXT_ATTRS | GTK_CSS_AFFECTS_TEXT_SIZE,
891                                           parse_letter_spacing,
892                                           _gtk_css_number_value_new (0.0, GTK_CSS_PX));
893 
894   gtk_css_style_property_register        ("text-decoration-line",
895                                           GTK_CSS_PROPERTY_TEXT_DECORATION_LINE,
896                                           0,
897                                           GTK_CSS_AFFECTS_TEXT_ATTRS,
898                                           parse_text_decoration_line,
899                                           _gtk_css_text_decoration_line_value_new (GTK_CSS_TEXT_DECORATION_LINE_NONE));
900   gtk_css_style_property_register        ("text-decoration-color",
901                                           GTK_CSS_PROPERTY_TEXT_DECORATION_COLOR,
902                                           GTK_STYLE_PROPERTY_ANIMATED,
903                                           GTK_CSS_AFFECTS_TEXT_ATTRS,
904                                           color_parse,
905                                           _gtk_css_color_value_new_current_color ());
906   gtk_css_style_property_register        ("text-decoration-style",
907                                           GTK_CSS_PROPERTY_TEXT_DECORATION_STYLE,
908                                           0,
909                                           GTK_CSS_AFFECTS_TEXT_ATTRS,
910                                           parse_text_decoration_style,
911                                           _gtk_css_text_decoration_style_value_new (GTK_CSS_TEXT_DECORATION_STYLE_SOLID));
912   gtk_css_style_property_register        ("font-kerning",
913                                           GTK_CSS_PROPERTY_FONT_KERNING,
914                                           0,
915                                           GTK_CSS_AFFECTS_TEXT_ATTRS | GTK_CSS_AFFECTS_TEXT_SIZE,
916                                           parse_font_kerning,
917                                           _gtk_css_font_kerning_value_new (GTK_CSS_FONT_KERNING_AUTO));
918   gtk_css_style_property_register        ("font-variant-ligatures",
919                                           GTK_CSS_PROPERTY_FONT_VARIANT_LIGATURES,
920                                           0,
921                                           GTK_CSS_AFFECTS_TEXT_ATTRS,
922                                           parse_font_variant_ligatures,
923                                           _gtk_css_font_variant_ligature_value_new (GTK_CSS_FONT_VARIANT_LIGATURE_NORMAL));
924   gtk_css_style_property_register        ("font-variant-position",
925                                           GTK_CSS_PROPERTY_FONT_VARIANT_POSITION,
926                                           0,
927                                           GTK_CSS_AFFECTS_TEXT_ATTRS,
928                                           parse_font_variant_position,
929                                           _gtk_css_font_variant_position_value_new (GTK_CSS_FONT_VARIANT_POSITION_NORMAL));
930   gtk_css_style_property_register        ("font-variant-caps",
931                                           GTK_CSS_PROPERTY_FONT_VARIANT_CAPS,
932                                           0,
933                                           GTK_CSS_AFFECTS_TEXT_ATTRS,
934                                           parse_font_variant_caps,
935                                           _gtk_css_font_variant_caps_value_new (GTK_CSS_FONT_VARIANT_CAPS_NORMAL));
936   gtk_css_style_property_register        ("font-variant-numeric",
937                                           GTK_CSS_PROPERTY_FONT_VARIANT_NUMERIC,
938                                           0,
939                                           GTK_CSS_AFFECTS_TEXT_ATTRS,
940                                           parse_font_variant_numeric,
941                                           _gtk_css_font_variant_numeric_value_new (GTK_CSS_FONT_VARIANT_NUMERIC_NORMAL));
942   gtk_css_style_property_register        ("font-variant-alternates",
943                                           GTK_CSS_PROPERTY_FONT_VARIANT_ALTERNATES,
944                                           0,
945                                           GTK_CSS_AFFECTS_TEXT_ATTRS,
946                                           parse_font_variant_alternates,
947                                           _gtk_css_font_variant_alternate_value_new (GTK_CSS_FONT_VARIANT_ALTERNATE_NORMAL));
948   gtk_css_style_property_register        ("font-variant-east-asian",
949                                           GTK_CSS_PROPERTY_FONT_VARIANT_EAST_ASIAN,
950                                           0,
951                                           GTK_CSS_AFFECTS_TEXT_ATTRS,
952                                           parse_font_variant_east_asian,
953                                           _gtk_css_font_variant_east_asian_value_new (GTK_CSS_FONT_VARIANT_EAST_ASIAN_NORMAL));
954   gtk_css_style_property_register        ("text-shadow",
955                                           GTK_CSS_PROPERTY_TEXT_SHADOW,
956                                           GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
957                                           GTK_CSS_AFFECTS_TEXT_CONTENT,
958                                           shadow_value_parse,
959                                           gtk_css_shadow_value_new_none ());
960 
961   gtk_css_style_property_register        ("box-shadow",
962                                           GTK_CSS_PROPERTY_BOX_SHADOW,
963                                           GTK_STYLE_PROPERTY_ANIMATED,
964                                           GTK_CSS_AFFECTS_BACKGROUND,
965                                           box_shadow_value_parse,
966                                           gtk_css_shadow_value_new_none ());
967 
968   gtk_css_style_property_register        ("margin-top",
969                                           GTK_CSS_PROPERTY_MARGIN_TOP,
970                                           GTK_STYLE_PROPERTY_ANIMATED,
971                                           GTK_CSS_AFFECTS_SIZE,
972                                           parse_margin,
973                                           _gtk_css_number_value_new (0.0, GTK_CSS_PX));
974   gtk_css_style_property_register        ("margin-left",
975                                           GTK_CSS_PROPERTY_MARGIN_LEFT,
976                                           GTK_STYLE_PROPERTY_ANIMATED,
977                                           GTK_CSS_AFFECTS_SIZE,
978                                           parse_margin,
979                                           _gtk_css_number_value_new (0.0, GTK_CSS_PX));
980   gtk_css_style_property_register        ("margin-bottom",
981                                           GTK_CSS_PROPERTY_MARGIN_BOTTOM,
982                                           GTK_STYLE_PROPERTY_ANIMATED,
983                                           GTK_CSS_AFFECTS_SIZE,
984                                           parse_margin,
985                                           _gtk_css_number_value_new (0.0, GTK_CSS_PX));
986   gtk_css_style_property_register        ("margin-right",
987                                           GTK_CSS_PROPERTY_MARGIN_RIGHT,
988                                           GTK_STYLE_PROPERTY_ANIMATED,
989                                           GTK_CSS_AFFECTS_SIZE,
990                                           parse_margin,
991                                           _gtk_css_number_value_new (0.0, GTK_CSS_PX));
992   gtk_css_style_property_register        ("padding-top",
993                                           GTK_CSS_PROPERTY_PADDING_TOP,
994                                           GTK_STYLE_PROPERTY_ANIMATED,
995                                           GTK_CSS_AFFECTS_SIZE,
996                                           parse_padding,
997                                           _gtk_css_number_value_new (0.0, GTK_CSS_PX));
998   gtk_css_style_property_register        ("padding-left",
999                                           GTK_CSS_PROPERTY_PADDING_LEFT,
1000                                           GTK_STYLE_PROPERTY_ANIMATED,
1001                                           GTK_CSS_AFFECTS_SIZE,
1002                                           parse_padding,
1003                                           _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1004   gtk_css_style_property_register        ("padding-bottom",
1005                                           GTK_CSS_PROPERTY_PADDING_BOTTOM,
1006                                           GTK_STYLE_PROPERTY_ANIMATED,
1007                                           GTK_CSS_AFFECTS_SIZE,
1008                                           parse_padding,
1009                                           _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1010   gtk_css_style_property_register        ("padding-right",
1011                                           GTK_CSS_PROPERTY_PADDING_RIGHT,
1012                                           GTK_STYLE_PROPERTY_ANIMATED,
1013                                           GTK_CSS_AFFECTS_SIZE,
1014                                           parse_padding,
1015                                           _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1016   /* IMPORTANT: the border-width properties must come after border-style properties,
1017    * they depend on them for their value computation.
1018    */
1019   gtk_css_style_property_register        ("border-top-style",
1020                                           GTK_CSS_PROPERTY_BORDER_TOP_STYLE,
1021                                           0,
1022                                           GTK_CSS_AFFECTS_BORDER,
1023                                           parse_border_style,
1024                                           _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1025   gtk_css_style_property_register        ("border-top-width",
1026                                           GTK_CSS_PROPERTY_BORDER_TOP_WIDTH,
1027                                           GTK_STYLE_PROPERTY_ANIMATED,
1028                                           GTK_CSS_AFFECTS_BORDER | GTK_CSS_AFFECTS_SIZE,
1029                                           parse_border_width,
1030                                           _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1031   gtk_css_style_property_register        ("border-left-style",
1032                                           GTK_CSS_PROPERTY_BORDER_LEFT_STYLE,
1033                                           0,
1034                                           GTK_CSS_AFFECTS_BORDER,
1035                                           parse_border_style,
1036                                           _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1037   gtk_css_style_property_register        ("border-left-width",
1038                                           GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH,
1039                                           GTK_STYLE_PROPERTY_ANIMATED,
1040                                           GTK_CSS_AFFECTS_BORDER | GTK_CSS_AFFECTS_SIZE,
1041                                           parse_border_width,
1042                                           _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1043   gtk_css_style_property_register        ("border-bottom-style",
1044                                           GTK_CSS_PROPERTY_BORDER_BOTTOM_STYLE,
1045                                           0,
1046                                           GTK_CSS_AFFECTS_BORDER,
1047                                           parse_border_style,
1048                                           _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1049   gtk_css_style_property_register        ("border-bottom-width",
1050                                           GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH,
1051                                           GTK_STYLE_PROPERTY_ANIMATED,
1052                                           GTK_CSS_AFFECTS_BORDER | GTK_CSS_AFFECTS_SIZE,
1053                                           parse_border_width,
1054                                           _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1055   gtk_css_style_property_register        ("border-right-style",
1056                                           GTK_CSS_PROPERTY_BORDER_RIGHT_STYLE,
1057                                           0,
1058                                           GTK_CSS_AFFECTS_BORDER,
1059                                           parse_border_style,
1060                                           _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1061   gtk_css_style_property_register        ("border-right-width",
1062                                           GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH,
1063                                           GTK_STYLE_PROPERTY_ANIMATED,
1064                                           GTK_CSS_AFFECTS_BORDER | GTK_CSS_AFFECTS_SIZE,
1065                                           parse_border_width,
1066                                           _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1067 
1068   gtk_css_style_property_register        ("border-top-left-radius",
1069                                           GTK_CSS_PROPERTY_BORDER_TOP_LEFT_RADIUS,
1070                                           GTK_STYLE_PROPERTY_ANIMATED,
1071                                           GTK_CSS_AFFECTS_BACKGROUND | GTK_CSS_AFFECTS_BORDER,
1072                                           border_corner_radius_value_parse,
1073                                           _gtk_css_number_value_new (0, GTK_CSS_PX));
1074   gtk_css_style_property_register        ("border-top-right-radius",
1075                                           GTK_CSS_PROPERTY_BORDER_TOP_RIGHT_RADIUS,
1076                                           GTK_STYLE_PROPERTY_ANIMATED,
1077                                           GTK_CSS_AFFECTS_BACKGROUND | GTK_CSS_AFFECTS_BORDER,
1078                                           border_corner_radius_value_parse,
1079                                           _gtk_css_number_value_new (0, GTK_CSS_PX));
1080   gtk_css_style_property_register        ("border-bottom-right-radius",
1081                                           GTK_CSS_PROPERTY_BORDER_BOTTOM_RIGHT_RADIUS,
1082                                           GTK_STYLE_PROPERTY_ANIMATED,
1083                                           GTK_CSS_AFFECTS_BACKGROUND | GTK_CSS_AFFECTS_BORDER,
1084                                           border_corner_radius_value_parse,
1085                                           _gtk_css_number_value_new (0, GTK_CSS_PX));
1086   gtk_css_style_property_register        ("border-bottom-left-radius",
1087                                           GTK_CSS_PROPERTY_BORDER_BOTTOM_LEFT_RADIUS,
1088                                           GTK_STYLE_PROPERTY_ANIMATED,
1089                                           GTK_CSS_AFFECTS_BACKGROUND | GTK_CSS_AFFECTS_BORDER,
1090                                           border_corner_radius_value_parse,
1091                                           _gtk_css_number_value_new (0, GTK_CSS_PX));
1092 
1093   gtk_css_style_property_register        ("outline-style",
1094                                           GTK_CSS_PROPERTY_OUTLINE_STYLE,
1095                                           0,
1096                                           GTK_CSS_AFFECTS_OUTLINE,
1097                                           parse_border_style,
1098                                           _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1099   gtk_css_style_property_register        ("outline-width",
1100                                           GTK_CSS_PROPERTY_OUTLINE_WIDTH,
1101                                           GTK_STYLE_PROPERTY_ANIMATED,
1102                                           GTK_CSS_AFFECTS_OUTLINE,
1103                                           parse_border_width,
1104                                           _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1105   gtk_css_style_property_register        ("outline-offset",
1106                                           GTK_CSS_PROPERTY_OUTLINE_OFFSET,
1107                                           GTK_STYLE_PROPERTY_ANIMATED,
1108                                           GTK_CSS_AFFECTS_OUTLINE,
1109                                           outline_parse,
1110                                           _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1111 
1112   gtk_css_style_property_register        ("background-clip",
1113                                           GTK_CSS_PROPERTY_BACKGROUND_CLIP,
1114                                           0,
1115                                           GTK_CSS_AFFECTS_BACKGROUND,
1116                                           parse_css_area,
1117                                           _gtk_css_area_value_new (GTK_CSS_AREA_BORDER_BOX));
1118   gtk_css_style_property_register        ("background-origin",
1119                                           GTK_CSS_PROPERTY_BACKGROUND_ORIGIN,
1120                                           0,
1121                                           GTK_CSS_AFFECTS_BACKGROUND,
1122                                           parse_css_area,
1123                                           _gtk_css_area_value_new (GTK_CSS_AREA_PADDING_BOX));
1124   gtk_css_style_property_register        ("background-size",
1125                                           GTK_CSS_PROPERTY_BACKGROUND_SIZE,
1126                                           GTK_STYLE_PROPERTY_ANIMATED,
1127                                           GTK_CSS_AFFECTS_BACKGROUND,
1128                                           background_size_parse,
1129                                           _gtk_css_bg_size_value_new (NULL, NULL));
1130   gtk_css_style_property_register        ("background-position",
1131                                           GTK_CSS_PROPERTY_BACKGROUND_POSITION,
1132                                           GTK_STYLE_PROPERTY_ANIMATED,
1133                                           GTK_CSS_AFFECTS_BACKGROUND,
1134                                           background_position_parse,
1135                                           _gtk_css_position_value_new (_gtk_css_number_value_new (0, GTK_CSS_PERCENT),
1136                                                                        _gtk_css_number_value_new (0, GTK_CSS_PERCENT)));
1137 
1138   gtk_css_style_property_register        ("border-top-color",
1139                                           GTK_CSS_PROPERTY_BORDER_TOP_COLOR,
1140                                           GTK_STYLE_PROPERTY_ANIMATED,
1141                                           GTK_CSS_AFFECTS_BORDER,
1142                                           color_parse,
1143                                           _gtk_css_color_value_new_current_color ());
1144   gtk_css_style_property_register        ("border-right-color",
1145                                           GTK_CSS_PROPERTY_BORDER_RIGHT_COLOR,
1146                                           GTK_STYLE_PROPERTY_ANIMATED,
1147                                           GTK_CSS_AFFECTS_BORDER,
1148                                           color_parse,
1149                                           _gtk_css_color_value_new_current_color ());
1150   gtk_css_style_property_register        ("border-bottom-color",
1151                                           GTK_CSS_PROPERTY_BORDER_BOTTOM_COLOR,
1152                                           GTK_STYLE_PROPERTY_ANIMATED,
1153                                           GTK_CSS_AFFECTS_BORDER,
1154                                           color_parse,
1155                                           _gtk_css_color_value_new_current_color ());
1156   gtk_css_style_property_register        ("border-left-color",
1157                                           GTK_CSS_PROPERTY_BORDER_LEFT_COLOR,
1158                                           GTK_STYLE_PROPERTY_ANIMATED,
1159                                           GTK_CSS_AFFECTS_BORDER,
1160                                           color_parse,
1161                                           _gtk_css_color_value_new_current_color ());
1162   gtk_css_style_property_register        ("outline-color",
1163                                           GTK_CSS_PROPERTY_OUTLINE_COLOR,
1164                                           GTK_STYLE_PROPERTY_ANIMATED,
1165                                           GTK_CSS_AFFECTS_OUTLINE,
1166                                           color_parse,
1167                                           _gtk_css_color_value_new_current_color ());
1168 
1169   gtk_css_style_property_register        ("background-repeat",
1170                                           GTK_CSS_PROPERTY_BACKGROUND_REPEAT,
1171                                           0,
1172                                           GTK_CSS_AFFECTS_BACKGROUND,
1173                                           background_repeat_value_parse,
1174                                           _gtk_css_background_repeat_value_new (GTK_CSS_REPEAT_STYLE_REPEAT,
1175                                                                                 GTK_CSS_REPEAT_STYLE_REPEAT));
1176   gtk_css_style_property_register        ("background-image",
1177                                           GTK_CSS_PROPERTY_BACKGROUND_IMAGE,
1178                                           GTK_STYLE_PROPERTY_ANIMATED,
1179                                           GTK_CSS_AFFECTS_BACKGROUND,
1180                                           background_image_value_parse,
1181                                           _gtk_css_image_value_new (NULL));
1182 
1183   gtk_css_style_property_register        ("background-blend-mode",
1184                                           GTK_CSS_PROPERTY_BACKGROUND_BLEND_MODE,
1185                                           0,
1186                                           GTK_CSS_AFFECTS_BACKGROUND,
1187                                           blend_mode_value_parse,
1188                                           _gtk_css_blend_mode_value_new (GSK_BLEND_MODE_DEFAULT));
1189 
1190   gtk_css_style_property_register        ("border-image-source",
1191                                           GTK_CSS_PROPERTY_BORDER_IMAGE_SOURCE,
1192                                           GTK_STYLE_PROPERTY_ANIMATED,
1193                                           GTK_CSS_AFFECTS_BORDER,
1194                                           css_image_value_parse,
1195                                           _gtk_css_image_value_new (NULL));
1196   gtk_css_style_property_register        ("border-image-repeat",
1197                                           GTK_CSS_PROPERTY_BORDER_IMAGE_REPEAT,
1198                                           0,
1199                                           GTK_CSS_AFFECTS_BORDER,
1200                                           border_image_repeat_parse,
1201                                           _gtk_css_border_repeat_value_new (GTK_CSS_REPEAT_STYLE_STRETCH,
1202                                                                             GTK_CSS_REPEAT_STYLE_STRETCH));
1203 
1204   gtk_css_style_property_register        ("border-image-slice",
1205                                           GTK_CSS_PROPERTY_BORDER_IMAGE_SLICE,
1206                                           0,
1207                                           GTK_CSS_AFFECTS_BORDER,
1208                                           border_image_slice_parse,
1209                                           _gtk_css_border_value_new (_gtk_css_number_value_new (100, GTK_CSS_PERCENT),
1210                                                                      _gtk_css_number_value_new (100, GTK_CSS_PERCENT),
1211                                                                      _gtk_css_number_value_new (100, GTK_CSS_PERCENT),
1212                                                                      _gtk_css_number_value_new (100, GTK_CSS_PERCENT)));
1213   gtk_css_style_property_register        ("border-image-width",
1214                                           GTK_CSS_PROPERTY_BORDER_IMAGE_WIDTH,
1215                                           0,
1216                                           GTK_CSS_AFFECTS_BORDER,
1217                                           border_image_width_parse,
1218                                           _gtk_css_border_value_new (_gtk_css_number_value_new (1, GTK_CSS_NUMBER),
1219                                                                      _gtk_css_number_value_new (1, GTK_CSS_NUMBER),
1220                                                                      _gtk_css_number_value_new (1, GTK_CSS_NUMBER),
1221                                                                      _gtk_css_number_value_new (1, GTK_CSS_NUMBER)));
1222 
1223   gtk_css_style_property_register        ("-gtk-icon-source",
1224                                           GTK_CSS_PROPERTY_ICON_SOURCE,
1225                                           GTK_STYLE_PROPERTY_ANIMATED,
1226                                           GTK_CSS_AFFECTS_ICON_TEXTURE,
1227                                           css_image_value_parse,
1228                                           _gtk_css_image_value_new (NULL));
1229   gtk_css_style_property_register        ("-gtk-icon-size",
1230                                           GTK_CSS_PROPERTY_ICON_SIZE,
1231                                           GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
1232                                           GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_ICON_SIZE,
1233                                           icon_size_parse,
1234                                           _gtk_css_number_value_new (16, GTK_CSS_PX));
1235   gtk_css_style_property_register        ("-gtk-icon-shadow",
1236                                           GTK_CSS_PROPERTY_ICON_SHADOW,
1237                                           GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
1238                                           GTK_CSS_AFFECTS_ICON_REDRAW,
1239                                           shadow_value_parse,
1240                                           gtk_css_shadow_value_new_none ());
1241   gtk_css_style_property_register        ("-gtk-icon-style",
1242                                           GTK_CSS_PROPERTY_ICON_STYLE,
1243                                           GTK_STYLE_PROPERTY_INHERIT,
1244                                           GTK_CSS_AFFECTS_ICON_TEXTURE,
1245                                           icon_style_parse,
1246                                           _gtk_css_icon_style_value_new (GTK_CSS_ICON_STYLE_REQUESTED));
1247   gtk_css_style_property_register        ("-gtk-icon-transform",
1248                                           GTK_CSS_PROPERTY_ICON_TRANSFORM,
1249                                           GTK_STYLE_PROPERTY_ANIMATED,
1250                                           GTK_CSS_AFFECTS_CONTENT,
1251                                           transform_value_parse,
1252                                           _gtk_css_transform_value_new_none ());
1253   gtk_css_style_property_register        ("-gtk-icon-filter",
1254                                           GTK_CSS_PROPERTY_ICON_FILTER,
1255                                           GTK_STYLE_PROPERTY_ANIMATED,
1256                                           GTK_CSS_AFFECTS_CONTENT,
1257                                           filter_value_parse,
1258                                           gtk_css_filter_value_new_none ());
1259   gtk_css_style_property_register        ("border-spacing",
1260                                           GTK_CSS_PROPERTY_BORDER_SPACING,
1261                                           GTK_STYLE_PROPERTY_ANIMATED,
1262                                           GTK_CSS_AFFECTS_SIZE,
1263                                           border_spacing_value_parse,
1264                                           _gtk_css_position_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1265                                                                        _gtk_css_number_value_new (0, GTK_CSS_PX)));
1266 
1267   gtk_css_style_property_register        ("transform",
1268                                           GTK_CSS_PROPERTY_TRANSFORM,
1269                                           GTK_STYLE_PROPERTY_ANIMATED,
1270                                           GTK_CSS_AFFECTS_TRANSFORM,
1271                                           transform_value_parse,
1272                                           _gtk_css_transform_value_new_none ());
1273   gtk_css_style_property_register        ("transform-origin",
1274                                           GTK_CSS_PROPERTY_TRANSFORM_ORIGIN,
1275                                           GTK_STYLE_PROPERTY_ANIMATED,
1276                                           GTK_CSS_AFFECTS_TRANSFORM,
1277                                           transform_origin_parse,
1278                                           _gtk_css_position_value_new (_gtk_css_number_value_new (50, GTK_CSS_PERCENT),
1279                                                                        _gtk_css_number_value_new (50, GTK_CSS_PERCENT)));
1280   gtk_css_style_property_register        ("min-width",
1281                                           GTK_CSS_PROPERTY_MIN_WIDTH,
1282                                           GTK_STYLE_PROPERTY_ANIMATED,
1283                                           GTK_CSS_AFFECTS_SIZE,
1284                                           minmax_parse,
1285                                           _gtk_css_number_value_new (0, GTK_CSS_PX));
1286   gtk_css_style_property_register        ("min-height",
1287                                           GTK_CSS_PROPERTY_MIN_HEIGHT,
1288                                           GTK_STYLE_PROPERTY_ANIMATED,
1289                                           GTK_CSS_AFFECTS_SIZE,
1290                                           minmax_parse,
1291                                           _gtk_css_number_value_new (0, GTK_CSS_PX));
1292 
1293   gtk_css_style_property_register        ("transition-property",
1294                                           GTK_CSS_PROPERTY_TRANSITION_PROPERTY,
1295                                           0,
1296                                           0,
1297                                           transition_property_parse,
1298                                           _gtk_css_ident_value_new ("all"));
1299   gtk_css_style_property_register        ("transition-duration",
1300                                           GTK_CSS_PROPERTY_TRANSITION_DURATION,
1301                                           0,
1302                                           0,
1303                                           transition_time_parse,
1304                                           _gtk_css_number_value_new (0, GTK_CSS_S));
1305   gtk_css_style_property_register        ("transition-timing-function",
1306                                           GTK_CSS_PROPERTY_TRANSITION_TIMING_FUNCTION,
1307                                           0,
1308                                           0,
1309                                           transition_timing_function_parse,
1310                                           _gtk_css_ease_value_new_cubic_bezier (0.25, 0.1, 0.25, 1.0));
1311   gtk_css_style_property_register        ("transition-delay",
1312                                           GTK_CSS_PROPERTY_TRANSITION_DELAY,
1313                                           0,
1314                                           0,
1315                                           transition_time_parse,
1316                                           _gtk_css_number_value_new (0, GTK_CSS_S));
1317 
1318   gtk_css_style_property_register        ("animation-name",
1319                                           GTK_CSS_PROPERTY_ANIMATION_NAME,
1320                                           0,
1321                                           0,
1322                                           transition_property_parse,
1323                                           _gtk_css_ident_value_new ("none"));
1324   gtk_css_style_property_register        ("animation-duration",
1325                                           GTK_CSS_PROPERTY_ANIMATION_DURATION,
1326                                           0,
1327                                           0,
1328                                           transition_time_parse,
1329                                           _gtk_css_number_value_new (0, GTK_CSS_S));
1330   gtk_css_style_property_register        ("animation-timing-function",
1331                                           GTK_CSS_PROPERTY_ANIMATION_TIMING_FUNCTION,
1332                                           0,
1333                                           0,
1334                                           transition_timing_function_parse,
1335                                           _gtk_css_ease_value_new_cubic_bezier (0.25, 0.1, 0.25, 1.0));
1336   gtk_css_style_property_register        ("animation-iteration-count",
1337                                           GTK_CSS_PROPERTY_ANIMATION_ITERATION_COUNT,
1338                                           0,
1339                                           0,
1340                                           iteration_count_parse,
1341                                           _gtk_css_number_value_new (1, GTK_CSS_NUMBER));
1342   gtk_css_style_property_register        ("animation-direction",
1343                                           GTK_CSS_PROPERTY_ANIMATION_DIRECTION,
1344                                           0,
1345                                           0,
1346                                           parse_css_direction,
1347                                           _gtk_css_direction_value_new (GTK_CSS_DIRECTION_NORMAL));
1348   gtk_css_style_property_register        ("animation-play-state",
1349                                           GTK_CSS_PROPERTY_ANIMATION_PLAY_STATE,
1350                                           0,
1351                                           0,
1352                                           parse_css_play_state,
1353                                           _gtk_css_play_state_value_new (GTK_CSS_PLAY_STATE_RUNNING));
1354   gtk_css_style_property_register        ("animation-delay",
1355                                           GTK_CSS_PROPERTY_ANIMATION_DELAY,
1356                                           0,
1357                                           0,
1358                                           transition_time_parse,
1359                                           _gtk_css_number_value_new (0, GTK_CSS_S));
1360   gtk_css_style_property_register        ("animation-fill-mode",
1361                                           GTK_CSS_PROPERTY_ANIMATION_FILL_MODE,
1362                                           0,
1363                                           0,
1364                                           parse_css_fill_mode,
1365                                           _gtk_css_fill_mode_value_new (GTK_CSS_FILL_NONE));
1366 
1367   gtk_css_style_property_register        ("opacity",
1368                                           GTK_CSS_PROPERTY_OPACITY,
1369                                           GTK_STYLE_PROPERTY_ANIMATED,
1370                                           GTK_CSS_AFFECTS_POSTEFFECT,
1371                                           opacity_parse,
1372                                           _gtk_css_number_value_new (1, GTK_CSS_NUMBER));
1373   gtk_css_style_property_register        ("filter",
1374                                           GTK_CSS_PROPERTY_FILTER,
1375                                           GTK_STYLE_PROPERTY_ANIMATED,
1376                                           GTK_CSS_AFFECTS_POSTEFFECT,
1377                                           filter_value_parse,
1378                                           gtk_css_filter_value_new_none ());
1379 
1380   gtk_css_style_property_register        ("caret-color",
1381                                           GTK_CSS_PROPERTY_CARET_COLOR,
1382                                           GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
1383                                           GTK_CSS_AFFECTS_CONTENT,
1384                                           color_parse,
1385                                           _gtk_css_color_value_new_current_color ());
1386   gtk_css_style_property_register        ("-gtk-secondary-caret-color",
1387                                           GTK_CSS_PROPERTY_SECONDARY_CARET_COLOR,
1388                                           GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
1389                                           GTK_CSS_AFFECTS_CONTENT,
1390                                           color_parse,
1391                                           _gtk_css_color_value_new_current_color ());
1392   gtk_css_style_property_register        ("font-feature-settings",
1393                                           GTK_CSS_PROPERTY_FONT_FEATURE_SETTINGS,
1394                                           GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
1395                                           GTK_CSS_AFFECTS_TEXT_ATTRS | GTK_CSS_AFFECTS_TEXT_SIZE,
1396                                           parse_font_feature_settings,
1397                                           gtk_css_font_features_value_new_default ());
1398   gtk_css_style_property_register        ("font-variation-settings",
1399                                           GTK_CSS_PROPERTY_FONT_VARIATION_SETTINGS,
1400                                           GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
1401                                           GTK_CSS_AFFECTS_TEXT_ATTRS | GTK_CSS_AFFECTS_TEXT_SIZE,
1402                                           parse_font_variation_settings,
1403                                           gtk_css_font_variations_value_new_default ());
1404 }
1405