From 6d01e7277f8589a1f0076acbf9e08b45a5a96d0d Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Thu, 13 Dec 2018 14:32:33 +1000 Subject: [PATCH 1/2] wacom: Map wacom-driver-specific generic IDs to 0 The xf86-input-wacom driver doesn't use 0 for tools that do not have an id or serials. Serials default to 1, and the tool id is either 0x2 for stylus or 0xa for eraser, see xf86WacomDefs.h, the defines for STYLUS_DEVICE_ID and ERASER_DEVICE_ID. libwacom uses 0xfffff and 0xffffe for the generic pens and all the lookup code we have in the panel is designed for a serial/tool id of 0. So let's just map the wacom driver IDs to 0 at the only transition point between Gdk and our panel. No devices with serials 0 or hw ids 2/10 exist, so this shouldn't have side effects. This only affects X + xf86-input-wacom. --- panels/wacom/cc-wacom-panel.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/panels/wacom/cc-wacom-panel.c b/panels/wacom/cc-wacom-panel.c index e4f3ca7..8748876 100644 --- a/panels/wacom/cc-wacom-panel.c +++ b/panels/wacom/cc-wacom-panel.c @@ -354,6 +354,14 @@ update_current_tool (CcWacomPanel *panel, /* Check whether we already know this tool, nothing to do then */ serial = gdk_device_tool_get_serial (tool); + + /* The wacom driver sends serial-less tools with a serial of + * 1, libinput uses 0. No device exists with serial 1, let's reset + * it here so everything else works as expected. + */ + if (serial == 1) + serial = 0; + stylus = cc_tablet_tool_map_lookup_tool (priv->tablet_tool_map, wacom_device, serial); @@ -361,6 +369,15 @@ update_current_tool (CcWacomPanel *panel, gboolean added; id = gdk_device_tool_get_hardware_id (tool); + + /* The wacom driver sends a hw id of 0x2 for stylus and 0xa + * for eraser for devices that don't have a true HW id. + * Reset those to 0 so we can use the same code-paths + * libinput uses. + */ + if (id == 0x2 || id == 0xa) + id = 0; + stylus = cc_wacom_tool_new (serial, id, wacom_device); if (!stylus) return; -- 2.24.1 From 6974aaeb20a5146f95de9c40cd0b3b5967b317a6 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Fri, 14 Dec 2018 16:14:30 +1000 Subject: [PATCH 2/2] wacom: ignore the wacom driver's touch tool type When the wacom driver handles the touch device, we get a tool id of 0x3. Let's ignore that because we don't need a tool for the touch node. Ideally we should be able to rely on the GDK tool type but that one is always GDK_DEVICE_TOOL_TYPE_UNKNOWN see https://gitlab.gnome.org/GNOME/gtk/merge_requests/453 A GTK bug (also fixed in that MR) prevents the tool id from updating. Until that GTK bug is fixed the pen will only be detected if it is the first event from this physical device. If the touch node sends an event before the pen, the pen won't be detected. --- panels/wacom/cc-wacom-panel.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/panels/wacom/cc-wacom-panel.c b/panels/wacom/cc-wacom-panel.c index 8748876..985ddf5 100644 --- a/panels/wacom/cc-wacom-panel.c +++ b/panels/wacom/cc-wacom-panel.c @@ -374,9 +374,14 @@ update_current_tool (CcWacomPanel *panel, * for eraser for devices that don't have a true HW id. * Reset those to 0 so we can use the same code-paths * libinput uses. + * The touch ID is 0x3, let's ignore that because we don't + * have a touch tool and it only happens when the wacom + * driver handles the touch device. */ if (id == 0x2 || id == 0xa) id = 0; + else if (id == 0x3) + return; stylus = cc_wacom_tool_new (serial, id, wacom_device); if (!stylus) -- 2.24.1