summaryrefslogtreecommitdiff
path: root/xbacklight.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@neko.keithp.com>2007-03-29 22:56:13 -0700
committerKeith Packard <keithp@neko.keithp.com>2007-03-29 22:56:13 -0700
commitd52f81e43da29d94122d62c1b1be34946960033c (patch)
tree8813482957442464792f8a012d8a16a499a2ca9a /xbacklight.c
Initial xbacklight program
Diffstat (limited to 'xbacklight.c')
-rw-r--r--xbacklight.c214
1 files changed, 214 insertions, 0 deletions
diff --git a/xbacklight.c b/xbacklight.c
new file mode 100644
index 0000000..df99905
--- /dev/null
+++ b/xbacklight.c
@@ -0,0 +1,214 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <X11/Xatom.h>
+#include <X11/Xlib.h>
+#include <X11/extensions/Xrandr.h>
+
+typedef enum { Get, Set, Inc, Dec } op_t;
+
+static char *program_name;
+
+static Atom backlight;
+
+static void
+usage (void)
+{
+ fprintf(stderr, "usage: %s [options]\n", program_name);
+ fprintf(stderr, " where options are:\n");
+ fprintf(stderr, " -display <display> or -d <display>\n");
+ fprintf(stderr, " -help\n");
+ fprintf(stderr, " -set <percentage> or = <percentage>\n");
+ fprintf(stderr, " -inc <percentage> or + <percentage>\n");
+ fprintf(stderr, " -dec <percentage> or - <percentage>\n");
+ fprintf(stderr, " -get\n");
+ /*NOTREACHED*/
+ exit (1);
+}
+
+static long
+backlight_get (Display *dpy, RROutput output)
+{
+ unsigned long nitems;
+ unsigned long bytes_after;
+ unsigned char *prop;
+ Atom actual_type;
+ int actual_format;
+ long value;
+
+ if (XRRGetOutputProperty (dpy, output, backlight,
+ 0, 4, False, False, None,
+ &actual_type, &actual_format,
+ &nitems, &bytes_after, &prop) != Success)
+ return -1;
+ if (actual_type != XA_INTEGER || nitems != 1 || actual_format != 32)
+ value = -1;
+ else
+ value = *((long *) prop);
+ XFree (prop);
+ return value;
+}
+
+static void
+backlight_set (Display *dpy, RROutput output, long value)
+{
+ XRRChangeOutputProperty (dpy, output, backlight, XA_INTEGER, 32,
+ PropModeReplace, (unsigned char *) &value, 1);
+}
+
+int
+main (int argc, char **argv)
+{
+ char *dpy_name = NULL;
+ Display *dpy;
+ int screen;
+ int major, minor;
+ op_t op = Get;
+ int value = 0;
+ int i;
+
+ program_name = argv[0];
+
+ for (i = 1; i < argc; i++)
+ {
+ if (!strcmp (argv[i], "-display") || !strcmp ("-d", argv[i]))
+ {
+ if (++i >= argc) usage();
+ dpy_name = argv[i];
+ continue;
+ }
+ if (!strcmp (argv[i], "-set") || !strcmp (argv[i], "="))
+ {
+ if (++i >= argc) usage();
+ op = Set;
+ value = atoi (argv[i]);
+ continue;
+ }
+ if (argv[i][0] == '=' && isdigit (argv[i][1]))
+ {
+ op = Set;
+ value = atoi (argv[i] + 1);
+ continue;
+ }
+ if (!strcmp (argv[i], "-inc") || !strcmp (argv[i], "+"))
+ {
+ if (++i >= argc) usage();
+ op = Inc;
+ value = atoi (argv[i]);
+ continue;
+ }
+ if (argv[i][0] == '+' && isdigit (argv[i][1]))
+ {
+ op = Inc;
+ value = atoi (argv[i] + 1);
+ continue;
+ }
+ if (!strcmp (argv[i], "-dec") || !strcmp (argv[i], "-"))
+ {
+ if (++i >= argc) usage();
+ op = Dec;
+ value = atoi (argv[i]);
+ continue;
+ }
+ if (argv[i][0] == '-' && isdigit (argv[i][1]))
+ {
+ op = Dec;
+ value = atoi (argv[i] + 1);
+ continue;
+ }
+ if (!strcmp (argv[i], "-get") || !strcmp (argv[i], "-g"))
+ {
+ op = Get;
+ continue;
+ }
+ if (!strcmp (argv[i], "-help") || !strcmp (argv[i], "-?"))
+ {
+ usage ();
+ }
+ }
+ dpy = XOpenDisplay (dpy_name);
+ if (!dpy)
+ {
+ fprintf (stderr, "Cannot open display \"%s\"\n",
+ XDisplayName (dpy_name));
+ exit (1);
+ }
+ if (!XRRQueryVersion (dpy, &major, &minor))
+ {
+ fprintf (stderr, "RandR extension missing\n");
+ exit (1);
+ }
+ if (major < 1 || (major == 1 && minor < 2))
+ {
+ fprintf (stderr, "RandR version %d.%d too old\n", major, minor);
+ exit (1);
+ }
+ backlight = XInternAtom (dpy, "BACKLIGHT", True);
+ if (backlight == None)
+ {
+ fprintf (stderr, "No outputs have backlight property\n");
+ exit (1);
+ }
+ for (screen = 0; screen < ScreenCount (dpy); screen++)
+ {
+ Window root = RootWindow (dpy, screen);
+ XRRScreenResources *resources = XRRGetScreenResources (dpy, root);
+ int o;
+
+ if (!resources) continue;
+ for (o = 0; o < resources->noutput; o++)
+ {
+ RROutput output = resources->outputs[o];
+ XRRPropertyInfo *info;
+ double cur, new, step;
+ double min, max;
+ double set;
+
+ cur = backlight_get (dpy, output);
+ if (cur != -1)
+ {
+ info = XRRQueryOutputProperty (dpy, output, backlight);
+ if (info)
+ {
+ if (info->range && info->num_values == 2)
+ {
+ min = info->values[0];
+ max = info->values[1];
+ if (op == Get) {
+ printf ("%f\n", (cur - min) * 100 / (max - min));
+ } else {
+ set = value * (max - min) / 100;
+ switch (op) {
+ case Set:
+ new = min + set;
+ break;
+ case Inc:
+ new = cur + set;
+ break;
+ case Dec:
+ new = cur - set;
+ break;
+ }
+ if (new > max) new = max;
+ if (new < min) new = min;
+ step = (new - cur) / 50;
+ for (i = 0; i < 50; i++)
+ {
+ if (i == 49)
+ cur = new;
+ else
+ cur += step;
+ backlight_set (dpy, output, (long) cur);
+ XFlush (dpy);
+ usleep (10 * 1000);
+ }
+ }
+ }
+ XFree (info);
+ }
+ }
+ }
+
+ XRRFreeScreenResources (resources);
+ }
+ XSync (dpy, False);
+}