7 #include <sysfs/libsysfs.h>
16 struct sysfs_class_device *find_brightness_device(void)
18 struct sysfs_class *cls;
19 struct dlist *backlights;
21 cls = sysfs_open_class("backlight");
24 perror("Could not open backlight class");
28 backlights = sysfs_get_class_devices(cls);
31 perror("Could not enumerate backlight devices");
35 struct sysfs_class_device *iter=NULL;
36 struct sysfs_attribute *attr=NULL;
38 dlist_for_each_data(backlights, iter, struct sysfs_class_device)
40 if((attr=sysfs_get_classdev_attr(iter, "type")))
42 if(!strncmp(attr->value, "raw", 3))
50 double get_brightness(struct sysfs_class_device *dev)
52 struct sysfs_attribute *attr;
54 double max_brightness=0;
56 if((attr=sysfs_get_classdev_attr(dev, "max_brightness")))
58 max_brightness = strtod(attr->value, NULL);
60 if((attr=sysfs_get_classdev_attr(dev, "brightness")))
62 brightness = strtod(attr->value, NULL);
65 return (brightness / max_brightness) * 100;
68 bool set_brightness(struct sysfs_class_device *dev, enum OP op, double value)
70 struct sysfs_attribute *attr;
72 double max_brightness=0;
74 if((attr=sysfs_get_classdev_attr(dev, "max_brightness")))
76 max_brightness = strtod(attr->value, NULL);
79 if((attr=sysfs_get_classdev_attr(dev, "brightness")))
81 brightness = strtod(attr->value, NULL);
84 if(max_brightness < 1 || isnan(max_brightness))
86 fprintf(stderr, "Failed to acquire maximum brightness.");
93 brightness = (max_brightness / 100) * value;
97 brightness += (max_brightness / 100) * value;
101 brightness -= (max_brightness / 100) * value;
105 // This is not supposed to happen
109 if(brightness > max_brightness)
116 len=snprintf(valbuf, 32, "%.0f", brightness);
117 if(sysfs_write_attribute(attr, valbuf, len) != 0)
119 perror("Failed to write brightness attribute");
126 int main(int argc, char **argv)
128 struct sysfs_class_device *dev;
133 dev = find_brightness_device();
136 fprintf(stderr, "Could not find backlight device of type raw!\n");
161 fprintf(stderr, "Unknown operation '%c'!\n", argv[1][0]);
169 fprintf(stderr, "Operation '%c' needs a value argument!\n", argv[1][0]);
172 value = strtod(argv[2], NULL);
175 if(value < 0 || isnan(value))
177 fprintf(stderr, "Invalid brightness value\n");
184 value = get_brightness(dev);
185 printf("%.0f\n", value);
189 if(!set_brightness(dev, op, value))
191 fprintf(stderr, "Could not set brightness!\n");