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"
39 enum event_filter_status {
40 EVENT_FILTER_NONE, /**< Event untouched by filters */
41 EVENT_FILTER_MODIFIED, /**< Event was modified */
42 EVENT_FILTER_DISCARD, /**< Discard current event */
45 static int sync_mt_state(struct libevdev *dev, int create_events);
48 slot_value(const struct libevdev *dev, int slot, int axis)
50 if (unlikely(slot > dev->num_slots)) {
51 log_bug("Slot %d exceeds number of slots (%d)\n", slot, dev->num_slots);
54 if (unlikely(axis < ABS_MT_MIN || axis > ABS_MT_MAX)) {
55 log_bug("MT axis %d is outside the valid range [%d,%d]\n",
56 axis, ABS_MT_MIN, ABS_MT_MAX);
59 return &dev->mt_slot_vals[slot * ABS_MT_CNT + axis - ABS_MT_MIN];
63 init_event_queue(struct libevdev *dev)
65 const int MIN_QUEUE_SIZE = 256;
66 int nevents = 1; /* terminating SYN_REPORT */
68 unsigned int type, code;
70 /* count the number of axes, keys, etc. to get a better idea at how
71 many events per EV_SYN we could possibly get. That's the max we
72 may get during SYN_DROPPED too. Use double that, just so we have
73 room for events while syncing an event.
75 for (type = EV_KEY; type < EV_MAX; type++) {
76 int max = libevdev_event_type_get_max(type);
77 for (code = 0; max > 0 && code < (unsigned int) max; code++) {
78 if (libevdev_has_event_code(dev, type, code))
83 nslots = libevdev_get_num_slots(dev);
87 for (code = ABS_MT_SLOT; code < ABS_MAX; code++) {
88 if (libevdev_has_event_code(dev, EV_ABS, code))
92 /* We already counted the first slot in the initial count */
93 nevents += num_mt_axes * (nslots - 1);
96 return queue_alloc(dev, max(MIN_QUEUE_SIZE, nevents * 2));
100 libevdev_dflt_log_func(enum libevdev_log_priority priority,
102 const char *file, int line, const char *func,
103 const char *format, va_list args)
107 case LIBEVDEV_LOG_ERROR: prefix = "libevdev error"; break;
108 case LIBEVDEV_LOG_INFO: prefix = "libevdev info"; break;
109 case LIBEVDEV_LOG_DEBUG:
110 prefix = "libevdev debug";
113 prefix = "libevdev INVALID LOG PRIORITY";
116 /* default logging format:
117 libevev error in libevdev_some_func: blah blah
118 libevev info in libevdev_some_func: blah blah
119 libevev debug in file.c:123:libevdev_some_func: blah blah
122 fprintf(stderr, "%s in ", prefix);
123 if (priority == LIBEVDEV_LOG_DEBUG)
124 fprintf(stderr, "%s:%d:", file, line);
125 fprintf(stderr, "%s: ", func);
126 vfprintf(stderr, format, args);
130 * Global logging settings.
132 struct logdata log_data = {
134 libevdev_dflt_log_func,
139 log_msg(enum libevdev_log_priority priority,
141 const char *file, int line, const char *func,
142 const char *format, ...)
146 if (!log_data.handler || priority > log_data.priority)
149 va_start(args, format);
150 log_data.handler(priority, data, file, line, func, format, args);
155 libevdev_reset(struct libevdev *dev)
160 free(dev->mt_slot_vals);
161 free(dev->mt_sync.mt_state);
162 free(dev->mt_sync.tracking_id_changes);
163 free(dev->mt_sync.slot_update);
164 memset(dev, 0, sizeof(*dev));
166 dev->initialized = false;
168 dev->current_slot = -1;
169 dev->grabbed = LIBEVDEV_UNGRAB;
170 dev->sync_state = SYNC_NONE;
171 libevdev_enable_event_type(dev, EV_SYN);
174 LIBEVDEV_EXPORT struct libevdev*
177 struct libevdev *dev;
179 dev = calloc(1, sizeof(*dev));
189 libevdev_new_from_fd(int fd, struct libevdev **dev)
198 rc = libevdev_set_fd(d, fd);
207 libevdev_free(struct libevdev *dev)
218 libevdev_set_log_function(libevdev_log_func_t logfunc, void *data)
220 log_data.handler = logfunc;
221 log_data.userdata = data;
225 libevdev_set_log_priority(enum libevdev_log_priority priority)
227 if (priority > LIBEVDEV_LOG_DEBUG)
228 priority = LIBEVDEV_LOG_DEBUG;
229 log_data.priority = priority;
232 LIBEVDEV_EXPORT enum libevdev_log_priority
233 libevdev_get_log_priority(void)
235 return log_data.priority;
239 libevdev_change_fd(struct libevdev *dev, int fd)
241 if (!dev->initialized) {
242 log_bug("device not initialized. call libevdev_set_fd() first\n");
250 libevdev_set_fd(struct libevdev* dev, int fd)
256 if (dev->initialized) {
257 log_bug("device already initialized.\n");
264 rc = ioctl(fd, EVIOCGBIT(0, sizeof(dev->bits)), dev->bits);
268 memset(buf, 0, sizeof(buf));
269 rc = ioctl(fd, EVIOCGNAME(sizeof(buf) - 1), buf);
274 dev->name = strdup(buf);
282 memset(buf, 0, sizeof(buf));
283 rc = ioctl(fd, EVIOCGPHYS(sizeof(buf) - 1), buf);
285 /* uinput has no phys */
289 dev->phys = strdup(buf);
298 memset(buf, 0, sizeof(buf));
299 rc = ioctl(fd, EVIOCGUNIQ(sizeof(buf) - 1), buf);
304 dev->uniq = strdup(buf);
311 rc = ioctl(fd, EVIOCGID, &dev->ids);
315 rc = ioctl(fd, EVIOCGVERSION, &dev->driver_version);
319 /* Built on a kernel with props, running against a kernel without property
320 support. This should not be a fatal case, we'll be missing properties but other
321 than that everything is as expected.
323 rc = ioctl(fd, EVIOCGPROP(sizeof(dev->props)), dev->props);
324 if (rc < 0 && errno != EINVAL)
327 rc = ioctl(fd, EVIOCGBIT(EV_REL, sizeof(dev->rel_bits)), dev->rel_bits);
331 rc = ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(dev->abs_bits)), dev->abs_bits);
335 rc = ioctl(fd, EVIOCGBIT(EV_LED, sizeof(dev->led_bits)), dev->led_bits);
339 rc = ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(dev->key_bits)), dev->key_bits);
343 rc = ioctl(fd, EVIOCGBIT(EV_SW, sizeof(dev->sw_bits)), dev->sw_bits);
347 rc = ioctl(fd, EVIOCGBIT(EV_MSC, sizeof(dev->msc_bits)), dev->msc_bits);
351 rc = ioctl(fd, EVIOCGBIT(EV_FF, sizeof(dev->ff_bits)), dev->ff_bits);
355 rc = ioctl(fd, EVIOCGBIT(EV_SND, sizeof(dev->snd_bits)), dev->snd_bits);
359 rc = ioctl(fd, EVIOCGKEY(sizeof(dev->key_values)), dev->key_values);
363 rc = ioctl(fd, EVIOCGLED(sizeof(dev->led_values)), dev->led_values);
367 rc = ioctl(fd, EVIOCGSW(sizeof(dev->sw_values)), dev->sw_values);
371 /* rep is a special case, always set it to 1 for both values if EV_REP is set */
372 if (bit_is_set(dev->bits, EV_REP)) {
373 for (i = 0; i < REP_CNT; i++)
374 set_bit(dev->rep_bits, i);
375 rc = ioctl(fd, EVIOCGREP, dev->rep_values);
380 for (i = ABS_X; i <= ABS_MAX; i++) {
381 if (bit_is_set(dev->abs_bits, i)) {
382 struct input_absinfo abs_info;
383 rc = ioctl(fd, EVIOCGABS(i), &abs_info);
387 dev->abs_info[i] = abs_info;
393 /* devices with ABS_MT_SLOT - 1 aren't MT devices,
394 see the documentation for multitouch-related
395 functions for more details */
396 if (!libevdev_has_event_code(dev, EV_ABS, ABS_MT_SLOT - 1) &&
397 libevdev_has_event_code(dev, EV_ABS, ABS_MT_SLOT)) {
398 const struct input_absinfo *abs_info;
400 abs_info = libevdev_get_abs_info(dev, ABS_MT_SLOT);
402 dev->num_slots = abs_info->maximum + 1;
403 dev->mt_slot_vals = calloc(dev->num_slots * ABS_MT_CNT, sizeof(int));
404 if (!dev->mt_slot_vals) {
408 dev->current_slot = abs_info->value;
410 dev->mt_sync.mt_state_sz = sizeof(*dev->mt_sync.mt_state) +
411 (dev->num_slots) * sizeof(int);
412 dev->mt_sync.mt_state = calloc(1, dev->mt_sync.mt_state_sz);
414 dev->mt_sync.tracking_id_changes_sz = NLONGS(dev->num_slots) * sizeof(long);
415 dev->mt_sync.tracking_id_changes = malloc(dev->mt_sync.tracking_id_changes_sz);
417 dev->mt_sync.slot_update_sz = NLONGS(dev->num_slots * ABS_MT_CNT) * sizeof(long);
418 dev->mt_sync.slot_update = malloc(dev->mt_sync.slot_update_sz);
420 if (!dev->mt_sync.tracking_id_changes ||
421 !dev->mt_sync.slot_update ||
422 !dev->mt_sync.mt_state) {
427 sync_mt_state(dev, 0);
430 rc = init_event_queue(dev);
436 /* not copying key state because we won't know when we'll start to
437 * use this fd and key's are likely to change state by then.
438 * Same with the valuators, really, but they may not change.
441 dev->initialized = true;
445 return rc ? -errno : 0;
449 libevdev_get_fd(const struct libevdev* dev)
455 init_event(struct libevdev *dev, struct input_event *ev, int type, int code, int value)
457 ev->time = dev->last_event_time;
464 sync_key_state(struct libevdev *dev)
468 unsigned long keystate[NLONGS(KEY_CNT)] = {0};
470 rc = ioctl(dev->fd, EVIOCGKEY(sizeof(keystate)), keystate);
474 for (i = 0; i < KEY_CNT; i++) {
476 old = bit_is_set(dev->key_values, i);
477 new = bit_is_set(keystate, i);
479 struct input_event *ev = queue_push(dev);
480 init_event(dev, ev, EV_KEY, i, new ? 1 : 0);
484 memcpy(dev->key_values, keystate, rc);
488 return rc ? -errno : 0;
492 sync_sw_state(struct libevdev *dev)
496 unsigned long swstate[NLONGS(SW_CNT)] = {0};
498 rc = ioctl(dev->fd, EVIOCGSW(sizeof(swstate)), swstate);
502 for (i = 0; i < SW_CNT; i++) {
504 old = bit_is_set(dev->sw_values, i);
505 new = bit_is_set(swstate, i);
507 struct input_event *ev = queue_push(dev);
508 init_event(dev, ev, EV_SW, i, new ? 1 : 0);
512 memcpy(dev->sw_values, swstate, rc);
516 return rc ? -errno : 0;
520 sync_led_state(struct libevdev *dev)
524 unsigned long ledstate[NLONGS(LED_CNT)] = {0};
526 rc = ioctl(dev->fd, EVIOCGLED(sizeof(ledstate)), ledstate);
530 for (i = 0; i < LED_CNT; i++) {
532 old = bit_is_set(dev->led_values, i);
533 new = bit_is_set(ledstate, i);
535 struct input_event *ev = queue_push(dev);
536 init_event(dev, ev, EV_LED, i, new ? 1 : 0);
540 memcpy(dev->led_values, ledstate, rc);
544 return rc ? -errno : 0;
547 sync_abs_state(struct libevdev *dev)
552 for (i = ABS_X; i < ABS_CNT; i++) {
553 struct input_absinfo abs_info;
555 if (i >= ABS_MT_MIN && i <= ABS_MT_MAX)
558 if (!bit_is_set(dev->abs_bits, i))
561 rc = ioctl(dev->fd, EVIOCGABS(i), &abs_info);
565 if (dev->abs_info[i].value != abs_info.value) {
566 struct input_event *ev = queue_push(dev);
568 init_event(dev, ev, EV_ABS, i, abs_info.value);
569 dev->abs_info[i].value = abs_info.value;
575 return rc ? -errno : 0;
579 sync_mt_state(struct libevdev *dev, int create_events)
581 struct input_event *ev;
582 struct input_absinfo abs_info;
585 int ioctl_success = 0;
586 int last_reported_slot = 0;
587 struct mt_sync_state *mt_state = dev->mt_sync.mt_state;
588 unsigned long *slot_update = dev->mt_sync.slot_update;
589 unsigned long *tracking_id_changes = dev->mt_sync.tracking_id_changes;
590 int need_tracking_id_changes = 0;
592 memset(dev->mt_sync.slot_update, 0, dev->mt_sync.slot_update_sz);
593 memset(dev->mt_sync.tracking_id_changes, 0,
594 dev->mt_sync.tracking_id_changes_sz);
596 #define AXISBIT(_slot, _axis) (_slot * ABS_MT_CNT + _axis - ABS_MT_MIN)
598 for (axis = ABS_MT_MIN; axis <= ABS_MT_MAX; axis++) {
599 if (axis == ABS_MT_SLOT)
602 if (!libevdev_has_event_code(dev, EV_ABS, axis))
605 mt_state->code = axis;
606 rc = ioctl(dev->fd, EVIOCGMTSLOTS(dev->mt_sync.mt_state_sz), mt_state);
608 /* if the first ioctl fails with -EINVAL, chances are the kernel
609 doesn't support the ioctl. Simply continue */
610 if (errno == -EINVAL && !ioctl_success) {
612 } else /* if the second, ... ioctl fails, really fail */
615 if (ioctl_success == 0)
618 for (slot = 0; slot < dev->num_slots; slot++) {
620 if (*slot_value(dev, slot, axis) == mt_state->val[slot])
623 if (axis == ABS_MT_TRACKING_ID &&
624 *slot_value(dev, slot, axis) != -1 &&
625 mt_state->val[slot] != -1) {
626 set_bit(tracking_id_changes, slot);
627 need_tracking_id_changes = 1;
630 *slot_value(dev, slot, axis) = mt_state->val[slot];
632 set_bit(slot_update, AXISBIT(slot, axis));
633 /* note that this slot has updates */
634 set_bit(slot_update, AXISBIT(slot, ABS_MT_SLOT));
641 if (!create_events) {
646 if (need_tracking_id_changes) {
647 for (slot = 0; slot < dev->num_slots; slot++) {
648 if (!bit_is_set(tracking_id_changes, slot))
651 ev = queue_push(dev);
652 init_event(dev, ev, EV_ABS, ABS_MT_SLOT, slot);
653 ev = queue_push(dev);
654 init_event(dev, ev, EV_ABS, ABS_MT_TRACKING_ID, -1);
656 last_reported_slot = slot;
659 ev = queue_push(dev);
660 init_event(dev, ev, EV_SYN, SYN_REPORT, 0);
663 for (slot = 0; slot < dev->num_slots; slot++) {
664 if (!bit_is_set(slot_update, AXISBIT(slot, ABS_MT_SLOT)))
667 ev = queue_push(dev);
668 init_event(dev, ev, EV_ABS, ABS_MT_SLOT, slot);
669 last_reported_slot = slot;
671 for (axis = ABS_MT_MIN; axis <= ABS_MT_MAX; axis++) {
672 if (axis == ABS_MT_SLOT ||
673 !libevdev_has_event_code(dev, EV_ABS, axis))
676 if (bit_is_set(slot_update, AXISBIT(slot, axis))) {
677 ev = queue_push(dev);
678 init_event(dev, ev, EV_ABS, axis, *slot_value(dev, slot, axis));
683 /* add one last slot event to make sure the client is on the same
684 slot as the kernel */
686 rc = ioctl(dev->fd, EVIOCGABS(ABS_MT_SLOT), &abs_info);
690 dev->current_slot = abs_info.value;
692 if (dev->current_slot != last_reported_slot) {
693 ev = queue_push(dev);
694 init_event(dev, ev, EV_ABS, ABS_MT_SLOT, dev->current_slot);
701 return rc ? -errno : 0;
705 read_more_events(struct libevdev *dev)
709 struct input_event *next;
711 free_elem = queue_num_free_elements(dev);
715 next = queue_next_element(dev);
716 len = read(dev->fd, next, free_elem * sizeof(struct input_event));
719 } else if (len > 0 && len % sizeof(struct input_event) != 0)
722 int nev = len/sizeof(struct input_event);
723 queue_set_num_elements(dev, queue_num_elements(dev) + nev);
730 drain_events(struct libevdev *dev)
735 const int max_iterations = 8; /* EVDEV_BUF_PACKETS in
736 kernel/drivers/input/evedev.c */
738 queue_shift_multiple(dev, queue_num_elements(dev), NULL);
741 rc = read_more_events(dev);
746 log_error("Failed to drain events before sync.\n");
750 nelem = queue_num_elements(dev);
751 queue_shift_multiple(dev, nelem, NULL);
752 } while (iterations++ < max_iterations && nelem >= queue_size(dev));
754 /* Our buffer should be roughly the same or bigger than the kernel
755 buffer in most cases, so we usually don't expect to recurse. If
756 we do, make sure we stop after max_iterations and proceed with
757 what we have. This could happen if events queue up faster than
760 if (iterations >= max_iterations)
761 log_info("Unable to drain events, buffer size mismatch.\n");
765 sync_state(struct libevdev *dev)
768 struct input_event *ev;
770 /* see section "Discarding events before synchronizing" in
771 * libevdev/libevdev.h */
774 if (libevdev_has_event_type(dev, EV_KEY))
775 rc = sync_key_state(dev);
776 if (libevdev_has_event_type(dev, EV_LED))
777 rc = sync_led_state(dev);
778 if (libevdev_has_event_type(dev, EV_SW))
779 rc = sync_sw_state(dev);
780 if (rc == 0 && libevdev_has_event_type(dev, EV_ABS))
781 rc = sync_abs_state(dev);
782 if (rc == 0 && dev->num_slots > -1 &&
783 libevdev_has_event_code(dev, EV_ABS, ABS_MT_SLOT))
784 rc = sync_mt_state(dev, 1);
786 dev->queue_nsync = queue_num_elements(dev);
788 if (dev->queue_nsync > 0) {
789 ev = queue_push(dev);
790 init_event(dev, ev, EV_SYN, SYN_REPORT, 0);
798 update_key_state(struct libevdev *dev, const struct input_event *e)
800 if (!libevdev_has_event_type(dev, EV_KEY))
803 if (e->code > KEY_MAX)
806 set_bit_state(dev->key_values, e->code, e->value != 0);
812 update_mt_state(struct libevdev *dev, const struct input_event *e)
814 if (e->code == ABS_MT_SLOT && dev->num_slots > -1) {
816 dev->current_slot = e->value;
817 /* sync abs_info with the current slot values */
818 for (i = ABS_MT_SLOT + 1; i <= ABS_MT_MAX; i++) {
819 if (libevdev_has_event_code(dev, EV_ABS, i))
820 dev->abs_info[i].value = *slot_value(dev, dev->current_slot, i);
824 } else if (dev->current_slot == -1)
827 *slot_value(dev, dev->current_slot, e->code) = e->value;
833 update_abs_state(struct libevdev *dev, const struct input_event *e)
835 if (!libevdev_has_event_type(dev, EV_ABS))
838 if (e->code > ABS_MAX)
841 if (e->code >= ABS_MT_MIN && e->code <= ABS_MT_MAX)
842 update_mt_state(dev, e);
844 dev->abs_info[e->code].value = e->value;
850 update_led_state(struct libevdev *dev, const struct input_event *e)
852 if (!libevdev_has_event_type(dev, EV_LED))
855 if (e->code > LED_MAX)
858 set_bit_state(dev->led_values, e->code, e->value != 0);
864 update_sw_state(struct libevdev *dev, const struct input_event *e)
866 if (!libevdev_has_event_type(dev, EV_SW))
869 if (e->code > SW_MAX)
872 set_bit_state(dev->sw_values, e->code, e->value != 0);
878 update_state(struct libevdev *dev, const struct input_event *e)
887 rc = update_key_state(dev, e);
890 rc = update_abs_state(dev, e);
893 rc = update_led_state(dev, e);
896 rc = update_sw_state(dev, e);
900 dev->last_event_time = e->time;
906 * Sanitize/modify events where needed.
908 static inline enum event_filter_status
909 sanitize_event(const struct libevdev *dev,
910 struct input_event *ev,
911 enum SyncState sync_state)
913 if (unlikely(dev->num_slots > -1 &&
914 libevdev_event_is_code(ev, EV_ABS, ABS_MT_SLOT) &&
915 (ev->value < 0 || ev->value >= dev->num_slots))) {
916 log_bug("Device \"%s\" received an invalid slot index %d."
917 "Capping to announced max slot number %d.\n",
918 dev->name, ev->value, dev->num_slots - 1);
919 ev->value = dev->num_slots - 1;
920 return EVENT_FILTER_MODIFIED;
922 /* Drop any invalid tracking IDs, they are only supposed to go from
923 N to -1 or from -1 to N. Never from -1 to -1, or N to M. Very
924 unlikely to ever happen from a real device.
926 } else if (unlikely(sync_state == SYNC_NONE &&
927 dev->num_slots > -1 &&
928 libevdev_event_is_code(ev, EV_ABS, ABS_MT_TRACKING_ID) &&
930 *slot_value(dev, dev->current_slot, ABS_MT_TRACKING_ID) == -1) ||
932 *slot_value(dev, dev->current_slot, ABS_MT_TRACKING_ID) != -1)))) {
933 log_bug("Device \"%s\" received a double tracking ID %d in slot %d.\n",
934 dev->name, ev->value, dev->current_slot);
935 return EVENT_FILTER_DISCARD;
938 return EVENT_FILTER_NONE;
942 libevdev_next_event(struct libevdev *dev, unsigned int flags, struct input_event *ev)
944 int rc = LIBEVDEV_READ_STATUS_SUCCESS;
945 enum event_filter_status filter_status;
947 if (!dev->initialized) {
948 log_bug("device not initialized. call libevdev_set_fd() first\n");
950 } else if (dev->fd < 0)
953 if (!(flags & (LIBEVDEV_READ_FLAG_NORMAL|LIBEVDEV_READ_FLAG_SYNC|LIBEVDEV_READ_FLAG_FORCE_SYNC))) {
954 log_bug("invalid flags %#x\n.\n", flags);
958 if (flags & LIBEVDEV_READ_FLAG_SYNC) {
959 if (dev->sync_state == SYNC_NEEDED) {
960 rc = sync_state(dev);
963 dev->sync_state = SYNC_IN_PROGRESS;
966 if (dev->queue_nsync == 0) {
967 dev->sync_state = SYNC_NONE;
971 } else if (dev->sync_state != SYNC_NONE) {
972 struct input_event e;
974 /* call update_state for all events here, otherwise the library has the wrong view
976 while (queue_shift(dev, &e) == 0) {
978 if (sanitize_event(dev, &e, dev->sync_state) != EVENT_FILTER_DISCARD)
979 update_state(dev, &e);
982 dev->sync_state = SYNC_NONE;
985 /* Always read in some more events. Best case this smoothes over a potential SYN_DROPPED,
986 worst case we don't read fast enough and end up with SYN_DROPPED anyway.
988 Except if the fd is in blocking mode and we still have events from the last read, don't
992 if (!(flags & LIBEVDEV_READ_FLAG_BLOCKING) ||
993 queue_num_elements(dev) == 0) {
994 rc = read_more_events(dev);
995 if (rc < 0 && rc != -EAGAIN)
999 if (flags & LIBEVDEV_READ_FLAG_FORCE_SYNC) {
1000 dev->sync_state = SYNC_NEEDED;
1001 rc = LIBEVDEV_READ_STATUS_SYNC;
1006 if (queue_shift(dev, ev) != 0)
1009 filter_status = sanitize_event(dev, ev, dev->sync_state);
1010 if (filter_status != EVENT_FILTER_DISCARD)
1011 update_state(dev, ev);
1013 /* if we disabled a code, get the next event instead */
1014 } while(filter_status == EVENT_FILTER_DISCARD ||
1015 !libevdev_has_event_code(dev, ev->type, ev->code));
1017 rc = LIBEVDEV_READ_STATUS_SUCCESS;
1018 if (ev->type == EV_SYN && ev->code == SYN_DROPPED) {
1019 dev->sync_state = SYNC_NEEDED;
1020 rc = LIBEVDEV_READ_STATUS_SYNC;
1023 if (flags & LIBEVDEV_READ_FLAG_SYNC && dev->queue_nsync > 0) {
1025 rc = LIBEVDEV_READ_STATUS_SYNC;
1026 if (dev->queue_nsync == 0) {
1027 struct input_event next;
1028 dev->sync_state = SYNC_NONE;
1030 if (queue_peek(dev, 0, &next) == 0 &&
1031 next.type == EV_SYN && next.code == SYN_DROPPED)
1032 log_info("SYN_DROPPED received after finished "
1033 "sync - you're not keeping up\n");
1042 libevdev_has_event_pending(struct libevdev *dev)
1044 struct pollfd fds = { dev->fd, POLLIN, 0 };
1047 if (!dev->initialized) {
1048 log_bug("device not initialized. call libevdev_set_fd() first\n");
1050 } else if (dev->fd < 0)
1053 if (queue_num_elements(dev) != 0)
1056 rc = poll(&fds, 1, 0);
1057 return (rc >= 0) ? rc : -errno;
1060 LIBEVDEV_EXPORT const char *
1061 libevdev_get_name(const struct libevdev *dev)
1063 return dev->name ? dev->name : "";
1066 LIBEVDEV_EXPORT const char *
1067 libevdev_get_phys(const struct libevdev *dev)
1072 LIBEVDEV_EXPORT const char *
1073 libevdev_get_uniq(const struct libevdev *dev)
1078 #define STRING_SETTER(field) \
1079 LIBEVDEV_EXPORT void libevdev_set_##field(struct libevdev *dev, const char *field) \
1081 if (field == NULL) \
1084 dev->field = strdup(field); \
1092 #define PRODUCT_GETTER(name) \
1093 LIBEVDEV_EXPORT int libevdev_get_id_##name(const struct libevdev *dev) \
1095 return dev->ids.name; \
1098 PRODUCT_GETTER(product)
1099 PRODUCT_GETTER(vendor)
1100 PRODUCT_GETTER(bustype)
1101 PRODUCT_GETTER(version)
1103 #define PRODUCT_SETTER(field) \
1104 LIBEVDEV_EXPORT void libevdev_set_id_##field(struct libevdev *dev, int field) \
1106 dev->ids.field = field;\
1109 PRODUCT_SETTER(product)
1110 PRODUCT_SETTER(vendor)
1111 PRODUCT_SETTER(bustype)
1112 PRODUCT_SETTER(version)
1115 libevdev_get_driver_version(const struct libevdev *dev)
1117 return dev->driver_version;
1121 libevdev_has_property(const struct libevdev *dev, unsigned int prop)
1123 return (prop <= INPUT_PROP_MAX) && bit_is_set(dev->props, prop);
1127 libevdev_enable_property(struct libevdev *dev, unsigned int prop)
1129 if (prop > INPUT_PROP_MAX)
1132 set_bit(dev->props, prop);
1137 libevdev_has_event_type(const struct libevdev *dev, unsigned int type)
1139 return type == EV_SYN ||(type <= EV_MAX && bit_is_set(dev->bits, type));
1143 libevdev_has_event_code(const struct libevdev *dev, unsigned int type, unsigned int code)
1145 const unsigned long *mask = NULL;
1148 if (!libevdev_has_event_type(dev, type))
1154 max = type_to_mask_const(dev, type, &mask);
1156 if (max == -1 || code > (unsigned int)max)
1159 return bit_is_set(mask, code);
1163 libevdev_get_event_value(const struct libevdev *dev, unsigned int type, unsigned int code)
1167 if (!libevdev_has_event_type(dev, type) || !libevdev_has_event_code(dev, type, code))
1171 case EV_ABS: value = dev->abs_info[code].value; break;
1172 case EV_KEY: value = bit_is_set(dev->key_values, code); break;
1173 case EV_LED: value = bit_is_set(dev->led_values, code); break;
1174 case EV_SW: value = bit_is_set(dev->sw_values, code); break;
1178 libevdev_get_repeat(dev, &value, NULL);
1181 libevdev_get_repeat(dev, NULL, &value);
1197 libevdev_set_event_value(struct libevdev *dev, unsigned int type, unsigned int code, int value)
1200 struct input_event e;
1202 if (!libevdev_has_event_type(dev, type) || !libevdev_has_event_code(dev, type, code))
1209 if (sanitize_event(dev, &e, SYNC_NONE) != EVENT_FILTER_NONE)
1213 case EV_ABS: rc = update_abs_state(dev, &e); break;
1214 case EV_KEY: rc = update_key_state(dev, &e); break;
1215 case EV_LED: rc = update_led_state(dev, &e); break;
1216 case EV_SW: rc = update_sw_state(dev, &e); break;
1226 libevdev_fetch_event_value(const struct libevdev *dev, unsigned int type, unsigned int code, int *value)
1228 if (libevdev_has_event_type(dev, type) &&
1229 libevdev_has_event_code(dev, type, code)) {
1230 *value = libevdev_get_event_value(dev, type, code);
1237 libevdev_get_slot_value(const struct libevdev *dev, unsigned int slot, unsigned int code)
1239 if (!libevdev_has_event_type(dev, EV_ABS) || !libevdev_has_event_code(dev, EV_ABS, code))
1242 if (dev->num_slots < 0 || slot >= (unsigned int)dev->num_slots)
1245 if (code > ABS_MT_MAX || code < ABS_MT_MIN)
1248 return *slot_value(dev, slot, code);
1252 libevdev_set_slot_value(struct libevdev *dev, unsigned int slot, unsigned int code, int value)
1254 if (!libevdev_has_event_type(dev, EV_ABS) || !libevdev_has_event_code(dev, EV_ABS, code))
1257 if (dev->num_slots == -1 || slot >= (unsigned int)dev->num_slots)
1260 if (code > ABS_MT_MAX || code < ABS_MT_MIN)
1263 if (code == ABS_MT_SLOT) {
1264 if (value < 0 || value >= libevdev_get_num_slots(dev))
1266 dev->current_slot = value;
1269 *slot_value(dev, slot, code) = value;
1275 libevdev_fetch_slot_value(const struct libevdev *dev, unsigned int slot, unsigned int code, int *value)
1277 if (libevdev_has_event_type(dev, EV_ABS) &&
1278 libevdev_has_event_code(dev, EV_ABS, code) &&
1279 dev->num_slots >= 0 &&
1280 slot < (unsigned int)dev->num_slots) {
1281 *value = libevdev_get_slot_value(dev, slot, code);
1288 libevdev_get_num_slots(const struct libevdev *dev)
1290 return dev->num_slots;
1294 libevdev_get_current_slot(const struct libevdev *dev)
1296 return dev->current_slot;
1299 LIBEVDEV_EXPORT const struct input_absinfo*
1300 libevdev_get_abs_info(const struct libevdev *dev, unsigned int code)
1302 if (!libevdev_has_event_type(dev, EV_ABS) ||
1303 !libevdev_has_event_code(dev, EV_ABS, code))
1306 return &dev->abs_info[code];
1309 #define ABS_GETTER(name) \
1310 LIBEVDEV_EXPORT int libevdev_get_abs_##name(const struct libevdev *dev, unsigned int code) \
1312 const struct input_absinfo *absinfo = libevdev_get_abs_info(dev, code); \
1313 return absinfo ? absinfo->name : 0; \
1320 ABS_GETTER(resolution)
1322 #define ABS_SETTER(field) \
1323 LIBEVDEV_EXPORT void libevdev_set_abs_##field(struct libevdev *dev, unsigned int code, int val) \
1325 if (!libevdev_has_event_code(dev, EV_ABS, code)) \
1327 dev->abs_info[code].field = val; \
1334 ABS_SETTER(resolution)
1336 LIBEVDEV_EXPORT void
1337 libevdev_set_abs_info(struct libevdev *dev, unsigned int code, const struct input_absinfo *abs)
1339 if (!libevdev_has_event_code(dev, EV_ABS, code))
1342 dev->abs_info[code] = *abs;
1346 libevdev_enable_event_type(struct libevdev *dev, unsigned int type)
1353 if (libevdev_has_event_type(dev, type))
1356 max = libevdev_event_type_get_max(type);
1360 set_bit(dev->bits, type);
1362 if (type == EV_REP) {
1363 int delay = 0, period = 0;
1364 libevdev_enable_event_code(dev, EV_REP, REP_DELAY, &delay);
1365 libevdev_enable_event_code(dev, EV_REP, REP_PERIOD, &period);
1371 libevdev_disable_event_type(struct libevdev *dev, unsigned int type)
1375 if (type > EV_MAX || type == EV_SYN)
1378 max = libevdev_event_type_get_max(type);
1382 clear_bit(dev->bits, type);
1388 libevdev_enable_event_code(struct libevdev *dev, unsigned int type,
1389 unsigned int code, const void *data)
1392 unsigned long *mask = NULL;
1394 if (libevdev_enable_event_type(dev, type))
1411 max = type_to_mask(dev, type, &mask);
1413 if (code > max || (int)max == -1)
1416 set_bit(mask, code);
1418 if (type == EV_ABS) {
1419 const struct input_absinfo *abs = data;
1420 dev->abs_info[code] = *abs;
1421 } else if (type == EV_REP) {
1422 const int *value = data;
1423 dev->rep_values[code] = *value;
1430 libevdev_disable_event_code(struct libevdev *dev, unsigned int type, unsigned int code)
1433 unsigned long *mask = NULL;
1435 if (type > EV_MAX || type == EV_SYN)
1438 max = type_to_mask(dev, type, &mask);
1440 if (code > max || (int)max == -1)
1443 clear_bit(mask, code);
1449 libevdev_kernel_set_abs_info(struct libevdev *dev, unsigned int code, const struct input_absinfo *abs)
1453 if (!dev->initialized) {
1454 log_bug("device not initialized. call libevdev_set_fd() first\n");
1456 } else if (dev->fd < 0)
1462 rc = ioctl(dev->fd, EVIOCSABS(code), abs);
1466 rc = libevdev_enable_event_code(dev, EV_ABS, code, abs);
1472 libevdev_grab(struct libevdev *dev, enum libevdev_grab_mode grab)
1476 if (!dev->initialized) {
1477 log_bug("device not initialized. call libevdev_set_fd() first\n");
1479 } else if (dev->fd < 0)
1482 if (grab != LIBEVDEV_GRAB && grab != LIBEVDEV_UNGRAB) {
1483 log_bug("invalid grab parameter %#x\n", grab);
1487 if (grab == dev->grabbed)
1490 if (grab == LIBEVDEV_GRAB)
1491 rc = ioctl(dev->fd, EVIOCGRAB, (void *)1);
1492 else if (grab == LIBEVDEV_UNGRAB)
1493 rc = ioctl(dev->fd, EVIOCGRAB, (void *)0);
1496 dev->grabbed = grab;
1498 return rc < 0 ? -errno : 0;
1502 libevdev_event_is_type(const struct input_event *ev, unsigned int type)
1504 return type < EV_CNT && ev->type == type;
1508 libevdev_event_is_code(const struct input_event *ev, unsigned int type, unsigned int code)
1512 if (!libevdev_event_is_type(ev, type))
1515 max = libevdev_event_type_get_max(type);
1516 return (max > -1 && code <= (unsigned int)max && ev->code == code);
1519 LIBEVDEV_EXPORT const char*
1520 libevdev_event_type_get_name(unsigned int type)
1525 return ev_map[type];
1528 LIBEVDEV_EXPORT const char*
1529 libevdev_event_code_get_name(unsigned int type, unsigned int code)
1531 int max = libevdev_event_type_get_max(type);
1533 if (max == -1 || code > (unsigned int)max)
1536 return event_type_map[type][code];
1539 LIBEVDEV_EXPORT const char*
1540 libevdev_property_get_name(unsigned int prop)
1542 if (prop > INPUT_PROP_MAX)
1545 return input_prop_map[prop];
1549 libevdev_event_type_get_max(unsigned int type)
1554 return ev_max[type];
1558 libevdev_get_repeat(const struct libevdev *dev, int *delay, int *period)
1560 if (!libevdev_has_event_type(dev, EV_REP))
1564 *delay = dev->rep_values[REP_DELAY];
1566 *period = dev->rep_values[REP_PERIOD];
1572 libevdev_kernel_set_led_value(struct libevdev *dev, unsigned int code, enum libevdev_led_value value)
1574 return libevdev_kernel_set_led_values(dev, code, value, -1);
1578 libevdev_kernel_set_led_values(struct libevdev *dev, ...)
1580 struct input_event ev[LED_MAX + 1];
1581 enum libevdev_led_value val;
1587 if (!dev->initialized) {
1588 log_bug("device not initialized. call libevdev_set_fd() first\n");
1590 } else if (dev->fd < 0)
1593 memset(ev, 0, sizeof(ev));
1595 va_start(args, dev);
1596 code = va_arg(args, unsigned int);
1597 while (code != -1) {
1598 if (code > LED_MAX) {
1602 val = va_arg(args, enum libevdev_led_value);
1603 if (val != LIBEVDEV_LED_ON && val != LIBEVDEV_LED_OFF) {
1608 if (libevdev_has_event_code(dev, EV_LED, code)) {
1609 struct input_event *e = ev;
1611 while (e->type > 0 && e->code != code)
1618 e->value = (val == LIBEVDEV_LED_ON);
1620 code = va_arg(args, unsigned int);
1624 if (rc == 0 && nleds > 0) {
1625 ev[nleds].type = EV_SYN;
1626 ev[nleds++].code = SYN_REPORT;
1628 rc = write(libevdev_get_fd(dev), ev, nleds * sizeof(ev[0]));
1630 nleds--; /* last is EV_SYN */
1632 update_led_state(dev, &ev[nleds]);
1634 rc = (rc != -1) ? 0 : -errno;
1641 libevdev_set_clock_id(struct libevdev *dev, int clockid)
1643 if (!dev->initialized) {
1644 log_bug("device not initialized. call libevdev_set_fd() first\n");
1646 } else if (dev->fd < 0)
1649 return ioctl(dev->fd, EVIOCSCLOCKID, &clockid) ? -errno : 0;