diff options
-rw-r--r-- | gtk/gtkcssparser.c | 47 | ||||
-rw-r--r-- | gtk/gtkcssparserprivate.h | 3 |
2 files changed, 50 insertions, 0 deletions
diff --git a/gtk/gtkcssparser.c b/gtk/gtkcssparser.c index ff44c35748..073e9478db 100644 --- a/gtk/gtkcssparser.c +++ b/gtk/gtkcssparser.c @@ -569,6 +569,53 @@ _gtk_css_parser_try_double (GtkCssParser *parser, return TRUE; } +gboolean +_gtk_css_parser_try_enum (GtkCssParser *parser, + GType enum_type, + int *value) +{ + GEnumClass *enum_class; + gboolean result; + const char *start; + char *str; + + g_return_val_if_fail (GTK_IS_CSS_PARSER (parser), FALSE); + g_return_val_if_fail (value != NULL, FALSE); + + result = FALSE; + + enum_class = g_type_class_ref (enum_type); + + start = parser->data; + + str = _gtk_css_parser_try_ident (parser, TRUE); + if (str == NULL) + return FALSE; + + if (enum_class->n_values) + { + GEnumValue *enum_value; + + for (enum_value = enum_class->values; enum_value->value_name; enum_value++) + { + if (enum_value->value_nick && + g_ascii_strcasecmp (str, enum_value->value_nick) == 0) + { + *value = enum_value->value; + result = TRUE; + break; + } + } + } + + g_type_class_unref (enum_class); + + if (!result) + parser->data = start; + + return result; +} + typedef enum { COLOR_RGBA, COLOR_RGB, diff --git a/gtk/gtkcssparserprivate.h b/gtk/gtkcssparserprivate.h index 6ea60a82ae..dd58fa6456 100644 --- a/gtk/gtkcssparserprivate.h +++ b/gtk/gtkcssparserprivate.h @@ -70,6 +70,9 @@ gboolean _gtk_css_parser_try_uint (GtkCssParser *parser guint *value); gboolean _gtk_css_parser_try_double (GtkCssParser *parser, gdouble *value); +gboolean _gtk_css_parser_try_enum (GtkCssParser *parser, + GType enum_type, + int *value); void _gtk_css_parser_skip_whitespace (GtkCssParser *parser); char * _gtk_css_parser_read_string (GtkCssParser *parser); |