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