1 /* GTK - The GIMP Toolkit
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 <cairo-gobject.h>
25 #include <math.h>
26
27 #include "gtkcssparserprivate.h"
28 #include "gtkcssstylefuncsprivate.h"
29 #include "gtkcssstylepropertyprivate.h"
30 #include "gtkcsstypesprivate.h"
31 #include "gtkintl.h"
32 #include "gtkprivatetypebuiltins.h"
33
34 /* this is in case round() is not provided by the compiler,
35 * such as in the case of C89 compilers, like MSVC
36 */
37 #include "fallback-c89.c"
38
39 /* the actual parsers we have */
40 #include "gtkbindings.h"
41 #include "gtkcssarrayvalueprivate.h"
42 #include "gtkcssbgsizevalueprivate.h"
43 #include "gtkcssbordervalueprivate.h"
44 #include "gtkcsscolorvalueprivate.h"
45 #include "gtkcsscornervalueprivate.h"
46 #include "gtkcsseasevalueprivate.h"
47 #include "gtkcssenginevalueprivate.h"
48 #include "gtkcssiconthemevalueprivate.h"
49 #include "gtkcssimageprivate.h"
50 #include "gtkcssimagebuiltinprivate.h"
51 #include "gtkcssimagegradientprivate.h"
52 #include "gtkcssimagevalueprivate.h"
53 #include "gtkcssinitialvalueprivate.h"
54 #include "gtkcssenumvalueprivate.h"
55 #include "gtkcssnumbervalueprivate.h"
56 #include "gtkcsspalettevalueprivate.h"
57 #include "gtkcsspositionvalueprivate.h"
58 #include "gtkcssrepeatvalueprivate.h"
59 #include "gtkcssrgbavalueprivate.h"
60 #include "gtkcssshadowsvalueprivate.h"
61 #include "gtkcssstringvalueprivate.h"
62 #include "gtkcsstransformvalueprivate.h"
63 #include "gtktypebuiltins.h"
64
65 #include "deprecated/gtkthemingengine.h"
66
67 /*** REGISTRATION ***/
68
69 typedef enum {
70 GTK_STYLE_PROPERTY_INHERIT = (1 << 0),
71 GTK_STYLE_PROPERTY_ANIMATED = (1 << 1),
72 } GtkStylePropertyFlags;
73
74 static void
gtk_css_style_property_register(const char * name,guint expected_id,GType value_type,GtkStylePropertyFlags flags,GtkCssAffects affects,GtkCssStylePropertyParseFunc parse_value,GtkCssStylePropertyQueryFunc query_value,GtkCssStylePropertyAssignFunc assign_value,GtkCssValue * initial_value)75 gtk_css_style_property_register (const char * name,
76 guint expected_id,
77 GType value_type,
78 GtkStylePropertyFlags flags,
79 GtkCssAffects affects,
80 GtkCssStylePropertyParseFunc parse_value,
81 GtkCssStylePropertyQueryFunc query_value,
82 GtkCssStylePropertyAssignFunc assign_value,
83 GtkCssValue * initial_value)
84 {
85 GtkCssStyleProperty *node;
86
87 g_assert (initial_value != NULL);
88 g_assert (parse_value != NULL);
89 g_assert (value_type == G_TYPE_NONE || query_value != NULL);
90 g_assert (assign_value == NULL || query_value != NULL);
91
92 node = g_object_new (GTK_TYPE_CSS_STYLE_PROPERTY,
93 "value-type", value_type,
94 "affects", affects,
95 "animated", (flags & GTK_STYLE_PROPERTY_ANIMATED) ? TRUE : FALSE,
96 "inherit", (flags & GTK_STYLE_PROPERTY_INHERIT) ? TRUE : FALSE,
97 "initial-value", initial_value,
98 "name", name,
99 NULL);
100
101 node->parse_value = parse_value;
102 node->query_value = query_value;
103 node->assign_value = assign_value;
104
105 _gtk_css_value_unref (initial_value);
106
107 g_assert (_gtk_css_style_property_get_id (node) == expected_id);
108 }
109
110 /*** IMPLEMENTATIONS ***/
111
112 static void
query_length_as_int(GtkCssStyleProperty * property,const GtkCssValue * css_value,GValue * value)113 query_length_as_int (GtkCssStyleProperty *property,
114 const GtkCssValue *css_value,
115 GValue *value)
116 {
117 g_value_init (value, G_TYPE_INT);
118 g_value_set_int (value, round (_gtk_css_number_value_get (css_value, 100)));
119 }
120
121 static GtkCssValue *
assign_length_from_int(GtkCssStyleProperty * property,const GValue * value)122 assign_length_from_int (GtkCssStyleProperty *property,
123 const GValue *value)
124 {
125 return _gtk_css_number_value_new (g_value_get_int (value), GTK_CSS_PX);
126 }
127
128 static void
query_font_size(GtkCssStyleProperty * property,const GtkCssValue * css_value,GValue * value)129 query_font_size (GtkCssStyleProperty *property,
130 const GtkCssValue *css_value,
131 GValue *value)
132 {
133 g_value_init (value, G_TYPE_DOUBLE);
134 g_value_set_double (value, _gtk_css_number_value_get (css_value, 100));
135 }
136
137 static GtkCssValue *
assign_font_size(GtkCssStyleProperty * property,const GValue * value)138 assign_font_size (GtkCssStyleProperty *property,
139 const GValue *value)
140 {
141 return _gtk_css_number_value_new (g_value_get_double (value), GTK_CSS_PX);
142 }
143
144 static void
query_border(GtkCssStyleProperty * property,const GtkCssValue * css_value,GValue * value)145 query_border (GtkCssStyleProperty *property,
146 const GtkCssValue *css_value,
147 GValue *value)
148 {
149 GtkBorder border;
150
151 g_value_init (value, GTK_TYPE_BORDER);
152
153 border.top = round (_gtk_css_number_value_get (_gtk_css_border_value_get_top (css_value), 100));
154 border.right = round (_gtk_css_number_value_get (_gtk_css_border_value_get_right (css_value), 100));
155 border.bottom = round (_gtk_css_number_value_get (_gtk_css_border_value_get_bottom (css_value), 100));
156 border.left = round (_gtk_css_number_value_get (_gtk_css_border_value_get_left (css_value), 100));
157
158 g_value_set_boxed (value, &border);
159 }
160
161 static GtkCssValue *
assign_border(GtkCssStyleProperty * property,const GValue * value)162 assign_border (GtkCssStyleProperty *property,
163 const GValue *value)
164 {
165 const GtkBorder *border = g_value_get_boxed (value);
166
167 if (border == NULL)
168 return _gtk_css_initial_value_new ();
169 else
170 return _gtk_css_border_value_new (_gtk_css_number_value_new (border->top, GTK_CSS_PX),
171 _gtk_css_number_value_new (border->right, GTK_CSS_PX),
172 _gtk_css_number_value_new (border->bottom, GTK_CSS_PX),
173 _gtk_css_number_value_new (border->left, GTK_CSS_PX));
174 }
175
176 static GtkCssValue *
color_parse(GtkCssStyleProperty * property,GtkCssParser * parser)177 color_parse (GtkCssStyleProperty *property,
178 GtkCssParser *parser)
179 {
180 return _gtk_css_color_value_parse (parser);
181 }
182
183 static void
color_query(GtkCssStyleProperty * property,const GtkCssValue * css_value,GValue * value)184 color_query (GtkCssStyleProperty *property,
185 const GtkCssValue *css_value,
186 GValue *value)
187 {
188 g_value_init (value, GDK_TYPE_RGBA);
189 g_value_set_boxed (value, _gtk_css_rgba_value_get_rgba (css_value));
190 }
191
192 static GtkCssValue *
color_assign(GtkCssStyleProperty * property,const GValue * value)193 color_assign (GtkCssStyleProperty *property,
194 const GValue *value)
195 {
196 return _gtk_css_rgba_value_new_from_rgba (g_value_get_boxed (value));
197 }
198
199 static GtkCssValue *
font_family_parse_one(GtkCssParser * parser)200 font_family_parse_one (GtkCssParser *parser)
201 {
202 char *name;
203
204 name = _gtk_css_parser_try_ident (parser, TRUE);
205 if (name)
206 {
207 GString *string = g_string_new (name);
208 g_free (name);
209 while ((name = _gtk_css_parser_try_ident (parser, TRUE)))
210 {
211 g_string_append_c (string, ' ');
212 g_string_append (string, name);
213 g_free (name);
214 }
215 name = g_string_free (string, FALSE);
216 }
217 else
218 {
219 name = _gtk_css_parser_read_string (parser);
220 if (name == NULL)
221 return NULL;
222 }
223
224 return _gtk_css_string_value_new_take (name);
225 }
226
227 GtkCssValue *
gtk_css_font_family_value_parse(GtkCssParser * parser)228 gtk_css_font_family_value_parse (GtkCssParser *parser)
229 {
230 return _gtk_css_array_value_parse (parser, font_family_parse_one);
231 }
232
233 static GtkCssValue *
font_family_parse(GtkCssStyleProperty * property,GtkCssParser * parser)234 font_family_parse (GtkCssStyleProperty *property,
235 GtkCssParser *parser)
236 {
237 return gtk_css_font_family_value_parse (parser);
238 }
239
240 static void
font_family_query(GtkCssStyleProperty * property,const GtkCssValue * css_value,GValue * value)241 font_family_query (GtkCssStyleProperty *property,
242 const GtkCssValue *css_value,
243 GValue *value)
244 {
245 GPtrArray *array;
246 guint i;
247
248 array = g_ptr_array_new ();
249
250 for (i = 0; i < _gtk_css_array_value_get_n_values (css_value); i++)
251 {
252 g_ptr_array_add (array, g_strdup (_gtk_css_string_value_get (_gtk_css_array_value_get_nth (css_value, i))));
253 }
254
255 /* NULL-terminate */
256 g_ptr_array_add (array, NULL);
257
258 g_value_init (value, G_TYPE_STRV);
259 g_value_set_boxed (value, g_ptr_array_free (array, FALSE));
260 }
261
262 static GtkCssValue *
font_family_assign(GtkCssStyleProperty * property,const GValue * value)263 font_family_assign (GtkCssStyleProperty *property,
264 const GValue *value)
265 {
266 const char **names;
267 GtkCssValue *result;
268 GPtrArray *array;
269
270 array = g_ptr_array_new ();
271
272 for (names = g_value_get_boxed (value); *names; names++)
273 {
274 g_ptr_array_add (array, _gtk_css_string_value_new (*names));
275 }
276
277 result = _gtk_css_array_value_new_from_array ((GtkCssValue **) array->pdata, array->len);
278 g_ptr_array_free (array, TRUE);
279 return result;
280 }
281
282 static GtkCssValue *
font_style_parse(GtkCssStyleProperty * property,GtkCssParser * parser)283 font_style_parse (GtkCssStyleProperty *property,
284 GtkCssParser *parser)
285 {
286 GtkCssValue *value = _gtk_css_font_style_value_try_parse (parser);
287
288 if (value == NULL)
289 _gtk_css_parser_error (parser, "unknown value for property");
290
291 return value;
292 }
293
294 static void
font_style_query(GtkCssStyleProperty * property,const GtkCssValue * css_value,GValue * value)295 font_style_query (GtkCssStyleProperty *property,
296 const GtkCssValue *css_value,
297 GValue *value)
298 {
299 g_value_init (value, PANGO_TYPE_STYLE);
300 g_value_set_enum (value, _gtk_css_font_style_value_get (css_value));
301 }
302
303 static GtkCssValue *
font_style_assign(GtkCssStyleProperty * property,const GValue * value)304 font_style_assign (GtkCssStyleProperty *property,
305 const GValue *value)
306 {
307 return _gtk_css_font_style_value_new (g_value_get_enum (value));
308 }
309
310 static GtkCssValue *
font_weight_parse(GtkCssStyleProperty * property,GtkCssParser * parser)311 font_weight_parse (GtkCssStyleProperty *property,
312 GtkCssParser *parser)
313 {
314 GtkCssValue *value = _gtk_css_font_weight_value_try_parse (parser);
315
316 if (value == NULL)
317 _gtk_css_parser_error (parser, "unknown value for property");
318
319 return value;
320 }
321
322 static void
font_weight_query(GtkCssStyleProperty * property,const GtkCssValue * css_value,GValue * value)323 font_weight_query (GtkCssStyleProperty *property,
324 const GtkCssValue *css_value,
325 GValue *value)
326 {
327 g_value_init (value, PANGO_TYPE_WEIGHT);
328 g_value_set_enum (value, _gtk_css_font_weight_value_get (css_value));
329 }
330
331 static GtkCssValue *
font_weight_assign(GtkCssStyleProperty * property,const GValue * value)332 font_weight_assign (GtkCssStyleProperty *property,
333 const GValue *value)
334 {
335 return _gtk_css_font_weight_value_new (g_value_get_enum (value));
336 }
337
338 static GtkCssValue *
font_variant_parse(GtkCssStyleProperty * property,GtkCssParser * parser)339 font_variant_parse (GtkCssStyleProperty *property,
340 GtkCssParser *parser)
341 {
342 GtkCssValue *value = _gtk_css_font_variant_value_try_parse (parser);
343
344 if (value == NULL)
345 _gtk_css_parser_error (parser, "unknown value for property");
346
347 return value;
348 }
349
350 static void
font_variant_query(GtkCssStyleProperty * property,const GtkCssValue * css_value,GValue * value)351 font_variant_query (GtkCssStyleProperty *property,
352 const GtkCssValue *css_value,
353 GValue *value)
354 {
355 g_value_init (value, PANGO_TYPE_VARIANT);
356 g_value_set_enum (value, _gtk_css_font_variant_value_get (css_value));
357 }
358
359 static GtkCssValue *
font_variant_assign(GtkCssStyleProperty * property,const GValue * value)360 font_variant_assign (GtkCssStyleProperty *property,
361 const GValue *value)
362 {
363 return _gtk_css_font_variant_value_new (g_value_get_enum (value));
364 }
365
366 static GtkCssValue *
font_stretch_parse(GtkCssStyleProperty * property,GtkCssParser * parser)367 font_stretch_parse (GtkCssStyleProperty *property,
368 GtkCssParser *parser)
369 {
370 GtkCssValue *value = _gtk_css_font_stretch_value_try_parse (parser);
371
372 if (value == NULL)
373 _gtk_css_parser_error (parser, "unknown value for property");
374
375 return value;
376 }
377
378 static void
font_stretch_query(GtkCssStyleProperty * property,const GtkCssValue * css_value,GValue * value)379 font_stretch_query (GtkCssStyleProperty *property,
380 const GtkCssValue *css_value,
381 GValue *value)
382 {
383 g_value_init (value, PANGO_TYPE_STRETCH);
384 g_value_set_enum (value, _gtk_css_font_stretch_value_get (css_value));
385 }
386
387 static GtkCssValue *
font_stretch_assign(GtkCssStyleProperty * property,const GValue * value)388 font_stretch_assign (GtkCssStyleProperty *property,
389 const GValue *value)
390 {
391 return _gtk_css_font_stretch_value_new (g_value_get_enum (value));
392 }
393
394 static GtkCssValue *
parse_border_style(GtkCssStyleProperty * property,GtkCssParser * parser)395 parse_border_style (GtkCssStyleProperty *property,
396 GtkCssParser *parser)
397 {
398 GtkCssValue *value = _gtk_css_border_style_value_try_parse (parser);
399
400 if (value == NULL)
401 _gtk_css_parser_error (parser, "unknown value for property");
402
403 return value;
404 }
405
406 static void
query_border_style(GtkCssStyleProperty * property,const GtkCssValue * css_value,GValue * value)407 query_border_style (GtkCssStyleProperty *property,
408 const GtkCssValue *css_value,
409 GValue *value)
410 {
411 g_value_init (value, GTK_TYPE_BORDER_STYLE);
412 g_value_set_enum (value, _gtk_css_border_style_value_get (css_value));
413 }
414
415 static GtkCssValue *
assign_border_style(GtkCssStyleProperty * property,const GValue * value)416 assign_border_style (GtkCssStyleProperty *property,
417 const GValue *value)
418 {
419 return _gtk_css_border_style_value_new (g_value_get_enum (value));
420 }
421
422 static GtkCssValue *
parse_css_area_one(GtkCssParser * parser)423 parse_css_area_one (GtkCssParser *parser)
424 {
425 GtkCssValue *value = _gtk_css_area_value_try_parse (parser);
426
427 if (value == NULL)
428 _gtk_css_parser_error (parser, "unknown value for property");
429
430 return value;
431 }
432
433 static GtkCssValue *
parse_css_area(GtkCssStyleProperty * property,GtkCssParser * parser)434 parse_css_area (GtkCssStyleProperty *property,
435 GtkCssParser *parser)
436 {
437 return _gtk_css_array_value_parse (parser, parse_css_area_one);
438 }
439
440 static GtkCssValue *
parse_one_css_direction(GtkCssParser * parser)441 parse_one_css_direction (GtkCssParser *parser)
442 {
443 GtkCssValue *value = _gtk_css_direction_value_try_parse (parser);
444
445 if (value == NULL)
446 _gtk_css_parser_error (parser, "unknown value for property");
447
448 return value;
449 }
450
451 static GtkCssValue *
parse_css_direction(GtkCssStyleProperty * property,GtkCssParser * parser)452 parse_css_direction (GtkCssStyleProperty *property,
453 GtkCssParser *parser)
454 {
455 return _gtk_css_array_value_parse (parser, parse_one_css_direction);
456 }
457
458 static GtkCssValue *
opacity_parse(GtkCssStyleProperty * property,GtkCssParser * parser)459 opacity_parse (GtkCssStyleProperty *property,
460 GtkCssParser *parser)
461 {
462 return _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_NUMBER);
463 }
464
465 static void
opacity_query(GtkCssStyleProperty * property,const GtkCssValue * css_value,GValue * value)466 opacity_query (GtkCssStyleProperty *property,
467 const GtkCssValue *css_value,
468 GValue *value)
469 {
470 g_value_init (value, G_TYPE_DOUBLE);
471 g_value_set_double (value, _gtk_css_number_value_get (css_value, 100));
472 }
473
474 static GtkCssValue *
parse_font_feature_settings(GtkCssStyleProperty * property,GtkCssParser * parser)475 parse_font_feature_settings (GtkCssStyleProperty *property,
476 GtkCssParser *parser)
477 {
478 return _gtk_css_string_value_parse (parser);
479 }
480
481 static GtkCssValue *
parse_one_css_play_state(GtkCssParser * parser)482 parse_one_css_play_state (GtkCssParser *parser)
483 {
484 GtkCssValue *value = _gtk_css_play_state_value_try_parse (parser);
485
486 if (value == NULL)
487 _gtk_css_parser_error (parser, "unknown value for property");
488
489 return value;
490 }
491
492 static GtkCssValue *
parse_css_play_state(GtkCssStyleProperty * property,GtkCssParser * parser)493 parse_css_play_state (GtkCssStyleProperty *property,
494 GtkCssParser *parser)
495 {
496 return _gtk_css_array_value_parse (parser, parse_one_css_play_state);
497 }
498
499 static GtkCssValue *
parse_one_css_fill_mode(GtkCssParser * parser)500 parse_one_css_fill_mode (GtkCssParser *parser)
501 {
502 GtkCssValue *value = _gtk_css_fill_mode_value_try_parse (parser);
503
504 if (value == NULL)
505 _gtk_css_parser_error (parser, "unknown value for property");
506
507 return value;
508 }
509
510 static GtkCssValue *
parse_css_fill_mode(GtkCssStyleProperty * property,GtkCssParser * parser)511 parse_css_fill_mode (GtkCssStyleProperty *property,
512 GtkCssParser *parser)
513 {
514 return _gtk_css_array_value_parse (parser, parse_one_css_fill_mode);
515 }
516
517 static GtkCssValue *
image_effect_parse(GtkCssStyleProperty * property,GtkCssParser * parser)518 image_effect_parse (GtkCssStyleProperty *property,
519 GtkCssParser *parser)
520 {
521 GtkCssValue *value = _gtk_css_icon_effect_value_try_parse (parser);
522
523 if (value == NULL)
524 _gtk_css_parser_error (parser, "unknown value for property");
525
526 return value;
527 }
528
529 static GtkCssValue *
icon_palette_parse(GtkCssStyleProperty * property,GtkCssParser * parser)530 icon_palette_parse (GtkCssStyleProperty *property,
531 GtkCssParser *parser)
532 {
533 return gtk_css_palette_value_parse (parser);
534 }
535
536 static GtkCssValue *
icon_style_parse(GtkCssStyleProperty * property,GtkCssParser * parser)537 icon_style_parse (GtkCssStyleProperty *property,
538 GtkCssParser *parser)
539 {
540 GtkCssValue *value = _gtk_css_icon_style_value_try_parse (parser);
541
542 if (value == NULL)
543 _gtk_css_parser_error (parser, "unknown value for property");
544
545 return value;
546 }
547
548 static GtkCssValue *
bindings_value_parse_one(GtkCssParser * parser)549 bindings_value_parse_one (GtkCssParser *parser)
550 {
551 char *name;
552
553 name = _gtk_css_parser_try_ident (parser, TRUE);
554 if (name == NULL)
555 {
556 _gtk_css_parser_error (parser, "Not a valid binding name");
557 return NULL;
558 }
559
560 if (g_ascii_strcasecmp (name, "none") == 0)
561 {
562 name = NULL;
563 }
564 else if (!gtk_binding_set_find (name))
565 {
566 _gtk_css_parser_error (parser, "No binding set named '%s'", name);
567 g_free (name);
568 return NULL;
569 }
570
571 return _gtk_css_string_value_new_take (name);
572 }
573
574 static GtkCssValue *
bindings_value_parse(GtkCssStyleProperty * property,GtkCssParser * parser)575 bindings_value_parse (GtkCssStyleProperty *property,
576 GtkCssParser *parser)
577 {
578 return _gtk_css_array_value_parse (parser, bindings_value_parse_one);
579 }
580
581 static void
bindings_value_query(GtkCssStyleProperty * property,const GtkCssValue * css_value,GValue * value)582 bindings_value_query (GtkCssStyleProperty *property,
583 const GtkCssValue *css_value,
584 GValue *value)
585 {
586 GPtrArray *array;
587 guint i;
588
589 g_value_init (value, G_TYPE_PTR_ARRAY);
590
591 if (_gtk_css_array_value_get_n_values (css_value) == 0)
592 return;
593
594 array = NULL;
595
596 for (i = 0; i < _gtk_css_array_value_get_n_values (css_value); i++)
597 {
598 const char *name;
599 GtkBindingSet *binding_set;
600
601 name = _gtk_css_string_value_get (_gtk_css_array_value_get_nth (css_value, i));
602 if (name == NULL)
603 continue;
604
605 binding_set = gtk_binding_set_find (name);
606 if (binding_set == NULL)
607 continue;
608
609 if (array == NULL)
610 array = g_ptr_array_new ();
611 g_ptr_array_add (array, binding_set);
612 }
613
614 g_value_take_boxed (value, array);
615 }
616
617 static GtkCssValue *
bindings_value_assign(GtkCssStyleProperty * property,const GValue * value)618 bindings_value_assign (GtkCssStyleProperty *property,
619 const GValue *value)
620 {
621 GPtrArray *binding_sets = g_value_get_boxed (value);
622 GtkCssValue **values, *result;
623 guint i;
624
625 if (binding_sets == NULL || binding_sets->len == 0)
626 return _gtk_css_array_value_new (_gtk_css_string_value_new (NULL));
627
628 values = g_new (GtkCssValue *, binding_sets->len);
629
630 for (i = 0; i < binding_sets->len; i++)
631 {
632 GtkBindingSet *binding_set = g_ptr_array_index (binding_sets, i);
633 values[i] = _gtk_css_string_value_new (binding_set->set_name);
634 }
635
636 result = _gtk_css_array_value_new_from_array (values, binding_sets->len);
637 g_free (values);
638 return result;
639 }
640
641 static GtkCssValue *
parse_letter_spacing(GtkCssStyleProperty * property,GtkCssParser * parser)642 parse_letter_spacing (GtkCssStyleProperty *property,
643 GtkCssParser *parser)
644 {
645 return _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_LENGTH);
646 }
647
648 static GtkCssValue *
parse_text_decoration_line(GtkCssStyleProperty * property,GtkCssParser * parser)649 parse_text_decoration_line (GtkCssStyleProperty *property,
650 GtkCssParser *parser)
651 {
652 GtkCssValue *value = _gtk_css_text_decoration_line_value_try_parse (parser);
653
654 if (value == NULL)
655 _gtk_css_parser_error (parser, "unknown value for property");
656
657 return value;
658 }
659
660 static GtkCssValue *
parse_text_decoration_style(GtkCssStyleProperty * property,GtkCssParser * parser)661 parse_text_decoration_style (GtkCssStyleProperty *property,
662 GtkCssParser *parser)
663 {
664 GtkCssValue *value = _gtk_css_text_decoration_style_value_try_parse (parser);
665
666 if (value == NULL)
667 _gtk_css_parser_error (parser, "unknown value for property");
668
669 return value;
670 }
671
672 static GtkCssValue *
box_shadow_value_parse(GtkCssStyleProperty * property,GtkCssParser * parser)673 box_shadow_value_parse (GtkCssStyleProperty *property,
674 GtkCssParser *parser)
675 {
676 return _gtk_css_shadows_value_parse (parser, TRUE);
677 }
678
679 static GtkCssValue *
shadow_value_parse(GtkCssStyleProperty * property,GtkCssParser * parser)680 shadow_value_parse (GtkCssStyleProperty *property,
681 GtkCssParser *parser)
682 {
683 return _gtk_css_shadows_value_parse (parser, FALSE);
684 }
685
686 static GtkCssValue *
transform_value_parse(GtkCssStyleProperty * property,GtkCssParser * parser)687 transform_value_parse (GtkCssStyleProperty *property,
688 GtkCssParser *parser)
689 {
690 return _gtk_css_transform_value_parse (parser);
691 }
692
693 static GtkCssValue *
border_corner_radius_value_parse(GtkCssStyleProperty * property,GtkCssParser * parser)694 border_corner_radius_value_parse (GtkCssStyleProperty *property,
695 GtkCssParser *parser)
696 {
697 return _gtk_css_corner_value_parse (parser);
698 }
699
700 static GtkCssValue *
css_image_value_parse(GtkCssStyleProperty * property,GtkCssParser * parser)701 css_image_value_parse (GtkCssStyleProperty *property,
702 GtkCssParser *parser)
703 {
704 GtkCssImage *image;
705
706 if (_gtk_css_parser_try (parser, "none", TRUE))
707 image = NULL;
708 else
709 {
710 image = _gtk_css_image_new_parse (parser);
711 if (image == NULL)
712 return NULL;
713 }
714
715 return _gtk_css_image_value_new (image);
716 }
717
718 static GtkCssValue *
css_image_value_parse_with_builtin(GtkCssStyleProperty * property,GtkCssParser * parser)719 css_image_value_parse_with_builtin (GtkCssStyleProperty *property,
720 GtkCssParser *parser)
721 {
722 if (_gtk_css_parser_try (parser, "builtin", TRUE))
723 return _gtk_css_image_value_new (gtk_css_image_builtin_new ());
724
725 return css_image_value_parse (property, parser);
726 }
727
728 static void
css_image_value_query(GtkCssStyleProperty * property,const GtkCssValue * css_value,GValue * value)729 css_image_value_query (GtkCssStyleProperty *property,
730 const GtkCssValue *css_value,
731 GValue *value)
732 {
733 GtkCssImage *image = _gtk_css_image_value_get_image (css_value);
734 cairo_pattern_t *pattern;
735 cairo_surface_t *surface;
736 cairo_matrix_t matrix;
737
738 g_value_init (value, CAIRO_GOBJECT_TYPE_PATTERN);
739
740 if (GTK_IS_CSS_IMAGE_GRADIENT (image))
741 g_value_set_boxed (value, GTK_CSS_IMAGE_GRADIENT (image)->pattern);
742 else if (image != NULL)
743 {
744 double width, height;
745
746 /* the 100, 100 is rather random */
747 _gtk_css_image_get_concrete_size (image, 0, 0, 100, 100, &width, &height);
748 surface = _gtk_css_image_get_surface (image, NULL, width, height);
749 pattern = cairo_pattern_create_for_surface (surface);
750 cairo_matrix_init_scale (&matrix, width, height);
751 cairo_pattern_set_matrix (pattern, &matrix);
752 cairo_surface_destroy (surface);
753 g_value_take_boxed (value, pattern);
754 }
755 }
756
757 static GtkCssValue *
css_image_value_assign(GtkCssStyleProperty * property,const GValue * value)758 css_image_value_assign (GtkCssStyleProperty *property,
759 const GValue *value)
760 {
761 g_warning ("FIXME: assigning images is not implemented");
762 return _gtk_css_image_value_new (NULL);
763 }
764
765 static GtkCssValue *
background_image_value_parse_one(GtkCssParser * parser)766 background_image_value_parse_one (GtkCssParser *parser)
767 {
768 return css_image_value_parse (NULL, parser);
769 }
770
771 static GtkCssValue *
background_image_value_parse(GtkCssStyleProperty * property,GtkCssParser * parser)772 background_image_value_parse (GtkCssStyleProperty *property,
773 GtkCssParser *parser)
774 {
775 return _gtk_css_array_value_parse (parser, background_image_value_parse_one);
776 }
777
778 static void
background_image_value_query(GtkCssStyleProperty * property,const GtkCssValue * css_value,GValue * value)779 background_image_value_query (GtkCssStyleProperty *property,
780 const GtkCssValue *css_value,
781 GValue *value)
782 {
783 css_image_value_query (property, _gtk_css_array_value_get_nth (css_value, 0), value);
784 }
785
786 static GtkCssValue *
background_image_value_assign(GtkCssStyleProperty * property,const GValue * value)787 background_image_value_assign (GtkCssStyleProperty *property,
788 const GValue *value)
789 {
790 return _gtk_css_array_value_new (css_image_value_assign (property, value));
791 }
792
793 static GtkCssValue *
dpi_parse(GtkCssStyleProperty * property,GtkCssParser * parser)794 dpi_parse (GtkCssStyleProperty *property,
795 GtkCssParser *parser)
796 {
797 return _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_NUMBER);
798 }
799
800 GtkCssValue *
gtk_css_font_size_value_parse(GtkCssParser * parser)801 gtk_css_font_size_value_parse (GtkCssParser *parser)
802 {
803 GtkCssValue *value;
804
805 value = _gtk_css_font_size_value_try_parse (parser);
806 if (value)
807 return value;
808
809 return _gtk_css_number_value_parse (parser,
810 GTK_CSS_PARSE_LENGTH
811 | GTK_CSS_PARSE_PERCENT
812 | GTK_CSS_POSITIVE_ONLY
813 | GTK_CSS_NUMBER_AS_PIXELS);
814 }
815
816 static GtkCssValue *
font_size_parse(GtkCssStyleProperty * property,GtkCssParser * parser)817 font_size_parse (GtkCssStyleProperty *property,
818 GtkCssParser *parser)
819 {
820 return gtk_css_font_size_value_parse (parser);
821 }
822
823 static GtkCssValue *
outline_parse(GtkCssStyleProperty * property,GtkCssParser * parser)824 outline_parse (GtkCssStyleProperty *property,
825 GtkCssParser *parser)
826 {
827 return _gtk_css_number_value_parse (parser,
828 GTK_CSS_NUMBER_AS_PIXELS
829 | GTK_CSS_PARSE_LENGTH);
830 }
831
832 static GtkCssValue *
border_image_repeat_parse(GtkCssStyleProperty * property,GtkCssParser * parser)833 border_image_repeat_parse (GtkCssStyleProperty *property,
834 GtkCssParser *parser)
835 {
836 GtkCssValue *value = _gtk_css_border_repeat_value_try_parse (parser);
837
838 if (value == NULL)
839 {
840 _gtk_css_parser_error (parser, "Not a valid value");
841 return NULL;
842 }
843
844 return value;
845 }
846
847 static GtkCssValue *
border_image_slice_parse(GtkCssStyleProperty * property,GtkCssParser * parser)848 border_image_slice_parse (GtkCssStyleProperty *property,
849 GtkCssParser *parser)
850 {
851 return _gtk_css_border_value_parse (parser,
852 GTK_CSS_PARSE_PERCENT
853 | GTK_CSS_PARSE_NUMBER
854 | GTK_CSS_POSITIVE_ONLY,
855 FALSE,
856 TRUE);
857 }
858
859 static GtkCssValue *
border_image_width_parse(GtkCssStyleProperty * property,GtkCssParser * parser)860 border_image_width_parse (GtkCssStyleProperty *property,
861 GtkCssParser *parser)
862 {
863 return _gtk_css_border_value_parse (parser,
864 GTK_CSS_PARSE_PERCENT
865 | GTK_CSS_PARSE_LENGTH
866 | GTK_CSS_PARSE_NUMBER
867 | GTK_CSS_POSITIVE_ONLY,
868 TRUE,
869 FALSE);
870 }
871
872 static GtkCssValue *
minmax_parse(GtkCssStyleProperty * property,GtkCssParser * parser)873 minmax_parse (GtkCssStyleProperty *property,
874 GtkCssParser *parser)
875 {
876 return _gtk_css_number_value_parse (parser,
877 GTK_CSS_PARSE_LENGTH
878 | GTK_CSS_POSITIVE_ONLY);
879 }
880
881 static GtkCssValue *
transition_property_parse_one(GtkCssParser * parser)882 transition_property_parse_one (GtkCssParser *parser)
883 {
884 GtkCssValue *value;
885
886 value = _gtk_css_ident_value_try_parse (parser);
887
888 if (value == NULL)
889 {
890 _gtk_css_parser_error (parser, "Expected an identifier");
891 return NULL;
892 }
893
894 return value;
895 }
896
897 static GtkCssValue *
transition_property_parse(GtkCssStyleProperty * property,GtkCssParser * parser)898 transition_property_parse (GtkCssStyleProperty *property,
899 GtkCssParser *parser)
900 {
901 return _gtk_css_array_value_parse (parser, transition_property_parse_one);
902 }
903
904 static GtkCssValue *
transition_time_parse_one(GtkCssParser * parser)905 transition_time_parse_one (GtkCssParser *parser)
906 {
907 return _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_TIME);
908 }
909
910 static GtkCssValue *
transition_time_parse(GtkCssStyleProperty * property,GtkCssParser * parser)911 transition_time_parse (GtkCssStyleProperty *property,
912 GtkCssParser *parser)
913 {
914 return _gtk_css_array_value_parse (parser, transition_time_parse_one);
915 }
916
917 static GtkCssValue *
transition_timing_function_parse(GtkCssStyleProperty * property,GtkCssParser * parser)918 transition_timing_function_parse (GtkCssStyleProperty *property,
919 GtkCssParser *parser)
920 {
921 return _gtk_css_array_value_parse (parser, _gtk_css_ease_value_parse);
922 }
923
924 static GtkCssValue *
iteration_count_parse_one(GtkCssParser * parser)925 iteration_count_parse_one (GtkCssParser *parser)
926 {
927 if (_gtk_css_parser_try (parser, "infinite", TRUE))
928 return _gtk_css_number_value_new (HUGE_VAL, GTK_CSS_NUMBER);
929
930 return _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_NUMBER | GTK_CSS_POSITIVE_ONLY);
931 }
932
933 static GtkCssValue *
iteration_count_parse(GtkCssStyleProperty * property,GtkCssParser * parser)934 iteration_count_parse (GtkCssStyleProperty *property,
935 GtkCssParser *parser)
936 {
937 return _gtk_css_array_value_parse (parser, iteration_count_parse_one);
938 }
939
940 static GtkCssValue *
engine_parse(GtkCssStyleProperty * property,GtkCssParser * parser)941 engine_parse (GtkCssStyleProperty *property,
942 GtkCssParser *parser)
943 {
944 return _gtk_css_engine_value_parse (parser);
945 }
946
947 static void
engine_query(GtkCssStyleProperty * property,const GtkCssValue * css_value,GValue * value)948 engine_query (GtkCssStyleProperty *property,
949 const GtkCssValue *css_value,
950 GValue *value)
951 {
952 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
953 g_value_init (value, GTK_TYPE_THEMING_ENGINE);
954 g_value_set_object (value, _gtk_css_engine_value_get_engine (css_value));
955 G_GNUC_END_IGNORE_DEPRECATIONS
956 }
957
958 static GtkCssValue *
engine_assign(GtkCssStyleProperty * property,const GValue * value)959 engine_assign (GtkCssStyleProperty *property,
960 const GValue *value)
961 {
962 return _gtk_css_engine_value_new (g_value_get_object (value));
963 }
964
965 static GtkCssValue *
parse_margin(GtkCssStyleProperty * property,GtkCssParser * parser)966 parse_margin (GtkCssStyleProperty *property,
967 GtkCssParser *parser)
968 {
969 return _gtk_css_number_value_parse (parser,
970 GTK_CSS_NUMBER_AS_PIXELS
971 | GTK_CSS_PARSE_LENGTH);
972 }
973
974 static GtkCssValue *
parse_padding(GtkCssStyleProperty * property,GtkCssParser * parser)975 parse_padding (GtkCssStyleProperty *property,
976 GtkCssParser *parser)
977 {
978 return _gtk_css_number_value_parse (parser,
979 GTK_CSS_POSITIVE_ONLY
980 | GTK_CSS_NUMBER_AS_PIXELS
981 | GTK_CSS_PARSE_LENGTH);
982 }
983
984 static GtkCssValue *
parse_border_width(GtkCssStyleProperty * property,GtkCssParser * parser)985 parse_border_width (GtkCssStyleProperty *property,
986 GtkCssParser *parser)
987 {
988 return _gtk_css_number_value_parse (parser,
989 GTK_CSS_POSITIVE_ONLY
990 | GTK_CSS_NUMBER_AS_PIXELS
991 | GTK_CSS_PARSE_LENGTH);
992 }
993
994 static GtkCssValue *
blend_mode_value_parse_one(GtkCssParser * parser)995 blend_mode_value_parse_one (GtkCssParser *parser)
996 {
997 GtkCssValue *value = _gtk_css_blend_mode_value_try_parse (parser);
998
999 if (value == NULL)
1000 _gtk_css_parser_error (parser, "unknown value for property");
1001
1002 return value;
1003 }
1004
1005 static GtkCssValue *
blend_mode_value_parse(GtkCssStyleProperty * property,GtkCssParser * parser)1006 blend_mode_value_parse (GtkCssStyleProperty *property,
1007 GtkCssParser *parser)
1008 {
1009 return _gtk_css_array_value_parse (parser, blend_mode_value_parse_one);
1010 }
1011
1012 static GtkCssValue *
background_repeat_value_parse_one(GtkCssParser * parser)1013 background_repeat_value_parse_one (GtkCssParser *parser)
1014 {
1015 GtkCssValue *value = _gtk_css_background_repeat_value_try_parse (parser);
1016
1017 if (value == NULL)
1018 {
1019 _gtk_css_parser_error (parser, "Not a valid value");
1020 return NULL;
1021 }
1022
1023 return value;
1024 }
1025
1026 static GtkCssValue *
background_repeat_value_parse(GtkCssStyleProperty * property,GtkCssParser * parser)1027 background_repeat_value_parse (GtkCssStyleProperty *property,
1028 GtkCssParser *parser)
1029 {
1030 return _gtk_css_array_value_parse (parser, background_repeat_value_parse_one);
1031 }
1032
1033 static GtkCssValue *
background_size_parse(GtkCssStyleProperty * property,GtkCssParser * parser)1034 background_size_parse (GtkCssStyleProperty *property,
1035 GtkCssParser *parser)
1036 {
1037 return _gtk_css_array_value_parse (parser, _gtk_css_bg_size_value_parse);
1038 }
1039
1040 static GtkCssValue *
background_position_parse(GtkCssStyleProperty * property,GtkCssParser * parser)1041 background_position_parse (GtkCssStyleProperty *property,
1042 GtkCssParser *parser)
1043 {
1044 return _gtk_css_array_value_parse (parser, _gtk_css_position_value_parse);
1045 }
1046
1047 static GtkCssValue *
icon_theme_value_parse(GtkCssStyleProperty * property,GtkCssParser * parser)1048 icon_theme_value_parse (GtkCssStyleProperty *property,
1049 GtkCssParser *parser)
1050 {
1051 return gtk_css_icon_theme_value_parse (parser);
1052 }
1053
1054 /*** REGISTRATION ***/
1055
1056 void
_gtk_css_style_property_init_properties(void)1057 _gtk_css_style_property_init_properties (void)
1058 {
1059 /* Initialize "color", "-gtk-dpi" and "font-size" first,
1060 * so that when computing values later they are
1061 * done first. That way, 'currentColor' and font
1062 * sizes in em can be looked up properly */
1063 gtk_css_style_property_register ("color",
1064 GTK_CSS_PROPERTY_COLOR,
1065 GDK_TYPE_RGBA,
1066 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
1067 GTK_CSS_AFFECTS_FOREGROUND | GTK_CSS_AFFECTS_TEXT | GTK_CSS_AFFECTS_SYMBOLIC_ICON,
1068 color_parse,
1069 color_query,
1070 color_assign,
1071 _gtk_css_color_value_new_rgba (1, 1, 1, 1));
1072 gtk_css_style_property_register ("-gtk-dpi",
1073 GTK_CSS_PROPERTY_DPI,
1074 G_TYPE_NONE,
1075 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
1076 GTK_CSS_AFFECTS_FONT | GTK_CSS_AFFECTS_TEXT | GTK_CSS_AFFECTS_SIZE,
1077 dpi_parse,
1078 NULL,
1079 NULL,
1080 _gtk_css_number_value_new (96.0, GTK_CSS_NUMBER));
1081 gtk_css_style_property_register ("font-size",
1082 GTK_CSS_PROPERTY_FONT_SIZE,
1083 G_TYPE_DOUBLE,
1084 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
1085 GTK_CSS_AFFECTS_FONT | GTK_CSS_AFFECTS_TEXT | GTK_CSS_AFFECTS_SIZE,
1086 font_size_parse,
1087 query_font_size,
1088 assign_font_size,
1089 _gtk_css_font_size_value_new (GTK_CSS_FONT_SIZE_MEDIUM));
1090 gtk_css_style_property_register ("-gtk-icon-theme",
1091 GTK_CSS_PROPERTY_ICON_THEME,
1092 G_TYPE_NONE,
1093 GTK_STYLE_PROPERTY_INHERIT,
1094 GTK_CSS_AFFECTS_ICON | GTK_CSS_AFFECTS_SYMBOLIC_ICON,
1095 icon_theme_value_parse,
1096 NULL,
1097 NULL,
1098 gtk_css_icon_theme_value_new (NULL));
1099 gtk_css_style_property_register ("-gtk-icon-palette",
1100 GTK_CSS_PROPERTY_ICON_PALETTE,
1101 G_TYPE_NONE,
1102 GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_INHERIT,
1103 GTK_CSS_AFFECTS_SYMBOLIC_ICON,
1104 icon_palette_parse,
1105 NULL,
1106 NULL,
1107 gtk_css_palette_value_new_default ());
1108
1109
1110 /* properties that aren't referenced when computing values
1111 * start here */
1112 gtk_css_style_property_register ("background-color",
1113 GTK_CSS_PROPERTY_BACKGROUND_COLOR,
1114 GDK_TYPE_RGBA,
1115 GTK_STYLE_PROPERTY_ANIMATED,
1116 GTK_CSS_AFFECTS_BACKGROUND,
1117 color_parse,
1118 color_query,
1119 color_assign,
1120 _gtk_css_color_value_new_rgba (0, 0, 0, 0));
1121
1122 gtk_css_style_property_register ("font-family",
1123 GTK_CSS_PROPERTY_FONT_FAMILY,
1124 G_TYPE_STRV,
1125 GTK_STYLE_PROPERTY_INHERIT,
1126 GTK_CSS_AFFECTS_FONT | GTK_CSS_AFFECTS_TEXT,
1127 font_family_parse,
1128 font_family_query,
1129 font_family_assign,
1130 _gtk_css_array_value_new (_gtk_css_string_value_new ("Sans")));
1131 gtk_css_style_property_register ("font-style",
1132 GTK_CSS_PROPERTY_FONT_STYLE,
1133 PANGO_TYPE_STYLE,
1134 GTK_STYLE_PROPERTY_INHERIT,
1135 GTK_CSS_AFFECTS_FONT | GTK_CSS_AFFECTS_TEXT,
1136 font_style_parse,
1137 font_style_query,
1138 font_style_assign,
1139 _gtk_css_font_style_value_new (PANGO_STYLE_NORMAL));
1140 gtk_css_style_property_register ("font-variant",
1141 GTK_CSS_PROPERTY_FONT_VARIANT,
1142 PANGO_TYPE_VARIANT,
1143 GTK_STYLE_PROPERTY_INHERIT,
1144 GTK_CSS_AFFECTS_FONT | GTK_CSS_AFFECTS_TEXT,
1145 font_variant_parse,
1146 font_variant_query,
1147 font_variant_assign,
1148 _gtk_css_font_variant_value_new (PANGO_VARIANT_NORMAL));
1149 gtk_css_style_property_register ("font-weight",
1150 GTK_CSS_PROPERTY_FONT_WEIGHT,
1151 PANGO_TYPE_WEIGHT,
1152 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
1153 GTK_CSS_AFFECTS_FONT | GTK_CSS_AFFECTS_TEXT,
1154 font_weight_parse,
1155 font_weight_query,
1156 font_weight_assign,
1157 _gtk_css_font_weight_value_new (PANGO_WEIGHT_NORMAL));
1158 gtk_css_style_property_register ("font-stretch",
1159 GTK_CSS_PROPERTY_FONT_STRETCH,
1160 PANGO_TYPE_STRETCH,
1161 GTK_STYLE_PROPERTY_INHERIT,
1162 GTK_CSS_AFFECTS_FONT | GTK_CSS_AFFECTS_TEXT,
1163 font_stretch_parse,
1164 font_stretch_query,
1165 font_stretch_assign,
1166 _gtk_css_font_stretch_value_new (PANGO_STRETCH_NORMAL));
1167
1168 gtk_css_style_property_register ("letter-spacing",
1169 GTK_CSS_PROPERTY_LETTER_SPACING,
1170 G_TYPE_NONE,
1171 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
1172 GTK_CSS_AFFECTS_TEXT | GTK_CSS_AFFECTS_TEXT_ATTRS,
1173 parse_letter_spacing,
1174 NULL,
1175 NULL,
1176 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1177
1178 gtk_css_style_property_register ("text-decoration-line",
1179 GTK_CSS_PROPERTY_TEXT_DECORATION_LINE,
1180 G_TYPE_NONE,
1181 0,
1182 GTK_CSS_AFFECTS_TEXT | GTK_CSS_AFFECTS_TEXT_ATTRS,
1183 parse_text_decoration_line,
1184 NULL,
1185 NULL,
1186 _gtk_css_text_decoration_line_value_new (GTK_CSS_TEXT_DECORATION_LINE_NONE));
1187 gtk_css_style_property_register ("text-decoration-color",
1188 GTK_CSS_PROPERTY_TEXT_DECORATION_COLOR,
1189 G_TYPE_NONE,
1190 GTK_STYLE_PROPERTY_ANIMATED,
1191 GTK_CSS_AFFECTS_TEXT | GTK_CSS_AFFECTS_TEXT_ATTRS,
1192 color_parse,
1193 NULL,
1194 NULL,
1195 _gtk_css_color_value_new_current_color ());
1196 gtk_css_style_property_register ("text-decoration-style",
1197 GTK_CSS_PROPERTY_TEXT_DECORATION_STYLE,
1198 G_TYPE_NONE,
1199 0,
1200 GTK_CSS_AFFECTS_TEXT | GTK_CSS_AFFECTS_TEXT_ATTRS,
1201 parse_text_decoration_style,
1202 NULL,
1203 NULL,
1204 _gtk_css_text_decoration_style_value_new (GTK_CSS_TEXT_DECORATION_STYLE_SOLID));
1205
1206 gtk_css_style_property_register ("text-shadow",
1207 GTK_CSS_PROPERTY_TEXT_SHADOW,
1208 G_TYPE_NONE,
1209 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
1210 GTK_CSS_AFFECTS_TEXT | GTK_CSS_AFFECTS_CLIP,
1211 shadow_value_parse,
1212 NULL,
1213 NULL,
1214 _gtk_css_shadows_value_new_none ());
1215
1216 gtk_css_style_property_register ("box-shadow",
1217 GTK_CSS_PROPERTY_BOX_SHADOW,
1218 G_TYPE_NONE,
1219 GTK_STYLE_PROPERTY_ANIMATED,
1220 GTK_CSS_AFFECTS_BACKGROUND | GTK_CSS_AFFECTS_CLIP,
1221 box_shadow_value_parse,
1222 NULL,
1223 NULL,
1224 _gtk_css_shadows_value_new_none ());
1225
1226 gtk_css_style_property_register ("margin-top",
1227 GTK_CSS_PROPERTY_MARGIN_TOP,
1228 G_TYPE_INT,
1229 GTK_STYLE_PROPERTY_ANIMATED,
1230 GTK_CSS_AFFECTS_SIZE,
1231 parse_margin,
1232 query_length_as_int,
1233 assign_length_from_int,
1234 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1235 gtk_css_style_property_register ("margin-left",
1236 GTK_CSS_PROPERTY_MARGIN_LEFT,
1237 G_TYPE_INT,
1238 GTK_STYLE_PROPERTY_ANIMATED,
1239 GTK_CSS_AFFECTS_SIZE,
1240 parse_margin,
1241 query_length_as_int,
1242 assign_length_from_int,
1243 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1244 gtk_css_style_property_register ("margin-bottom",
1245 GTK_CSS_PROPERTY_MARGIN_BOTTOM,
1246 G_TYPE_INT,
1247 GTK_STYLE_PROPERTY_ANIMATED,
1248 GTK_CSS_AFFECTS_SIZE,
1249 parse_margin,
1250 query_length_as_int,
1251 assign_length_from_int,
1252 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1253 gtk_css_style_property_register ("margin-right",
1254 GTK_CSS_PROPERTY_MARGIN_RIGHT,
1255 G_TYPE_INT,
1256 GTK_STYLE_PROPERTY_ANIMATED,
1257 GTK_CSS_AFFECTS_SIZE,
1258 parse_margin,
1259 query_length_as_int,
1260 assign_length_from_int,
1261 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1262 gtk_css_style_property_register ("padding-top",
1263 GTK_CSS_PROPERTY_PADDING_TOP,
1264 G_TYPE_INT,
1265 GTK_STYLE_PROPERTY_ANIMATED,
1266 GTK_CSS_AFFECTS_SIZE,
1267 parse_padding,
1268 query_length_as_int,
1269 assign_length_from_int,
1270 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1271 gtk_css_style_property_register ("padding-left",
1272 GTK_CSS_PROPERTY_PADDING_LEFT,
1273 G_TYPE_INT,
1274 GTK_STYLE_PROPERTY_ANIMATED,
1275 GTK_CSS_AFFECTS_SIZE,
1276 parse_padding,
1277 query_length_as_int,
1278 assign_length_from_int,
1279 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1280 gtk_css_style_property_register ("padding-bottom",
1281 GTK_CSS_PROPERTY_PADDING_BOTTOM,
1282 G_TYPE_INT,
1283 GTK_STYLE_PROPERTY_ANIMATED,
1284 GTK_CSS_AFFECTS_SIZE,
1285 parse_padding,
1286 query_length_as_int,
1287 assign_length_from_int,
1288 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1289 gtk_css_style_property_register ("padding-right",
1290 GTK_CSS_PROPERTY_PADDING_RIGHT,
1291 G_TYPE_INT,
1292 GTK_STYLE_PROPERTY_ANIMATED,
1293 GTK_CSS_AFFECTS_SIZE,
1294 parse_padding,
1295 query_length_as_int,
1296 assign_length_from_int,
1297 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1298 /* IMPORTANT: the border-width properties must come after border-style properties,
1299 * they depend on them for their value computation.
1300 */
1301 gtk_css_style_property_register ("border-top-style",
1302 GTK_CSS_PROPERTY_BORDER_TOP_STYLE,
1303 GTK_TYPE_BORDER_STYLE,
1304 0,
1305 GTK_CSS_AFFECTS_BORDER,
1306 parse_border_style,
1307 query_border_style,
1308 assign_border_style,
1309 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1310 gtk_css_style_property_register ("border-top-width",
1311 GTK_CSS_PROPERTY_BORDER_TOP_WIDTH,
1312 G_TYPE_INT,
1313 GTK_STYLE_PROPERTY_ANIMATED,
1314 GTK_CSS_AFFECTS_BORDER | GTK_CSS_AFFECTS_SIZE,
1315 parse_border_width,
1316 query_length_as_int,
1317 assign_length_from_int,
1318 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1319 gtk_css_style_property_register ("border-left-style",
1320 GTK_CSS_PROPERTY_BORDER_LEFT_STYLE,
1321 GTK_TYPE_BORDER_STYLE,
1322 0,
1323 GTK_CSS_AFFECTS_BORDER,
1324 parse_border_style,
1325 query_border_style,
1326 assign_border_style,
1327 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1328 gtk_css_style_property_register ("border-left-width",
1329 GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH,
1330 G_TYPE_INT,
1331 GTK_STYLE_PROPERTY_ANIMATED,
1332 GTK_CSS_AFFECTS_BORDER | GTK_CSS_AFFECTS_SIZE,
1333 parse_border_width,
1334 query_length_as_int,
1335 assign_length_from_int,
1336 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1337 gtk_css_style_property_register ("border-bottom-style",
1338 GTK_CSS_PROPERTY_BORDER_BOTTOM_STYLE,
1339 GTK_TYPE_BORDER_STYLE,
1340 0,
1341 GTK_CSS_AFFECTS_BORDER,
1342 parse_border_style,
1343 query_border_style,
1344 assign_border_style,
1345 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1346 gtk_css_style_property_register ("border-bottom-width",
1347 GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH,
1348 G_TYPE_INT,
1349 GTK_STYLE_PROPERTY_ANIMATED,
1350 GTK_CSS_AFFECTS_BORDER | GTK_CSS_AFFECTS_SIZE,
1351 parse_border_width,
1352 query_length_as_int,
1353 assign_length_from_int,
1354 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1355 gtk_css_style_property_register ("border-right-style",
1356 GTK_CSS_PROPERTY_BORDER_RIGHT_STYLE,
1357 GTK_TYPE_BORDER_STYLE,
1358 0,
1359 GTK_CSS_AFFECTS_BORDER,
1360 parse_border_style,
1361 query_border_style,
1362 assign_border_style,
1363 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1364 gtk_css_style_property_register ("border-right-width",
1365 GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH,
1366 G_TYPE_INT,
1367 GTK_STYLE_PROPERTY_ANIMATED,
1368 GTK_CSS_AFFECTS_BORDER | GTK_CSS_AFFECTS_SIZE,
1369 parse_border_width,
1370 query_length_as_int,
1371 assign_length_from_int,
1372 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1373
1374 gtk_css_style_property_register ("border-top-left-radius",
1375 GTK_CSS_PROPERTY_BORDER_TOP_LEFT_RADIUS,
1376 G_TYPE_NONE,
1377 GTK_STYLE_PROPERTY_ANIMATED,
1378 GTK_CSS_AFFECTS_BACKGROUND | GTK_CSS_AFFECTS_BORDER,
1379 border_corner_radius_value_parse,
1380 NULL,
1381 NULL,
1382 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1383 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1384 gtk_css_style_property_register ("border-top-right-radius",
1385 GTK_CSS_PROPERTY_BORDER_TOP_RIGHT_RADIUS,
1386 G_TYPE_NONE,
1387 GTK_STYLE_PROPERTY_ANIMATED,
1388 GTK_CSS_AFFECTS_BACKGROUND | GTK_CSS_AFFECTS_BORDER,
1389 border_corner_radius_value_parse,
1390 NULL,
1391 NULL,
1392 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1393 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1394 gtk_css_style_property_register ("border-bottom-right-radius",
1395 GTK_CSS_PROPERTY_BORDER_BOTTOM_RIGHT_RADIUS,
1396 G_TYPE_NONE,
1397 GTK_STYLE_PROPERTY_ANIMATED,
1398 GTK_CSS_AFFECTS_BACKGROUND | GTK_CSS_AFFECTS_BORDER,
1399 border_corner_radius_value_parse,
1400 NULL,
1401 NULL,
1402 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1403 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1404 gtk_css_style_property_register ("border-bottom-left-radius",
1405 GTK_CSS_PROPERTY_BORDER_BOTTOM_LEFT_RADIUS,
1406 G_TYPE_NONE,
1407 GTK_STYLE_PROPERTY_ANIMATED,
1408 GTK_CSS_AFFECTS_BACKGROUND | GTK_CSS_AFFECTS_BORDER,
1409 border_corner_radius_value_parse,
1410 NULL,
1411 NULL,
1412 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1413 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1414
1415 gtk_css_style_property_register ("outline-style",
1416 GTK_CSS_PROPERTY_OUTLINE_STYLE,
1417 GTK_TYPE_BORDER_STYLE,
1418 0,
1419 GTK_CSS_AFFECTS_OUTLINE | GTK_CSS_AFFECTS_CLIP,
1420 parse_border_style,
1421 query_border_style,
1422 assign_border_style,
1423 _gtk_css_border_style_value_new (GTK_BORDER_STYLE_NONE));
1424 gtk_css_style_property_register ("outline-width",
1425 GTK_CSS_PROPERTY_OUTLINE_WIDTH,
1426 G_TYPE_INT,
1427 GTK_STYLE_PROPERTY_ANIMATED,
1428 GTK_CSS_AFFECTS_OUTLINE | GTK_CSS_AFFECTS_CLIP,
1429 parse_border_width,
1430 query_length_as_int,
1431 assign_length_from_int,
1432 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1433 gtk_css_style_property_register ("outline-offset",
1434 GTK_CSS_PROPERTY_OUTLINE_OFFSET,
1435 G_TYPE_INT,
1436 GTK_STYLE_PROPERTY_ANIMATED,
1437 GTK_CSS_AFFECTS_OUTLINE | GTK_CSS_AFFECTS_CLIP,
1438 outline_parse,
1439 query_length_as_int,
1440 assign_length_from_int,
1441 _gtk_css_number_value_new (0.0, GTK_CSS_PX));
1442
1443 gtk_css_style_property_register ("-gtk-outline-top-left-radius",
1444 GTK_CSS_PROPERTY_OUTLINE_TOP_LEFT_RADIUS,
1445 G_TYPE_NONE,
1446 GTK_STYLE_PROPERTY_ANIMATED,
1447 GTK_CSS_AFFECTS_OUTLINE,
1448 border_corner_radius_value_parse,
1449 NULL,
1450 NULL,
1451 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1452 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1453 _gtk_style_property_add_alias ("-gtk-outline-top-left-radius", "outline-top-left-radius");
1454 gtk_css_style_property_register ("-gtk-outline-top-right-radius",
1455 GTK_CSS_PROPERTY_OUTLINE_TOP_RIGHT_RADIUS,
1456 G_TYPE_NONE,
1457 GTK_STYLE_PROPERTY_ANIMATED,
1458 GTK_CSS_AFFECTS_OUTLINE,
1459 border_corner_radius_value_parse,
1460 NULL,
1461 NULL,
1462 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1463 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1464 _gtk_style_property_add_alias ("-gtk-outline-top-right-radius", "outline-top-right-radius");
1465 gtk_css_style_property_register ("-gtk-outline-bottom-right-radius",
1466 GTK_CSS_PROPERTY_OUTLINE_BOTTOM_RIGHT_RADIUS,
1467 G_TYPE_NONE,
1468 GTK_STYLE_PROPERTY_ANIMATED,
1469 GTK_CSS_AFFECTS_OUTLINE,
1470 border_corner_radius_value_parse,
1471 NULL,
1472 NULL,
1473 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1474 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1475 _gtk_style_property_add_alias ("-gtk-outline-bottom-right-radius", "outline-bottom-right-radius");
1476 gtk_css_style_property_register ("-gtk-outline-bottom-left-radius",
1477 GTK_CSS_PROPERTY_OUTLINE_BOTTOM_LEFT_RADIUS,
1478 G_TYPE_NONE,
1479 GTK_STYLE_PROPERTY_ANIMATED,
1480 GTK_CSS_AFFECTS_OUTLINE,
1481 border_corner_radius_value_parse,
1482 NULL,
1483 NULL,
1484 _gtk_css_corner_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
1485 _gtk_css_number_value_new (0, GTK_CSS_PX)));
1486 _gtk_style_property_add_alias ("-gtk-outline-bottom-left-radius", "outline-bottom-left-radius");
1487
1488 gtk_css_style_property_register ("background-clip",
1489 GTK_CSS_PROPERTY_BACKGROUND_CLIP,
1490 G_TYPE_NONE,
1491 0,
1492 GTK_CSS_AFFECTS_BACKGROUND,
1493 parse_css_area,
1494 NULL,
1495 NULL,
1496 _gtk_css_array_value_new (_gtk_css_area_value_new (GTK_CSS_AREA_BORDER_BOX)));
1497 gtk_css_style_property_register ("background-origin",
1498 GTK_CSS_PROPERTY_BACKGROUND_ORIGIN,
1499 G_TYPE_NONE,
1500 0,
1501 GTK_CSS_AFFECTS_BACKGROUND,
1502 parse_css_area,
1503 NULL,
1504 NULL,
1505 _gtk_css_array_value_new (_gtk_css_area_value_new (GTK_CSS_AREA_PADDING_BOX)));
1506 gtk_css_style_property_register ("background-size",
1507 GTK_CSS_PROPERTY_BACKGROUND_SIZE,
1508 G_TYPE_NONE,
1509 GTK_STYLE_PROPERTY_ANIMATED,
1510 GTK_CSS_AFFECTS_BACKGROUND,
1511 background_size_parse,
1512 NULL,
1513 NULL,
1514 _gtk_css_array_value_new (_gtk_css_bg_size_value_new (NULL, NULL)));
1515 gtk_css_style_property_register ("background-position",
1516 GTK_CSS_PROPERTY_BACKGROUND_POSITION,
1517 G_TYPE_NONE,
1518 GTK_STYLE_PROPERTY_ANIMATED,
1519 GTK_CSS_AFFECTS_BACKGROUND,
1520 background_position_parse,
1521 NULL,
1522 NULL,
1523 _gtk_css_array_value_new (_gtk_css_position_value_new (_gtk_css_number_value_new (0, GTK_CSS_PERCENT),
1524 _gtk_css_number_value_new (0, GTK_CSS_PERCENT))));
1525
1526 gtk_css_style_property_register ("border-top-color",
1527 GTK_CSS_PROPERTY_BORDER_TOP_COLOR,
1528 GDK_TYPE_RGBA,
1529 GTK_STYLE_PROPERTY_ANIMATED,
1530 GTK_CSS_AFFECTS_BORDER,
1531 color_parse,
1532 color_query,
1533 color_assign,
1534 _gtk_css_color_value_new_current_color ());
1535 gtk_css_style_property_register ("border-right-color",
1536 GTK_CSS_PROPERTY_BORDER_RIGHT_COLOR,
1537 GDK_TYPE_RGBA,
1538 GTK_STYLE_PROPERTY_ANIMATED,
1539 GTK_CSS_AFFECTS_BORDER,
1540 color_parse,
1541 color_query,
1542 color_assign,
1543 _gtk_css_color_value_new_current_color ());
1544 gtk_css_style_property_register ("border-bottom-color",
1545 GTK_CSS_PROPERTY_BORDER_BOTTOM_COLOR,
1546 GDK_TYPE_RGBA,
1547 GTK_STYLE_PROPERTY_ANIMATED,
1548 GTK_CSS_AFFECTS_BORDER,
1549 color_parse,
1550 color_query,
1551 color_assign,
1552 _gtk_css_color_value_new_current_color ());
1553 gtk_css_style_property_register ("border-left-color",
1554 GTK_CSS_PROPERTY_BORDER_LEFT_COLOR,
1555 GDK_TYPE_RGBA,
1556 GTK_STYLE_PROPERTY_ANIMATED,
1557 GTK_CSS_AFFECTS_BORDER,
1558 color_parse,
1559 color_query,
1560 color_assign,
1561 _gtk_css_color_value_new_current_color ());
1562 gtk_css_style_property_register ("outline-color",
1563 GTK_CSS_PROPERTY_OUTLINE_COLOR,
1564 GDK_TYPE_RGBA,
1565 GTK_STYLE_PROPERTY_ANIMATED,
1566 GTK_CSS_AFFECTS_OUTLINE,
1567 color_parse,
1568 color_query,
1569 color_assign,
1570 _gtk_css_color_value_new_current_color ());
1571
1572 gtk_css_style_property_register ("background-repeat",
1573 GTK_CSS_PROPERTY_BACKGROUND_REPEAT,
1574 G_TYPE_NONE,
1575 0,
1576 GTK_CSS_AFFECTS_BACKGROUND,
1577 background_repeat_value_parse,
1578 NULL,
1579 NULL,
1580 _gtk_css_array_value_new (_gtk_css_background_repeat_value_new (GTK_CSS_REPEAT_STYLE_REPEAT,
1581 GTK_CSS_REPEAT_STYLE_REPEAT)));
1582 gtk_css_style_property_register ("background-image",
1583 GTK_CSS_PROPERTY_BACKGROUND_IMAGE,
1584 CAIRO_GOBJECT_TYPE_PATTERN,
1585 GTK_STYLE_PROPERTY_ANIMATED,
1586 GTK_CSS_AFFECTS_BACKGROUND,
1587 background_image_value_parse,
1588 background_image_value_query,
1589 background_image_value_assign,
1590 _gtk_css_array_value_new (_gtk_css_image_value_new (NULL)));
1591
1592 gtk_css_style_property_register ("background-blend-mode",
1593 GTK_CSS_PROPERTY_BACKGROUND_BLEND_MODE,
1594 G_TYPE_NONE,
1595 0,
1596 GTK_CSS_AFFECTS_BACKGROUND,
1597 blend_mode_value_parse,
1598 NULL,
1599 NULL,
1600 _gtk_css_array_value_new (_gtk_css_blend_mode_value_new (GTK_CSS_BLEND_MODE_NORMAL)));
1601
1602 gtk_css_style_property_register ("border-image-source",
1603 GTK_CSS_PROPERTY_BORDER_IMAGE_SOURCE,
1604 CAIRO_GOBJECT_TYPE_PATTERN,
1605 GTK_STYLE_PROPERTY_ANIMATED,
1606 GTK_CSS_AFFECTS_BORDER,
1607 css_image_value_parse,
1608 css_image_value_query,
1609 css_image_value_assign,
1610 _gtk_css_image_value_new (NULL));
1611 gtk_css_style_property_register ("border-image-repeat",
1612 GTK_CSS_PROPERTY_BORDER_IMAGE_REPEAT,
1613 G_TYPE_NONE,
1614 0,
1615 GTK_CSS_AFFECTS_BORDER,
1616 border_image_repeat_parse,
1617 NULL,
1618 NULL,
1619 _gtk_css_border_repeat_value_new (GTK_CSS_REPEAT_STYLE_STRETCH,
1620 GTK_CSS_REPEAT_STYLE_STRETCH));
1621
1622 gtk_css_style_property_register ("border-image-slice",
1623 GTK_CSS_PROPERTY_BORDER_IMAGE_SLICE,
1624 GTK_TYPE_BORDER,
1625 0,
1626 GTK_CSS_AFFECTS_BORDER,
1627 border_image_slice_parse,
1628 query_border,
1629 assign_border,
1630 _gtk_css_border_value_new (_gtk_css_number_value_new (100, GTK_CSS_PERCENT),
1631 _gtk_css_number_value_new (100, GTK_CSS_PERCENT),
1632 _gtk_css_number_value_new (100, GTK_CSS_PERCENT),
1633 _gtk_css_number_value_new (100, GTK_CSS_PERCENT)));
1634 gtk_css_style_property_register ("border-image-width",
1635 GTK_CSS_PROPERTY_BORDER_IMAGE_WIDTH,
1636 GTK_TYPE_BORDER,
1637 0,
1638 GTK_CSS_AFFECTS_BORDER,
1639 border_image_width_parse,
1640 query_border,
1641 assign_border,
1642 _gtk_css_border_value_new (_gtk_css_number_value_new (1, GTK_CSS_NUMBER),
1643 _gtk_css_number_value_new (1, GTK_CSS_NUMBER),
1644 _gtk_css_number_value_new (1, GTK_CSS_NUMBER),
1645 _gtk_css_number_value_new (1, GTK_CSS_NUMBER)));
1646
1647 gtk_css_style_property_register ("-gtk-icon-source",
1648 GTK_CSS_PROPERTY_ICON_SOURCE,
1649 G_TYPE_NONE,
1650 GTK_STYLE_PROPERTY_ANIMATED,
1651 GTK_CSS_AFFECTS_ICON | GTK_CSS_AFFECTS_SYMBOLIC_ICON,
1652 css_image_value_parse_with_builtin,
1653 NULL,
1654 NULL,
1655 _gtk_css_image_value_new (gtk_css_image_builtin_new ()));
1656 gtk_css_style_property_register ("-gtk-icon-shadow",
1657 GTK_CSS_PROPERTY_ICON_SHADOW,
1658 G_TYPE_NONE,
1659 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
1660 GTK_CSS_AFFECTS_ICON | GTK_CSS_AFFECTS_SYMBOLIC_ICON | GTK_CSS_AFFECTS_CLIP,
1661 shadow_value_parse,
1662 NULL,
1663 NULL,
1664 _gtk_css_shadows_value_new_none ());
1665 _gtk_style_property_add_alias ("-gtk-icon-shadow", "icon-shadow");
1666 gtk_css_style_property_register ("-gtk-icon-style",
1667 GTK_CSS_PROPERTY_ICON_STYLE,
1668 G_TYPE_NONE,
1669 GTK_STYLE_PROPERTY_INHERIT,
1670 GTK_CSS_AFFECTS_ICON | GTK_CSS_AFFECTS_SYMBOLIC_ICON,
1671 icon_style_parse,
1672 NULL,
1673 NULL,
1674 _gtk_css_icon_style_value_new (GTK_CSS_ICON_STYLE_REQUESTED));
1675 gtk_css_style_property_register ("-gtk-icon-transform",
1676 GTK_CSS_PROPERTY_ICON_TRANSFORM,
1677 G_TYPE_NONE,
1678 GTK_STYLE_PROPERTY_ANIMATED,
1679 GTK_CSS_AFFECTS_ICON | GTK_CSS_AFFECTS_SYMBOLIC_ICON | GTK_CSS_AFFECTS_CLIP,
1680 transform_value_parse,
1681 NULL,
1682 NULL,
1683 _gtk_css_transform_value_new_none ());
1684
1685 gtk_css_style_property_register ("min-width",
1686 GTK_CSS_PROPERTY_MIN_WIDTH,
1687 G_TYPE_INT,
1688 GTK_STYLE_PROPERTY_ANIMATED,
1689 GTK_CSS_AFFECTS_SIZE,
1690 minmax_parse,
1691 query_length_as_int,
1692 NULL,
1693 _gtk_css_number_value_new (0, GTK_CSS_PX));
1694 gtk_css_style_property_register ("min-height",
1695 GTK_CSS_PROPERTY_MIN_HEIGHT,
1696 G_TYPE_INT,
1697 GTK_STYLE_PROPERTY_ANIMATED,
1698 GTK_CSS_AFFECTS_SIZE,
1699 minmax_parse,
1700 query_length_as_int,
1701 NULL,
1702 _gtk_css_number_value_new (0, GTK_CSS_PX));
1703
1704 gtk_css_style_property_register ("transition-property",
1705 GTK_CSS_PROPERTY_TRANSITION_PROPERTY,
1706 G_TYPE_NONE,
1707 0,
1708 0,
1709 transition_property_parse,
1710 NULL,
1711 NULL,
1712 _gtk_css_array_value_new (_gtk_css_ident_value_new ("all")));
1713 gtk_css_style_property_register ("transition-duration",
1714 GTK_CSS_PROPERTY_TRANSITION_DURATION,
1715 G_TYPE_NONE,
1716 0,
1717 0,
1718 transition_time_parse,
1719 NULL,
1720 NULL,
1721 _gtk_css_array_value_new (_gtk_css_number_value_new (0, GTK_CSS_S)));
1722 gtk_css_style_property_register ("transition-timing-function",
1723 GTK_CSS_PROPERTY_TRANSITION_TIMING_FUNCTION,
1724 G_TYPE_NONE,
1725 0,
1726 0,
1727 transition_timing_function_parse,
1728 NULL,
1729 NULL,
1730 _gtk_css_array_value_new (
1731 _gtk_css_ease_value_new_cubic_bezier (0.25, 0.1, 0.25, 1.0)));
1732 gtk_css_style_property_register ("transition-delay",
1733 GTK_CSS_PROPERTY_TRANSITION_DELAY,
1734 G_TYPE_NONE,
1735 0,
1736 0,
1737 transition_time_parse,
1738 NULL,
1739 NULL,
1740 _gtk_css_array_value_new (_gtk_css_number_value_new (0, GTK_CSS_S)));
1741
1742 gtk_css_style_property_register ("animation-name",
1743 GTK_CSS_PROPERTY_ANIMATION_NAME,
1744 G_TYPE_NONE,
1745 0,
1746 0,
1747 transition_property_parse,
1748 NULL,
1749 NULL,
1750 _gtk_css_array_value_new (_gtk_css_ident_value_new ("none")));
1751 gtk_css_style_property_register ("animation-duration",
1752 GTK_CSS_PROPERTY_ANIMATION_DURATION,
1753 G_TYPE_NONE,
1754 0,
1755 0,
1756 transition_time_parse,
1757 NULL,
1758 NULL,
1759 _gtk_css_array_value_new (_gtk_css_number_value_new (0, GTK_CSS_S)));
1760 gtk_css_style_property_register ("animation-timing-function",
1761 GTK_CSS_PROPERTY_ANIMATION_TIMING_FUNCTION,
1762 G_TYPE_NONE,
1763 0,
1764 0,
1765 transition_timing_function_parse,
1766 NULL,
1767 NULL,
1768 _gtk_css_array_value_new (
1769 _gtk_css_ease_value_new_cubic_bezier (0.25, 0.1, 0.25, 1.0)));
1770 gtk_css_style_property_register ("animation-iteration-count",
1771 GTK_CSS_PROPERTY_ANIMATION_ITERATION_COUNT,
1772 G_TYPE_NONE,
1773 0,
1774 0,
1775 iteration_count_parse,
1776 NULL,
1777 NULL,
1778 _gtk_css_array_value_new (_gtk_css_number_value_new (1, GTK_CSS_NUMBER)));
1779 gtk_css_style_property_register ("animation-direction",
1780 GTK_CSS_PROPERTY_ANIMATION_DIRECTION,
1781 G_TYPE_NONE,
1782 0,
1783 0,
1784 parse_css_direction,
1785 NULL,
1786 NULL,
1787 _gtk_css_array_value_new (_gtk_css_direction_value_new (GTK_CSS_DIRECTION_NORMAL)));
1788 gtk_css_style_property_register ("animation-play-state",
1789 GTK_CSS_PROPERTY_ANIMATION_PLAY_STATE,
1790 G_TYPE_NONE,
1791 0,
1792 0,
1793 parse_css_play_state,
1794 NULL,
1795 NULL,
1796 _gtk_css_array_value_new (_gtk_css_play_state_value_new (GTK_CSS_PLAY_STATE_RUNNING)));
1797 gtk_css_style_property_register ("animation-delay",
1798 GTK_CSS_PROPERTY_ANIMATION_DELAY,
1799 G_TYPE_NONE,
1800 0,
1801 0,
1802 transition_time_parse,
1803 NULL,
1804 NULL,
1805 _gtk_css_array_value_new (_gtk_css_number_value_new (0, GTK_CSS_S)));
1806 gtk_css_style_property_register ("animation-fill-mode",
1807 GTK_CSS_PROPERTY_ANIMATION_FILL_MODE,
1808 G_TYPE_NONE,
1809 0,
1810 0,
1811 parse_css_fill_mode,
1812 NULL,
1813 NULL,
1814 _gtk_css_array_value_new (_gtk_css_fill_mode_value_new (GTK_CSS_FILL_NONE)));
1815
1816 gtk_css_style_property_register ("opacity",
1817 GTK_CSS_PROPERTY_OPACITY,
1818 G_TYPE_DOUBLE,
1819 GTK_STYLE_PROPERTY_ANIMATED,
1820 0,
1821 opacity_parse,
1822 opacity_query,
1823 NULL,
1824 _gtk_css_number_value_new (1, GTK_CSS_NUMBER));
1825 gtk_css_style_property_register ("-gtk-icon-effect",
1826 GTK_CSS_PROPERTY_ICON_EFFECT,
1827 G_TYPE_NONE,
1828 GTK_STYLE_PROPERTY_INHERIT,
1829 GTK_CSS_AFFECTS_ICON,
1830 image_effect_parse,
1831 NULL,
1832 NULL,
1833 _gtk_css_icon_effect_value_new (GTK_CSS_ICON_EFFECT_NONE));
1834 _gtk_style_property_add_alias ("-gtk-icon-effect", "-gtk-image-effect");
1835
1836 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
1837 gtk_css_style_property_register ("engine",
1838 GTK_CSS_PROPERTY_ENGINE,
1839 GTK_TYPE_THEMING_ENGINE,
1840 0,
1841 0,
1842 engine_parse,
1843 engine_query,
1844 engine_assign,
1845 _gtk_css_engine_value_new (gtk_theming_engine_load (NULL)));
1846 G_GNUC_END_IGNORE_DEPRECATIONS
1847
1848 /* Private property holding the binding sets */
1849 gtk_css_style_property_register ("-gtk-key-bindings",
1850 GTK_CSS_PROPERTY_GTK_KEY_BINDINGS,
1851 G_TYPE_PTR_ARRAY,
1852 0,
1853 0,
1854 bindings_value_parse,
1855 bindings_value_query,
1856 bindings_value_assign,
1857 _gtk_css_array_value_new (_gtk_css_string_value_new (NULL)));
1858 _gtk_style_property_add_alias ("-gtk-key-bindings", "gtk-key-bindings");
1859
1860 gtk_css_style_property_register ("caret-color",
1861 GTK_CSS_PROPERTY_CARET_COLOR,
1862 GDK_TYPE_RGBA,
1863 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
1864 GTK_CSS_AFFECTS_TEXT,
1865 color_parse,
1866 color_query,
1867 color_assign,
1868 _gtk_css_color_value_new_current_color ());
1869 gtk_css_style_property_register ("-gtk-secondary-caret-color",
1870 GTK_CSS_PROPERTY_SECONDARY_CARET_COLOR,
1871 GDK_TYPE_RGBA,
1872 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
1873 GTK_CSS_AFFECTS_TEXT,
1874 color_parse,
1875 color_query,
1876 color_assign,
1877 _gtk_css_color_value_new_current_color ());
1878 gtk_css_style_property_register ("font-feature-settings",
1879 GTK_CSS_PROPERTY_FONT_FEATURE_SETTINGS,
1880 G_TYPE_NONE,
1881 GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
1882 GTK_CSS_AFFECTS_TEXT | GTK_CSS_AFFECTS_TEXT_ATTRS,
1883 parse_font_feature_settings,
1884 NULL,
1885 NULL,
1886 _gtk_css_string_value_new (""));
1887 }
1888