[PATCH v2 libinput 12/14] Switch from udev property parsing to the quirks system

Peter Hutterer peter.hutterer at who-t.net
Fri Jun 8 06:00:19 UTC 2018


Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
 src/evdev-mt-touchpad.c                      | 164 ++++++++++++++-------------
 src/evdev.c                                  | 155 +++++++++++++++++--------
 test/litest-device-alps-dualpoint.c          |  15 +--
 test/litest-device-apple-appletouch.c        |  15 +--
 test/litest-device-gpio-keys.c               |   9 +-
 test/litest-device-huion-pentablet.c         |  15 +--
 test/litest-device-lid-switch-surface3.c     |   9 +-
 test/litest-device-lid-switch.c              |   9 +-
 test/litest-device-synaptics-i2c.c           |  15 +--
 test/litest-device-synaptics-x1-carbon-3rd.c |  15 +--
 test/litest-device-waltop-tablet.c           |  15 +--
 test/test-switch.c                           |  13 +--
 test/test-tablet.c                           |  18 +--
 13 files changed, 252 insertions(+), 215 deletions(-)

diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
index dd575510..85095b08 100644
--- a/src/evdev-mt-touchpad.c
+++ b/src/evdev-mt-touchpad.c
@@ -28,6 +28,7 @@
 #include <stdbool.h>
 #include <limits.h>
 
+#include "quirks.h"
 #include "evdev-mt-touchpad.h"
 
 #define DEFAULT_TRACKPOINT_ACTIVITY_TIMEOUT ms2us(300)
@@ -2835,16 +2836,25 @@ tp_dwt_config_get_default(struct libinput_device *device)
 static inline bool
 tp_is_tpkb_combo_below(struct evdev_device *device)
 {
-	const char *prop;
+	struct quirks_context *quirks;
+	struct quirks *q;
+	char *prop;
 	enum tpkbcombo_layout layout = TPKBCOMBO_LAYOUT_UNKNOWN;
+	int rc = false;
 
-	prop = udev_device_get_property_value(device->udev_device,
-					      "LIBINPUT_ATTR_TPKBCOMBO_LAYOUT");
-	if (!prop)
+	quirks = evdev_libinput_context(device)->quirks;
+	q = quirks_fetch_for_device(quirks, device->udev_device);
+	if (!q)
 		return false;
 
-	return parse_tpkbcombo_layout_poperty(prop, &layout) &&
-		layout == TPKBCOMBO_LAYOUT_BELOW;
+	if (quirks_get_string(q, QUIRK_ATTR_TPKBCOMBO_LAYOUT, &prop)) {
+		rc = parse_tpkbcombo_layout_poperty(prop, &layout) &&
+			layout == TPKBCOMBO_LAYOUT_BELOW;
+	}
+
+	quirks_unref(q);
+
+	return rc;
 }
 
 static inline bool
@@ -2911,19 +2921,20 @@ static int
 tp_read_palm_pressure_prop(struct tp_dispatch *tp,
 			   const struct evdev_device *device)
 {
-	struct udev_device *udev_device = device->udev_device;
-	const char *prop;
-	int threshold;
 	const int default_palm_threshold = 130;
+	uint32_t threshold = default_palm_threshold;
+	struct quirks_context *quirks;
+	struct quirks *q;
 
-	prop = udev_device_get_property_value(udev_device,
-			      "LIBINPUT_ATTR_PALM_PRESSURE_THRESHOLD");
-	if (!prop)
-		return default_palm_threshold;
+	quirks = evdev_libinput_context(device)->quirks;
+	q = quirks_fetch_for_device(quirks, device->udev_device);
+	if (!q)
+		return threshold;
 
-	threshold = parse_palm_pressure_property(prop);
+	quirks_get_uint32(q, QUIRK_ATTR_PALM_PRESSURE_THRESHOLD, &threshold);
+	quirks_unref(q);
 
-	return threshold > 0 ? threshold : default_palm_threshold;
+	return threshold;
 }
 
 static inline void
