summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte.benjamin@googlemail.com>2019-10-11 23:24:55 +0000
committerBenjamin Otte <otte.benjamin@googlemail.com>2019-10-11 23:24:55 +0000
commitdb37493692fe5e49898f4ee969f5012ad31c3a21 (patch)
treeae4c67a4b1939e8e2f49061a32b29aa9246afb10
parent35ae460abbf58966e66045a77236468b344ebae2 (diff)
downloadgnome-settings-daemon-db37493692fe5e49898f4ee969f5012ad31c3a21.tar.gz
power: Fix rounding of brightness value
We rounded properly for percentage to absolute value, but we always floored the other way around. The new code achieves this by always rounding. This way the following rule holds (assuming the the min value is 0 for this discussion) x = round (round (x * scale) / scale) with scale = (max - min) / 100 and assuming that scale >= 1 If scale < 1, the rule holds for the other direction.
-rw-r--r--plugins/power/gpm-common.c19
1 files changed, 9 insertions, 10 deletions
diff --git a/plugins/power/gpm-common.c b/plugins/power/gpm-common.c
index 0934a205..a7ca87fb 100644
--- a/plugins/power/gpm-common.c
+++ b/plugins/power/gpm-common.c
@@ -43,6 +43,13 @@
#define UPS_SOUND_LOOP_ID 99
#define GSD_POWER_MANAGER_CRITICAL_ALERT_TIMEOUT 5 /* seconds */
+static int
+gsd_power_backlight_convert_safe (int value, int from_range, int to_range)
+{
+ /* round (value / from_range) * to_range */
+ return (value * to_range + from_range / 2) / from_range;
+}
+
/* take a discrete value with offset and convert to percentage */
int
gsd_power_backlight_abs_to_percentage (int min, int max, int value)
@@ -50,26 +57,18 @@ gsd_power_backlight_abs_to_percentage (int min, int max, int value)
g_return_val_if_fail (max > min, -1);
g_return_val_if_fail (value >= min, -1);
g_return_val_if_fail (value <= max, -1);
- return (((value - min) * 100) / (max - min));
+ return gsd_power_backlight_convert_safe (value - min, max - min, 100);
}
/* take a percentage and convert to a discrete value with offset */
int
gsd_power_backlight_percentage_to_abs (int min, int max, int value)
{
- int steps, step_size;
-
g_return_val_if_fail (max > min, -1);
g_return_val_if_fail (value >= 0, -1);
g_return_val_if_fail (value <= 100, -1);
- steps = max - min;
- step_size = 100 / steps;
-
- /* Round for better precision when steps is small */
- value += step_size / 2;
-
- return min + (steps * value) / 100;
+ return min + gsd_power_backlight_convert_safe (value, 100, max - min);
}
#define GPM_UP_TIME_PRECISION 5*60