From: Chris Bagwell <ch...@cnpbagwell.com>

There is an implied agreement between kernel drivers and
user land to work around event filtering issues.  Document
our current approach since it seems not so obvious the
importance of a memset().

Our current approach works great with wacom tablets but
has some issues with non-wacom tablets.  List some TODO's
to aid those developers in the future.

Also, forcing in proximity handles a few corner cases fine for
all wacom devices but document the preferred approach for
possible future patch.

Signed-off-by: Chris Bagwell <ch...@cnpbagwell.com>
---
 src/wcmUSB.c |   44 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 44 insertions(+), 0 deletions(-)

diff --git a/src/wcmUSB.c b/src/wcmUSB.c
index c8d775f..eed755e 100644
--- a/src/wcmUSB.c
+++ b/src/wcmUSB.c
@@ -1224,11 +1224,55 @@ static void usbDispatchEvents(InputInfoPtr pInfo)
        pChannel = common->wcmChannel + channel;
        dslast = pChannel->valid.state;
 
+       /* Because of linux input filtering, the kernel driver can not
+        * always force total set of event data when new tool comes into
+        * proximity.  This includes simple case of flipping stylus
+        * from pen to eraser tool. Therefore, when new tool is in-prox
+        * we must initialize all shared event values to same as previous
+        * tool to account for filtered events.
+        *
+        * For Generic and Protocol 4 devices that have fixed channel
+        * mappings, this is no problem.  Protocol 5 devices are difficult
+        * because they dynamically assign channel #'s and even simple
+        * case above can switch from channel 1 to channel 0.
+        *
+        * To simplify things, we take advantage of fact wacom kernel
+        * drivers force all values to zero when going out of proximity so
+        * we take a short cut and memset() to align when going in-prox
+        * instead of a memcpy().
+        *
+        * TODO: Some non-wacom tablets send X/Y data right before coming
+        * in proximity. The following discards that data.
+        * Adding "&& dslast.proximimty" to check would probably help
+        * this case.
+        * Some non-wacom tablets may also never reset their values
+        * to zero when out-of-prox.  The memset() can loss this data.
+        * Adding a !WCM_PROTOCOL_GENERIC check would probably help this case.
+        */
        if (!common->wcmChannel[channel].work.proximity)
        {
                memset(&common->wcmChannel[channel],0,sizeof(WacomChannel));
 
                /* in case the in-prox event was missing */
+               /* TODO: There are not valid times when in-prox
+                * events are not sent by a driver except:
+                *
+                * 1) Starting X while tool is already in prox.
+                * 2) Non-wacom tablet sends only BTN_TOUCH without
+                * BTN_TOOL_PEN since it only support 1 tool.
+                *
+                * Case 1) should be handled in same location as
+                * below check of (ds->device_type == 0) since its
+                * same reason.  It is better to query for real
+                * value instead of assuming in-prox.
+                * Case 2) should be handled in case statement that
+                * processes BTN_TOUCH for WCM_PROTOCOL_GENERIC devices.
+                *
+                * So we should not be forcing to in-prox here because
+                * it could cause cursor jump from (X,Y)=(0,0) if events
+                * are sent while out-of-prox; which can happen only
+                * with WCM_PROTOCOL_GENERIC devices. Hint: see TODO above.
+                */
                common->wcmChannel[channel].work.proximity = 1;
        }
 
-- 
1.7.3.1


------------------------------------------------------------------------------
Nokia and AT&T present the 2010 Calling All Innovators-North America contest
Create new apps & games for the Nokia N8 for consumers in  U.S. and Canada
$10 million total in prizes - $4M cash, 500 devices, nearly $6M in marketing
Develop with Nokia Qt SDK, Web Runtime, or Java and Publish to Ovi Store 
http://p.sf.net/sfu/nokia-dev2dev
_______________________________________________
Linuxwacom-devel mailing list
Linuxwacom-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to