Make color constants work without warnings

The code for defining a color as a constant had broken logic: it
would try to parse the color first as an double, then as an integer;
the second attempt would produce an error about overwriting the
already-set-GError. Then it would clear the error and store the constant
as a color.

Use the fact that colors have to start with a letter or #, divide the
space of constants into:

 - Integers
 - Doubles
 - Colors

so we get good error messages. Based on a patch by
William Jon McCann <jmccann@redhat.com>.

Note that this breaks the ability to specify an integer constant as
identical to another integer constant (the same didn't work for doubles.)
I think this was an accidental side effect of the code and not something
that was intentional or people were relying on

https://bugzilla.gnome.org/show_bug.cgi?id=632116
This commit is contained in:
Owen W. Taylor 2010-10-13 23:56:38 -04:00
parent 52bc675fcb
commit af715f71e7

View File

@ -902,36 +902,47 @@ parse_toplevel_element (GMarkupParseContext *context,
NULL))
return;
if (strchr (value, '.') && parse_double (value, &dval, context, error))
/* We don't know how a a constant is going to be used, so we have guess its
* type from its contents:
*
* - Starts like a number and contains a '.': float constant
* - Starts like a number and doesn't contain a '.': int constant
* - Starts with anything else: a color constant.
* (colors always start with # or a letter)
*/
if (value[0] == '.' || value[0] == '+' || value[0] == '-' || (value[0] >= '0' && value[0] <= '9'))
{
g_clear_error (error);
if (!meta_theme_define_float_constant (info->theme,
name,
dval,
error))
if (strchr (value, '.'))
{
add_context_to_error (error, context);
return;
if (!parse_double (value, &dval, context, error))
return;
if (!meta_theme_define_float_constant (info->theme,
name,
dval,
error))
{
add_context_to_error (error, context);
return;
}
}
}
else if (parse_positive_integer (value, &ival, context, info->theme, error))
{
g_clear_error (error);
if (!meta_theme_define_int_constant (info->theme,
name,
ival,
error))
else
{
add_context_to_error (error, context);
return;
if (!parse_positive_integer (value, &ival, context, info->theme, error))
return;
if (!meta_theme_define_int_constant (info->theme,
name,
ival,
error))
{
add_context_to_error (error, context);
return;
}
}
}
else
{
g_clear_error (error);
if (!meta_theme_define_color_constant (info->theme,
name,
value,