css: Add _gtk_css_parser_try_enum

This helps parsing GType enums in CSS, properly handling
CSS being case insensitive.
This commit is contained in:
Alexander Larsson 2011-11-25 14:11:56 +01:00
parent c9a3332ede
commit 1a68afffaf
2 changed files with 50 additions and 0 deletions

View File

@ -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,

View File

@ -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);