#define MAXEVENTS 64
-/* DEPRECATED */
-LIBEVDEV_EXPORT const enum libevdev_read_flag LIBEVDEV_READ_SYNC = LIBEVDEV_READ_FLAG_SYNC;
-LIBEVDEV_EXPORT const enum libevdev_read_flag LIBEVDEV_READ_NORMAL = LIBEVDEV_READ_FLAG_NORMAL;
-LIBEVDEV_EXPORT const enum libevdev_read_flag LIBEVDEV_FORCE_SYNC = LIBEVDEV_READ_FLAG_FORCE_SYNC;
-LIBEVDEV_EXPORT const enum libevdev_read_flag LIBEVDEV_READ_BLOCKING = LIBEVDEV_READ_FLAG_BLOCKING;
-
static int sync_mt_state(struct libevdev *dev, int create_events);
static int
va_end(args);
}
-LIBEVDEV_EXPORT struct libevdev*
-libevdev_new(void)
+static void
+libevdev_reset(struct libevdev *dev)
{
- struct libevdev *dev;
-
- dev = calloc(1, sizeof(*dev));
- if (!dev)
- return NULL;
+ memset(dev, 0, sizeof(*dev));
dev->fd = -1;
dev->initialized = false;
dev->num_slots = -1;
dev->current_slot = -1;
dev->grabbed = LIBEVDEV_UNGRAB;
dev->sync_state = SYNC_NONE;
+ libevdev_enable_event_type(dev, EV_SYN);
+}
+
+LIBEVDEV_EXPORT struct libevdev*
+libevdev_new(void)
+{
+ struct libevdev *dev;
+
+ dev = malloc(sizeof(*dev));
+ if (!dev)
+ return NULL;
+
+ libevdev_reset(dev);
return dev;
}
free(dev);
}
-/* DEPRECATED */
-LIBEVDEV_EXPORT void
-libevdev_set_log_handler(struct libevdev *dev, libevdev_log_func_t logfunc)
-{
- /* Can't be backwards compatible to this yet, so don't even try */
- fprintf(stderr, "libevdev: ABI change. Log function will not be honored.\n");
-}
-
LIBEVDEV_EXPORT void
libevdev_set_log_function(libevdev_log_func_t logfunc, void *data)
{
} else if (fd < 0)
return -EBADF;
+ libevdev_reset(dev);
+
rc = ioctl(fd, EVIOCGBIT(0, sizeof(dev->bits)), dev->bits);
if (rc < 0)
goto out;
dev->initialized = true;
out:
+ if (rc)
+ libevdev_reset(dev);
return rc ? -errno : 0;
}
dev->field = strdup(field); \
}
-STRING_SETTER(name);
-STRING_SETTER(phys);
-STRING_SETTER(uniq);
+STRING_SETTER(name)
+STRING_SETTER(phys)
+STRING_SETTER(uniq)
#define PRODUCT_GETTER(name) \
return dev->ids.name; \
}
-PRODUCT_GETTER(product);
-PRODUCT_GETTER(vendor);
-PRODUCT_GETTER(bustype);
-PRODUCT_GETTER(version);
+PRODUCT_GETTER(product)
+PRODUCT_GETTER(vendor)
+PRODUCT_GETTER(bustype)
+PRODUCT_GETTER(version)
#define PRODUCT_SETTER(field) \
LIBEVDEV_EXPORT void libevdev_set_id_##field(struct libevdev *dev, int field) \
dev->ids.field = field;\
}
-PRODUCT_SETTER(product);
-PRODUCT_SETTER(vendor);
-PRODUCT_SETTER(bustype);
-PRODUCT_SETTER(version);
+PRODUCT_SETTER(product)
+PRODUCT_SETTER(vendor)
+PRODUCT_SETTER(bustype)
+PRODUCT_SETTER(version)
LIBEVDEV_EXPORT int
libevdev_get_driver_version(const struct libevdev *dev)
LIBEVDEV_EXPORT int
libevdev_has_event_type(const struct libevdev *dev, unsigned int type)
{
- return (type <= EV_MAX) && bit_is_set(dev->bits, type);
+ return type == EV_SYN ||(type <= EV_MAX && bit_is_set(dev->bits, type));
}
LIBEVDEV_EXPORT int
case EV_KEY: value = bit_is_set(dev->key_values, code); break;
case EV_LED: value = bit_is_set(dev->led_values, code); break;
case EV_SW: value = bit_is_set(dev->sw_values, code); break;
+ case EV_REP:
+ switch(code) {
+ case REP_DELAY:
+ libevdev_get_repeat(dev, &value, NULL);
+ break;
+ case REP_PERIOD:
+ libevdev_get_repeat(dev, NULL, &value);
+ break;
+ default:
+ value = 0;
+ break;
+ }
+ break;
default:
value = 0;
break;
return absinfo ? absinfo->name : 0; \
}
-ABS_GETTER(maximum);
-ABS_GETTER(minimum);
-ABS_GETTER(fuzz);
-ABS_GETTER(flat);
-ABS_GETTER(resolution);
+ABS_GETTER(maximum)
+ABS_GETTER(minimum)
+ABS_GETTER(fuzz)
+ABS_GETTER(flat)
+ABS_GETTER(resolution)
#define ABS_SETTER(field) \
LIBEVDEV_EXPORT void libevdev_set_abs_##field(struct libevdev *dev, unsigned int code, int val) \
LIBEVDEV_EXPORT int
libevdev_enable_event_type(struct libevdev *dev, unsigned int type)
{
+ int max;
+
if (type > EV_MAX)
return -1;
if (libevdev_has_event_type(dev, type))
return 0;
+ max = libevdev_event_type_get_max(type);
+ if (max == -1)
+ return -1;
+
set_bit(dev->bits, type);
if (type == EV_REP) {
LIBEVDEV_EXPORT int
libevdev_disable_event_type(struct libevdev *dev, unsigned int type)
{
+ int max;
+
if (type > EV_MAX || type == EV_SYN)
return -1;
+ max = libevdev_event_type_get_max(type);
+ if (max == -1)
+ return -1;
+
clear_bit(dev->bits, type);
return 0;
max = type_to_mask(dev, type, &mask);
- if (code > max)
+ if (code > max || (int)max == -1)
return -1;
set_bit(mask, code);
unsigned int max;
unsigned long *mask = NULL;
- if (type > EV_MAX)
+ if (type > EV_MAX || type == EV_SYN)
return -1;
max = type_to_mask(dev, type, &mask);
- if (code > max)
+ if (code > max || (int)max == -1)
return -1;
clear_bit(mask, code);
}
LIBEVDEV_EXPORT int
-libevdev_kernel_set_abs_value(struct libevdev *dev, unsigned int code, const struct input_absinfo *abs)
-{
- return libevdev_kernel_set_abs_info(dev, code, abs);
-}
-
-LIBEVDEV_EXPORT int
libevdev_kernel_set_abs_info(struct libevdev *dev, unsigned int code, const struct input_absinfo *abs)
{
int rc;
return rc < 0 ? -errno : 0;
}
-/* DEPRECATED */
-LIBEVDEV_EXPORT int
-libevdev_is_event_type(const struct input_event *ev, unsigned int type)
-ALIAS(libevdev_event_is_type);
-
LIBEVDEV_EXPORT int
libevdev_event_is_type(const struct input_event *ev, unsigned int type)
{
return type < EV_CNT && ev->type == type;
}
-/* DEPRECATED */
-LIBEVDEV_EXPORT int
-libevdev_is_event_code(const struct input_event *ev, unsigned int type, unsigned int code)
-ALIAS(libevdev_event_is_code);
-
LIBEVDEV_EXPORT int
libevdev_event_is_code(const struct input_event *ev, unsigned int type, unsigned int code)
{
return (max > -1 && code <= (unsigned int)max && ev->code == code);
}
-/* DEPRECATED */
-LIBEVDEV_EXPORT const char*
-libevdev_get_event_type_name(unsigned int type)
-ALIAS(libevdev_event_type_get_name);
-
LIBEVDEV_EXPORT const char*
libevdev_event_type_get_name(unsigned int type)
{
return ev_map[type];
}
-/* DEPRECATED */
-LIBEVDEV_EXPORT const char*
-libevdev_get_event_code_name(unsigned int type, unsigned int code)
-ALIAS(libevdev_event_code_get_name);
-
LIBEVDEV_EXPORT const char*
libevdev_event_code_get_name(unsigned int type, unsigned int code)
{
return event_type_map[type][code];
}
-/* DEPRECATED */
-LIBEVDEV_EXPORT const char*
-libevdev_get_input_prop_name(unsigned int prop)
-ALIAS(libevdev_property_get_name);
-
-/* DEPRECATED */
-LIBEVDEV_EXPORT const char*
-libevdev_get_property_name(unsigned int prop)
-ALIAS(libevdev_property_get_name);
-
LIBEVDEV_EXPORT const char*
libevdev_property_get_name(unsigned int prop)
{
return input_prop_map[prop];
}
-/* DEPRECATED */
-LIBEVDEV_EXPORT int
-libevdev_get_event_type_max(unsigned int type)
-ALIAS(libevdev_event_type_get_max);
-
LIBEVDEV_EXPORT int
libevdev_event_type_get_max(unsigned int type)
{
}
LIBEVDEV_EXPORT int
-libevdev_get_repeat(struct libevdev *dev, int *delay, int *period)
+libevdev_get_repeat(const struct libevdev *dev, int *delay, int *period)
{
if (!libevdev_has_event_type(dev, EV_REP))
return -1;