Add libevdev_disable_property
authorScott Jann <sjann@knight-rider.org>
Sat, 17 Oct 2020 08:03:17 +0000 (03:03 -0500)
committerPeter Hutterer <peter.hutterer@who-t.net>
Mon, 19 Oct 2020 04:47:07 +0000 (14:47 +1000)
On some devices, a kernel input property has been set in error and we need the
ability to disable that property.

Signed-off-by: Scott Jann <sjann@knight-rider.org>
libevdev/libevdev.c
libevdev/libevdev.h
libevdev/libevdev.sym
test/test-libevdev-has-event.c

index 7dea906ebd9de804d2c8f0c087eb5764a5b5ef9a..2b90a6c51d7802cba81d602bb72c4672a0a720f9 100644 (file)
@@ -1318,6 +1318,16 @@ libevdev_enable_property(struct libevdev *dev, unsigned int prop)
        return 0;
 }
 
+LIBEVDEV_EXPORT int
+libevdev_disable_property(struct libevdev *dev, unsigned int prop)
+{
+       if (prop > INPUT_PROP_MAX)
+               return -1;
+
+       clear_bit(dev->props, prop);
+       return 0;
+}
+
 LIBEVDEV_EXPORT int
 libevdev_has_event_type(const struct libevdev *dev, unsigned int type)
 {
index c94d3916a42458537602ff0bc7d3421290f51062..6ffcda73128abd173d9b0dac6f9b6ecdf5121c92 100644 (file)
@@ -1388,6 +1388,16 @@ int libevdev_has_property(const struct libevdev *dev, unsigned int prop);
  */
 int libevdev_enable_property(struct libevdev *dev, unsigned int prop);
 
+/**
+ * @ingroup kernel
+ *
+ * @param dev The evdev device
+ * @param prop The input property to disable, one of INPUT_PROP_...
+ *
+ * @return 0 on success or -1 on failure
+ */
+int libevdev_disable_property(struct libevdev *dev, unsigned int prop);
+
 /**
  * @ingroup bits
  *
index d034669e34e0475871587b80375ede42e0fc50ee..30af65de74ffba9a5cc699fbb026c1656176aa0f 100644 (file)
@@ -131,3 +131,10 @@ global:
 local:
        *;
 } LIBEVDEV_1_6;
+
+LIBEVDEV_1_10 {
+global:
+       libevdev_disable_property;
+local:
+       *;
+} LIBEVDEV_1_7;
index 7d23590c19cf1c017356096388a1327f9e054381..a1f2fec1f999d1f8577b2ed67223600d56501174 100644 (file)
@@ -313,6 +313,13 @@ START_TEST(test_set_input_props)
        ck_assert_int_eq(libevdev_has_property(dev, INPUT_PROP_DIRECT), 0);
        ck_assert_int_eq(libevdev_has_property(dev, INPUT_PROP_BUTTONPAD), 1);
 
+       /* Test disabling the properties too */
+       ck_assert_int_eq(libevdev_disable_property(dev, INPUT_PROP_MAX + 1), -1);
+       ck_assert_int_eq(libevdev_disable_property(dev, INPUT_PROP_DIRECT), 0);
+       ck_assert_int_eq(libevdev_disable_property(dev, INPUT_PROP_BUTTONPAD), 0);
+       ck_assert_int_eq(libevdev_has_property(dev, INPUT_PROP_DIRECT), 0);
+       ck_assert_int_eq(libevdev_has_property(dev, INPUT_PROP_BUTTONPAD), 0);
+
        uinput_device_free(uidev);
        libevdev_free(dev);
 }