diff --git a/clutter/clutter-units.c b/clutter/clutter-units.c index f07f0f619..8a43cfefe 100644 --- a/clutter/clutter-units.c +++ b/clutter/clutter-units.c @@ -480,11 +480,21 @@ clutter_units_from_string (ClutterUnits *units, ClutterBackend *backend; ClutterUnitType unit_type; gfloat value; + gboolean negative = FALSE; g_return_val_if_fail (units != NULL, FALSE); g_return_val_if_fail (str != NULL, FALSE); /* strip leading space */ + while (g_ascii_isspace (*str) || *str == '+') + str++; + + if (*str == '-') + { + negative = TRUE; + str++; + } + while (g_ascii_isspace (*str)) str++; @@ -550,6 +560,9 @@ clutter_units_from_string (ClutterUnits *units, if (*str != '\0') return FALSE; + if (negative) + value *= -1; + backend = clutter_get_default_backend (); units->unit_type = unit_type; diff --git a/tests/conform/units.c b/tests/conform/units.c index 3822e05e2..0dcc3550e 100644 --- a/tests/conform/units.c +++ b/tests/conform/units.c @@ -108,6 +108,10 @@ units_string (TestConformSimpleFixture *fixture, g_assert (clutter_units_get_unit_type (&units) == CLUTTER_UNIT_POINT); g_assert_cmpfloat (clutter_units_get_unit_value (&units), ==, 0.5f); + g_assert (clutter_units_from_string (&units, "-3 px") == TRUE); + g_assert (clutter_units_get_unit_type (&units) == CLUTTER_UNIT_PIXEL); + g_assert_cmpfloat (clutter_units_get_unit_value (&units), ==, -3.0); + g_assert (clutter_units_from_string (&units, "1 omg!!pony") == FALSE); clutter_units_from_pt (&units, 24.0);