summaryrefslogtreecommitdiff
path: root/libevdev/libevdev.c
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2013-06-04 16:24:11 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2013-06-04 20:17:27 +1000
commit0e9ef8a22d16c327af1a060d058b7cf746298c98 (patch)
tree9b7f39fa325b8c72c05566b7ddb3356ab9c45dc4 /libevdev/libevdev.c
parentaff1db36da26db45cf724bde5d0c579e12d03c02 (diff)
downloadlibevdev-0e9ef8a22d16c327af1a060d058b7cf746298c98.tar.gz
Add functions to enable axis on the device in the kernel
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Diffstat (limited to 'libevdev/libevdev.c')
-rw-r--r--libevdev/libevdev.c58
1 files changed, 50 insertions, 8 deletions
diff --git a/libevdev/libevdev.c b/libevdev/libevdev.c
index 76973bc..3d5bbf6 100644
--- a/libevdev/libevdev.c
+++ b/libevdev/libevdev.c
@@ -26,6 +26,7 @@
#include <string.h>
#include <unistd.h>
#include <stdarg.h>
+#include <linux/uinput.h>
#include "libevdev.h"
#include "libevdev-int.h"
@@ -753,8 +754,6 @@ libevdev_enable_event_type(struct libevdev *dev, unsigned int type)
set_bit(dev->bits, type);
- /* FIXME: pass through to kernel */
-
return 0;
}
@@ -766,8 +765,6 @@ libevdev_disable_event_type(struct libevdev *dev, unsigned int type)
clear_bit(dev->bits, type);
- /* FIXME: pass through to kernel */
-
return 0;
}
@@ -793,8 +790,6 @@ libevdev_enable_event_code(struct libevdev *dev, unsigned int type,
dev->abs_info[code] = *abs;
}
- /* FIXME: pass through to kernel */
-
return 0;
}
@@ -814,12 +809,59 @@ libevdev_disable_event_code(struct libevdev *dev, unsigned int type, unsigned in
clear_bit(mask, code);
- /* FIXME: pass through to kernel */
-
return 0;
}
int
+libevdev_kernel_enable_event_type(struct libevdev *dev, unsigned int type)
+{
+ int rc;
+
+ if (type > EV_MAX)
+ return -1;
+
+ rc = ioctl(dev->fd, UI_SET_EVBIT, type);
+ if (rc != -1)
+ libevdev_enable_event_type(dev, type);
+
+ return (rc != -1) ? 0 : -errno;
+}
+
+int
+libevdev_kernel_enable_event_code(struct libevdev *dev, unsigned int type, unsigned int code)
+{
+ int rc;
+ int uinput_bit;
+ int max;
+ const unsigned long *mask;
+
+ rc = libevdev_kernel_enable_event_type(dev, type);
+ if (rc != 0)
+ return rc;
+
+ max = type_to_mask_const(dev, type, &mask);
+ if (code > max)
+ return -EINVAL;
+
+ switch(type) {
+ case EV_KEY: uinput_bit = UI_SET_KEYBIT; break;
+ case EV_REL: uinput_bit = UI_SET_RELBIT; break;
+ case EV_ABS: uinput_bit = UI_SET_ABSBIT; break;
+ case EV_MSC: uinput_bit = UI_SET_MSCBIT; break;
+ case EV_LED: uinput_bit = UI_SET_LEDBIT; break;
+ case EV_SND: uinput_bit = UI_SET_SNDBIT; break;
+ case EV_FF: uinput_bit = UI_SET_FFBIT; break;
+ case EV_SW: uinput_bit = UI_SET_SWBIT; break;
+ }
+
+ rc = ioctl(dev->fd, uinput_bit, type);
+ if (rc != -1)
+ libevdev_enable_event_type(dev, type);
+
+ return (rc != -1) ? 0 : -errno;
+}
+
+int
libevdev_kernel_set_abs_value(struct libevdev *dev, unsigned int code, const struct input_absinfo *abs)
{
int rc;