@@ -2947,24 +2958,26 @@ static inline void
 tp_init_palmdetect_size(struct tp_dispatch *tp,
 			struct evdev_device *device)
 {
-	const char *prop;
-	int threshold;
+	struct quirks_context *quirks;
+	struct quirks *q;
+	uint32_t threshold;
 
-	prop = udev_device_get_property_value(device->udev_device,
-					      "LIBINPUT_ATTR_PALM_SIZE_THRESHOLD");
-	if (!prop)
+	quirks = evdev_libinput_context(device)->quirks;
+	q = quirks_fetch_for_device(quirks, device->udev_device);
+	if (!q)
 		return;
 
-	threshold = parse_palm_size_property(prop);
-	if (threshold == 0) {
-		evdev_log_bug_client(device,
-				     "palm: ignoring invalid threshold %s\n",
-				     prop);
-		return;
+	if (quirks_get_uint32(q, QUIRK_ATTR_PALM_SIZE_THRESHOLD, &threshold)) {
+		if (threshold == 0) {
+			evdev_log_bug_client(device,
+					     "palm: ignoring invalid threshold %d\n",
+					     threshold);
+		} else {
+			tp->palm.use_size = true;
+			tp->palm.size_threshold = threshold;
+		}
 	}
-
-	tp->palm.use_size = true;
-	tp->palm.size_threshold = threshold;
+	quirks_unref(q);
 }
 
 static inline void
@@ -3039,25 +3052,6 @@ tp_init_sendevents(struct tp_dispatch *tp,
 			    tp_keyboard_timeout, tp);
 }
 
