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

Reply via email to