summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Davenport <qball@gmpclient.org>2023-02-10 18:56:05 +0100
committerDave Davenport <qball@gmpclient.org>2023-02-10 18:56:05 +0100
commit8197b9ae870ca2d4d05495926fa1f8366447cccf (patch)
tree59e5fc5b2ba004243c044a5c11b83f343308614c
parentcaa92637f1a436d2f629f92b301f1b374e72f6c1 (diff)
[Theme] First move to double internal calculations.
-rw-r--r--source/theme.c26
-rw-r--r--test/theme-parser-test.c31
2 files changed, 44 insertions, 13 deletions
diff --git a/source/theme.c b/source/theme.c
index c467fd77..0f14edbf 100644
--- a/source/theme.c
+++ b/source/theme.c
@@ -1359,7 +1359,7 @@ static int get_pixels(RofiDistanceUnit *unit, RofiOrientation ori) {
return val;
}
-static int distance_unit_get_pixel(RofiDistanceUnit *unit,
+static double distance_unit_get_pixel(RofiDistanceUnit *unit,
RofiOrientation ori) {
switch (unit->modtype) {
case ROFI_DISTANCE_MODIFIER_GROUP:
@@ -1375,45 +1375,45 @@ static int distance_unit_get_pixel(RofiDistanceUnit *unit,
return distance_unit_get_pixel(unit->left, ori) *
distance_unit_get_pixel(unit->right, ori);
case ROFI_DISTANCE_MODIFIER_DIVIDE: {
- int a = distance_unit_get_pixel(unit->left, ori);
- int b = distance_unit_get_pixel(unit->right, ori);
+ double a = distance_unit_get_pixel(unit->left, ori);
+ double b = distance_unit_get_pixel(unit->right, ori);
if (b != 0) {
return a / b;
}
return a;
}
case ROFI_DISTANCE_MODIFIER_MODULO: {
- int a = distance_unit_get_pixel(unit->left, ori);
- int b = distance_unit_get_pixel(unit->right, ori);
+ double a = distance_unit_get_pixel(unit->left, ori);
+ double b = distance_unit_get_pixel(unit->right, ori);
if (b != 0) {
- return a % b;
+ return fmod(a, b);
}
return 0;
}
case ROFI_DISTANCE_MODIFIER_MIN: {
- int a = distance_unit_get_pixel(unit->left, ori);
- int b = distance_unit_get_pixel(unit->right, ori);
+ double a = distance_unit_get_pixel(unit->left, ori);
+ double b = distance_unit_get_pixel(unit->right, ori);
return MIN(a, b);
}
case ROFI_DISTANCE_MODIFIER_MAX: {
- int a = distance_unit_get_pixel(unit->left, ori);
- int b = distance_unit_get_pixel(unit->right, ori);
+ double a = distance_unit_get_pixel(unit->left, ori);
+ double b = distance_unit_get_pixel(unit->right, ori);
return MAX(a, b);
}
case ROFI_DISTANCE_MODIFIER_ROUND: {
double a = (double)distance_unit_get_pixel(unit->left, ori);
double b = (double)distance_unit_get_pixel(unit->right, ori);
- return (int)(round(a / b) * b);
+ return (double)(round(a / b) * b);
}
case ROFI_DISTANCE_MODIFIER_CEIL: {
double a = (double)distance_unit_get_pixel(unit->left, ori);
double b = (double)distance_unit_get_pixel(unit->right, ori);
- return (int)(ceil(a / b) * b);
+ return (double)(ceil(a / b) * b);
}
case ROFI_DISTANCE_MODIFIER_FLOOR: {
double a = (double)distance_unit_get_pixel(unit->left, ori);
double b = (double)distance_unit_get_pixel(unit->right, ori);
- return (int)(floor(a / b) * b);
+ return (double)(floor(a / b) * b);
}
default:
break;
diff --git a/test/theme-parser-test.c b/test/theme-parser-test.c
index 527eec2c..036a4947 100644
--- a/test/theme-parser-test.c
+++ b/test/theme-parser-test.c
@@ -1498,6 +1498,35 @@ START_TEST(test_prepare_math_max) {
int dist = distance_get_pixel(l, ROFI_ORIENTATION_HORIZONTAL);
ck_assert_int_eq(dist, 256);
}
+START_TEST(test_prepare_math_failure) {
+ widget wid;
+ wid.name = "window";
+ wid.state = "";
+ rofi_theme_parse_string("window { width: calc( 1/2 * 500 );}");
+ ck_assert_ptr_nonnull(rofi_theme);
+ // ck_assert_ptr_null ( rofi_theme->widgets );
+ ck_assert_ptr_null(rofi_theme->properties);
+ ck_assert_ptr_null(rofi_theme->parent);
+ ck_assert_str_eq(rofi_theme->name, "Root");
+ RofiDistance l = rofi_theme_get_distance(&wid, "width", 0);
+ int dist = distance_get_pixel(l, ROFI_ORIENTATION_HORIZONTAL);
+ ck_assert_int_eq(dist, 250);
+}
+
+START_TEST(test_prepare_math_failure2) {
+ widget wid;
+ wid.name = "window";
+ wid.state = "";
+ rofi_theme_parse_string("window { width: calc( -16/2 * 1.5 );}");
+ ck_assert_ptr_nonnull(rofi_theme);
+ // ck_assert_ptr_null ( rofi_theme->widgets );
+ ck_assert_ptr_null(rofi_theme->properties);
+ ck_assert_ptr_null(rofi_theme->parent);
+ ck_assert_str_eq(rofi_theme->name, "Root");
+ RofiDistance l = rofi_theme_get_distance(&wid, "width", 0);
+ int dist = distance_get_pixel(l, ROFI_ORIENTATION_HORIZONTAL);
+ ck_assert_int_eq(dist, -12);
+}
END_TEST
START_TEST(test_prepare_default) {
rofi_theme_parse_string("@import \"default\"");
@@ -1739,6 +1768,8 @@ static Suite *theme_parser_suite(void) {
tcase_add_test(tc_prepare_math, test_prepare_math_round);
tcase_add_test(tc_prepare_math, test_prepare_math_min);
tcase_add_test(tc_prepare_math, test_prepare_math_max);
+ tcase_add_test(tc_prepare_math, test_prepare_math_failure);
+ tcase_add_test(tc_prepare_math, test_prepare_math_failure2);
suite_add_tcase(s, tc_prepare_math);
}
return s;