GFile * _gtk_css_parser_read_url (GtkCssParser *parser) { gchar *path; char *scheme; GFile *file; if (_gtk_css_parser_try (parser, "url", FALSE)) { if (!_gtk_css_parser_try (parser, "(", TRUE)) { _gtk_css_parser_skip_whitespace (parser); if (_gtk_css_parser_try (parser, "(", TRUE)) { _gtk_css_parser_error_full (parser, GTK_CSS_PROVIDER_ERROR_DEPRECATED, "Whitespace between 'url' and '(' is deprecated"); } else { _gtk_css_parser_error (parser, "Expected '(' after 'url'"); return NULL; } } path = _gtk_css_parser_read_string (parser); if (path == NULL) return NULL; if (!_gtk_css_parser_try (parser, ")", TRUE)) { _gtk_css_parser_error (parser, "No closing ')' found for 'url'"); g_free (path); return NULL; } scheme = g_uri_parse_scheme (path); if (scheme != NULL) { file = g_file_new_for_uri (path); g_free (path); g_free (scheme); return file; } } else { path = _gtk_css_parser_try_name (parser, TRUE); if (path == NULL) { _gtk_css_parser_error (parser, "Not a valid url"); return NULL; } } file = _gtk_css_parser_get_file_for_path (parser, path); g_free (path); return file; }
GFile * _gtk_css_parse_url (GtkCssParser *parser, GFile *base) { gchar *path; GFile *file; if (_gtk_css_parser_try (parser, "url", FALSE)) { if (!_gtk_css_parser_try (parser, "(", TRUE)) { _gtk_css_parser_skip_whitespace (parser); if (_gtk_css_parser_try (parser, "(", TRUE)) { GError *error; error = g_error_new_literal (GTK_CSS_PROVIDER_ERROR, GTK_CSS_PROVIDER_ERROR_DEPRECATED, "Whitespace between 'url' and '(' is not allowed"); _gtk_css_parser_take_error (parser, error); } else { _gtk_css_parser_error (parser, "Expected '(' after 'url'"); return NULL; } } path = _gtk_css_parser_read_string (parser); if (path == NULL) return NULL; if (!_gtk_css_parser_try (parser, ")", TRUE)) { _gtk_css_parser_error (parser, "No closing ')' found for 'url'"); g_free (path); return NULL; } } else { path = _gtk_css_parser_try_name (parser, TRUE); if (path == NULL) { _gtk_css_parser_error (parser, "Not a valid url"); return NULL; } } file = g_file_resolve_relative_path (base, path); g_free (path); return file; }
GtkSymbolicColor * _gtk_css_parser_read_symbolic_color (GtkCssParser *parser) { GtkSymbolicColor *symbolic; guint color; const char *names[] = {"rgba", "rgb", "lighter", "darker", "shade", "alpha", "mix", GTK_WIN32_THEME_SYMBOLIC_COLOR_NAME}; char *name; g_return_val_if_fail (GTK_IS_CSS_PARSER (parser), NULL); if (_gtk_css_parser_try (parser, "@", FALSE)) { name = _gtk_css_parser_try_name (parser, TRUE); if (name) { symbolic = gtk_symbolic_color_new_name (name); } else { _gtk_css_parser_error (parser, "'%s' is not a valid symbolic color name", name); symbolic = NULL; } g_free (name); return symbolic; } for (color = 0; color < G_N_ELEMENTS (names); color++) { if (_gtk_css_parser_try (parser, names[color], TRUE)) break; } if (color < G_N_ELEMENTS (names)) return gtk_css_parser_read_symbolic_color_function (parser, color); symbolic = gtk_css_parser_try_hash_color (parser); if (symbolic) return symbolic; name = _gtk_css_parser_try_name (parser, TRUE); if (name) { GdkRGBA rgba; if (gdk_rgba_parse (&rgba, name)) { symbolic = gtk_symbolic_color_new_literal (&rgba); } else { _gtk_css_parser_error (parser, "'%s' is not a valid color name", name); symbolic = NULL; } g_free (name); return symbolic; } _gtk_css_parser_error (parser, "Not a color definition"); return NULL; }