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