[PATCH libinput 18/26] tablet: rely on libwacom to give us the right tablet axes

Peter Hutterer peter.hutterer at who-t.net
Mon Feb 23 22:21:21 PST 2015


Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
 src/evdev-tablet.c | 50 +++++++++++++++++++++++++++++++++-----------------
 1 file changed, 33 insertions(+), 17 deletions(-)

diff --git a/src/evdev-tablet.c b/src/evdev-tablet.c
index 2b90e08..52742cf 100644
--- a/src/evdev-tablet.c
+++ b/src/evdev-tablet.c
@@ -408,7 +408,7 @@ copy_button_cap(const struct tablet_dispatch *tablet,
 		set_bit(tool->buttons, button);
 }
 
-static void
+static int
 tool_set_bits_from_libwacom(const struct tablet_dispatch *tablet,
 			    struct libinput_tool *tool)
 {
@@ -416,6 +416,8 @@ tool_set_bits_from_libwacom(const struct tablet_dispatch *tablet,
 	WacomDeviceDatabase *db;
 	const WacomStylus *s = NULL;
 	int code;
+	WacomStylusType type;
+	int rc = 1;
 
 	db = libwacom_database_new();
 	if (!db)
@@ -424,7 +426,8 @@ tool_set_bits_from_libwacom(const struct tablet_dispatch *tablet,
 	if (!s)
 		goto out;
 
-	if (libwacom_stylus_get_type(s) == WSTYLUS_PUCK) {
+	type = libwacom_stylus_get_type(s);
+	if (type == WSTYLUS_PUCK) {
 		for (code = BTN_LEFT;
 		     code < BTN_LEFT + libwacom_stylus_get_num_buttons(s);
 		     code++)
@@ -437,9 +440,29 @@ tool_set_bits_from_libwacom(const struct tablet_dispatch *tablet,
 		copy_button_cap(tablet, tool, BTN_TOUCH);
 	}
 
+	/* Eventually we want libwacom to tell us each axis on each device
+	   separately. */
+	switch(type) {
+	case WSTYLUS_AIRBRUSH:
+	case WSTYLUS_MARKER:
+	case WSTYLUS_GENERAL:
+	case WSTYLUS_INKING:
+	case WSTYLUS_CLASSIC:
+	case WSTYLUS_STROKE:
+		copy_axis_cap(tablet, tool, LIBINPUT_TABLET_AXIS_PRESSURE);
+		copy_axis_cap(tablet, tool, LIBINPUT_TABLET_AXIS_DISTANCE);
+		copy_axis_cap(tablet, tool, LIBINPUT_TABLET_AXIS_TILT_X);
+		copy_axis_cap(tablet, tool, LIBINPUT_TABLET_AXIS_TILT_Y);
+		break;
+	default:
+		break;
+	}
+
+	rc = 0;
 out:
 	if (db)
 		libwacom_database_destroy(db);
+	return rc;
 #endif
 }
 
@@ -449,23 +472,20 @@ tool_set_bits(const struct tablet_dispatch *tablet,
 {
 	enum libinput_tool_type type = tool->type;
 
-	/* Determine the axis capabilities of the tool. Here's a break
-	 * down of the heuristics used here:
-	 * - The Wacom art pen supports all of the extra axes, along
-	 *   with rotation
-	 * - The Wacom airbrush supports a wheel with a ~90 deg
-	 *   range.
-	 * - All of normal pens and the airbrush support all of the
-	 *   extra axes if the tablet can report them
-	 * - All of the mouse-like devices don't report any of
-	 *   the extra axes except for rotation (calculated from tilt x/y).
+#if HAVE_LIBWACOM
+	if (tool_set_bits_from_libwacom(tablet, tool) == 0)
+		return;
+#endif
+	/* If we don't have libwacom, we simply copy any axis we have on the
+	   tablet onto the tool. Except we know that mice only have rotation
+	   anyway.
 	 */
 	switch (type) {
+	case LIBINPUT_TOOL_AIRBRUSH:
 	case LIBINPUT_TOOL_PEN:
 	case LIBINPUT_TOOL_ERASER:
 	case LIBINPUT_TOOL_PENCIL:
 	case LIBINPUT_TOOL_BRUSH:
-	case LIBINPUT_TOOL_AIRBRUSH:
 		copy_axis_cap(tablet, tool, LIBINPUT_TABLET_AXIS_PRESSURE);
 		copy_axis_cap(tablet, tool, LIBINPUT_TABLET_AXIS_DISTANCE);
 		copy_axis_cap(tablet, tool, LIBINPUT_TABLET_AXIS_TILT_X);
@@ -475,9 +495,6 @@ tool_set_bits(const struct tablet_dispatch *tablet,
 		break;
 	}
 
-#if HAVE_LIBWACOM
-	tool_set_bits_from_libwacom(tablet, tool);
-#else
 	/* If we don't have libwacom, copy all pen-related ones from the
 	   tablet vs all mouse-related ones */
 	switch (type) {
@@ -501,7 +518,6 @@ tool_set_bits(const struct tablet_dispatch *tablet,
 	default:
 		break;
 	}
-#endif
 }
 
 static struct libinput_tool *
-- 
2.1.0



More information about the wayland-devel mailing list