static GType gtk_css_image_get_parser_type (GtkCssParser *parser) { static const struct { const char *prefix; GType (* type_func) (void); } image_types[] = { { "url", _gtk_css_image_url_get_type }, { "-gtk-gradient", _gtk_css_image_gradient_get_type }, { "-gtk-scaled", _gtk_css_image_scaled_get_type }, { "-gtk-win32-theme-part", _gtk_css_image_win32_get_type }, { "linear-gradient", _gtk_css_image_linear_get_type }, { "repeating-linear-gradient", _gtk_css_image_linear_get_type }, { "cross-fade", _gtk_css_image_cross_fade_get_type } }; guint i; for (i = 0; i < G_N_ELEMENTS (image_types); i++) { if (_gtk_css_parser_has_prefix (parser, image_types[i].prefix)) return image_types[i].type_func (); } return G_TYPE_INVALID; }
static gboolean int_value_parse (GtkCssParser *parser, GValue *value) { gint i; if (_gtk_css_parser_has_prefix (parser, "-gtk")) { GtkCssValue *cssvalue = gtk_css_win32_size_value_parse (parser, GTK_CSS_PARSE_NUMBER | GTK_CSS_NUMBER_AS_PIXELS); if (cssvalue) { g_value_set_int (value, _gtk_css_number_value_get (cssvalue, 100)); _gtk_css_value_unref (cssvalue); return TRUE; } return FALSE; } if (!_gtk_css_parser_try_int (parser, &i)) { _gtk_css_parser_error (parser, "Expected a valid integer value"); return FALSE; } g_value_set_int (value, i); return TRUE; }
static gboolean border_value_parse (GtkCssParser *parser, GValue *value) { GtkBorder border = { 0, }; guint i; int numbers[4]; for (i = 0; i < G_N_ELEMENTS (numbers); i++) { if (_gtk_css_parser_has_prefix (parser, "-gtk")) { GtkCssValue *cssvalue = gtk_css_win32_size_value_parse (parser, GTK_CSS_PARSE_NUMBER | GTK_CSS_NUMBER_AS_PIXELS); if (cssvalue) { numbers[i] = _gtk_css_number_value_get (cssvalue, 100); _gtk_css_value_unref (cssvalue); return TRUE; } return FALSE; } else { if (!_gtk_css_parser_try_length (parser, &numbers[i])) break; } } if (i == 0) { _gtk_css_parser_error (parser, "Expected valid border"); return FALSE; } border.top = numbers[0]; if (i > 1) border.right = numbers[1]; else border.right = border.top; if (i > 2) border.bottom = numbers[2]; else border.bottom = border.top; if (i > 3) border.left = numbers[3]; else border.left = border.right; g_value_set_boxed (value, &border); return TRUE; }
gboolean _gtk_css_ease_value_can_parse (GtkCssParser *parser) { guint i; for (i = 0; i < G_N_ELEMENTS (parser_values); i++) { if (_gtk_css_parser_has_prefix (parser, parser_values[i].name)) return TRUE; } return FALSE; }