diff options
| author | Peter Hutterer <peter.hutterer@who-t.net> | 2013-06-04 16:24:11 +1000 |
|---|---|---|
| committer | Peter Hutterer <peter.hutterer@who-t.net> | 2013-06-04 20:17:27 +1000 |
| commit | 0e9ef8a22d16c327af1a060d058b7cf746298c98 (patch) | |
| tree | 9b7f39fa325b8c72c05566b7ddb3356ab9c45dc4 /libevdev/libevdev.c | |
| parent | aff1db36da26db45cf724bde5d0c579e12d03c02 (diff) | |
| download | libevdev-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.c | 58 |
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; |
