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

source code of gtk/gtk/gtkcssstylepropertyimpl.c