2 * Copyright © 2013 Red Hat, Inc.
4 * Permission to use, copy, modify, distribute, and sell this software and its
5 * documentation for any purpose is hereby granted without fee, provided that
6 * the above copyright notice appear in all copies and that both that copyright
7 * notice and this permission notice appear in supporting documentation, and
8 * that the name of the copyright holders not be used in advertising or
9 * publicity pertaining to distribution of the software without specific,
10 * written prior permission. The copyright holders make no representations
11 * about the suitability of this software for any purpose. It is provided "as
12 * is" without express or implied warranty.
14 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
33 #include "libevdev-int.h"
34 #include "libevdev-util.h"
35 #include "event-names.h"
40 LIBEVDEV_EXPORT const enum libevdev_read_flag LIBEVDEV_READ_SYNC = LIBEVDEV_READ_FLAG_SYNC;
41 LIBEVDEV_EXPORT const enum libevdev_read_flag LIBEVDEV_READ_NORMAL = LIBEVDEV_READ_FLAG_NORMAL;
42 LIBEVDEV_EXPORT const enum libevdev_read_flag LIBEVDEV_FORCE_SYNC = LIBEVDEV_READ_FLAG_FORCE_SYNC;
43 LIBEVDEV_EXPORT const enum libevdev_read_flag LIBEVDEV_READ_BLOCKING = LIBEVDEV_READ_FLAG_BLOCKING;
45 static int sync_mt_state(struct libevdev *dev, int create_events);
48 init_event_queue(struct libevdev *dev)
50 /* FIXME: count the number of axes, keys, etc. to get a better idea at how many events per
51 EV_SYN we could possibly get. Then multiply that by the actual buffer size we care about */
53 const int QUEUE_SIZE = 256;
55 return queue_alloc(dev, QUEUE_SIZE);
59 libevdev_dflt_log_func(enum libevdev_log_priority priority,
61 const char *file, int line, const char *func,
62 const char *format, va_list args)
66 case LIBEVDEV_LOG_ERROR: prefix = "libevdev error"; break;
67 case LIBEVDEV_LOG_INFO: prefix = "libevdev info"; break;
68 case LIBEVDEV_LOG_DEBUG:
69 prefix = "libevdev debug";
72 prefix = "libevdev INVALID LOG PRIORITY";
75 /* default logging format:
76 libevev error in libevdev_some_func: blah blah
77 libevev info in libevdev_some_func: blah blah
78 libevev debug in file.c:123:libevdev_some_func: blah blah
81 fprintf(stderr, "%s in ", prefix);
82 if (priority == LIBEVDEV_LOG_DEBUG)
83 fprintf(stderr, "%s:%d:", file, line);
84 fprintf(stderr, "%s: ", func);
85 vfprintf(stderr, format, args);
89 * Global logging settings.
91 struct logdata log_data = {
93 libevdev_dflt_log_func,
98 log_msg(enum libevdev_log_priority priority,
100 const char *file, int line, const char *func,
101 const char *format, ...)
105 if (!log_data.handler)
108 va_start(args, format);
109 log_data.handler(priority, data, file, line, func, format, args);
114 libevdev_reset(struct libevdev *dev)
116 memset(dev, 0, sizeof(*dev));
118 dev->initialized = false;
120 dev->current_slot = -1;
121 dev->grabbed = LIBEVDEV_UNGRAB;
122 dev->sync_state = SYNC_NONE;
123 libevdev_enable_event_type(dev, EV_SYN);
126 LIBEVDEV_EXPORT struct libevdev*
129 struct libevdev *dev;
131 dev = malloc(sizeof(*dev));
141 libevdev_new_from_fd(int fd, struct libevdev **dev)
150 rc = libevdev_set_fd(d, fd);
159 libevdev_free(struct libevdev *dev)
173 libevdev_set_log_handler(struct libevdev *dev, libevdev_log_func_t logfunc)
175 /* Can't be backwards compatible to this yet, so don't even try */
176 fprintf(stderr, "libevdev: ABI change. Log function will not be honored.\n");
180 libevdev_set_log_function(libevdev_log_func_t logfunc, void *data)
182 log_data.handler = logfunc;
183 log_data.userdata = data;
187 libevdev_set_log_priority(enum libevdev_log_priority priority)
189 if (priority > LIBEVDEV_LOG_DEBUG)
190 priority = LIBEVDEV_LOG_DEBUG;
191 log_data.priority = priority;
194 LIBEVDEV_EXPORT enum libevdev_log_priority
195 libevdev_get_log_priority(void)
197 return log_data.priority;
201 libevdev_change_fd(struct libevdev *dev, int fd)
203 if (!dev->initialized) {
204 log_bug("device not initialized. call libevdev_set_fd() first\n");
212 libevdev_set_fd(struct libevdev* dev, int fd)
218 if (dev->initialized) {
219 log_bug("device already initialized.\n");
226 rc = ioctl(fd, EVIOCGBIT(0, sizeof(dev->bits)), dev->bits);
230 memset(buf, 0, sizeof(buf));
231 rc = ioctl(fd, EVIOCGNAME(sizeof(buf) - 1), buf);
236 dev->name = strdup(buf);
244 memset(buf, 0, sizeof(buf));
245 rc = ioctl(fd, EVIOCGPHYS(sizeof(buf) - 1), buf);
247 /* uinput has no phys */
251 dev->phys = strdup(buf);
260 memset(buf, 0, sizeof(buf));
261 rc = ioctl(fd, EVIOCGUNIQ(sizeof(buf) - 1), buf);
266 dev->uniq = strdup(buf);
273 rc = ioctl(fd, EVIOCGID, &dev->ids);
277 rc = ioctl(fd, EVIOCGVERSION, &dev->driver_version);
281 /* Built on a kernel with props, running against a kernel without property
282 support. This should not be a fatal case, we'll be missing properties but other
283 than that everything is as expected.
285 rc = ioctl(fd, EVIOCGPROP(sizeof(dev->props)), dev->props);
286 if (rc < 0 && errno != EINVAL)
289 rc = ioctl(fd, EVIOCGBIT(EV_REL, sizeof(dev->rel_bits)), dev->rel_bits);
293 rc = ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(dev->abs_bits)), dev->abs_bits);
297 rc = ioctl(fd, EVIOCGBIT(EV_LED, sizeof(dev->led_bits)), dev->led_bits);
301 rc = ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(dev->key_bits)), dev->key_bits);
305 rc = ioctl(fd, EVIOCGBIT(EV_SW, sizeof(dev->sw_bits)), dev->sw_bits);
309 rc = ioctl(fd, EVIOCGBIT(EV_MSC, sizeof(dev->msc_bits)), dev->msc_bits);
313 rc = ioctl(fd, EVIOCGBIT(EV_FF, sizeof(dev->ff_bits)), dev->ff_bits);
317 rc = ioctl(fd, EVIOCGBIT(EV_SND, sizeof(dev->snd_bits)), dev->snd_bits);
321 rc = ioctl(fd, EVIOCGKEY(sizeof(dev->key_values)), dev->key_values);
325 rc = ioctl(fd, EVIOCGLED(sizeof(dev->led_values)), dev->led_values);
329 rc = ioctl(fd, EVIOCGSW(sizeof(dev->sw_values)), dev->sw_values);
333 /* rep is a special case, always set it to 1 for both values if EV_REP is set */
334 if (bit_is_set(dev->bits, EV_REP)) {
335 for (i = 0; i < REP_CNT; i++)
336 set_bit(dev->rep_bits, i);
337 rc = ioctl(fd, EVIOCGREP, dev->rep_values);
342 for (i = ABS_X; i <= ABS_MAX; i++) {
343 if (bit_is_set(dev->abs_bits, i)) {
344 struct input_absinfo abs_info;
345 rc = ioctl(fd, EVIOCGABS(i), &abs_info);
349 dev->abs_info[i] = abs_info;
350 if (i == ABS_MT_SLOT) {
351 dev->num_slots = abs_info.maximum + 1;
352 dev->current_slot = abs_info.value;
359 sync_mt_state(dev, 0);
361 rc = init_event_queue(dev);
367 /* not copying key state because we won't know when we'll start to
368 * use this fd and key's are likely to change state by then.
369 * Same with the valuators, really, but they may not change.
372 dev->initialized = true;
376 return rc ? -errno : 0;
380 libevdev_get_fd(const struct libevdev* dev)
386 init_event(struct libevdev *dev, struct input_event *ev, int type, int code, int value)
388 ev->time = dev->last_event_time;
395 sync_key_state(struct libevdev *dev)
399 unsigned long keystate[NLONGS(KEY_CNT)] = {0};
401 rc = ioctl(dev->fd, EVIOCGKEY(sizeof(keystate)), keystate);
405 for (i = 0; i < KEY_CNT; i++) {
407 old = bit_is_set(dev->key_values, i);
408 new = bit_is_set(keystate, i);
410 struct input_event *ev = queue_push(dev);
411 init_event(dev, ev, EV_KEY, i, new ? 1 : 0);
415 memcpy(dev->key_values, keystate, rc);
419 return rc ? -errno : 0;
423 sync_sw_state(struct libevdev *dev)
427 unsigned long swstate[NLONGS(SW_CNT)] = {0};
429 rc = ioctl(dev->fd, EVIOCGSW(sizeof(swstate)), swstate);
433 for (i = 0; i < SW_CNT; i++) {
435 old = bit_is_set(dev->sw_values, i);
436 new = bit_is_set(swstate, i);
438 struct input_event *ev = queue_push(dev);
439 init_event(dev, ev, EV_SW, i, new ? 1 : 0);
443 memcpy(dev->sw_values, swstate, rc);
447 return rc ? -errno : 0;
451 sync_led_state(struct libevdev *dev)
455 unsigned long ledstate[NLONGS(LED_CNT)] = {0};
457 rc = ioctl(dev->fd, EVIOCGLED(sizeof(ledstate)), ledstate);
461 for (i = 0; i < LED_CNT; i++) {
463 old = bit_is_set(dev->led_values, i);
464 new = bit_is_set(ledstate, i);
466 struct input_event *ev = queue_push(dev);
467 init_event(dev, ev, EV_LED, i, new ? 1 : 0);
471 memcpy(dev->led_values, ledstate, rc);
475 return rc ? -errno : 0;
478 sync_abs_state(struct libevdev *dev)
483 for (i = ABS_X; i < ABS_CNT; i++) {
484 struct input_absinfo abs_info;
486 if (i >= ABS_MT_MIN && i <= ABS_MT_MAX)
489 if (!bit_is_set(dev->abs_bits, i))
492 rc = ioctl(dev->fd, EVIOCGABS(i), &abs_info);
496 if (dev->abs_info[i].value != abs_info.value) {
497 struct input_event *ev = queue_push(dev);
499 init_event(dev, ev, EV_ABS, i, abs_info.value);
500 dev->abs_info[i].value = abs_info.value;
506 return rc ? -errno : 0;
510 sync_mt_state(struct libevdev *dev, int create_events)
514 int ioctl_success = 0;
518 } mt_state[ABS_MT_CNT];
520 memset(&mt_state, 0, sizeof(mt_state));
522 for (i = ABS_MT_MIN; i <= ABS_MT_MAX; i++) {
524 if (i == ABS_MT_SLOT)
527 if (!libevdev_has_event_code(dev, EV_ABS, i))
530 idx = i - ABS_MT_MIN;
531 mt_state[idx].code = i;
532 rc = ioctl(dev->fd, EVIOCGMTSLOTS(sizeof(struct mt_state)), &mt_state[idx]);
534 /* if the first ioctl fails with -EINVAL, chances are the kernel
535 doesn't support the ioctl. Simply continue */
536 if (errno == -EINVAL && !ioctl_success) {
538 } else /* if the second, ... ioctl fails, really fail */
540 } else if (ioctl_success == 0)
544 for (i = 0; i < dev->num_slots; i++) {
546 struct input_event *ev;
549 ev = queue_push(dev);
550 init_event(dev, ev, EV_ABS, ABS_MT_SLOT, i);
553 for (j = ABS_MT_MIN; j <= ABS_MT_MAX; j++) {
554 int jdx = j - ABS_MT_MIN;
556 if (j == ABS_MT_SLOT)
559 if (!libevdev_has_event_code(dev, EV_ABS, j))
562 if (dev->mt_slot_vals[i][jdx] == mt_state[jdx].val[i])
566 ev = queue_push(dev);
567 init_event(dev, ev, EV_ABS, j, mt_state[jdx].val[i]);
569 dev->mt_slot_vals[i][jdx] = mt_state[jdx].val[i];
575 return rc ? -errno : 0;
579 sync_state(struct libevdev *dev)
583 struct input_event *ev;
585 /* FIXME: if we have events in the queue after the SYN_DROPPED (which was
586 queue[0]) we need to shift this backwards. Except that chances are that the
587 queue may be either full or too full to prepend all the events needed for
590 so we search for the last sync event in the queue and drop everything before
591 including that event and rely on the kernel to tell us the right value for that
592 bitfield during the sync process.
595 for (i = queue_num_elements(dev) - 1; i >= 0; i--) {
596 struct input_event e = {{0,0}, 0, 0, 0};
597 queue_peek(dev, i, &e);
598 if (e.type == EV_SYN)
603 queue_shift_multiple(dev, i + 1, NULL);
605 if (libevdev_has_event_type(dev, EV_KEY))
606 rc = sync_key_state(dev);
607 if (libevdev_has_event_type(dev, EV_LED))
608 rc = sync_led_state(dev);
609 if (libevdev_has_event_type(dev, EV_SW))
610 rc = sync_sw_state(dev);
611 if (rc == 0 && libevdev_has_event_type(dev, EV_ABS))
612 rc = sync_abs_state(dev);
613 if (rc == 0 && libevdev_has_event_code(dev, EV_ABS, ABS_MT_SLOT))
614 rc = sync_mt_state(dev, 1);
616 dev->queue_nsync = queue_num_elements(dev);
618 if (dev->queue_nsync > 0) {
619 ev = queue_push(dev);
620 init_event(dev, ev, EV_SYN, SYN_REPORT, 0);
628 update_key_state(struct libevdev *dev, const struct input_event *e)
630 if (!libevdev_has_event_type(dev, EV_KEY))
633 if (e->code > KEY_MAX)
636 set_bit_state(dev->key_values, e->code, e->value != 0);
642 update_mt_state(struct libevdev *dev, const struct input_event *e)
644 if (e->code == ABS_MT_SLOT) {
646 dev->current_slot = e->value;
647 /* sync abs_info with the current slot values */
648 for (i = ABS_MT_SLOT + 1; i <= ABS_MT_MAX; i++) {
649 if (libevdev_has_event_code(dev, EV_ABS, i))
650 dev->abs_info[i].value = dev->mt_slot_vals[dev->current_slot][i - ABS_MT_MIN];
654 } else if (dev->current_slot == -1)
657 dev->mt_slot_vals[dev->current_slot][e->code - ABS_MT_MIN] = e->value;
663 update_abs_state(struct libevdev *dev, const struct input_event *e)
665 if (!libevdev_has_event_type(dev, EV_ABS))
668 if (e->code > ABS_MAX)
671 if (e->code >= ABS_MT_MIN && e->code <= ABS_MT_MAX)
672 update_mt_state(dev, e);
674 dev->abs_info[e->code].value = e->value;
680 update_led_state(struct libevdev *dev, const struct input_event *e)
682 if (!libevdev_has_event_type(dev, EV_LED))
685 if (e->code > LED_MAX)
688 set_bit_state(dev->led_values, e->code, e->value != 0);
694 update_sw_state(struct libevdev *dev, const struct input_event *e)
696 if (!libevdev_has_event_type(dev, EV_SW))
699 if (e->code > SW_MAX)
702 set_bit_state(dev->sw_values, e->code, e->value != 0);
708 update_state(struct libevdev *dev, const struct input_event *e)
717 rc = update_key_state(dev, e);
720 rc = update_abs_state(dev, e);
723 rc = update_led_state(dev, e);
726 rc = update_sw_state(dev, e);
730 dev->last_event_time = e->time;
736 read_more_events(struct libevdev *dev)
740 struct input_event *next;
742 free_elem = queue_num_free_elements(dev);
746 next = queue_next_element(dev);
747 len = read(dev->fd, next, free_elem * sizeof(struct input_event));
750 } else if (len > 0 && len % sizeof(struct input_event) != 0)
753 int nev = len/sizeof(struct input_event);
754 queue_set_num_elements(dev, queue_num_elements(dev) + nev);
761 libevdev_next_event(struct libevdev *dev, unsigned int flags, struct input_event *ev)
763 int rc = LIBEVDEV_READ_STATUS_SUCCESS;
765 if (!dev->initialized) {
766 log_bug("device not initialized. call libevdev_set_fd() first\n");
768 } else if (dev->fd < 0)
771 if (!(flags & (LIBEVDEV_READ_FLAG_NORMAL|LIBEVDEV_READ_FLAG_SYNC|LIBEVDEV_READ_FLAG_FORCE_SYNC))) {
772 log_bug("invalid flags %#x\n.\n", flags);
776 if (flags & LIBEVDEV_READ_FLAG_SYNC) {
777 if (dev->sync_state == SYNC_NEEDED) {
778 rc = sync_state(dev);
781 dev->sync_state = SYNC_IN_PROGRESS;
784 if (dev->queue_nsync == 0) {
785 dev->sync_state = SYNC_NONE;
789 } else if (dev->sync_state != SYNC_NONE) {
790 struct input_event e;
792 /* call update_state for all events here, otherwise the library has the wrong view
794 while (queue_shift(dev, &e) == 0) {
796 update_state(dev, &e);
799 dev->sync_state = SYNC_NONE;
802 /* FIXME: if the first event after SYNC_IN_PROGRESS is a SYN_DROPPED, log this */
804 /* Always read in some more events. Best case this smoothes over a potential SYN_DROPPED,
805 worst case we don't read fast enough and end up with SYN_DROPPED anyway.
807 Except if the fd is in blocking mode and we still have events from the last read, don't
811 if (!(flags & LIBEVDEV_READ_FLAG_BLOCKING) ||
812 queue_num_elements(dev) == 0) {
813 rc = read_more_events(dev);
814 if (rc < 0 && rc != -EAGAIN)
818 if (flags & LIBEVDEV_READ_FLAG_FORCE_SYNC) {
819 dev->sync_state = SYNC_NEEDED;
820 rc = LIBEVDEV_READ_STATUS_SYNC;
825 if (queue_shift(dev, ev) != 0)
828 update_state(dev, ev);
830 /* if we disabled a code, get the next event instead */
831 } while(!libevdev_has_event_code(dev, ev->type, ev->code));
834 if (ev->type == EV_SYN && ev->code == SYN_DROPPED) {
835 dev->sync_state = SYNC_NEEDED;
836 rc = LIBEVDEV_READ_STATUS_SYNC;
839 if (flags & LIBEVDEV_READ_FLAG_SYNC && dev->queue_nsync > 0) {
841 rc = LIBEVDEV_READ_STATUS_SYNC;
842 if (dev->queue_nsync == 0)
843 dev->sync_state = SYNC_NONE;
851 libevdev_has_event_pending(struct libevdev *dev)
853 struct pollfd fds = { dev->fd, POLLIN, 0 };
856 if (!dev->initialized) {
857 log_bug("device not initialized. call libevdev_set_fd() first\n");
859 } else if (dev->fd < 0)
862 if (queue_num_elements(dev) != 0)
865 rc = poll(&fds, 1, 0);
866 return (rc >= 0) ? rc : -errno;
869 LIBEVDEV_EXPORT const char *
870 libevdev_get_name(const struct libevdev *dev)
872 return dev->name ? dev->name : "";
875 LIBEVDEV_EXPORT const char *
876 libevdev_get_phys(const struct libevdev *dev)
881 LIBEVDEV_EXPORT const char *
882 libevdev_get_uniq(const struct libevdev *dev)
887 #define STRING_SETTER(field) \
888 LIBEVDEV_EXPORT void libevdev_set_##field(struct libevdev *dev, const char *field) \
893 dev->field = strdup(field); \
901 #define PRODUCT_GETTER(name) \
902 LIBEVDEV_EXPORT int libevdev_get_id_##name(const struct libevdev *dev) \
904 return dev->ids.name; \
907 PRODUCT_GETTER(product);
908 PRODUCT_GETTER(vendor);
909 PRODUCT_GETTER(bustype);
910 PRODUCT_GETTER(version);
912 #define PRODUCT_SETTER(field) \
913 LIBEVDEV_EXPORT void libevdev_set_id_##field(struct libevdev *dev, int field) \
915 dev->ids.field = field;\
918 PRODUCT_SETTER(product);
919 PRODUCT_SETTER(vendor);
920 PRODUCT_SETTER(bustype);
921 PRODUCT_SETTER(version);
924 libevdev_get_driver_version(const struct libevdev *dev)
926 return dev->driver_version;
930 libevdev_has_property(const struct libevdev *dev, unsigned int prop)
932 return (prop <= INPUT_PROP_MAX) && bit_is_set(dev->props, prop);
936 libevdev_enable_property(struct libevdev *dev, unsigned int prop)
938 if (prop > INPUT_PROP_MAX)
941 set_bit(dev->props, prop);
946 libevdev_has_event_type(const struct libevdev *dev, unsigned int type)
948 return type == EV_SYN ||(type <= EV_MAX && bit_is_set(dev->bits, type));
952 libevdev_has_event_code(const struct libevdev *dev, unsigned int type, unsigned int code)
954 const unsigned long *mask;
957 if (!libevdev_has_event_type(dev, type))
963 max = type_to_mask_const(dev, type, &mask);
965 if (max == -1 || code > (unsigned int)max)
968 return bit_is_set(mask, code);
972 libevdev_get_event_value(const struct libevdev *dev, unsigned int type, unsigned int code)
976 if (!libevdev_has_event_type(dev, type) || !libevdev_has_event_code(dev, type, code))
980 case EV_ABS: value = dev->abs_info[code].value; break;
981 case EV_KEY: value = bit_is_set(dev->key_values, code); break;
982 case EV_LED: value = bit_is_set(dev->led_values, code); break;
983 case EV_SW: value = bit_is_set(dev->sw_values, code); break;
993 libevdev_set_event_value(struct libevdev *dev, unsigned int type, unsigned int code, int value)
996 struct input_event e;
998 if (!libevdev_has_event_type(dev, type) || !libevdev_has_event_code(dev, type, code))
1006 case EV_ABS: rc = update_abs_state(dev, &e); break;
1007 case EV_KEY: rc = update_key_state(dev, &e); break;
1008 case EV_LED: rc = update_led_state(dev, &e); break;
1009 case EV_SW: rc = update_sw_state(dev, &e); break;
1019 libevdev_fetch_event_value(const struct libevdev *dev, unsigned int type, unsigned int code, int *value)
1021 if (libevdev_has_event_type(dev, type) &&
1022 libevdev_has_event_code(dev, type, code)) {
1023 *value = libevdev_get_event_value(dev, type, code);
1030 libevdev_get_slot_value(const struct libevdev *dev, unsigned int slot, unsigned int code)
1032 if (!libevdev_has_event_type(dev, EV_ABS) || !libevdev_has_event_code(dev, EV_ABS, code))
1035 if (dev->num_slots < 0 || slot >= (unsigned int)dev->num_slots || slot >= MAX_SLOTS)
1038 if (code > ABS_MT_MAX || code < ABS_MT_MIN)
1041 return dev->mt_slot_vals[slot][code - ABS_MT_MIN];
1045 libevdev_set_slot_value(struct libevdev *dev, unsigned int slot, unsigned int code, int value)
1047 if (!libevdev_has_event_type(dev, EV_ABS) || !libevdev_has_event_code(dev, EV_ABS, code))
1050 if (dev->num_slots == -1 || slot >= (unsigned int)dev->num_slots || slot >= MAX_SLOTS)
1053 if (code > ABS_MT_MAX || code < ABS_MT_MIN)
1056 if (code == ABS_MT_SLOT) {
1057 if (value < 0 || value >= libevdev_get_num_slots(dev))
1059 dev->current_slot = value;
1062 dev->mt_slot_vals[slot][code - ABS_MT_MIN] = value;
1069 libevdev_fetch_slot_value(const struct libevdev *dev, unsigned int slot, unsigned int code, int *value)
1071 if (libevdev_has_event_type(dev, EV_ABS) &&
1072 libevdev_has_event_code(dev, EV_ABS, code) &&
1073 dev->num_slots >= 0 &&
1074 slot < (unsigned int)dev->num_slots && slot < MAX_SLOTS) {
1075 *value = libevdev_get_slot_value(dev, slot, code);
1082 libevdev_get_num_slots(const struct libevdev *dev)
1084 return dev->num_slots;
1088 libevdev_get_current_slot(const struct libevdev *dev)
1090 return dev->current_slot;
1093 LIBEVDEV_EXPORT const struct input_absinfo*
1094 libevdev_get_abs_info(const struct libevdev *dev, unsigned int code)
1096 if (!libevdev_has_event_type(dev, EV_ABS) ||
1097 !libevdev_has_event_code(dev, EV_ABS, code))
1100 return &dev->abs_info[code];
1103 #define ABS_GETTER(name) \
1104 LIBEVDEV_EXPORT int libevdev_get_abs_##name(const struct libevdev *dev, unsigned int code) \
1106 const struct input_absinfo *absinfo = libevdev_get_abs_info(dev, code); \
1107 return absinfo ? absinfo->name : 0; \
1110 ABS_GETTER(maximum);
1111 ABS_GETTER(minimum);
1114 ABS_GETTER(resolution);
1116 #define ABS_SETTER(field) \
1117 LIBEVDEV_EXPORT void libevdev_set_abs_##field(struct libevdev *dev, unsigned int code, int val) \
1119 if (!libevdev_has_event_code(dev, EV_ABS, code)) \
1121 dev->abs_info[code].field = val; \
1128 ABS_SETTER(resolution)
1130 LIBEVDEV_EXPORT void
1131 libevdev_set_abs_info(struct libevdev *dev, unsigned int code, const struct input_absinfo *abs)
1133 if (!libevdev_has_event_code(dev, EV_ABS, code))
1136 dev->abs_info[code] = *abs;
1140 libevdev_enable_event_type(struct libevdev *dev, unsigned int type)
1145 if (libevdev_has_event_type(dev, type))
1148 set_bit(dev->bits, type);
1150 if (type == EV_REP) {
1151 int delay = 0, period = 0;
1152 libevdev_enable_event_code(dev, EV_REP, REP_DELAY, &delay);
1153 libevdev_enable_event_code(dev, EV_REP, REP_PERIOD, &period);
1159 libevdev_disable_event_type(struct libevdev *dev, unsigned int type)
1161 if (type > EV_MAX || type == EV_SYN)
1164 clear_bit(dev->bits, type);
1170 libevdev_enable_event_code(struct libevdev *dev, unsigned int type,
1171 unsigned int code, const void *data)
1174 unsigned long *mask = NULL;
1176 if (libevdev_enable_event_type(dev, type))
1193 max = type_to_mask(dev, type, &mask);
1198 set_bit(mask, code);
1200 if (type == EV_ABS) {
1201 const struct input_absinfo *abs = data;
1202 dev->abs_info[code] = *abs;
1203 } else if (type == EV_REP) {
1204 const int *value = data;
1205 dev->rep_values[code] = *value;
1212 libevdev_disable_event_code(struct libevdev *dev, unsigned int type, unsigned int code)
1215 unsigned long *mask = NULL;
1217 if (type > EV_MAX || type == EV_SYN)
1220 max = type_to_mask(dev, type, &mask);
1225 clear_bit(mask, code);
1231 libevdev_kernel_set_abs_value(struct libevdev *dev, unsigned int code, const struct input_absinfo *abs)
1233 return libevdev_kernel_set_abs_info(dev, code, abs);
1237 libevdev_kernel_set_abs_info(struct libevdev *dev, unsigned int code, const struct input_absinfo *abs)
1241 if (!dev->initialized) {
1242 log_bug("device not initialized. call libevdev_set_fd() first\n");
1244 } else if (dev->fd < 0)
1250 rc = ioctl(dev->fd, EVIOCSABS(code), abs);
1254 rc = libevdev_enable_event_code(dev, EV_ABS, code, abs);
1260 libevdev_grab(struct libevdev *dev, enum libevdev_grab_mode grab)
1264 if (!dev->initialized) {
1265 log_bug("device not initialized. call libevdev_set_fd() first\n");
1267 } else if (dev->fd < 0)
1270 if (grab != LIBEVDEV_GRAB && grab != LIBEVDEV_UNGRAB) {
1271 log_bug("invalid grab parameter %#x\n", grab);
1275 if (grab == dev->grabbed)
1278 if (grab == LIBEVDEV_GRAB)
1279 rc = ioctl(dev->fd, EVIOCGRAB, (void *)1);
1280 else if (grab == LIBEVDEV_UNGRAB)
1281 rc = ioctl(dev->fd, EVIOCGRAB, (void *)0);
1284 dev->grabbed = grab;
1286 return rc < 0 ? -errno : 0;
1291 libevdev_is_event_type(const struct input_event *ev, unsigned int type)
1292 ALIAS(libevdev_event_is_type);
1295 libevdev_event_is_type(const struct input_event *ev, unsigned int type)
1297 return type < EV_CNT && ev->type == type;
1302 libevdev_is_event_code(const struct input_event *ev, unsigned int type, unsigned int code)
1303 ALIAS(libevdev_event_is_code);
1306 libevdev_event_is_code(const struct input_event *ev, unsigned int type, unsigned int code)
1310 if (!libevdev_event_is_type(ev, type))
1313 max = libevdev_event_type_get_max(type);
1314 return (max > -1 && code <= (unsigned int)max && ev->code == code);
1318 LIBEVDEV_EXPORT const char*
1319 libevdev_get_event_type_name(unsigned int type)
1320 ALIAS(libevdev_event_type_get_name);
1322 LIBEVDEV_EXPORT const char*
1323 libevdev_event_type_get_name(unsigned int type)
1328 return ev_map[type];
1332 LIBEVDEV_EXPORT const char*
1333 libevdev_get_event_code_name(unsigned int type, unsigned int code)
1334 ALIAS(libevdev_event_code_get_name);
1336 LIBEVDEV_EXPORT const char*
1337 libevdev_event_code_get_name(unsigned int type, unsigned int code)
1339 int max = libevdev_event_type_get_max(type);
1341 if (max == -1 || code > (unsigned int)max)
1344 return event_type_map[type][code];
1348 LIBEVDEV_EXPORT const char*
1349 libevdev_get_input_prop_name(unsigned int prop)
1350 ALIAS(libevdev_property_get_name);
1353 LIBEVDEV_EXPORT const char*
1354 libevdev_get_property_name(unsigned int prop)
1355 ALIAS(libevdev_property_get_name);
1357 LIBEVDEV_EXPORT const char*
1358 libevdev_property_get_name(unsigned int prop)
1360 if (prop > INPUT_PROP_MAX)
1363 return input_prop_map[prop];
1368 libevdev_get_event_type_max(unsigned int type)
1369 ALIAS(libevdev_event_type_get_max);
1372 libevdev_event_type_get_max(unsigned int type)
1377 return ev_max[type];
1381 libevdev_get_repeat(struct libevdev *dev, int *delay, int *period)
1383 if (!libevdev_has_event_type(dev, EV_REP))
1387 *delay = dev->rep_values[REP_DELAY];
1389 *period = dev->rep_values[REP_PERIOD];
1395 libevdev_kernel_set_led_value(struct libevdev *dev, unsigned int code, enum libevdev_led_value value)
1397 return libevdev_kernel_set_led_values(dev, code, value, -1);
1401 libevdev_kernel_set_led_values(struct libevdev *dev, ...)
1403 struct input_event ev[LED_MAX + 1];
1404 enum libevdev_led_value val;
1410 if (!dev->initialized) {
1411 log_bug("device not initialized. call libevdev_set_fd() first\n");
1413 } else if (dev->fd < 0)
1416 memset(ev, 0, sizeof(ev));
1418 va_start(args, dev);
1419 code = va_arg(args, unsigned int);
1420 while (code != -1) {
1421 if (code > LED_MAX) {
1425 val = va_arg(args, enum libevdev_led_value);
1426 if (val != LIBEVDEV_LED_ON && val != LIBEVDEV_LED_OFF) {
1431 if (libevdev_has_event_code(dev, EV_LED, code)) {
1432 struct input_event *e = ev;
1434 while (e->type > 0 && e->code != code)
1441 e->value = (val == LIBEVDEV_LED_ON);
1443 code = va_arg(args, unsigned int);
1447 if (rc == 0 && nleds > 0) {
1448 ev[nleds].type = EV_SYN;
1449 ev[nleds++].code = SYN_REPORT;
1451 rc = write(libevdev_get_fd(dev), ev, nleds * sizeof(ev[0]));
1453 nleds--; /* last is EV_SYN */
1455 update_led_state(dev, &ev[nleds]);
1457 rc = (rc != -1) ? 0 : -errno;
1464 libevdev_set_clock_id(struct libevdev *dev, int clockid)
1466 if (!dev->initialized) {
1467 log_bug("device not initialized. call libevdev_set_fd() first\n");
1469 } else if (dev->fd < 0)
1472 return ioctl(dev->fd, EVIOCSCLOCKID, &clockid) ? -errno : 0;