+static gboolean
+parse_border (GtkCssShorthandProperty *shorthand,
+ GValue *values,
+ GtkCssParser *parser,
+ GFile *base)
+{
+ int style;
+
+ do
+ {
+ if (!G_IS_VALUE (&values[0]) &&
+ _gtk_css_parser_has_number (parser))
+ {
+ GtkCssNumber number;
+ if (!_gtk_css_parser_read_number (parser,
+ &number,
+ GTK_CSS_POSITIVE_ONLY
+ | GTK_CSS_NUMBER_AS_PIXELS
+ | GTK_CSS_PARSE_LENGTH))
+ return FALSE;
+
+ g_value_init (&values[0], GTK_TYPE_CSS_NUMBER);
+ g_value_init (&values[1], GTK_TYPE_CSS_NUMBER);
+ g_value_init (&values[2], GTK_TYPE_CSS_NUMBER);
+ g_value_init (&values[3], GTK_TYPE_CSS_NUMBER);
+ g_value_set_boxed (&values[0], &number);
+ g_value_set_boxed (&values[1], &number);
+ g_value_set_boxed (&values[2], &number);
+ g_value_set_boxed (&values[3], &number);
+ }
+ else if (!G_IS_VALUE (&values[4]) &&
+ _gtk_css_parser_try_enum (parser, GTK_TYPE_BORDER_STYLE, &style))
+ {
+ g_value_init (&values[4], GTK_TYPE_BORDER_STYLE);
+ g_value_init (&values[5], GTK_TYPE_BORDER_STYLE);
+ g_value_init (&values[6], GTK_TYPE_BORDER_STYLE);
+ g_value_init (&values[7], GTK_TYPE_BORDER_STYLE);
+ g_value_set_enum (&values[4], style);
+ g_value_set_enum (&values[5], style);
+ g_value_set_enum (&values[6], style);
+ g_value_set_enum (&values[7], style);
+ }
+ else if (!G_IS_VALUE (&values[8]))
+ {
+ GtkSymbolicColor *symbolic;
+
+ symbolic = _gtk_css_parser_read_symbolic_color (parser);
+ if (symbolic == NULL)
+ return FALSE;
+
+ g_value_init (&values[8], GTK_TYPE_SYMBOLIC_COLOR);
+ g_value_init (&values[9], GTK_TYPE_SYMBOLIC_COLOR);
+ g_value_init (&values[10], GTK_TYPE_SYMBOLIC_COLOR);
+ g_value_init (&values[11], GTK_TYPE_SYMBOLIC_COLOR);
+ g_value_set_boxed (&values[8], symbolic);
+ g_value_set_boxed (&values[9], symbolic);
+ g_value_set_boxed (&values[10], symbolic);
+ g_value_take_boxed (&values[11], symbolic);
+ }
+ else
+ {
+ /* We parsed everything and there's still stuff left?
+ * Pretend we didn't notice and let the normal code produce
+ * a 'junk at end of value' error */
+ break;
+ }
+ }
+ while (!value_is_done_parsing (parser));
+
+ /* Note that border-image values are not set: according to the spec
+ they just need to be reset when using the border shorthand */
+
+ return TRUE;
+}
+
+static gboolean
+parse_font (GtkCssShorthandProperty *shorthand,
+ GValue *values,
+ GtkCssParser *parser,
+ GFile *base)