summaryrefslogtreecommitdiff
path: root/gtk/gtkcsspositionvalue.c
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2019-04-10 21:10:03 +0200
committerBenjamin Otte <otte@redhat.com>2019-04-12 19:34:28 +0200
commit3ab65b7da2394b6f16b84b948c30449248ce5d86 (patch)
tree66953e4bdc5d7bfe76ed2799504a5412f2cf4a92 /gtk/gtkcsspositionvalue.c
parent79238b0d8f8683b57ba85e27b3cdf0949011a8d1 (diff)
downloadgtk+-3ab65b7da2394b6f16b84b948c30449248ce5d86.tar.gz
csspositionvalue: Redo the parser
The old one incorrectly rejected "center left" and "center right".
Diffstat (limited to 'gtk/gtkcsspositionvalue.c')
-rw-r--r--gtk/gtkcsspositionvalue.c86
1 files changed, 46 insertions, 40 deletions
diff --git a/gtk/gtkcsspositionvalue.c b/gtk/gtkcsspositionvalue.c
index 473ae56ca9..b5cde9de9c 100644
--- a/gtk/gtkcsspositionvalue.c
+++ b/gtk/gtkcsspositionvalue.c
@@ -179,42 +179,34 @@ position_value_parse (GtkCssParser *parser, gboolean try)
const char *name;
guint percentage;
gboolean horizontal;
- gboolean vertical;
+ gboolean swap;
} names[] = {
{ "left", 0, TRUE, FALSE },
{ "right", 100, TRUE, FALSE },
{ "center", 50, TRUE, TRUE },
- { "top", 0, FALSE, TRUE },
- { "bottom", 100, FALSE, TRUE },
- { NULL , 0, TRUE, FALSE }, /* used for numbers */
- { NULL , 50, TRUE, TRUE } /* used for no value */
+ { "top", 0, FALSE, FALSE },
+ { "bottom", 100, FALSE, FALSE },
};
- GtkCssValue *x, *y;
- GtkCssValue **missing;
- guint first, second;
+ GtkCssValue *x = NULL, *y = NULL;
+ gboolean swap = FALSE;
+ guint i;
- for (first = 0; names[first].name != NULL; first++)
+ for (i = 0; i < G_N_ELEMENTS (names); i++)
{
- if (gtk_css_parser_try_ident (parser, names[first].name))
+ if (gtk_css_parser_try_ident (parser, names[i].name))
{
- if (names[first].horizontal)
- {
- x = _gtk_css_number_value_new (names[first].percentage, GTK_CSS_PERCENT);
- missing = &y;
- }
+ if (names[i].horizontal)
+ x = _gtk_css_number_value_new (names[i].percentage, GTK_CSS_PERCENT);
else
- {
- y = _gtk_css_number_value_new (names[first].percentage, GTK_CSS_PERCENT);
- missing = &x;
- }
+ y = _gtk_css_number_value_new (names[i].percentage, GTK_CSS_PERCENT);
+ swap = names[i].swap;
break;
}
}
- if (names[first].name == NULL)
+ if (i == G_N_ELEMENTS (names))
{
if (gtk_css_number_value_can_parse (parser))
{
- missing = &y;
x = _gtk_css_number_value_parse (parser,
GTK_CSS_PARSE_PERCENT
| GTK_CSS_PARSE_LENGTH);
@@ -230,20 +222,44 @@ position_value_parse (GtkCssParser *parser, gboolean try)
}
}
- for (second = 0; names[second].name != NULL; second++)
+ for (i = 0; i < G_N_ELEMENTS (names); i++)
{
- if (gtk_css_parser_try_ident (parser, names[second].name))
+ if (!swap && !names[i].swap)
{
- *missing = _gtk_css_number_value_new (names[second].percentage, GTK_CSS_PERCENT);
+ if (names[i].horizontal && x != NULL)
+ continue;
+ if (!names[i].horizontal && y != NULL)
+ continue;
+ }
+
+ if (gtk_css_parser_try_ident (parser, names[i].name))
+ {
+ if (x)
+ {
+ if (names[i].horizontal && !names[i].swap)
+ {
+ y = x;
+ x = _gtk_css_number_value_new (names[i].percentage, GTK_CSS_PERCENT);
+ }
+ else
+ {
+ y = _gtk_css_number_value_new (names[i].percentage, GTK_CSS_PERCENT);
+ }
+ }
+ else
+ {
+ g_assert (names[i].horizontal || names[i].swap);
+ x = _gtk_css_number_value_new (names[i].percentage, GTK_CSS_PERCENT);
+ }
break;
}
}
- if (names[second].name == NULL)
+ if (i == G_N_ELEMENTS (names))
{
if (gtk_css_number_value_can_parse (parser))
{
- if (missing != &y)
+ if (y != NULL)
{
if (!try)
gtk_css_parser_error_syntax (parser, "Invalid combination of values");
@@ -261,20 +277,10 @@ position_value_parse (GtkCssParser *parser, gboolean try)
}
else
{
- second++;
- *missing = _gtk_css_number_value_new (50, GTK_CSS_PERCENT);
- }
- }
- else
- {
- if ((names[first].horizontal && !names[second].vertical) ||
- (!names[first].horizontal && !names[second].horizontal))
- {
- if (!try)
- gtk_css_parser_error_syntax (parser, "Invalid combination of values");
- _gtk_css_value_unref (x);
- _gtk_css_value_unref (y);
- return NULL;
+ if (y)
+ x = _gtk_css_number_value_new (50, GTK_CSS_PERCENT);
+ else
+ y = _gtk_css_number_value_new (50, GTK_CSS_PERCENT);
}
}