From 8197b9ae870ca2d4d05495926fa1f8366447cccf Mon Sep 17 00:00:00 2001 From: Dave Davenport Date: Fri, 10 Feb 2023 18:56:05 +0100 Subject: [Theme] First move to double internal calculations. --- source/theme.c | 26 +++++++++++++------------- test/theme-parser-test.c | 31 +++++++++++++++++++++++++++++++ 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; -- cgit v1.2.3