Support EV_REP values through libevdev_get_event_value
authorPeter Hutterer <peter.hutterer@who-t.net>
Wed, 4 Dec 2013 10:21:09 +0000 (20:21 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Sun, 8 Dec 2013 23:49:15 +0000 (09:49 +1000)
We shouldn't have a separate API for that, the whole point of libevdev is to
abstract the quirkyness of the ioctls into a common interface. So let's
export the two EV_REP values through libevdev_get_event_value.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: David Herrmann <dh.herrmann@gmail.com>
libevdev/libevdev.c
libevdev/libevdev.h
test/test-libevdev-events.c

index d543dad74dfbf68c3dd54030d0f1ea4a30324987..60bbbfc456e2654c926ad6537fe4873f4d203883 100644 (file)
@@ -967,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;
index afcf36631b98d31f1808904aab59a73c061f4b1c..1dd3a4bc4d2aada75b5ed2eac644b2eb8e194e27 100644 (file)
@@ -259,7 +259,7 @@ extern "C" {
  * <dd>supported, see libevdev_get_id_product(), libevdev_get_id_vendor(),
  * libevdev_get_id_bustype(), * * libevdev_get_id_version()</dd>
  * <dt>EVIOCGREP:</dt>
- * <dd>supported, see libevdev_get_repeat()</dd>
+ * <dd>supported, see libevdev_get_event_value())</dd>
  * <dt>EVIOCSREP:</dt>
  * <dd>supported, see libevdev_enable_event_code()</dd>
  * <dt>EVIOCGKEYCODE:</dt>
@@ -1604,7 +1604,9 @@ int libevdev_event_code_from_name_n(unsigned int type, const char *name,
 /**
  * @ingroup bits
  *
- * Get the repeat delay and repeat period values for this device.
+ * Get the repeat delay and repeat period values for this device. This
+ * function is a convenience function only, EV_REP is supported by
+ * libevdev_get_event_value().
  *
  * @param dev The evdev device, already initialized with libevdev_set_fd()
  * @param delay If not null, set to the repeat delay value
@@ -1613,6 +1615,8 @@ int libevdev_event_code_from_name_n(unsigned int type, const char *name,
  * @return 0 on success, -1 if this device does not have repeat settings.
  *
  * @note This function is signal-safe
+ *
+ * @see libevdev_get_event_value
  */
 int libevdev_get_repeat(const struct libevdev *dev, int *delay, int *period);
 
index 790304387f2bd5c9a637fe9669e96257cf7660c7..5197cfc830d6a3af5a374ecd4dac2bf6ed2ecdd6 100644 (file)
@@ -929,6 +929,31 @@ START_TEST(test_mt_event_values_invalid)
 }
 END_TEST
 
+START_TEST(test_ev_rep_values)
+{
+       struct uinput_device* uidev;
+       struct libevdev *dev;
+       int rc;
+       int delay = 500, period = 200;
+       rc = test_create_device(&uidev, &dev,
+                               EV_KEY, BTN_LEFT,
+                               EV_REL, REL_X,
+                               EV_REL, REL_Y,
+                               EV_SYN, SYN_REPORT,
+                               -1);
+       ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
+
+       libevdev_enable_event_code(dev, EV_REP, REP_DELAY, &delay);
+       libevdev_enable_event_code(dev, EV_REP, REP_PERIOD, &period);
+
+       ck_assert_int_eq(libevdev_has_event_type(dev, EV_REP), 1);
+       ck_assert_int_eq(libevdev_has_event_code(dev, EV_REP, REP_DELAY), 1);
+       ck_assert_int_eq(libevdev_has_event_code(dev, EV_REP, REP_PERIOD), 1);
+       ck_assert_int_eq(libevdev_get_event_value(dev, EV_REP, REP_DELAY), 500);
+       ck_assert_int_eq(libevdev_get_event_value(dev, EV_REP, REP_PERIOD), 200);
+}
+END_TEST
+
 START_TEST(test_event_value_setters)
 {
        struct uinput_device* uidev;
@@ -1203,6 +1228,7 @@ libevdev_events(void)
        tcase_add_test(tc, test_event_values_invalid);
        tcase_add_test(tc, test_mt_event_values);
        tcase_add_test(tc, test_mt_event_values_invalid);
+       tcase_add_test(tc, test_ev_rep_values);
        suite_add_tcase(s, tc);
 
        tc = tcase_create("event value setters");