-static int
-tp_read_thumb_pressure_prop(struct tp_dispatch *tp,
-			    const struct evdev_device *device)
-{
-	struct udev_device *udev_device = device->udev_device;
-	const char *prop;
-	int threshold;
-	const int default_thumb_threshold = 0;
-
-	prop = udev_device_get_property_value(udev_device,
-			      "LIBINPUT_ATTR_THUMB_PRESSURE_THRESHOLD");
-	if (!prop)
-		return default_thumb_threshold;
-
-	threshold = parse_thumb_pressure_property(prop);
-
-	return threshold > 0 ? threshold : default_thumb_threshold;
-}
-
 static void
 tp_init_thumb(struct tp_dispatch *tp)
 {
@@ -3066,7 +3060,9 @@ tp_init_thumb(struct tp_dispatch *tp)
 	double w = 0.0, h = 0.0;
 	struct device_coords edges;
 	struct phys_coords mm = { 0.0, 0.0 };
-	int threshold;
+	uint32_t threshold;
+	struct quirks_context *quirks;
+	struct quirks *q;
 
 	if (!tp->buttons.is_clickpad)
 		return;
@@ -3095,11 +3091,13 @@ tp_init_thumb(struct tp_dispatch *tp)
 	if (!abs)
 		goto out;
 
-	threshold = tp_read_thumb_pressure_prop(tp, device);
-	if (threshold == 0)
-		goto out;
-
-	tp->thumb.threshold = threshold;
+	quirks = evdev_libinput_context(device)->quirks;
+	q = quirks_fetch_for_device(quirks, device->udev_device);
+	if (quirks_get_uint32(q,
+			      QUIRK_ATTR_THUMB_PRESSURE_THRESHOLD,
+			      &threshold))
+		tp->thumb.threshold = threshold;
+	quirks_unref(q);
 
 out:
 	evdev_log_debug(device,
@@ -3197,7 +3195,9 @@ tp_init_pressure(struct tp_dispatch *tp,
 {
 	const struct input_absinfo *abs;
 	unsigned int code;
-	const char *prop;
+	struct quirks_context *quirks;
+	struct quirks *q;
+	struct quirk_range r;
 	int hi, lo;
 
 	code = tp->has_mt ? ABS_MT_PRESSURE : ABS_PRESSURE;
@@ -3209,20 +3209,16 @@ tp_init_pressure(struct tp_dispatch *tp,
 	abs = libevdev_get_abs_info(device->evdev, code);
 	assert(abs);
 
-	prop = udev_device_get_property_value(device->udev_device,
-					      "LIBINPUT_ATTR_PRESSURE_RANGE");
-	if (prop) {
-		if (!parse_range_property(prop, &hi, &lo)) {
-			evdev_log_bug_client(device,
-				     "discarding invalid pressure range '%s'\n",
-				     prop);
-			return;
-		}
+	quirks = evdev_libinput_context(device)->quirks;
+	q = quirks_fetch_for_device(quirks, device->udev_device);
+	if (q && quirks_get_range(q, QUIRK_ATTR_PRESSURE_RANGE, &r)) {
+		hi = r.upper;
+		lo = r.lower;
 
 		if (hi == 0 && lo == 0) {
 			evdev_log_info(device,
 			       "pressure-based touch detection disabled\n");
-			return;
+			goto out;
 		}
 	} else {
 		unsigned int range = abs->maximum - abs->minimum;
@@ -3232,12 +3228,13 @@ tp_init_pressure(struct tp_dispatch *tp,
 		lo = abs->minimum + 0.10 * range;
 	}
 
+
 	if (hi > abs->maximum || hi < abs->minimum ||
 	    lo > abs->maximum || lo < abs->minimum) {
 		evdev_log_bug_libinput(device,
 			       "discarding out-of-bounds pressure range %d:%d\n",
 			       hi, lo);
-		return;
+		goto out;
 	}
 
 	tp->pressure.use_pressure = true;
@@ -3248,14 +3245,19 @@ tp_init_pressure(struct tp_dispatch *tp,
 			"using pressure-based touch detection (%d:%d)\n",
 			lo,
 			hi);
+out:
+	quirks_unref(q);
 }
 
 static bool
 tp_init_touch_size(struct tp_dispatch *tp,
 		   struct evdev_device *device)
 {
-	const char *prop;
+	struct quirks_context *quirks;
+	struct quirks *q;
+	struct quirk_range r;
 	int lo, hi;
+	int rc = false;
 
 	if (!libevdev_has_event_code(device->evdev,
 				     EV_ABS,
@@ -3263,28 +3265,25 @@ tp_init_touch_size(struct tp_dispatch *tp,
 		return false;
 	}
 
-	prop = udev_device_get_property_value(device->udev_device,
-					      "LIBINPUT_ATTR_TOUCH_SIZE_RANGE");
-	if (!prop)
-		return false;
+	quirks = evdev_libinput_context(device)->quirks;
+	q = quirks_fetch_for_device(quirks, device->udev_device);
+	if (q && quirks_get_range(q, QUIRK_ATTR_TOUCH_SIZE_RANGE, &r)) {
+		hi = r.upper;
+		lo = r.lower;
+	} else {
+		goto out;
+	}
 
 	if (libevdev_get_num_slots(device->evdev) < 5) {
 		evdev_log_bug_libinput(device,
 			       "Expected 5+ slots for touch size detection\n");
-		return false;
-	}
-
-	if (!parse_range_property(prop, &hi, &lo)) {
-		evdev_log_bug_client(device,
-				     "discarding invalid touch size range '%s'\n",
-				     prop);
-		return false;
+		goto out;
 	}
 
 	if (hi == 0 && lo == 0) {
 		evdev_log_info(device,
 			       "touch size based touch detection disabled\n");
-		return false;
+		goto out;
 	}
 
 	/* Thresholds apply for both major or minor */
@@ -3296,7 +3295,10 @@ tp_init_touch_size(struct tp_dispatch *tp,
 			"using size-based touch detection (%d:%d)\n",
 			hi, lo);
 
-	return true;
+	rc = true;
+out:
+	quirks_unref(q);
+	return rc;
 }
 
 static int
diff --git a/src/evdev.c b/src/evdev.c
index e93dda6b..9fb11d83 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -43,6 +43,7 @@
 #include "evdev.h"
 #include "filter.h"
 #include "libinput-private.h"
+#include "quirks.h"
 
 #if HAVE_LIBWACOM
 #include <libwacom/libwacom.h>
@@ -410,7 +411,9 @@ static void
 evdev_tag_keyboard(struct evdev_device *device,
 		   struct udev_device *udev_device)
 {
-	const char *prop;
+	struct quirks_context *quirks;
+	struct quirks *q;
+	char *prop;
 	int code;
 
 	if (!libevdev_has_event_type(device->evdev, EV_KEY))
@@ -423,10 +426,9 @@ evdev_tag_keyboard(struct evdev_device *device,
 			return;
 	}
 
-	/* This should eventually become ID_INPUT_KEYBOARD_INTEGRATION */
-	prop = udev_device_get_property_value(udev_device,
-					      "LIBINPUT_ATTR_KEYBOARD_INTEGRATION");
-	if (prop) {
+	quirks = evdev_libinput_context(device)->quirks;
+	q = quirks_fetch_for_device(quirks, device->udev_device);
+	if (q && quirks_get_string(q, QUIRK_ATTR_KEYBOARD_INTEGRATION, &prop)) {
 		if (streq(prop, "internal")) {
 			evdev_tag_keyboard_internal(device);
 		} else if (streq(prop, "external")) {
@@ -438,6 +440,8 @@ evdev_tag_keyboard(struct evdev_device *device,
 		}
 	}
 
+	quirks_unref(q);
+
 	device->tags |= EVDEV_TAG_KEYBOARD;
 }
 
@@ -796,12 +800,16 @@ evdev_is_fake_mt_device(struct evdev_device *device)
 enum switch_reliability
 evdev_read_switch_reliability_prop(struct evdev_device *device)
 {
-	const char *prop;
 	enum switch_reliability r;
+	struct quirks_context *quirks;
+	struct quirks *q;
+	char *prop;
 
-	prop = udev_device_get_property_value(device->udev_device,
-					      "LIBINPUT_ATTR_LID_SWITCH_RELIABILITY");
-	if (!parse_switch_reliability_property(prop, &r)) {
+	quirks = evdev_libinput_context(device)->quirks;
+	q = quirks_fetch_for_device(quirks, device->udev_device);
+	if (!q || !quirks_get_string(q, QUIRK_ATTR_LID_SWITCH_RELIABILITY, &prop)) {
+		r = RELIABILITY_UNKNOWN;
+	} else if (!parse_switch_reliability_property(prop, &r)) {
 		evdev_log_error(device,
 				"%s: switch reliability set to unknown value '%s'\n",
 				device->devname,
@@ -811,6 +819,8 @@ evdev_read_switch_reliability_prop(struct evdev_device *device)
 		evdev_log_info(device, "will write switch open events\n");
 	}
 
+	quirks_unref(q);
+
 	return r;
 }
 
@@ -1169,22 +1179,17 @@ evdev_read_wheel_tilt_props(struct evdev_device *device)
 static inline int
 evdev_get_trackpoint_range(struct evdev_device *device)
 {
+	struct quirks_context *quirks;
+	struct quirks *q;
 	const char *prop;
-	int range = DEFAULT_TRACKPOINT_RANGE;
+	uint32_t range = DEFAULT_TRACKPOINT_RANGE;
 
 	if (!(device->tags & EVDEV_TAG_TRACKPOINT))
 		return DEFAULT_TRACKPOINT_RANGE;
 
-	prop = udev_device_get_property_value(device->udev_device,
-					      "LIBINPUT_ATTR_TRACKPOINT_RANGE");
-	if (prop) {
-		if (!safe_atoi(prop, &range) || range < 0.0) {
-			evdev_log_error(device,
-					"trackpoint range property is present but invalid, "
-					"using %d instead\n",
-					DEFAULT_TRACKPOINT_RANGE);
-			range = DEFAULT_TRACKPOINT_RANGE;
-		}
+	quirks = evdev_libinput_context(device)->quirks;
+	q = quirks_fetch_for_device(quirks, device->udev_device);
+	if (q && quirks_get_uint32(q, QUIRK_ATTR_TRACKPOINT_RANGE, &range)) {
 		goto out;
 	}
 
@@ -1215,6 +1220,8 @@ evdev_get_trackpoint_range(struct evdev_device *device)
 	}
 
 out:
+	quirks_unref(q);
+
 	if (range == 0) {
 		evdev_log_bug_libinput(device, "trackpoint range is zero\n");
 		range = DEFAULT_TRACKPOINT_RANGE;
@@ -1256,12 +1263,11 @@ static inline uint32_t
 evdev_read_model_flags(struct evdev_device *device)
 {
 	const struct model_map {
-		const char *property;
+		enum quirk quirk;
 		enum evdev_device_model model;
 	} model_map[] = {
-#define MODEL(name) { "LIBINPUT_MODEL_" #name, EVDEV_MODEL_##name }
+#define MODEL(name) { QUIRK_MODEL_##name, EVDEV_MODEL_##name }
 		MODEL(LENOVO_X230),
-		MODEL(LENOVO_X220_TOUCHPAD_FW81),
 		MODEL(CHROMEBOOK),
 		MODEL(SYSTEM76_BONOBO),
 		MODEL(SYSTEM76_GALAGO),
@@ -1290,29 +1296,62 @@ evdev_read_model_flags(struct evdev_device *device)
 		MODEL(LENOVO_CARBON_X1_6TH),
 		MODEL(LENOVO_SCROLLPOINT),
 #undef MODEL
-		{ "ID_INPUT_TRACKBALL", EVDEV_MODEL_TRACKBALL },
-		{ NULL, EVDEV_MODEL_DEFAULT },
+		{ 0, 0 },
 	};
 	const struct model_map *m = model_map;
 	uint32_t model_flags = 0;
 	uint32_t all_model_flags = 0;
+	struct quirks_context *quirks;
+	struct quirks *q;
+
+	quirks = evdev_libinput_context(device)->quirks;
+	q = quirks_fetch_for_device(quirks, device->udev_device);
+
+	while (q && m->quirk) {
+		bool is_set;
 
-	while (m->property) {
 		/* Check for flag re-use */
-		if (strneq("LIBINPUT_MODEL_", m->property, 15)) {
-			assert((all_model_flags & m->model) == 0);
-			all_model_flags |= m->model;
-		}
+		assert((all_model_flags & m->model) == 0);
+		all_model_flags |= m->model;
 
-		if (parse_udev_flag(device,
-				    device->udev_device,
-				    m->property)) {
-			evdev_log_debug(device, "tagged as %s\n", m->property);
-			model_flags |= m->model;
+		if (quirks_get_bool(q, m->quirk, &is_set)) {
+			if (is_set) {
+				evdev_log_debug(device,
+						"tagged as %s\n",
+						quirk_get_name(m->quirk));
+				model_flags |= m->model;
+			} else {
+				evdev_log_debug(device,
+						"untagged as %s\n",
+						quirk_get_name(m->quirk));
+				model_flags &= ~m->model;
+			}
 		}
+
 		m++;
 	}
 
+	quirks_unref(q);
+
+	if (parse_udev_flag(device,
+			    device->udev_device,
+			    "ID_INPUT_TRACKBALL")) {
+		evdev_log_debug(device, "tagged as trackball\n");
+		model_flags |= EVDEV_MODEL_TRACKBALL;
+	}
+
+	/**
+	 * Device is 6 years old at the time of writing this and this was
+	 * one of the few udev properties that wasn't reserved for private
+	 * usage, so we need to keep this for backwards compat.
+	 */
+	if (parse_udev_flag(device,
+			    device->udev_device,
+			    "LIBINPUT_MODEL_LENOVO_X220_TOUCHPAD_FW81")) {
+		evdev_log_debug(device, "tagged as trackball\n");
+		model_flags |= EVDEV_MODEL_LENOVO_X220_TOUCHPAD_FW81;
+	}
+
 	return model_flags;
 }
 
@@ -1321,16 +1360,25 @@ evdev_read_attr_res_prop(struct evdev_device *device,
 			 size_t *xres,
 			 size_t *yres)
 {
-	struct udev_device *udev;
-	const char *res_prop;
+	struct quirks_context *quirks;
+	struct quirks *q;
+	struct quirk_dimensions dim;
+	bool rc = false;
 
-	udev = device->udev_device;
-	res_prop = udev_device_get_property_value(udev,
-						   "LIBINPUT_ATTR_RESOLUTION_HINT");
-	if (!res_prop)
+	quirks = evdev_libinput_context(device)->quirks;
+	q = quirks_fetch_for_device(quirks, device->udev_device);
+	if (!q)
 		return false;
 
-	return parse_dimension_property(res_prop, xres, yres);
+	rc = quirks_get_dimensions(q, QUIRK_ATTR_RESOLUTION_HINT, &dim);
+	if (rc) {
+		*xres = dim.x;
+		*yres = dim.y;
+	}
+
+	quirks_unref(q);
+
+	return rc;
 }
 
 static inline bool
@@ -1338,16 +1386,25 @@ evdev_read_attr_size_prop(struct evdev_device *device,
 			  size_t *size_x,
 			  size_t *size_y)
 {
-	struct udev_device *udev;
-	const char *size_prop;
+	struct quirks_context *quirks;
+	struct quirks *q;
+	struct quirk_dimensions dim;
+	bool rc = false;
 
-	udev = device->udev_device;
-	size_prop = udev_device_get_property_value(udev,
-						   "LIBINPUT_ATTR_SIZE_HINT");
-	if (!size_prop)
+	quirks = evdev_libinput_context(device)->quirks;
+	q = quirks_fetch_for_device(quirks, device->udev_device);
+	if (!q)
 		return false;
 
-	return parse_dimension_property(size_prop, size_x, size_y);
+	rc = quirks_get_dimensions(q, QUIRK_ATTR_SIZE_HINT, &dim);
+	if (rc) {
+		*size_x = dim.x;
+		*size_y = dim.y;
+	}
+
+	quirks_unref(q);
+
+	return rc;
 }
 
 /* Return 1 if the device is set to the fake resolution or 0 otherwise */
diff --git a/test/litest-device-alps-dualpoint.c b/test/litest-device-alps-dualpoint.c
index 7e68ec61..b9943001 100644
--- a/test/litest-device-alps-dualpoint.c
+++ b/test/litest-device-alps-dualpoint.c
@@ -103,15 +103,10 @@ static struct input_absinfo absinfo[] = {
 	{ .value = -1 }
 };
 
-static const char udev_rule[] =
-"ACTION==\"remove\", GOTO=\"touchpad_end\"\n"
-"KERNEL!=\"event*\", GOTO=\"touchpad_end\"\n"
-"ENV{ID_INPUT_TOUCHPAD}==\"\", GOTO=\"touchpad_end\"\n"
-"\n"
-"ATTRS{name}==\"litest AlpsPS/2 ALPS DualPoint TouchPad\","
-"    ENV{LIBINPUT_MODEL_TOUCHPAD_VISIBLE_MARKER}=\"1\"\n"
-"\n"
-"LABEL=\"touchpad_end\"";
+static const char quirk_file[] =
+"[litest ALPS Touchpad]\n"
+"MatchName=litest AlpsPS/2 ALPS DualPoint TouchPad\n"
+"ModelTouchpadVisibleMarker=1\n";
 
 TEST_DEVICE("alps-dualpoint",
 	.type = LITEST_ALPS_DUALPOINT,
@@ -122,5 +117,5 @@ TEST_DEVICE("alps-dualpoint",
 	.id = &input_id,
 	.events = events,
 	.absinfo = absinfo,
-	.udev_rule = udev_rule,
+	.quirk_file = quirk_file,
 )
diff --git a/test/litest-device-apple-appletouch.c b/test/litest-device-apple-appletouch.c
index fa13e8e5..c7a9e4f1 100644
--- a/test/litest-device-apple-appletouch.c
+++ b/test/litest-device-apple-appletouch.c
@@ -83,15 +83,10 @@ static struct input_absinfo absinfo[] = {
 	{ .value = -1 }
 };
 
-static const char udev_rule[] =
-"ACTION==\"remove\", GOTO=\"touchpad_end\"\n"
-"KERNEL!=\"event*\", GOTO=\"touchpad_end\"\n"
-"ENV{ID_INPUT_TOUCHPAD}==\"\", GOTO=\"touchpad_end\"\n"
-"\n"
-"ATTRS{name}==\"litest appletouch\","
-"    ENV{LIBINPUT_MODEL_APPLE_TOUCHPAD_ONEBUTTON}=\"1\"\n"
-"\n"
-"LABEL=\"touchpad_end\"";
+static const char quirk_file[] =
+"[litest ALPS Touchpad]\n"
+"MatchName=litest appletouch\n"
+"ModelAppleTouchpadOneButton=1\n";
 
 TEST_DEVICE("appletouch",
 	.type = LITEST_APPLETOUCH,
@@ -102,5 +97,5 @@ TEST_DEVICE("appletouch",
 	.id = &input_id,
 	.events = events,
 	.absinfo = absinfo,
-	.udev_rule = udev_rule,
+	.quirk_file = quirk_file,
 )
diff --git a/test/litest-device-gpio-keys.c b/test/litest-device-gpio-keys.c
index 67993912..ee226de1 100644
--- a/test/litest-device-gpio-keys.c
+++ b/test/litest-device-gpio-keys.c
@@ -47,11 +47,15 @@ static const char udev_rule[] =
 "KERNEL!=\"event*\", GOTO=\"switch_end\"\n"
 "\n"
 "ATTRS{name}==\"litest gpio-keys*\",\\\n"
-"    ENV{ID_INPUT_SWITCH}=\"1\",\\\n"
-"    ENV{LIBINPUT_ATTR_LID_SWITCH_RELIABILITY}=\"reliable\"\n"
+"    ENV{ID_INPUT_SWITCH}=\"1\"\n"
 "\n"
 "LABEL=\"switch_end\"";
 
+static const char quirk_file[] =
+"[litest gpio quirk]\n"
+"MatchName=litest gpio-keys\n"
+"AttrLidSwitchReliability=reliable\n";
+
 TEST_DEVICE("gpio-keys",
 	.type = LITEST_GPIO_KEYS,
 	.features = LITEST_SWITCH,
@@ -63,4 +67,5 @@ TEST_DEVICE("gpio-keys",
 	.absinfo = NULL,
 
 	.udev_rule = udev_rule,
+	.quirk_file = quirk_file,
 )
diff --git a/test/litest-device-huion-pentablet.c b/test/litest-device-huion-pentablet.c
index 053212b9..26b8adfb 100644
--- a/test/litest-device-huion-pentablet.c
+++ b/test/litest-device-huion-pentablet.c
@@ -88,15 +88,10 @@ static int events[] = {
 	-1, -1,
 };
 
-static const char udev_rule[] =
-"ACTION==\"remove\", GOTO=\"huion_end\"\n"
-"KERNEL!=\"event*\", GOTO=\"huion_end\"\n"
-"ENV{ID_INPUT_TABLET}==\"\", GOTO=\"huion_end\"\n"
-"\n"
-"ATTRS{name}==\"litest HUION PenTablet Pen\","
-"    ENV{LIBINPUT_MODEL_TABLET_NO_PROXIMITY_OUT}=\"1\"\n"
-"\n"
-"LABEL=\"huion_end\"";
+static const char quirk_file[] =
+"[litest HUION tablet]\n"
+"MatchName=litest HUION PenTablet Pen\n"
+"ModelTabletNoProximityOut=1\n";
 
 TEST_DEVICE("huion-tablet",
 	.type = LITEST_HUION_TABLET,
@@ -107,5 +102,5 @@ TEST_DEVICE("huion-tablet",
 	.id = &input_id,
 	.events = events,
 	.absinfo = absinfo,
-	.udev_rule = udev_rule,
+	.quirk_file = quirk_file,
 )
diff --git a/test/litest-device-lid-switch-surface3.c b/test/litest-device-lid-switch-surface3.c
index a0df1696..8d72b672 100644
--- a/test/litest-device-lid-switch-surface3.c
+++ b/test/litest-device-lid-switch-surface3.c
@@ -43,11 +43,15 @@ static const char udev_rule[] =
 "KERNEL!=\"event*\", GOTO=\"switch_end\"\n"
 "\n"
 "ATTRS{name}==\"litest Lid Switch Surface3*\",\\\n"
-"    ENV{ID_INPUT_SWITCH}=\"1\",\\\n"
-"    ENV{LIBINPUT_ATTR_LID_SWITCH_RELIABILITY}=\"write_open\"\n"
+"    ENV{ID_INPUT_SWITCH}=\"1\"\n"
 "\n"
 "LABEL=\"switch_end\"";
 
+static const char quirk_file[] =
+"[litest Surface Lid]\n"
+"MatchName=litest Lid Switch Surface3\n"
+"AttrLidSwitchReliability=write_open\n";
+
 TEST_DEVICE("lid-switch-surface3",
 	.type = LITEST_LID_SWITCH_SURFACE3,
 	.features = LITEST_SWITCH,
@@ -59,4 +63,5 @@ TEST_DEVICE("lid-switch-surface3",
 	.absinfo = NULL,
 
 	.udev_rule = udev_rule,
+	.quirk_file = quirk_file,
 )
diff --git a/test/litest-device-lid-switch.c b/test/litest-device-lid-switch.c
index 5c141cb3..e7b4e7c9 100644
--- a/test/litest-device-lid-switch.c
+++ b/test/litest-device-lid-switch.c
@@ -42,11 +42,15 @@ static const char udev_rule[] =
 "KERNEL!=\"event*\", GOTO=\"switch_end\"\n"
 "\n"
 "ATTRS{name}==\"litest Lid Switch\",\\\n"
-"    ENV{ID_INPUT_SWITCH}=\"1\",\\\n"
-"    ENV{LIBINPUT_ATTR_LID_SWITCH_RELIABILITY}=\"reliable\"\n"
+"    ENV{ID_INPUT_SWITCH}=\"1\"\n"
 "\n"
 "LABEL=\"switch_end\"";
 
+static const char quirk_file[] =
+"[litest Lid Switch]\n"
+"MatchName=litest Lid Switch\n"
+"AttrLidSwitchReliability=reliable\n";
+
 TEST_DEVICE("lid-switch",
 	.type = LITEST_LID_SWITCH,
 	.features = LITEST_SWITCH,
@@ -58,4 +62,5 @@ TEST_DEVICE("lid-switch",
 	.absinfo = NULL,
 
 	.udev_rule = udev_rule,
+	.quirk_file = quirk_file,
 )
diff --git a/test/litest-device-synaptics-i2c.c b/test/litest-device-synaptics-i2c.c
index d32e0a50..ce2d905b 100644
--- a/test/litest-device-synaptics-i2c.c
+++ b/test/litest-device-synaptics-i2c.c
@@ -79,15 +79,10 @@ static struct input_absinfo absinfo[] = {
 	{ .value = -1 }
 };
 
-static const char udev_rule[] =
-"ACTION==\"remove\", GOTO=\"touchpad_end\"\n"
-"KERNEL!=\"event*\", GOTO=\"touchpad_end\"\n"
-"ENV{ID_INPUT_TOUCHPAD}==\"\", GOTO=\"touchpad_end\"\n"
-"\n"
-"ATTRS{name}==\"litest DLL0704:01 06CB:76AD Touchpad\","
-"    ENV{LIBINPUT_MODEL_TOUCHPAD_VISIBLE_MARKER}=\"1\"\n"
-"\n"
-"LABEL=\"touchpad_end\"";
+static const char quirk_file[] =
+"[litest Synaptics i2c Touchpad]\n"
+"MatchName=litest DLL0704:01 06CB:76AD Touchpad\n"
+"ModelTouchpadVisibleMarker=1\n";
 
 TEST_DEVICE("synaptics-i2c",
 	.type = LITEST_SYNAPTICS_I2C,
@@ -98,5 +93,5 @@ TEST_DEVICE("synaptics-i2c",
 	.id = &input_id,
 	.events = events,
 	.absinfo = absinfo,
-	.udev_rule = udev_rule,
+	.quirk_file = quirk_file,
 )
diff --git a/test/litest-device-synaptics-x1-carbon-3rd.c b/test/litest-device-synaptics-x1-carbon-3rd.c
index 73fac59a..b3efe47a 100644
--- a/test/litest-device-synaptics-x1-carbon-3rd.c
+++ b/test/litest-device-synaptics-x1-carbon-3rd.c
@@ -105,15 +105,10 @@ static struct input_absinfo absinfo[] = {
 	{ .value = -1 }
 };
 
-static const char udev_rule[] =
-"ACTION==\"remove\", GOTO=\"touchpad_end\"\n"
-"KERNEL!=\"event*\", GOTO=\"touchpad_end\"\n"
-"ENV{ID_INPUT_TOUCHPAD}==\"\", GOTO=\"touchpad_end\"\n"
-"\n"
-"ATTRS{name}==\"litest SynPS/2 Synaptics TouchPad X1C3rd\","
-"    ENV{LIBINPUT_MODEL_LENOVO_T450_TOUCHPAD}=\"1\"\n"
-"\n"
-"LABEL=\"touchpad_end\"";
+static const char quirk_file[] =
+"[litest Synaptics X1 Carbon 3rd Touchpad]\n"
+"MatchName=litest SynPS/2 Synaptics TouchPad X1C3rd\n"
+"ModelLenovoT450Touchpad=1\n";
 
 TEST_DEVICE("synaptics-carbon3rd",
 	.type = LITEST_SYNAPTICS_TRACKPOINT_BUTTONS,
@@ -124,5 +119,5 @@ TEST_DEVICE("synaptics-carbon3rd",
 	.id = &input_id,
 	.events = events,
 	.absinfo = absinfo,
-	.udev_rule = udev_rule,
+	.quirk_file = quirk_file,
 )
diff --git a/test/litest-device-waltop-tablet.c b/test/litest-device-waltop-tablet.c
index 96052e27..7aa69d99 100644
--- a/test/litest-device-waltop-tablet.c
+++ b/test/litest-device-waltop-tablet.c
@@ -220,15 +220,10 @@ static int events[] = {
 	-1, -1,
 };
 
-static const char udev_rule[] =
-"ACTION==\"remove\", GOTO=\"waltop_end\"\n"
-"KERNEL!=\"event*\", GOTO=\"waltop_end\"\n"
-"ENV{ID_INPUT_TABLET}==\"\", GOTO=\"waltop_end\"\n"
-"\n"
-"ATTRS{name}==\"litest          WALTOP     Batteryless Tablet*\",\\\n"
-"    ENV{LIBINPUT_ATTR_SIZE_HINT}=\"200x200\"\n"
-"\n"
-"LABEL=\"waltop_end\"";
+static const char quirk_file[] =
+"[litest Waltop Tablet]\n"
+"MatchName=litest          WALTOP     Batteryless Tablet*\n"
+"AttrSizeHint=200x200\n";
 
 TEST_DEVICE("waltop-tablet",
 	.type = LITEST_WALTOP,
@@ -239,5 +234,5 @@ TEST_DEVICE("waltop-tablet",
 	.id = &input_id,
 	.events = events,
 	.absinfo = absinfo,
-	.udev_rule = udev_rule,
+	.quirk_file = quirk_file,
 )
diff --git a/test/test-switch.c b/test/test-switch.c
index 74cb43e0..043a8e3a 100644
--- a/test/test-switch.c
+++ b/test/test-switch.c
@@ -143,16 +143,15 @@ END_TEST
 static bool
 lid_switch_is_reliable(struct litest_device *dev)
 {
-	struct udev_device *udev_device;
-	const char *prop;
+	char *prop;
 	bool is_reliable = false;
 
-	udev_device = libinput_device_get_udev_device(dev->libinput_device);
-	prop = udev_device_get_property_value(udev_device,
-					      "LIBINPUT_ATTR_LID_SWITCH_RELIABILITY");
+	if (quirks_get_string(dev->quirks,
+			      QUIRK_ATTR_LID_SWITCH_RELIABILITY,
+			      &prop)) {
+		is_reliable = streq(prop, "reliable");
+	}
 
-	is_reliable = prop && streq(prop, "reliable");
-	udev_device_unref(udev_device);
 
 	return is_reliable;
 }
diff --git a/test/test-tablet.c b/test/test-tablet.c
index 92c52ae8..1638b20d 100644
--- a/test/test-tablet.c
+++ b/test/test-tablet.c
@@ -293,19 +293,13 @@ END_TEST
 static inline bool
 tablet_has_proxout_quirk(struct litest_device *dev)
 {
-	struct udev_device *udev_device;
-	bool has_quirk;
+	bool is_set = false;
+	if (!quirks_get_bool(dev->quirks,
+			     QUIRK_MODEL_TABLET_NO_PROXIMITY_OUT,
+			     &is_set))
+		return false;
 
-	udev_device = libinput_device_get_udev_device(dev->libinput_device);
-
-	has_quirk = !!udev_device_get_property_value(udev_device,
-			   "LIBINPUT_MODEL_TABLET_NO_PROXIMITY_OUT");
-	if (!has_quirk)
-		has_quirk = !libevdev_has_event_code(dev->evdev, EV_KEY, BTN_TOOL_PEN);
-
-	udev_device_unref(udev_device);
-
-	return has_quirk;
+	return is_set;
 }
 
 START_TEST(tip_up_prox_out)
-- 
2.14.4



More information about the wayland-devel mailing list