summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Jann <sjann@knight-rider.org>2020-10-17 03:03:17 -0500
committerPeter Hutterer <peter.hutterer@who-t.net>2020-10-19 14:47:07 +1000
commit4226c7801b4ea1b0c7d1eaac47ca24ece8f24809 (patch)
tree2cd10d7dfdbfe197afaa8cb909beacea40297a52
parent8e94375bc60e3070d04258b31bac7d53882cc534 (diff)
Add libevdev_disable_property
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>
-rw-r--r--libevdev/libevdev.c10
-rw-r--r--libevdev/libevdev.h10
-rw-r--r--libevdev/libevdev.sym7
-rw-r--r--test/test-libevdev-has-event.c7
4 files changed, 34 insertions, 0 deletions
diff --git a/libevdev/libevdev.c b/libevdev/libevdev.c
index 7dea906..2b90a6c 100644
--- a/libevdev/libevdev.c
+++ b/libevdev/libevdev.c
@@ -1319,6 +1319,16 @@ libevdev_enable_property(struct libevdev *dev, unsigned int prop)
}
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)
{
return type == EV_SYN ||(type <= EV_MAX && bit_is_set(dev->bits, type));
diff --git a/libevdev/libevdev.h b/libevdev/libevdev.h
index c94d391..6ffcda7 100644
--- a/libevdev/libevdev.h
+++ b/libevdev/libevdev.h
@@ -1389,6 +1389,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
*
* @param dev The evdev device, already initialized with libevdev_set_fd()
diff --git a/libevdev/libevdev.sym b/libevdev/libevdev.sym
index d034669..30af65d 100644
--- a/libevdev/libevdev.sym
+++ b/libevdev/libevdev.sym
@@ -131,3 +131,10 @@ global:
local:
*;
} LIBEVDEV_1_6;
+
+LIBEVDEV_1_10 {
+global:
+ libevdev_disable_property;
+local:
+ *;
+} LIBEVDEV_1_7;
diff --git a/test/test-libevdev-has-event.c b/test/test-libevdev-has-event.c
index 7d23590..a1f2fec 100644
--- a/test/test-libevdev-has-event.c
+++ b/test/test-libevdev-has-event.c
@@ -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);
}