summaryrefslogtreecommitdiff
path: root/libevdev/libevdev.c
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2013-08-09 13:21:28 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2013-08-15 10:32:40 +1000
commit4d4293a65b604e0bf8d02dc729803f142fc665aa (patch)
tree5673340dea0205a4bd473feae44caa9565eae4ee /libevdev/libevdev.c
parentbfb6c1c6c59bf1bb3a9bbab0ff26b962a4efc922 (diff)
downloadlibevdev-4d4293a65b604e0bf8d02dc729803f142fc665aa.tar.gz
Add functions to toggle LEDs on the device
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Benjamin Tissoires <benjamin.tissoires@gmail.com>
Diffstat (limited to 'libevdev/libevdev.c')
-rw-r--r--libevdev/libevdev.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/libevdev/libevdev.c b/libevdev/libevdev.c
index bd0c58c..25d33e7 100644
--- a/libevdev/libevdev.c
+++ b/libevdev/libevdev.c
@@ -1179,3 +1179,62 @@ libevdev_get_repeat(struct libevdev *dev, int *delay, int *period)
return 0;
}
+
+int
+libevdev_kernel_set_led_value(struct libevdev *dev, unsigned int code, enum EvdevLEDValues value)
+{
+ return libevdev_kernel_set_led_values(dev, code, value, -1);
+}
+
+int
+libevdev_kernel_set_led_values(struct libevdev *dev, ...)
+{
+ struct input_event ev[LED_MAX];
+ enum EvdevLEDValues val;
+ va_list args;
+ int code;
+ int rc = 0;
+ size_t nleds = 0;
+
+ memset(ev, 0, sizeof(ev));
+
+ va_start(args, dev);
+ code = va_arg(args, unsigned int);
+ while (code != -1) {
+ if (code > LED_MAX) {
+ rc = -EINVAL;
+ break;
+ }
+ val = va_arg(args, enum EvdevLEDValues);
+ if (val != LIBEVDEV_LED_ON && val != LIBEVDEV_LED_OFF) {
+ rc = -EINVAL;
+ break;
+ }
+
+ if (libevdev_has_event_code(dev, EV_LED, code)) {
+ struct input_event *e = ev;
+
+ while (e->type > 0 && e->code != code)
+ e++;
+
+ if (e->type == 0)
+ nleds++;
+ e->type = EV_LED;
+ e->code = code;
+ e->value = (val == LIBEVDEV_LED_ON);
+ }
+ code = va_arg(args, unsigned int);
+ }
+ va_end(args);
+
+ if (rc == 0 && nleds > 0) {
+ rc = write(libevdev_get_fd(dev), ev, nleds * sizeof(ev[0]));
+ if (rc > 0) {
+ while (nleds--)
+ update_led_state(dev, &ev[nleds]);
+ }
+ rc = (rc != -1) ? 0 : -errno;
+ }
+
+ return rc;
+}