Add setter for property bits
authorPeter Hutterer <peter.hutterer@who-t.net>
Mon, 29 Jul 2013 05:34:37 +0000 (15:34 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Thu, 1 Aug 2013 03:53:04 +0000 (13:53 +1000)
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Benjamin Tissoires <benjamin.tissoires@gmail.com>
Reviewed-by: Benjamin Tissoires <benjamin.tissoires@gmail.com>
libevdev/libevdev.c
libevdev/libevdev.h
test/test-libevdev-has-event.c

index bb92529..6d49c76 100644 (file)
@@ -692,6 +692,16 @@ libevdev_has_property(const struct libevdev *dev, unsigned int prop)
 }
 
 int
+libevdev_enable_property(struct libevdev *dev, unsigned int prop)
+{
+       if (prop > INPUT_PROP_MAX)
+               return -1;
+
+       set_bit(dev->props, prop);
+       return 0;
+}
+
+int
 libevdev_has_event_type(const struct libevdev *dev, unsigned int type)
 {
        return (type <= EV_MAX) && bit_is_set(dev->bits, type);
index d637c29..208a1a2 100644 (file)
@@ -610,6 +610,19 @@ int libevdev_get_driver_version(const struct libevdev *dev);
 int libevdev_has_property(const struct libevdev *dev, unsigned int prop);
 
 /**
+ * @ingroup kernel
+ *
+ * @param dev The evdev device
+ * @param prop The input property to enable, one of INPUT_PROP_...
+ *
+ * @return 0 on success or -1 on failure
+ *
+ * @note This function may be called before libevdev_set_fd(). A call to
+ * libevdev_set_fd() will overwrite any previously set value.
+ */
+int libevdev_enable_property(struct libevdev *dev, unsigned int prop);
+
+/**
  * @ingroup bits
  *
  * @param dev The evdev device, already initialized with libevdev_set_fd()
index a0e22ef..f6db68e 100644 (file)
@@ -243,6 +243,40 @@ START_TEST(test_input_props)
 }
 END_TEST
 
+START_TEST(test_set_input_props)
+{
+       struct uinput_device* uidev;
+       struct libevdev *dev;
+       int rc, fd;
+
+       dev = libevdev_new();
+       ck_assert_int_eq(libevdev_enable_property(dev, INPUT_PROP_MAX + 1), -1);
+       ck_assert_int_eq(libevdev_enable_property(dev, INPUT_PROP_DIRECT), 0);
+       ck_assert_int_eq(libevdev_enable_property(dev, INPUT_PROP_BUTTONPAD), 0);
+       ck_assert_int_eq(libevdev_has_property(dev, INPUT_PROP_DIRECT), 1);
+       ck_assert_int_eq(libevdev_has_property(dev, INPUT_PROP_BUTTONPAD), 1);
+
+       uidev = uinput_device_new(TEST_DEVICE_NAME);
+       rc = uinput_device_set_event_bits(uidev,
+                                         EV_ABS, ABS_X,
+                                         -1);
+       ck_assert_int_eq(rc, 0);
+       uinput_device_set_prop(uidev, INPUT_PROP_BUTTONPAD);
+       rc = uinput_device_create(uidev);
+       ck_assert_msg(rc == 0, "Failed to create uinput device: %s", strerror(-rc));
+
+       fd = uinput_device_get_fd(uidev);
+       rc = libevdev_set_fd(dev, fd);
+       ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
+
+       ck_assert_int_eq(libevdev_has_property(dev, INPUT_PROP_DIRECT), 0);
+       ck_assert_int_eq(libevdev_has_property(dev, INPUT_PROP_BUTTONPAD), 1);
+
+       uinput_device_free(uidev);
+       libevdev_free(dev);
+}
+END_TEST
+
 START_TEST(test_slot_init_value)
 {
        struct uinput_device *uidev;
@@ -767,6 +801,7 @@ libevdev_has_event_test(void)
 
        tc = tcase_create("input properties");
        tcase_add_test(tc, test_input_props);
+       tcase_add_test(tc, test_set_input_props);
        suite_add_tcase(s, tc);
 
        tc = tcase_create("multitouch info");