Support EV_REP values through libevdev_get_event_value
[platform/upstream/libevdev.git] / libevdev / libevdev.c
index d84e67e..60bbbfc 100644 (file)
 
 #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
@@ -120,6 +114,7 @@ libevdev_reset(struct libevdev *dev)
        dev->current_slot = -1;
        dev->grabbed = LIBEVDEV_UNGRAB;
        dev->sync_state = SYNC_NONE;
+       libevdev_enable_event_type(dev, EV_SYN);
 }
 
 LIBEVDEV_EXPORT struct libevdev*
@@ -167,14 +162,6 @@ libevdev_free(struct libevdev *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)
 {
@@ -892,9 +879,9 @@ LIBEVDEV_EXPORT void libevdev_set_##field(struct libevdev *dev, const char *fiel
        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) \
@@ -903,10 +890,10 @@ LIBEVDEV_EXPORT int libevdev_get_id_##name(const struct libevdev *dev) \
        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) \
@@ -914,10 +901,10 @@ 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)
@@ -944,7 +931,7 @@ libevdev_enable_property(struct libevdev *dev, unsigned int prop)
 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
@@ -980,6 +967,19 @@ libevdev_get_event_value(const struct libevdev *dev, unsigned int type, unsigned
                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;
@@ -1106,11 +1106,11 @@ LIBEVDEV_EXPORT int libevdev_get_abs_##name(const struct libevdev *dev, unsigned
        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) \
@@ -1138,12 +1138,18 @@ libevdev_set_abs_info(struct libevdev *dev, unsigned int code, const struct inpu
 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) {
@@ -1157,9 +1163,15 @@ libevdev_enable_event_type(struct libevdev *dev, unsigned int type)
 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;
@@ -1191,7 +1203,7 @@ libevdev_enable_event_code(struct libevdev *dev, unsigned int type,
 
        max = type_to_mask(dev, type, &mask);
 
-       if (code > max)
+       if (code > max || (int)max == -1)
                return -1;
 
        set_bit(mask, code);
@@ -1213,12 +1225,12 @@ libevdev_disable_event_code(struct libevdev *dev, unsigned int type, unsigned in
        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);
@@ -1227,12 +1239,6 @@ libevdev_disable_event_code(struct libevdev *dev, unsigned int type, unsigned in
 }
 
 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;
@@ -1285,22 +1291,12 @@ libevdev_grab(struct libevdev *dev, enum libevdev_grab_mode grab)
        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)
 {
@@ -1313,11 +1309,6 @@ libevdev_event_is_code(const struct input_event *ev, unsigned int type, unsigned
        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)
 {
@@ -1327,11 +1318,6 @@ 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)
 {
@@ -1343,16 +1329,6 @@ 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)
 {
@@ -1362,11 +1338,6 @@ 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)
 {
@@ -1377,7 +1348,7 @@ 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;