15 struct sysfs_class_device *find_brightness_device(void)
17 struct sysfs_class *cls;
18 struct dlist *backlights;
20 cls = sysfs_open_class("backlight");
23 perror("Could not open backlight class");
27 backlights = sysfs_get_class_devices(cls);
30 perror("Could not enumerate backlight devices");
34 struct sysfs_class_device *iter=NULL;
35 struct sysfs_attribute *attr=NULL;
37 dlist_for_each_data(backlights, iter, struct sysfs_class_device)
39 if((attr=sysfs_get_classdev_attr(iter, "type")))
41 if(!strncmp(attr->value, "raw", 3))
49 bool set_brightness(struct sysfs_class_device *dev, enum OP op, double value)
51 struct sysfs_attribute *attr;
53 double max_brightness=0;
55 if((attr=sysfs_get_classdev_attr(dev, "max_brightness")))
57 max_brightness = strtod(attr->value, NULL);
60 if((attr=sysfs_get_classdev_attr(dev, "brightness")))
62 brightness = strtod(attr->value, NULL);
65 if(max_brightness < 1 || isnan(max_brightness))
67 fprintf(stderr, "Failed to acquire maximum brightness.");
74 brightness = (max_brightness / 100) * value;
78 brightness += (max_brightness / 100) * value;
82 brightness -= (max_brightness / 100) * value;
86 if(brightness > max_brightness)
93 len=snprintf(valbuf, 32, "%.0f", brightness);
94 if(sysfs_write_attribute(attr, valbuf, len) != 0)
96 perror("Failed to write brightness attribute");
103 int main(int argc, char **argv)
105 struct sysfs_class_device *dev;
110 dev = find_brightness_device();
113 fprintf(stderr, "Could not find backlight device of type raw!\n");
134 fprintf(stderr, "Unknown operation '%c'!\n", argv[1][0]);
138 value = strtod(argv[2], NULL);
139 if(value < 0 || isnan(value))
141 fprintf(stderr, "Invalid brightness value\n");
147 if(!set_brightness(dev, op, value))
149 fprintf(stderr, "Could not set brightness!\n");