On my laptop (a Lenovo ThinkPad X1 Carbon, 4th generation), the physical screen brightness seems to be a logarithmic function of the xbacklight number. This means adding/subtracting a constant has a much larger effect on a dim screen than a bright screen. Multiplying the brightness by, say, 1.5/0.66 gives more desirable behavior (approximately constant brightness changes throughout the range).
Signed-off-by: Jake Schmidt <[email protected]> --- xbacklight.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/xbacklight.c b/xbacklight.c index 278043f..deba73f 100644 --- a/xbacklight.c +++ b/xbacklight.c @@ -36,7 +36,7 @@ #include <string.h> #include <unistd.h> -typedef enum { Get, Set, Inc, Dec } op_t; +typedef enum { Get, Set, Inc, Dec, Mul } op_t; static char *program_name; @@ -53,6 +53,7 @@ usage (int exitcode) " -set <percentage> or = <percentage>\n" " -inc <percentage> or + <percentage>\n" " -dec <percentage> or - <percentage>\n" + " -mul <multiplier> or * <multiplier>\n" " -get\n" " -time <fade time in milliseconds>\n" " -steps <number of steps in fade>\n"); @@ -185,6 +186,19 @@ main (int argc, char **argv) value = atof (argv[i] + 1); continue; } + if (!strcmp (argv[i], "-mul") || !strcmp (argv[i], "*")) + { + if (++i >= argc) missing_arg (argv[i-1]); + op = Mul; + value = atof (argv[i]); + continue; + } + if (argv[i][0] == '*' && isdigit (argv[i][1])) + { + op = Mul; + value = atof (argv[i] + 1); + continue; + } if (!strcmp (argv[i], "-get") || !strcmp (argv[i], "-g")) { op = Get; @@ -315,6 +329,16 @@ main (int argc, char **argv) case Dec: new = cur - set; break; + case Mul: + set = cur * value - cur; + if (value > 1 && set < 1.0) { + set = 1.0; + } + if (value < 1 && set > -1.0) { + set = -1.0; + } + new = cur + set; + break; default: xcb_aux_sync (conn); return 1; -- 2.9.3 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: https://lists.x.org/mailman/listinfo/xorg-devel
